From 8b7a001699dd3e0517ab34794c08fad4ac93253d Mon Sep 17 00:00:00 2001 From: Aaron Madison Date: Fri, 1 Mar 2019 15:59:45 -0600 Subject: [PATCH 001/390] fix casts in repos_commits parsing --- lib/src/common/model/repos_commits.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/src/common/model/repos_commits.dart b/lib/src/common/model/repos_commits.dart index 01fb98ff..2421227a 100644 --- a/lib/src/common/model/repos_commits.dart +++ b/lib/src/common/model/repos_commits.dart @@ -52,13 +52,13 @@ class RepositoryCommit { ..stats = CommitStats.fromJSON(input['stats'] as Map); if (input['parents'] != null) { - commit.parents = (input['parents'] as List>) + commit.parents = (input['parents'] as List) .map((parent) => GitCommit.fromJson(parent)) .toList(); } if (input['files'] != null) { - commit.files = (input['files'] as List>) + commit.files = (input['files'] as List) .map((file) => CommitFile.fromJSON(file)) .toList(); } From b897ff143b1e1e6e1d5f0a9f8ef09fb990280e5e Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Mon, 22 Apr 2019 12:20:56 -0700 Subject: [PATCH 002/390] Remove deprecated lint --- analysis_options.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index 0395b8f5..5b52ce3d 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -30,7 +30,6 @@ linter: - prefer_is_not_empty - slash_for_doc_comments - sort_unnamed_constructors_first - - super_goes_last - test_types_in_equals - throw_in_finally - type_annotate_public_apis From ff9ee0b5289496a63a622aea298e1d8b86431dc9 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Mon, 22 Apr 2019 12:21:49 -0700 Subject: [PATCH 003/390] Require Dart 2.1 Since `Future` is used in a number of libraries without importing dart:async --- CHANGELOG.md | 4 ++++ pubspec.yaml | 7 +++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b1fecab3..639a65a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## v4.1.1 + +- Require at least Dart `2.1.0`. + ## v4.1.0 - Fix return type of `RepositoriesService.listContributors`. diff --git a/pubspec.yaml b/pubspec.yaml index 25e65f22..6461b5a9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,15 +1,18 @@ name: github -version: 4.1.0 +version: 4.1.1-dev author: Kenneth Endfinger description: GitHub API Client Library homepage: https://github.com/DirectMyFile/github.dart + environment: - sdk: '>=2.0.0 <3.0.0' + sdk: '>=2.1.0 <3.0.0' + dependencies: http: '>=0.11.3 <0.13.0' http_parser: ^3.1.1 json_annotation: ^2.0.0 meta: ^1.1.0 + dev_dependencies: build_runner: any build_test: any From 442b87080e7156d27ecc16aa62d5bb13b5d87361 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Mon, 22 Apr 2019 12:25:22 -0700 Subject: [PATCH 004/390] dartfmt --fix -w . And enable corresponding lints --- analysis_options.yaml | 4 ++ example/common.dart | 6 +- example/emoji.dart | 8 +-- example/languages.dart | 4 +- example/readme.dart | 2 +- example/releases.dart | 2 +- example/repos.dart | 2 +- example/stars.dart | 10 +-- example/user_info.dart | 2 +- example/users.dart | 8 +-- lib/browser.dart | 5 +- lib/server.dart | 15 ++--- lib/src/browser/helper.dart | 6 +- lib/src/common.dart | 4 +- lib/src/common/activity_service.dart | 64 +++++++++---------- lib/src/common/authorizations_service.dart | 2 +- lib/src/common/gists_service.dart | 13 ++-- lib/src/common/git_service.dart | 10 +-- lib/src/common/github.dart | 54 ++++++++-------- lib/src/common/issues_service.dart | 16 ++--- lib/src/common/misc_service.dart | 2 +- lib/src/common/model/activity.dart | 4 +- lib/src/common/model/authorizations.dart | 4 +- lib/src/common/model/gists.dart | 10 +-- lib/src/common/model/git.dart | 4 +- lib/src/common/model/issues.dart | 10 +-- lib/src/common/model/keys.dart | 2 +- lib/src/common/model/misc.dart | 8 +-- lib/src/common/model/notifications.dart | 4 +- lib/src/common/model/orgs.dart | 8 +-- lib/src/common/model/pulls.dart | 14 ++-- lib/src/common/model/repos.dart | 8 +-- lib/src/common/model/repos_commits.dart | 6 +- lib/src/common/model/repos_contents.dart | 6 +- lib/src/common/model/repos_hooks.dart | 4 +- lib/src/common/model/repos_pages.dart | 2 +- lib/src/common/model/repos_stats.dart | 8 +-- lib/src/common/model/repos_statuses.dart | 4 +- lib/src/common/orgs_service.dart | 26 ++++---- lib/src/common/pulls_service.dart | 16 ++--- lib/src/common/repos_service.dart | 74 +++++++++++----------- lib/src/common/search_service.dart | 22 +++---- lib/src/common/url_shortener_service.dart | 2 +- lib/src/common/users_service.dart | 18 +++--- lib/src/common/util/json.dart | 2 +- lib/src/common/util/oauth2.dart | 8 +-- lib/src/common/util/pagination.dart | 10 +-- lib/src/common/util/utils.dart | 2 +- lib/src/server/hooks.dart | 16 ++--- lib/src/util.dart | 10 +-- test/code_search_test.dart | 2 +- test/data_object_test.dart | 2 +- test/experiment/crawler.dart | 6 +- test/experiment/error_handling.dart | 2 +- test/experiment/files.dart | 4 +- test/experiment/limit_pager.dart | 9 ++- test/experiment/readme.dart | 2 +- test/git_integration_test.dart | 22 +++---- test/git_test.dart | 51 ++++++++------- test/helper.dart | 3 +- test/helper/assets.dart | 2 +- test/helper/http.dart | 9 +-- 62 files changed, 331 insertions(+), 334 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index 5b52ce3d..b953e59d 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -27,6 +27,8 @@ linter: - package_api_docs - package_names - package_prefixed_library_names + - prefer_equal_for_default_values + - prefer_generic_function_type_aliases - prefer_is_not_empty - slash_for_doc_comments - sort_unnamed_constructors_first @@ -36,6 +38,8 @@ linter: - type_init_formals - unawaited_futures - unnecessary_brace_in_string_interps + - unnecessary_const - unnecessary_getters_setters + - unnecessary_new - unrelated_type_equality_checks - valid_regexps diff --git a/example/common.dart b/example/common.dart index f5cc63fe..74750345 100644 --- a/example/common.dart +++ b/example/common.dart @@ -51,10 +51,10 @@ Map queryString = String token = queryString["token"] ?? window.sessionStorage['token']; GitHub _createGitHub() { - return new GitHub( + return GitHub( auth: token != null - ? new Authentication.withToken(token) - : new Authentication.anonymous()); + ? Authentication.withToken(token) + : Authentication.anonymous()); } GitHub github = _createGitHub(); diff --git a/example/emoji.dart b/example/emoji.dart index 7dc8d05b..dd455cd0 100644 --- a/example/emoji.dart +++ b/example/emoji.dart @@ -19,12 +19,12 @@ Future loadEmojis() async { var emojis = await github.misc.listEmojis(); emojis.forEach((name, url) { - var h = new DivElement(); + var h = DivElement(); h.className = 'emojibox'; h.style.textAlign = "center"; - h.append(new ImageElement(src: url, width: 64, height: 64) - ..classes.add("emoji")); - h.append(new ParagraphElement()..text = ":$name:"); + h.append( + ImageElement(src: url, width: 64, height: 64)..classes.add("emoji")); + h.append(ParagraphElement()..text = ":$name:"); emojiDiv.append(h); }); } diff --git a/example/languages.dart b/example/languages.dart index 8eb0d983..24abf35c 100644 --- a/example/languages.dart +++ b/example/languages.dart @@ -29,14 +29,14 @@ Future loadRepository() async { document.getElementById("name").setInnerHtml("$user/$reponame"); - var repo = new RepositorySlug(user, reponame); + var repo = RepositorySlug(user, reponame); breakdown = await github.repositories.listLanguages(repo); reloadTable(); } bool isReloadingTable = false; -void reloadTable({int accuracy: 4}) { +void reloadTable({int accuracy = 4}) { if (isReloadingTable) { return; } diff --git a/example/readme.dart b/example/readme.dart index 46eebd73..bde2e057 100644 --- a/example/readme.dart +++ b/example/readme.dart @@ -10,7 +10,7 @@ DivElement readmeDiv; Future main() async { await initViewSourceButton("readme.dart"); readmeDiv = querySelector("#readme"); - var repo = new RepositorySlug("DirectMyFile", "github.dart"); + var repo = RepositorySlug("DirectMyFile", "github.dart"); var readme = await github.repositories.getReadme(repo); String markdown = readme.content; if (readme.encoding == 'base64') { diff --git a/example/releases.dart b/example/releases.dart index 8a71cc2c..2a9ec082 100644 --- a/example/releases.dart +++ b/example/releases.dart @@ -14,7 +14,7 @@ Future main() async { void loadReleases() { github.repositories - .listReleases(new RepositorySlug("twbs", "bootstrap")) + .listReleases(RepositorySlug("twbs", "bootstrap")) .toList() .then((releases) { for (var release in releases) { diff --git a/example/repos.dart b/example/repos.dart index 8eeecd83..57243e7a 100644 --- a/example/repos.dart +++ b/example/repos.dart @@ -70,7 +70,7 @@ void updateRepos(List repos, void loadRepos([int compare(Repository a, Repository b)]) { var title = querySelector("#title"); if (title.text.contains("(")) { - title.replaceWith(new HeadingElement.h2() + title.replaceWith(HeadingElement.h2() ..text = "GitHub for Dart - Repositories" ..id = "title"); } diff --git a/example/stars.dart b/example/stars.dart index 9cebf0f2..339ec13b 100644 --- a/example/stars.dart +++ b/example/stars.dart @@ -26,16 +26,16 @@ void loadStars() { querySelector("#title").appendText(" for $user/$repo"); github.activity - .listStargazers(new RepositorySlug(user, repo)) + .listStargazers(RepositorySlug(user, repo)) .listen((stargazer) { - var h = new DivElement(); + var h = DivElement(); h.classes.add("box"); h.classes.add("user"); h.style.textAlign = "center"; - h.append(new ImageElement(src: stargazer.avatarUrl, width: 64, height: 64) + h.append(ImageElement(src: stargazer.avatarUrl, width: 64, height: 64) ..classes.add("avatar")); - h.append(new AnchorElement(href: stargazer.htmlUrl) - ..append(new ParagraphElement()..text = stargazer.login)); + h.append(AnchorElement(href: stargazer.htmlUrl) + ..append(ParagraphElement()..text = stargazer.login)); $stars.append(h); }).onDone(() { querySelector("#total") diff --git a/example/user_info.dart b/example/user_info.dart index 66785da3..c89dc811 100644 --- a/example/user_info.dart +++ b/example/user_info.dart @@ -12,7 +12,7 @@ Future main() async { } GitHub createClient(String token) { - return new GitHub(auth: new Authentication.withToken(token)); + return GitHub(auth: Authentication.withToken(token)); } void loadUser() { diff --git a/example/users.dart b/example/users.dart index db0af40d..41b6b111 100644 --- a/example/users.dart +++ b/example/users.dart @@ -16,16 +16,16 @@ Future main() async { void loadUsers() { github.users.listUsers(pages: 2).take(12).listen((User baseUser) { github.users.getUser(baseUser.login).then((user) { - var userDiv = new DivElement(); + var userDiv = DivElement(); for (int i = 1; i <= 2; i++) { - userDiv.append(new BRElement()); + userDiv.append(BRElement()); } userDiv.append( GitHubBrowserHelper.createAvatarImage(user, width: 64, height: 64) ..classes.add("avatar")); - var buff = new StringBuffer(); + var buff = StringBuffer(); buff ..writeln("Username: ${user.login}") @@ -38,7 +38,7 @@ void loadUsers() { buff.writeln("Followers: ${user.followersCount}"); - userDiv.append(new ParagraphElement() + userDiv.append(ParagraphElement() ..appendHtml(buff.toString().replaceAll("\n", "
"), treeSanitizer: NodeTreeSanitizer.trusted)); diff --git a/lib/browser.dart b/lib/browser.dart index 3a875d2b..92065d30 100644 --- a/lib/browser.dart +++ b/lib/browser.dart @@ -13,10 +13,9 @@ export "src/common.dart"; /// Creates a GitHub Client GitHub createGitHubClient( - {Authentication auth, String endpoint: "https://api.github.com"}) { + {Authentication auth, String endpoint = "https://api.github.com"}) { // NOTE: This library is not needed if `pkg:http` is updated to support // pkg:http ^0.12.0. Make sure to update the dependency if/when you remove // browser.dart - return new GitHub( - auth: auth, client: new BrowserClient(), endpoint: endpoint); + return GitHub(auth: auth, client: BrowserClient(), endpoint: endpoint); } diff --git a/lib/server.dart b/lib/server.dart index a4a0d3ae..ccb83bd5 100644 --- a/lib/server.dart +++ b/lib/server.dart @@ -12,15 +12,15 @@ export "src/server/hooks.dart"; /// If [auth] is not specified, then it will be automatically configured /// from the environment as per [findAuthenticationFromEnvironment]. GitHub createGitHubClient( - {Authentication auth, String endpoint: "https://api.github.com"}) { + {Authentication auth, String endpoint = "https://api.github.com"}) { if (auth == null) { auth = findAuthenticationFromEnvironment(); } - return new GitHub(auth: auth, endpoint: endpoint); + return GitHub(auth: auth, endpoint: endpoint); } -const List COMMON_GITHUB_TOKEN_ENV_KEYS = const [ +const List COMMON_GITHUB_TOKEN_ENV_KEYS = [ "GITHUB_ADMIN_TOKEN", "GITHUB_DART_TOKEN", "GITHUB_API_TOKEN", @@ -46,7 +46,7 @@ Authentication findAuthenticationFromEnvironment() { username = username.substring(0, username.length - 1); String password = result.stderr.toString().split("password:")[1].trim(); password = password.substring(1, password.length - 1); - return new Authentication.basic(username.trim(), password.trim()); + return Authentication.basic(username.trim(), password.trim()); } } @@ -54,14 +54,13 @@ Authentication findAuthenticationFromEnvironment() { for (String key in COMMON_GITHUB_TOKEN_ENV_KEYS) { if (env[key] is String) { - return new Authentication.withToken(env[key]); + return Authentication.withToken(env[key]); } } if (env["GITHUB_USERNAME"] is String && env["GITHUB_PASSWORD"] is String) { - return new Authentication.basic( - env["GITHUB_USERNAME"], env["GITHUB_PASSWORD"]); + return Authentication.basic(env["GITHUB_USERNAME"], env["GITHUB_PASSWORD"]); } - return new Authentication.anonymous(); + return Authentication.anonymous(); } diff --git a/lib/src/browser/helper.dart b/lib/src/browser/helper.dart index 970e2438..664b1079 100644 --- a/lib/src/browser/helper.dart +++ b/lib/src/browser/helper.dart @@ -11,7 +11,7 @@ class GitHubBrowserHelper { /// [github] is the GitHub instance to use. /// [selector] is the selector to use to find markdown elements. /// [indent] is the indent that needs to be stripped out. - static void renderMarkdown(GitHub github, String selector, {int indent: 4}) { + static void renderMarkdown(GitHub github, String selector, {int indent = 4}) { ElementList elements = document.querySelectorAll(selector); elements.removeWhere((Element it) => it.attributes.containsKey("rendered")); @@ -34,7 +34,7 @@ class GitHubBrowserHelper { /// Creates an Image Element from a User that has the user's avatar. static ImageElement createAvatarImage(User user, - {int width: 128, int height: 128}) { - return new ImageElement(src: user.avatarUrl, width: width, height: height); + {int width = 128, int height = 128}) { + return ImageElement(src: user.avatarUrl, width: width, height: height); } } diff --git a/lib/src/common.dart b/lib/src/common.dart index 2dfeb6ae..c60faebb 100644 --- a/lib/src/common.dart +++ b/lib/src/common.dart @@ -76,8 +76,8 @@ void _applyExpandos(Object target, http.Response response) { } } -final _etagExpando = new Expando('etag'); -final _dateExpando = new Expando('date'); +final _etagExpando = Expando('etag'); +final _dateExpando = Expando('date'); String getResponseEtag(Object obj) => _etagExpando[obj]; DateTime getResponseDate(Object obj) => _dateExpando[obj]; diff --git a/lib/src/common/activity_service.dart b/lib/src/common/activity_service.dart index b71cb88c..8c491493 100644 --- a/lib/src/common/activity_service.dart +++ b/lib/src/common/activity_service.dart @@ -10,8 +10,8 @@ class ActivityService extends Service { /// Lists public events. /// /// API docs: https://developer.github.com/v3/activity/events/#list-public-events - Stream listPublicEvents({int pages: 2}) { - return new PaginationHelper(_github) + Stream listPublicEvents({int pages = 2}) { + return PaginationHelper(_github) .objects("GET", "/events", Event.fromJSON, pages: pages); } @@ -19,8 +19,8 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/events/#list-public-events-for-a-network-of-repositories Stream listRepositoryNetworkEvents(RepositorySlug slug, - {int pages: 2}) { - return new PaginationHelper(_github).objects( + {int pages = 2}) { + return PaginationHelper(_github).objects( "GET", "/networks/${slug.fullName}/events", Event.fromJSON, pages: pages); } @@ -29,19 +29,19 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/events/#list-public-events-for-a-network-of-repositories EventPoller pollRepositoryNetworkEvents(RepositorySlug slug) => - new EventPoller(_github, "/networks/${slug.fullName}/events"); + EventPoller(_github, "/networks/${slug.fullName}/events"); /// Returns an [EventPoller] for repository issue events. /// /// API docs: https://developer.github.com/v3/activity/events/#list-repository-events EventPoller pollRepositoryIssueEvents(RepositorySlug slug) => - new EventPoller(_github, "/repos/${slug.fullName}/issues/events"); + EventPoller(_github, "/repos/${slug.fullName}/issues/events"); /// Lists repository issue events. /// /// API docs: https://developer.github.com/v3/activity/events/#list-repository-events Stream listRepositoryIssueEvents(RepositorySlug slug, {int pages}) { - return new PaginationHelper(_github).objects( + return PaginationHelper(_github).objects( "GET", "/repos/${slug.fullName}/issues/events", Event.fromJSON, pages: pages); } @@ -49,13 +49,13 @@ class ActivityService extends Service { /// Returns an [EventPoller] for public events. /// /// API docs: https://developer.github.com/v3/activity/events/#list-public-events - EventPoller pollPublicEvents() => new EventPoller(_github, "/events"); + EventPoller pollPublicEvents() => EventPoller(_github, "/events"); /// Lists repository events. /// /// API docs: https://developer.github.com/v3/activity/events/#list-repository-events Stream listRepositoryEvents(RepositorySlug slug, {int pages}) { - return new PaginationHelper(_github).objects( + return PaginationHelper(_github).objects( "GET", "/repos/${slug.fullName}/events", Event.fromJSON, pages: pages); } @@ -64,13 +64,13 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/events/#list-repository-events EventPoller pollRepositoryEvents(RepositorySlug slug) => - new EventPoller(_github, "/repos/${slug.fullName}/events"); + EventPoller(_github, "/repos/${slug.fullName}/events"); /// Lists public events for an organization. /// /// API docs: https://developer.github.com/v3/activity/events/#list-public-events-for-an-organization Stream listEventsForOrganization(String name, {int pages}) { - return new PaginationHelper(_github) + return PaginationHelper(_github) .objects("GET", "/orgs/$name/events", Event.fromJSON, pages: pages); } @@ -78,25 +78,25 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/events/#list-public-events-for-an-organization EventPoller pollEventsForOrganization(String name) => - new EventPoller(_github, "/orgs/$name/events"); + EventPoller(_github, "/orgs/$name/events"); /// Returns an [EventPoller] for events performed by a user. /// /// API docs: https://developer.github.com/v3/activity/events/#list-events-that-a-user-has-received EventPoller pollEventsReceivedByUser(String user) => - new EventPoller(_github, "/users/$user/events"); + EventPoller(_github, "/users/$user/events"); /// Returns an [EventPoller] for events performed by a user. /// /// API docs: https://developer.github.com/v3/activity/events/#list-public-events-that-a-user-has-received EventPoller pollPublicEventsReceivedByUser(String user) => - new EventPoller(_github, "/repos/$user/events/public"); + EventPoller(_github, "/repos/$user/events/public"); /// Lists the events performed by a user. /// /// API docs: https://developer.github.com/v3/activity/events/#list-events-performed-by-a-user Stream listEventsPerformedByUser(String username, {int pages}) { - return new PaginationHelper(_github).objects( + return PaginationHelper(_github).objects( "GET", "/users/$username/events", Event.fromJSON, pages: pages); } @@ -105,7 +105,7 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/events/#list-public-events-performed-by-a-user Stream listPublicEventsPerformedByUser(String username, {int pages}) { - return new PaginationHelper(_github).objects( + return PaginationHelper(_github).objects( "GET", "/users/$username/events/public", Event.fromJSON, pages: pages); } @@ -114,7 +114,7 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/events/#list-events-for-an-organization EventPoller pollUserEventsForOrganization(String user, String organization) => - new EventPoller(_github, "/users/$user/events/orgs/$organization"); + EventPoller(_github, "/users/$user/events/orgs/$organization"); // TODO: Implement listFeeds: https://developer.github.com/v3/activity/feeds/#list-feeds @@ -122,8 +122,8 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/notifications/#list-your-notifications Stream listNotifications( - {bool all: false, bool participating: false}) { - return new PaginationHelper(_github).objects( + {bool all = false, bool participating = false}) { + return PaginationHelper(_github).objects( "GET", '/notifications', Notification.fromJSON, params: {"all": all, "participating": participating}); } @@ -132,8 +132,8 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/notifications/#list-your-notifications-in-a-repository Stream listRepositoryNotifications(RepositorySlug repository, - {bool all: false, bool participating: false}) { - return new PaginationHelper(_github).objects("GET", + {bool all = false, bool participating = false}) { + return PaginationHelper(_github).objects("GET", '/repos/${repository.fullName}/notifications', Notification.fromJSON, params: {"all": all, "participating": participating}); } @@ -187,7 +187,7 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/starring/#list-stargazers Stream listStargazers(RepositorySlug slug) { - return new PaginationHelper(_github) + return PaginationHelper(_github) .objects("GET", "/repos/${slug.fullName}/stargazers", User.fromJson); } @@ -195,7 +195,7 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/starring/#list-repositories-being-starred Stream listStarredByUser(String user) { - return new PaginationHelper(_github) + return PaginationHelper(_github) .objects("GET", "/users/$user/starred", Repository.fromJSON); } @@ -203,7 +203,7 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/starring/#list-repositories-being-starred Stream listStarred() { - return new PaginationHelper(_github) + return PaginationHelper(_github) .objects("GET", "/user/starred", Repository.fromJSON); } @@ -242,7 +242,7 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/watching/#list-watchers Stream listWatchers(RepositorySlug slug) { - return new PaginationHelper(_github) + return PaginationHelper(_github) .objects("GET", "/repos/${slug.fullName}/subscribers", User.fromJson); } @@ -250,7 +250,7 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/watching/#list-repositories-being-watched Stream listWatchedByUser(String user) { - return new PaginationHelper(_github) + return PaginationHelper(_github) .objects("GET", '/users/$user/subscriptions', Repository.fromJSON); } @@ -258,7 +258,7 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/watching/#list-repositories-being-watched Stream listWatched() { - return new PaginationHelper(_github) + return PaginationHelper(_github) .objects("GET", '/user/subscriptions', Repository.fromJSON); } @@ -306,14 +306,14 @@ class EventPoller { EventPoller(this.github, this.path); - Stream start({bool onlyNew: false, int interval, DateTime after}) { + Stream start({bool onlyNew = false, int interval, DateTime after}) { if (_timer != null) { - throw new Exception("Polling already started."); + throw Exception("Polling already started."); } if (after != null) after = after.toUtc(); - _controller = new StreamController(); + _controller = StreamController(); void handleEvent(http.Response response) { if (interval == null) { @@ -347,7 +347,7 @@ class EventPoller { } if (_timer == null) { - _timer = new Timer.periodic(new Duration(seconds: interval), (timer) { + _timer = Timer.periodic(Duration(seconds: interval), (timer) { var headers = {}; if (_lastFetched != null) { @@ -372,7 +372,7 @@ class EventPoller { Future stop() { if (_timer == null) { - throw new Exception("Polling not started."); + throw Exception("Polling not started."); } _timer.cancel(); diff --git a/lib/src/common/authorizations_service.dart b/lib/src/common/authorizations_service.dart index 32f9e940..0c0aa535 100644 --- a/lib/src/common/authorizations_service.dart +++ b/lib/src/common/authorizations_service.dart @@ -14,7 +14,7 @@ class AuthorizationsService extends Service { /// /// API docs: https://developer.github.com/v3/oauth_authorizations/#list-your-authorizations Stream listAuthorizations() { - return new PaginationHelper(_github) + return PaginationHelper(_github) .objects("GET", "/authorizations", Authorization.fromJSON); } diff --git a/lib/src/common/gists_service.dart b/lib/src/common/gists_service.dart index 72342f15..124cb3f4 100644 --- a/lib/src/common/gists_service.dart +++ b/lib/src/common/gists_service.dart @@ -11,7 +11,7 @@ class GistsService extends Service { /// /// API docs: https://developer.github.com/v3/gists/#list-gists Stream listUserGists(String username) { - return new PaginationHelper(_github) + return PaginationHelper(_github) .objects("GET", "/users/$username/gists", Gist.fromJSON); } @@ -20,15 +20,14 @@ class GistsService extends Service { /// /// API docs: https://developer.github.com/v3/gists/#list-gists Stream listCurrentUserGists() { - return new PaginationHelper(_github) - .objects("GET", "/gists", Gist.fromJSON); + return PaginationHelper(_github).objects("GET", "/gists", Gist.fromJSON); } /// Fetches the currently authenticated user's public gists. /// /// API docs: https://developer.github.com/v3/gists/#list-gists Stream listCurrentUserPublicGists() { - return new PaginationHelper(_github) + return PaginationHelper(_github) .objects("GET", "/gists/public", Gist.fromJSON); } @@ -36,7 +35,7 @@ class GistsService extends Service { /// /// API docs: https://developer.github.com/v3/gists/#list-gists Stream listCurrentUserStarredGists() { - return new PaginationHelper(_github) + return PaginationHelper(_github) .objects("GET", "/gists/starred", Gist.fromJSON); } @@ -50,7 +49,7 @@ class GistsService extends Service { /// /// API docs: https://developer.github.com/v3/gists/#create-a-gist Future createGist(Map files, - {String description, bool public: false}) { + {String description, bool public = false}) { var map = {"files": {}}; if (description != null) { @@ -149,7 +148,7 @@ class GistsService extends Service { /// /// API docs: https://developer.github.com/v3/gists/comments/#list-comments-on-a-gist Stream listComments(String gistId) { - return new PaginationHelper(_github) + return PaginationHelper(_github) .objects("GET", "/gists/$gistId/comments", GistComment.fromJSON); } diff --git a/lib/src/common/git_service.dart b/lib/src/common/git_service.dart index d4823cbd..d5fc64ae 100644 --- a/lib/src/common/git_service.dart +++ b/lib/src/common/git_service.dart @@ -63,7 +63,7 @@ class GitService extends Service { path += '/$type'; } - return new PaginationHelper(_github) + return PaginationHelper(_github) .objects('GET', path, GitReference.fromJSON); } @@ -86,7 +86,7 @@ class GitService extends Service { /// API docs: https://developer.github.com/v3/git/refs/#update-a-reference Future editReference( RepositorySlug slug, String ref, String sha, - {bool force: false}) { + {bool force = false}) { String body = jsonEncode({'sha': sha, 'force': force}); // Somehow the reference updates PATCH request needs a valid content-length. var headers = {'content-length': body.length.toString()}; @@ -132,14 +132,14 @@ class GitService extends Service { /// API docs: https://developer.github.com/v3/git/trees/#get-a-tree /// and https://developer.github.com/v3/git/trees/#get-a-tree-recursively Future getTree(RepositorySlug slug, String sha, - {bool recursive: false}) { + {bool recursive = false}) { var path = '/repos/${slug.fullName}/git/trees/$sha'; if (recursive) { path += '?recursive=1'; } return _github.getJSON(path, - convert: (j) => new GitTree.fromJson(j), statusCode: StatusCodes.OK); + convert: (j) => GitTree.fromJson(j), statusCode: StatusCodes.OK); } /// Creates a new tree in a repository. @@ -147,7 +147,7 @@ class GitService extends Service { /// API docs: https://developer.github.com/v3/git/trees/#create-a-tree Future createTree(RepositorySlug slug, CreateGitTree tree) { return _github.postJSON('/repos/${slug.fullName}/git/trees', - convert: (j) => new GitTree.fromJson(j), + convert: (j) => GitTree.fromJson(j), statusCode: StatusCodes.CREATED, body: tree.toJSON()); } diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index 4fd3c7a6..250c0fbe 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -1,6 +1,6 @@ part of github.common; -typedef http.Client ClientCreator(); +typedef ClientCreator = http.Client Function(); /// The Main GitHub Client /// @@ -42,10 +42,10 @@ class GitHub { /// [auth] is the authentication information GitHub( {Authentication auth, - this.endpoint: "https://api.github.com", + this.endpoint = "https://api.github.com", http.Client client}) - : this.auth = auth == null ? new Authentication.anonymous() : auth, - this.client = client == null ? new http.Client() : client; + : this.auth = auth == null ? Authentication.anonymous() : auth, + this.client = client == null ? http.Client() : client; /// The maximum number of requests that the consumer is permitted to make per /// hour. @@ -69,7 +69,7 @@ class GitHub { /// Will be `null` if no requests have been made yet. DateTime get rateLimitReset => _rateLimitReset == null ? null - : new DateTime.fromMillisecondsSinceEpoch(_rateLimitReset * 1000, + : DateTime.fromMillisecondsSinceEpoch(_rateLimitReset * 1000, isUtc: true); int _rateLimitReset, _rateLimitLimit, _rateLimitRemaining; @@ -77,7 +77,7 @@ class GitHub { /// Service for activity related methods of the GitHub API. ActivityService get activity { if (_activity == null) { - _activity = new ActivityService(this); + _activity = ActivityService(this); } return _activity; } @@ -88,7 +88,7 @@ class GitHub { /// username and password, not tokens. AuthorizationsService get authorizations { if (_authorizations == null) { - _authorizations = new AuthorizationsService(this); + _authorizations = AuthorizationsService(this); } return _authorizations; } @@ -96,7 +96,7 @@ class GitHub { /// Service for gist related methods of the GitHub API. GistsService get gists { if (_gists == null) { - _gists = new GistsService(this); + _gists = GistsService(this); } return _gists; } @@ -104,7 +104,7 @@ class GitHub { /// Service for git data related methods of the GitHub API. GitService get git { if (_git == null) { - _git = new GitService(this); + _git = GitService(this); } return _git; } @@ -112,7 +112,7 @@ class GitHub { /// Service for issues related methods of the GitHub API. IssuesService get issues { if (_issues == null) { - _issues = new IssuesService(this); + _issues = IssuesService(this); } return _issues; } @@ -120,7 +120,7 @@ class GitHub { /// Service for misc related methods of the GitHub API. MiscService get misc { if (_misc == null) { - _misc = new MiscService(this); + _misc = MiscService(this); } return _misc; } @@ -128,7 +128,7 @@ class GitHub { /// Service for organization related methods of the GitHub API. OrganizationsService get organizations { if (_organizations == null) { - _organizations = new OrganizationsService(this); + _organizations = OrganizationsService(this); } return _organizations; } @@ -136,7 +136,7 @@ class GitHub { /// Service for pull requests related methods of the GitHub API. PullRequestsService get pullRequests { if (_pullRequests == null) { - _pullRequests = new PullRequestsService(this); + _pullRequests = PullRequestsService(this); } return _pullRequests; } @@ -144,7 +144,7 @@ class GitHub { /// Service for repository related methods of the GitHub API. RepositoriesService get repositories { if (_repositories == null) { - _repositories = new RepositoriesService(this); + _repositories = RepositoriesService(this); } return _repositories; } @@ -152,7 +152,7 @@ class GitHub { /// Service for search related methods of the GitHub API. SearchService get search { if (_search == null) { - _search = new SearchService(this); + _search = SearchService(this); } return _search; } @@ -160,7 +160,7 @@ class GitHub { /// Service to provide a handy method to access GitHub's url shortener. UrlShortenerService get urlShortener { if (_urlShortener == null) { - _urlShortener = new UrlShortenerService(this); + _urlShortener = UrlShortenerService(this); } return _urlShortener; } @@ -168,7 +168,7 @@ class GitHub { /// Service for user related methods of the GitHub API. UsersService get users { if (_users == null) { - _users = new UsersService(this); + _users = UsersService(this); } return _users; } @@ -314,7 +314,7 @@ class GitHub { queryString = buildQueryString(params); } - var url = new StringBuffer(); + var url = StringBuffer(); if (path.startsWith("http://") || path.startsWith("https://")) { url.write(path); @@ -328,7 +328,7 @@ class GitHub { url.write(queryString); } - var request = new http.Request(method, Uri.parse(url.toString())); + var request = http.Request(method, Uri.parse(url.toString())); request.headers.addAll(headers); if (body != null) { request.body = body; @@ -360,20 +360,20 @@ class GitHub { } switch (response.statusCode) { case 404: - throw new NotFound(this, "Requested Resource was Not Found"); + throw NotFound(this, "Requested Resource was Not Found"); break; case 401: - throw new AccessForbidden(this); + throw AccessForbidden(this); case 400: if (message == "Problems parsing JSON") { - throw new InvalidJSON(this, message); + throw InvalidJSON(this, message); } else if (message == "Body should be a JSON Hash") { - throw new InvalidJSON(this, message); + throw InvalidJSON(this, message); } else - throw new BadRequest(this); + throw BadRequest(this); break; case 422: - var buff = new StringBuffer(); + var buff = StringBuffer(); buff.writeln(); buff.writeln(" Message: $message"); if (errors != null) { @@ -388,9 +388,9 @@ class GitHub { ..write(" Code: $code"); } } - throw new ValidationFailed(this, buff.toString()); + throw ValidationFailed(this, buff.toString()); } - throw new UnknownError(this, message); + throw UnknownError(this, message); } /// Disposes of this GitHub Instance. diff --git a/lib/src/common/issues_service.dart b/lib/src/common/issues_service.dart index 3b9b4f39..46123076 100644 --- a/lib/src/common/issues_service.dart +++ b/lib/src/common/issues_service.dart @@ -117,7 +117,7 @@ class IssuesService extends Service { params['labels'] = labels.join(','); } - return new PaginationHelper(_github) + return PaginationHelper(_github) .objects("GET", pathSegment, Issue.fromJSON, params: params); } @@ -151,7 +151,7 @@ class IssuesService extends Service { if (StatusCodes.isClientError(response.statusCode)) { //TODO: throw a more friendly error – better this than silent failure - throw new GitHubError(_github, response.body); + throw GitHubError(_github, response.body); } return Issue.fromJSON(jsonDecode(response.body) as Map); @@ -162,7 +162,7 @@ class IssuesService extends Service { /// /// API docs: https://developer.github.com/v3/issues/assignees/#list-assignees Stream listAssignees(RepositorySlug slug) { - return new PaginationHelper(_github) + return PaginationHelper(_github) .objects("GET", "/repos/${slug.fullName}/assignees", User.fromJson); } @@ -180,7 +180,7 @@ class IssuesService extends Service { /// API docs: https://developer.github.com/v3/issues/comments/#list-comments-on-an-issue Stream listCommentsByIssue( RepositorySlug slug, int issueNumber) { - return new PaginationHelper(_github).objects( + return PaginationHelper(_github).objects( 'GET', '/repos/${slug.fullName}/issues/$issueNumber/comments', IssueComment.fromJSON); @@ -190,7 +190,7 @@ class IssuesService extends Service { /// /// API docs: https://developer.github.com/v3/issues/comments/#list-comments-on-an-issue Stream listCommentsByRepo(RepositorySlug slug) { - return new PaginationHelper(_github).objects('GET', + return PaginationHelper(_github).objects('GET', '/repos/${slug.fullName}/issues/comments', IssueComment.fromJSON); } @@ -231,7 +231,7 @@ class IssuesService extends Service { /// /// API docs: https://developer.github.com/v3/issues/labels/#list-all-labels-for-this-repository Stream listLabels(RepositorySlug slug) { - return new PaginationHelper(_github) + return PaginationHelper(_github) .objects("GET", "/repos/${slug.fullName}/labels", IssueLabel.fromJSON); } @@ -275,7 +275,7 @@ class IssuesService extends Service { /// /// API docs: https://developer.github.com/v3/issues/labels/#list-all-labels-for-this-repository Stream listLabelsByIssue(RepositorySlug slug, int issueNumber) { - return new PaginationHelper(_github).objects( + return PaginationHelper(_github).objects( "GET", "/repos/${slug.fullName}/issues/$issueNumber/labels", IssueLabel.fromJSON); @@ -334,7 +334,7 @@ class IssuesService extends Service { /// /// API docs: https://developer.github.com/v3/issues/milestones/#list-milestones-for-a-repository Stream listMilestones(RepositorySlug slug) { - return new PaginationHelper(_github).objects( + return PaginationHelper(_github).objects( "GET", "/repos/${slug.fullName}/milestones", Milestone.fromJSON); } diff --git a/lib/src/common/misc_service.dart b/lib/src/common/misc_service.dart index f61061b1..369f094e 100644 --- a/lib/src/common/misc_service.dart +++ b/lib/src/common/misc_service.dart @@ -40,7 +40,7 @@ class MiscService extends Service { /// /// API docs: https://developer.github.com/v3/markdown/#render-an-arbitrary-markdown-document Future renderMarkdown(String input, - {String mode: "markdown", String context}) { + {String mode = "markdown", String context}) { return _github .request("POST", "/markdown", body: jsonEncode({"text": input, "mode": mode, "context": context})) diff --git a/lib/src/common/model/activity.dart b/lib/src/common/model/activity.dart index 416a3a58..6f539d69 100644 --- a/lib/src/common/model/activity.dart +++ b/lib/src/common/model/activity.dart @@ -22,7 +22,7 @@ class Event { static Event fromJSON(Map input) { if (input == null) return null; - var event = new Event(); + var event = Event(); event.json = input; @@ -54,7 +54,7 @@ class RepositorySubscription { static RepositorySubscription fromJSON(Map input) { if (input == null) return null; - return new RepositorySubscription() + return RepositorySubscription() ..subscribed = input['subscribed'] ..ignored = input['ignored'] ..reason = input['reason'] diff --git a/lib/src/common/model/authorizations.dart b/lib/src/common/model/authorizations.dart index c32b2fbd..b3b7f0b0 100644 --- a/lib/src/common/model/authorizations.dart +++ b/lib/src/common/model/authorizations.dart @@ -18,7 +18,7 @@ class Authorization { static Authorization fromJSON(Map input) { if (input == null) return null; - return new Authorization() + return Authorization() ..id = input['id'] ..scopes = input['scopes'] as List ..token = input['token'] @@ -46,7 +46,7 @@ class AuthorizationApplication { static AuthorizationApplication fromJSON(Map input) { if (input == null) return null; - return new AuthorizationApplication() + return AuthorizationApplication() ..url = input['url'] ..name = input['name'] ..clientID = input['client_id']; diff --git a/lib/src/common/model/gists.dart b/lib/src/common/model/gists.dart index 967b6ed0..52a411bc 100644 --- a/lib/src/common/model/gists.dart +++ b/lib/src/common/model/gists.dart @@ -30,7 +30,7 @@ class Gist { static Gist fromJSON(Map input) { if (input == null) return null; - var gist = new Gist() + var gist = Gist() ..id = input['id'] ..description = input['description'] ..public = input['public'] @@ -74,7 +74,7 @@ class GistFile { static GistFile fromJson(Map input) { if (input == null) return null; - return new GistFile() + return GistFile() ..name = input['name'] ..size = input['size'] ..rawUrl = input['raw_url'] @@ -99,7 +99,7 @@ class GistFork { static GistFork fromJson(Map input) { if (input == null) return null; - return new GistFork() + return GistFork() ..user = User.fromJson(input['user'] as Map) ..id = input['id'] ..createdAt = parseDateTime(input['created_at']) @@ -128,7 +128,7 @@ class GistHistoryEntry { static GistHistoryEntry fromJSON(Map input) { if (input == null) return null; - return new GistHistoryEntry() + return GistHistoryEntry() ..version = input['version'] ..user = User.fromJson(input['user'] as Map) ..deletions = input['change_status']['deletions'] @@ -154,7 +154,7 @@ class GistComment { static GistComment fromJSON(Map input) { if (input == null) return null; - return new GistComment() + return GistComment() ..id = input['id'] ..user = User.fromJson(input['user'] as Map) ..createdAt = parseDateTime(input['created_at']) diff --git a/lib/src/common/model/git.dart b/lib/src/common/model/git.dart index 4ee3f64b..598e1b9c 100644 --- a/lib/src/common/model/git.dart +++ b/lib/src/common/model/git.dart @@ -11,7 +11,7 @@ class GitBlob { static GitBlob fromJSON(Map input) { if (input == null) return null; - return new GitBlob() + return GitBlob() ..content = (input['content'] as String)?.trim() // includes newline? ..encoding = input['encoding'] ..url = input['url'] @@ -58,7 +58,7 @@ class GitCommit { static GitCommit fromJSON(Map input) { if (input == null) return null; - return new GitCommit.fromJson(input); + return GitCommit.fromJson(input); } } diff --git a/lib/src/common/model/issues.dart b/lib/src/common/model/issues.dart index 3a00fd4b..7ff8f73a 100644 --- a/lib/src/common/model/issues.dart +++ b/lib/src/common/model/issues.dart @@ -65,7 +65,7 @@ class Issue { input['labels'].cast>(); if (labels == null) labels = >[]; - return new Issue() + return Issue() ..id = input['id'] ..url = input['url'] ..htmlUrl = input['html_url'] @@ -131,7 +131,7 @@ class IssuePullRequest { static IssuePullRequest fromJSON(Map input) { if (input == null) return null; - return new IssuePullRequest() + return IssuePullRequest() ..htmlUrl = input['html_url'] ..diffUrl = input['diff_url'] ..patchUrl = input['patch_url']; @@ -161,7 +161,7 @@ class IssueComment { static IssueComment fromJSON(Map input) { if (input == null) return null; - return new IssueComment() + return IssueComment() ..id = input['id'] ..body = input['body'] ..user = User.fromJson(input['user'] as Map) @@ -187,7 +187,7 @@ class IssueLabel { assert(input['name'] != null); assert(input['color'] != null); - return new IssueLabel() + return IssueLabel() ..name = input['name'] ..color = input['color']; } @@ -239,7 +239,7 @@ class Milestone { static Milestone fromJSON(Map input) { if (input == null) return null; - return new Milestone() + return Milestone() ..id = input['id'] ..number = input['number'] ..state = input['state'] diff --git a/lib/src/common/model/keys.dart b/lib/src/common/model/keys.dart index 787b8cc7..617c5069 100644 --- a/lib/src/common/model/keys.dart +++ b/lib/src/common/model/keys.dart @@ -12,7 +12,7 @@ class PublicKey { static PublicKey fromJSON(Map input) { if (input == null) return null; - return new PublicKey() + return PublicKey() ..id = input['id'] ..key = input['key'] ..title = input['title']; diff --git a/lib/src/common/model/misc.dart b/lib/src/common/model/misc.dart index eeb275d7..e5c649c2 100644 --- a/lib/src/common/model/misc.dart +++ b/lib/src/common/model/misc.dart @@ -11,7 +11,7 @@ class GitignoreTemplate { static GitignoreTemplate fromJSON(Map input) { if (input == null) return null; - return new GitignoreTemplate() + return GitignoreTemplate() ..name = input['name'] ..source = input['source']; } @@ -33,9 +33,9 @@ class RateLimit { static RateLimit fromHeaders(Map headers) { var limit = int.parse(headers['x-ratelimit-limit']); var remaining = int.parse(headers['x-ratelimit-remaining']); - var resets = new DateTime.fromMillisecondsSinceEpoch( + var resets = DateTime.fromMillisecondsSinceEpoch( int.parse(headers['x-ratelimit-reset']) * 1000); - return new RateLimit(limit, remaining, resets); + return RateLimit(limit, remaining, resets); } } @@ -55,7 +55,7 @@ class APIStatus { static APIStatus fromJSON(Map input) { if (input == null) return null; - return new APIStatus() + return APIStatus() ..status = input['status'] ..message = input['body'] ..lastUpdatedAt = parseDateTime(input['last_updated']) diff --git a/lib/src/common/model/notifications.dart b/lib/src/common/model/notifications.dart index e186ab14..0b8a43a2 100644 --- a/lib/src/common/model/notifications.dart +++ b/lib/src/common/model/notifications.dart @@ -17,7 +17,7 @@ class Notification { static Notification fromJSON(Map input) { if (input == null) return null; - return new Notification() + return Notification() ..id = input['id'] ..repository = Repository.fromJSON(input['repository'] as Map) @@ -38,7 +38,7 @@ class NotificationSubject { static NotificationSubject fromJSON(Map input) { if (input == null) return null; - return new NotificationSubject() + return NotificationSubject() ..title = input['title'] ..type = input['type']; } diff --git a/lib/src/common/model/orgs.dart b/lib/src/common/model/orgs.dart index 3e7acd2e..ebedc7ab 100644 --- a/lib/src/common/model/orgs.dart +++ b/lib/src/common/model/orgs.dart @@ -58,7 +58,7 @@ class Organization { static Organization fromJSON(Map input) { if (input == null) return null; - return new Organization() + return Organization() ..login = input['login'] ..id = input['id'] ..htmlUrl = input['html_url'] @@ -85,7 +85,7 @@ class OrganizationMembership { static OrganizationMembership fromJSON(Map input) { if (input == null) return null; - return new OrganizationMembership() + return OrganizationMembership() ..organization = Organization.fromJSON(input['organization'] as Map) ..state = input['state']; @@ -117,7 +117,7 @@ class Team { static Team fromJSON(Map input) { if (input == null) return null; - return new Team() + return Team() ..name = input['name'] ..id = input['id'] ..membersCount = input['members_count'] @@ -164,7 +164,7 @@ class TeamMember { static TeamMember fromJSON(Map input) { if (input == null) return null; - var member = new TeamMember(); + var member = TeamMember(); member.login = input['login']; member.id = input['id']; member.avatarUrl = input['avatar_url']; diff --git a/lib/src/common/model/pulls.dart b/lib/src/common/model/pulls.dart index 52db9ab6..a81f46d0 100644 --- a/lib/src/common/model/pulls.dart +++ b/lib/src/common/model/pulls.dart @@ -60,7 +60,7 @@ class PullRequestInformation { [PullRequestInformation into]) { if (input == null) return null; - var pr = into != null ? into : new PullRequestInformation(); + var pr = into != null ? into : PullRequestInformation(); pr.head = PullRequestHead.fromJSON(input['head'] as Map); pr.base = PullRequestHead.fromJSON(input['base'] as Map); pr.htmlUrl = input['html_url']; @@ -117,7 +117,7 @@ class PullRequest extends PullRequestInformation { static PullRequest fromJSON(Map input) { if (input == null) return null; - PullRequest pr = PullRequestInformation.fromJSON(input, new PullRequest()); + PullRequest pr = PullRequestInformation.fromJSON(input, PullRequest()); pr.mergeable = input['mergeable']; pr.merged = input['merged']; pr.id = input['id']; @@ -143,7 +143,7 @@ class PullRequestMerge { static PullRequestMerge fromJSON(Map input) { if (input == null) return null; - return new PullRequestMerge() + return PullRequestMerge() ..merged = input['merged'] ..sha = input['sha'] ..message = input['message']; @@ -170,7 +170,7 @@ class PullRequestHead { static PullRequestHead fromJSON(Map input) { if (input == null) return null; - var head = new PullRequestHead(); + var head = PullRequestHead(); head.label = input['label']; head.ref = input['ref']; head.sha = input['sha']; @@ -244,7 +244,7 @@ class PullRequestComment { static PullRequestComment fromJSON(Map input) { if (input == null) return null; - return new PullRequestComment() + return PullRequestComment() ..id = input['id'] ..diffHunk = input['diff_hunk'] ..path = input['path'] @@ -258,7 +258,7 @@ class PullRequestComment { ..updatedAt = parseDateTime(input['updated_at']) ..url = input['html_url'] ..pullRequestUrl = input['pull_request_url'] - ..links = new Links.fromJson(input['_links'] as Map); + ..links = Links.fromJson(input['_links'] as Map); } } @@ -300,7 +300,7 @@ class PullRequestFile { String patch; static PullRequestFile fromJSON(Map input) { - var file = new PullRequestFile(); + var file = PullRequestFile(); file.sha = input['sha']; file.filename = input['filename']; file.status = input['status']; diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart index 1c2db534..f8269a55 100644 --- a/lib/src/common/model/repos.dart +++ b/lib/src/common/model/repos.dart @@ -128,7 +128,7 @@ class Repository { } /// Gets the Repository Slug (Full Name). - RepositorySlug slug() => new RepositorySlug(owner.login, name); + RepositorySlug slug() => RepositorySlug(owner.login, name); @override String toString() => 'Repository: ${owner.login}/$name'; @@ -258,7 +258,7 @@ class RepositorySlug { var split = f.split("/"); var o = split[0]; var n = (split..removeAt(0)).join("/"); - return new RepositorySlug(o, n); + return RepositorySlug(o, n); } /// The Full Name of the Repository @@ -355,7 +355,7 @@ class Branch { static Branch fromJSON(Map input) { if (input == null) return null; - return new Branch.fromJson(input); + return Branch.fromJson(input); } } @@ -393,7 +393,7 @@ class LanguageBreakdown { @override String toString() { - var buffer = new StringBuffer(); + var buffer = StringBuffer(); _data.forEach((key, value) { buffer.writeln("$key: $value"); }); diff --git a/lib/src/common/model/repos_commits.dart b/lib/src/common/model/repos_commits.dart index 01fb98ff..65de6edf 100644 --- a/lib/src/common/model/repos_commits.dart +++ b/lib/src/common/model/repos_commits.dart @@ -41,7 +41,7 @@ class RepositoryCommit { static RepositoryCommit fromJSON(Map input) { if (input == null) return null; - var commit = new RepositoryCommit() + var commit = RepositoryCommit() ..url = input['url'] ..sha = input['sha'] ..htmlUrl = input['html_url'] @@ -81,7 +81,7 @@ class CommitStats { static CommitStats fromJSON(Map input) { if (input == null) return null; - return new CommitStats() + return CommitStats() ..additions = input['additions'] ..deletions = input['deletions'] ..total = input['total']; @@ -111,7 +111,7 @@ class CommitFile { static CommitFile fromJSON(Map input) { if (input == null) return null; - return new CommitFile() + return CommitFile() ..name = input['filename'] ..additions = input['additions'] ..deletions = input['deletions'] diff --git a/lib/src/common/model/repos_contents.dart b/lib/src/common/model/repos_contents.dart index ad7527c5..bfe6eec7 100644 --- a/lib/src/common/model/repos_contents.dart +++ b/lib/src/common/model/repos_contents.dart @@ -52,7 +52,7 @@ class GitHubFile { [RepositorySlug slug]) { if (input == null) return null; - return new GitHubFile() + return GitHubFile() ..type = input['type'] ..encoding = input['encoding'] ..size = input['size'] @@ -64,7 +64,7 @@ class GitHubFile { ..sha = input['sha'] ..gitUrl = input['git_url'] ..htmlUrl = input['html_url'] - ..links = new Links.fromJson(input['_links'] as Map) + ..links = Links.fromJson(input['_links'] as Map) ..sourceRepository = slug; } } @@ -144,7 +144,7 @@ class ContentCreation { static ContentCreation fromJSON(Map input) { if (input == null) return null; - return new ContentCreation( + return ContentCreation( RepositoryCommit.fromJSON(input['commit'] as Map), GitHubFile.fromJSON(input['content'] as Map)); } diff --git a/lib/src/common/model/repos_hooks.dart b/lib/src/common/model/repos_hooks.dart index bad1cc5e..3a482afb 100644 --- a/lib/src/common/model/repos_hooks.dart +++ b/lib/src/common/model/repos_hooks.dart @@ -34,7 +34,7 @@ class Hook { static Hook fromJSON(String repoName, Map input) { if (input == null) return null; - return new Hook() + return Hook() ..events = input['events']?.cast() ..active = input['active'] ..name = input['name'] @@ -61,7 +61,7 @@ class CreateHook { final bool active; CreateHook(this.name, this.config, - {this.events: const ["push"], this.active: true}); + {this.events = const ["push"], this.active = true}); String toJSON() { return jsonEncode( diff --git a/lib/src/common/model/repos_pages.dart b/lib/src/common/model/repos_pages.dart index e916b619..7f778ea3 100644 --- a/lib/src/common/model/repos_pages.dart +++ b/lib/src/common/model/repos_pages.dart @@ -15,7 +15,7 @@ class RepositoryPages { static RepositoryPages fromJSON(Map input) { if (input == null) return null; - var pages = new RepositoryPages(); + var pages = RepositoryPages(); pages.cname = input['cname']; pages.status = input['status']; pages.hasCustom404 = input['custom_404']; diff --git a/lib/src/common/model/repos_stats.dart b/lib/src/common/model/repos_stats.dart index 358bef0a..b26e9746 100644 --- a/lib/src/common/model/repos_stats.dart +++ b/lib/src/common/model/repos_stats.dart @@ -59,7 +59,7 @@ class ContributorParticipation { static ContributorParticipation fromJSON(Map input) { if (input == null) return null; - return new ContributorParticipation() + return ContributorParticipation() ..all = input['all'] as List ..owner = input['owner'] as List; } @@ -79,7 +79,7 @@ class YearCommitCountWeek { static YearCommitCountWeek fromJSON(Map input) { if (input == null) return null; - var c = new YearCommitCountWeek(); + var c = YearCommitCountWeek(); c.days = input["days"] as List; c.total = input["total"]; c.timestamp = input["week"]; @@ -100,7 +100,7 @@ class WeeklyChangesCount { static WeeklyChangesCount fromJSON(Map input) { if (input == null) return null; - var c = new WeeklyChangesCount(); + var c = WeeklyChangesCount(); c.timestamp = input[0]; c.additions = input[1]; c.deletions = input[2]; @@ -121,7 +121,7 @@ class PunchcardEntry { static PunchcardEntry fromJSON(Map input) { if (input == null) return null; - var c = new PunchcardEntry(); + var c = PunchcardEntry(); c.weekday = input[0]; c.hour = input[1]; c.commits = input[2]; diff --git a/lib/src/common/model/repos_statuses.dart b/lib/src/common/model/repos_statuses.dart index bc096bf8..0fdc153c 100644 --- a/lib/src/common/model/repos_statuses.dart +++ b/lib/src/common/model/repos_statuses.dart @@ -13,7 +13,7 @@ class CombinedRepositoryStatus { static CombinedRepositoryStatus fromJSON(Map input) { if (input == null) return null; - return new CombinedRepositoryStatus() + return CombinedRepositoryStatus() ..state = input["state"] ..sha = input["sha"] ..totalCount = input["total_count"] @@ -37,7 +37,7 @@ class RepositoryStatus { static RepositoryStatus fromJSON(Map input) { if (input == null) return null; - return new RepositoryStatus() + return RepositoryStatus() ..createdAt = parseDateTime(input['created_at']) ..updatedAt = parseDateTime(input['updated_at']) ..state = input['state'] diff --git a/lib/src/common/orgs_service.dart b/lib/src/common/orgs_service.dart index f9eddfa7..817c05f2 100644 --- a/lib/src/common/orgs_service.dart +++ b/lib/src/common/orgs_service.dart @@ -17,7 +17,7 @@ class OrganizationsService extends Service { if (userName == null) { requestPath = "/user/orgs"; } - return new PaginationHelper(_github) + return PaginationHelper(_github) .objects("GET", requestPath, Organization.fromJSON); } @@ -28,7 +28,7 @@ class OrganizationsService extends Service { convert: Organization.fromJSON, statusCode: StatusCodes.OK, fail: (http.Response response) { if (response.statusCode == 404) { - throw new OrganizationNotFound(_github, name); + throw OrganizationNotFound(_github, name); } }); @@ -67,7 +67,7 @@ class OrganizationsService extends Service { /// /// API docs: https://developer.github.com/v3/orgs/teams/#list-teams Stream listTeams(String orgName) { - return new PaginationHelper(_github) + return PaginationHelper(_github) .objects("GET", "/orgs/$orgName/teams", Team.fromJSON); } @@ -120,7 +120,7 @@ class OrganizationsService extends Service { /// /// API docs: https://developer.github.com/v3/orgs/teams/#list-team-members Stream listTeamMembers(int teamId) { - return new PaginationHelper(_github) + return PaginationHelper(_github) .objects("GET", "/teams/$teamId/members", TeamMember.fromJSON); } @@ -158,19 +158,19 @@ class OrganizationsService extends Service { /// /// API docs: https://developer.github.com/v3/orgs/teams/#get-team-membership Future getTeamMembership(int teamId, String user) { - var completer = new Completer(); + var completer = Completer(); _github .getJSON("/teams/$teamId/memberships/$user", statusCode: 200, fail: (http.Response response) { if (response.statusCode == 404) { - completer.complete(new TeamMembershipState(null)); + completer.complete(TeamMembershipState(null)); } else { _github.handleStatusCode(response); } }, - convert: (json) => new TeamMembershipState(json['state'])) + convert: (json) => TeamMembershipState(json['state'])) .then(completer.complete); return completer.future; @@ -180,17 +180,17 @@ class OrganizationsService extends Service { /// /// API docs: https://developer.github.com/v3/orgs/teams/#get-team-membership Future addTeamMembership(int teamId, String user) { - var completer = new Completer(); + var completer = Completer(); _github.request("POST", "/teams/$teamId/memberships/$user", statusCode: 200, fail: (http.Response response) { if (response.statusCode == 404) { - completer.complete(new TeamMembershipState(null)); + completer.complete(TeamMembershipState(null)); } else { _github.handleStatusCode(response); } }).then((response) { - return new TeamMembershipState(jsonDecode(response.body)["state"]); + return TeamMembershipState(jsonDecode(response.body)["state"]); // TODO: Not sure what should go here. }).then(completer.complete); @@ -209,7 +209,7 @@ class OrganizationsService extends Service { /// /// API docs: https://developer.github.com/v3/orgs/teams/#list-team-repos Stream listTeamRepositories(int teamId) { - return new PaginationHelper(_github) + return PaginationHelper(_github) .objects("GET", "/teams/$teamId/repos", Repository.fromJSON); } @@ -250,7 +250,7 @@ class OrganizationsService extends Service { /// /// API docs: https://developer.github.com/v3/orgs/teams/#list-user-teams Stream listUserTeams() { - return new PaginationHelper(_github) + return PaginationHelper(_github) .objects("GET", "/user/teams", Team.fromJSON); } @@ -258,7 +258,7 @@ class OrganizationsService extends Service { /// /// API docs: https://developer.github.com/v3/orgs/hooks/#list-hooks Stream listHooks(String org) { - return new PaginationHelper(_github).objects("GET", "/orgs/$org/hooks", + return PaginationHelper(_github).objects("GET", "/orgs/$org/hooks", (Map input) => Hook.fromJSON(org, input)); } diff --git a/lib/src/common/pulls_service.dart b/lib/src/common/pulls_service.dart index 2837cd5a..805fd4fb 100644 --- a/lib/src/common/pulls_service.dart +++ b/lib/src/common/pulls_service.dart @@ -13,10 +13,10 @@ class PullRequestsService extends Service { Stream list(RepositorySlug slug, {int pages, String base, - String direction: 'desc', + String direction = 'desc', String head, - String sort: 'created', - String state: 'open'}) { + String sort = 'created', + String state = 'open'}) { var params = {}; putValue("base", base, params); putValue("direction", direction, params); @@ -24,7 +24,7 @@ class PullRequestsService extends Service { putValue("sort", sort, params); putValue("state", state, params); - return new PaginationHelper(_github).objects("GET", + return PaginationHelper(_github).objects("GET", "/repos/${slug.fullName}/pulls?state=$state", PullRequest.fromJSON, pages: pages, params: params); } @@ -68,14 +68,14 @@ class PullRequestsService extends Service { /// /// API docs: https://developer.github.com/v3/pulls/#list-commits-on-a-pull-request Stream listCommits(RepositorySlug slug, int number) { - return new PaginationHelper(_github).objects( + return PaginationHelper(_github).objects( "GET", '/repos/${slug.fullName}/pulls/$number/commits', RepositoryCommit.fromJSON); } Stream listFiles(RepositorySlug slug, int number) { - return new PaginationHelper(_github).objects( + return PaginationHelper(_github).objects( "GET", '/repos/${slug.fullName}/pulls/$number/files', PullRequestFile.fromJSON) as Stream; @@ -114,7 +114,7 @@ class PullRequestsService extends Service { /// API docs: https://developer.github.com/v3/pulls/comments/#list-comments-on-a-pull-request Stream listCommentsByPullRequest( RepositorySlug slug, int number) { - return new PaginationHelper(_github).objects( + return PaginationHelper(_github).objects( "GET", "/repos/${slug.fullName}/pulls/$number/comments", PullRequestComment.fromJSON); @@ -124,7 +124,7 @@ class PullRequestsService extends Service { /// /// API docs: https://developer.github.com/v3/pulls/comments/#list-comments-in-a-repository Stream listComments(RepositorySlug slug) { - return new PaginationHelper(_github).objects("GET", + return PaginationHelper(_github).objects("GET", "/repos/${slug.fullName}/pulls/comments", PullRequestComment.fromJSON); } diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 5a1f2b1e..a116e5e1 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -11,12 +11,12 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/#list-your-repositories Stream listRepositories( - {String type: "owner", - String sort: "full_name", - String direction: "asc"}) { + {String type = "owner", + String sort = "full_name", + String direction = "asc"}) { var params = {"type": type, "sort": sort, "direction": direction}; - return new PaginationHelper(_github) + return PaginationHelper(_github) .objects("GET", "/user/repos", Repository.fromJSON, params: params); } @@ -24,12 +24,12 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/#list-user-repositories Stream listUserRepositories(String user, - {String type: "owner", - String sort: "full_name", - String direction: "asc"}) { + {String type = "owner", + String sort = "full_name", + String direction = "asc"}) { var params = {"type": type, "sort": sort, "direction": direction}; - return new PaginationHelper(_github).objects( + return PaginationHelper(_github).objects( "GET", "/users/$user/repos", Repository.fromJSON, params: params); } @@ -38,12 +38,12 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/#list-user-repositories Stream listOrganizationRepositories(String org, - {String type: "all"}) { + {String type = "all"}) { var params = { "type": type, }; - return new PaginationHelper(_github).objects( + return PaginationHelper(_github).objects( "GET", "/orgs/$org/repos", Repository.fromJSON, params: params); } @@ -55,7 +55,7 @@ class RepositoriesService extends Service { /// If [limit] is null, it will fetch ALL the repositories on GitHub. /// /// API docs: https://developer.github.com/v3/repos/#list-all-public-repositories - Stream listPublicRepositories({int limit: 50, DateTime since}) { + Stream listPublicRepositories({int limit = 50, DateTime since}) { var params = {}; if (since != null) { @@ -64,7 +64,7 @@ class RepositoriesService extends Service { var pages = limit != null ? (limit / 30).ceil() : null; - return new PaginationHelper(_github) + return PaginationHelper(_github) .fetchStreamed("GET", "/repositories", pages: pages, params: params) .expand((http.Response response) { var list = jsonDecode(response.body) as List>; @@ -91,7 +91,7 @@ class RepositoriesService extends Service { Future getLicense(RepositorySlug slug) => _github.getJSON("/repos/${slug.owner}/${slug.name}/license", - convert: (json) => new LicenseDetails.fromJson(json)); + convert: (json) => LicenseDetails.fromJson(json)); /// Fetches the repository specified by the [slug]. /// @@ -101,7 +101,7 @@ class RepositoriesService extends Service { convert: Repository.fromJSON, statusCode: StatusCodes.OK, fail: (http.Response response) { if (response.statusCode == 404) { - throw new RepositoryNotFound(_github, slug.fullName); + throw RepositoryNotFound(_github, slug.fullName); } }); @@ -152,8 +152,8 @@ class RepositoriesService extends Service { /// Lists the contributors of the specified repository. /// /// API docs: https://developer.github.com/v3/repos/#list-contributors - Stream listContributors(RepositorySlug slug, {bool anon: false}) { - return new PaginationHelper(_github).objects( + Stream listContributors(RepositorySlug slug, {bool anon = false}) { + return PaginationHelper(_github).objects( 'GET', '/repos/${slug.fullName}/contributors', User.fromJson, params: {"anon": anon.toString()}); } @@ -162,7 +162,7 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/#list-teams Stream listTeams(RepositorySlug slug) { - return new PaginationHelper(_github) + return PaginationHelper(_github) .objects('GET', '/repos/${slug.fullName}/teams', Team.fromJSON); } @@ -173,21 +173,21 @@ class RepositoriesService extends Service { _github.getJSON("/repos/${slug.fullName}/languages", statusCode: StatusCodes.OK, convert: (Map input) => - new LanguageBreakdown(input.cast())); + LanguageBreakdown(input.cast())); /// Lists the tags of the specified repository. /// /// API docs: https://developer.github.com/v3/repos/#list-tags Stream listTags(RepositorySlug slug) { - return new PaginationHelper(_github).objects( - 'GET', '/repos/${slug.fullName}/tags', (j) => new Tag.fromJson(j)); + return PaginationHelper(_github) + .objects('GET', '/repos/${slug.fullName}/tags', (j) => Tag.fromJson(j)); } /// Lists the branches of the specified repository. /// /// API docs: https://developer.github.com/v3/repos/#list-branches Stream listBranches(RepositorySlug slug) { - return new PaginationHelper(_github) + return PaginationHelper(_github) .objects('GET', '/repos/${slug.fullName}/branches', Branch.fromJSON); } @@ -202,7 +202,7 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/collaborators/#list Stream listCollaborators(RepositorySlug slug) { - return new PaginationHelper(_github) + return PaginationHelper(_github) .objects("GET", "/repos/${slug.fullName}/collaborators", User.fromJson); } @@ -241,7 +241,7 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/commits/#list-commits-on-a-repository Stream listCommits(RepositorySlug slug) { - return new PaginationHelper(_github).objects( + return PaginationHelper(_github).objects( "GET", "/repos/${slug.fullName}/commits", RepositoryCommit.fromJSON); } @@ -259,7 +259,7 @@ class RepositoriesService extends Service { Future compareCommits( RepositorySlug slug, String refBase, String refHead) => _github.getJSON("/repos/${slug.fullName}/compare/$refBase...$refHead", - convert: (j) => new GitHubComparison.fromJson(j)); + convert: (j) => GitHubComparison.fromJson(j)); /// Fetches the readme file for a repository. /// @@ -281,7 +281,7 @@ class RepositoriesService extends Service { statusCode: StatusCodes.OK, fail: (http.Response response) { if (response.statusCode == 404) { - throw new NotFound(_github, response.body); + throw NotFound(_github, response.body); } }, convert: (Map input) => @@ -312,13 +312,13 @@ class RepositoriesService extends Service { } return _github.getJSON(url, convert: (input) { - var contents = new RepositoryContents(); + var contents = RepositoryContents(); if (input is Map) { // Weird one-off. If the content of `input` is JSON w/ a message // it was likely a 404 – but we don't have the status code here // But we can guess an the JSON content if (input.containsKey('message')) { - throw new GitHubError(_github, input['message'], + throw GitHubError(_github, input['message'], apiUrl: input['documentation_url']); } contents.file = GitHubFile.fromJSON(input as Map); @@ -379,7 +379,7 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/contents/#get-archive-link Future getArchiveLink(RepositorySlug slug, String ref, - {String format: "tarball"}) { + {String format = "tarball"}) { return _github .request("GET", "/repos/${slug.fullName}/$format/$ref", statusCode: 302) .then((response) { @@ -391,7 +391,7 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/forks/#list-forks Stream listForks(RepositorySlug slug) { - return new PaginationHelper(_github) + return PaginationHelper(_github) .objects("GET", "/repos/${slug.fullName}/forks", Repository.fromJSON); } @@ -399,7 +399,7 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/forks/#create-a-fork Future createFork(RepositorySlug slug, [CreateFork fork]) { - if (fork == null) fork = new CreateFork(); + if (fork == null) fork = CreateFork(); return _github.postJSON("/repos/${slug.fullName}/forks", body: fork.toJSON(), convert: Repository.fromJSON); } @@ -408,7 +408,7 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/hooks/#list-hooks Stream listHooks(RepositorySlug slug) { - return new PaginationHelper(_github).objects( + return PaginationHelper(_github).objects( "GET", "/repos/${slug.fullName}/hooks", (Map input) => Hook.fromJSON(slug.fullName, input)); @@ -464,7 +464,7 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/keys/#list Stream listDeployKeys(RepositorySlug slug) { - return new PaginationHelper(_github) + return PaginationHelper(_github) .objects("GET", "/repos/${slug.fullName}/keys", PublicKey.fromJSON); } @@ -504,7 +504,7 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/releases/#list-releases-for-a-repository Stream listReleases(RepositorySlug slug) { - return new PaginationHelper(_github) + return PaginationHelper(_github) .objects("GET", "/repos/${slug.fullName}/releases", Release.fromJson); } @@ -558,7 +558,7 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/statistics/#commit-activity Stream listCommitActivity(RepositorySlug slug) { - return new PaginationHelper(_github).objects( + return PaginationHelper(_github).objects( "GET", "/repos/${slug.fullName}/stats/commit_activity", YearCommitCountWeek.fromJSON); @@ -568,7 +568,7 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/statistics/#code-frequency Stream listCodeFrequency(RepositorySlug slug) { - return new PaginationHelper(_github).objects( + return PaginationHelper(_github).objects( "GET", "/repos/${slug.fullName}/stats/code_frequency", WeeklyChangesCount.fromJSON); @@ -585,7 +585,7 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/statistics/#punch-card Stream listPunchcard(RepositorySlug slug) { - return new PaginationHelper(_github).objects("GET", + return PaginationHelper(_github).objects("GET", "/repos/${slug.fullName}/stats/punchcard", PunchcardEntry.fromJSON); } @@ -594,7 +594,7 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/statuses/#list-statuses-for-a-specific-ref Stream listStatuses(RepositorySlug slug, String ref) { - return new PaginationHelper(_github).objects( + return PaginationHelper(_github).objects( "GET", "/repos/${slug.fullName}/commits/$ref/statuses", RepositoryStatus.fromJSON); diff --git a/lib/src/common/search_service.dart b/lib/src/common/search_service.dart index fc4b3424..b9bc5da5 100644 --- a/lib/src/common/search_service.dart +++ b/lib/src/common/search_service.dart @@ -11,24 +11,24 @@ class SearchService extends Service { /// Since the Search Rate Limit is small, this is a best effort implementation. /// /// API docs: https://developer.github.com/v3/search/#search-repositories - Stream repositories(String query, {String sort, int pages: 2}) { + Stream repositories(String query, {String sort, int pages = 2}) { var params = {"q": query}; if (sort != null) { params["sort"] = sort; } - var controller = new StreamController(); + var controller = StreamController(); var isFirst = true; - new PaginationHelper(_github) + PaginationHelper(_github) .fetchStreamed("GET", "/search/repositories", params: params, pages: pages) .listen((response) { if (response.statusCode == 403 && response.body.contains("rate limit") && isFirst) { - throw new RateLimitHit(_github); + throw RateLimitHit(_github); } isFirst = false; @@ -72,8 +72,8 @@ class SearchService extends Service { String fork, String path, String size, - bool inFile: true, - bool inPath: false, + bool inFile = true, + bool inPath = false, }) { // Add qualifiers to the query // Known Issue: If a query already has a qualifier and the same @@ -112,7 +112,7 @@ class SearchService extends Service { params['per_page'] = perPage.toString(); } - return new PaginationHelper(_github) + return PaginationHelper(_github) .fetchStreamed("GET", "/search/code", params: params, pages: pages) .map((r) => CodeSearchResults.fromJson(json.decode(r.body))); } @@ -130,7 +130,7 @@ class SearchService extends Service { /// /// API docs: https://developer.github.com/v3/search/#search-users Stream users(String query, - {String sort, int pages: 2, int perPage: 30}) { + {String sort, int pages = 2, int perPage = 30}) { var params = {"q": query}; if (sort != null) { @@ -139,17 +139,17 @@ class SearchService extends Service { params["per_page"] = perPage.toString(); - var controller = new StreamController(); + var controller = StreamController(); var isFirst = true; - new PaginationHelper(_github) + PaginationHelper(_github) .fetchStreamed("GET", "/search/users", params: params, pages: pages) .listen((response) { if (response.statusCode == 403 && response.body.contains("rate limit") && isFirst) { - throw new RateLimitHit(_github); + throw RateLimitHit(_github); } isFirst = false; diff --git a/lib/src/common/url_shortener_service.dart b/lib/src/common/url_shortener_service.dart index 7af62807..c8fd9406 100644 --- a/lib/src/common/url_shortener_service.dart +++ b/lib/src/common/url_shortener_service.dart @@ -22,7 +22,7 @@ class UrlShortenerService extends Service { .request("POST", "http://git.io/", params: params) .then((response) { if (response.statusCode != StatusCodes.CREATED) { - throw new GitHubError(_github, "Failed to create shortened url!"); + throw GitHubError(_github, "Failed to create shortened url!"); } return response.headers["Location"].split("/").last; diff --git a/lib/src/common/users_service.dart b/lib/src/common/users_service.dart index dc2c7aea..2e225d2b 100644 --- a/lib/src/common/users_service.dart +++ b/lib/src/common/users_service.dart @@ -55,7 +55,7 @@ class UsersService extends Service { _github.getJSON("/user", statusCode: StatusCodes.OK, fail: (http.Response response) { if (response.statusCode == StatusCodes.FORBIDDEN) { - throw new AccessForbidden(_github); + throw AccessForbidden(_github); } }, convert: CurrentUser.fromJSON); @@ -70,21 +70,20 @@ class UsersService extends Service { /// /// API docs: https://developer.github.com/v3/users/#get-all-users Stream listUsers({int pages, int since}) => - new PaginationHelper(_github).objects("GET", "/users", User.fromJson, + PaginationHelper(_github).objects("GET", "/users", User.fromJson, pages: pages, params: {"since": since}); /// Lists all email addresses for the currently authenticated user. /// /// API docs: https://developer.github.com/v3/users/emails/#list-email-addresses-for-a-user - Stream listEmails() => new PaginationHelper(_github) + Stream listEmails() => PaginationHelper(_github) .objects("GET", "/user/emails", UserEmail.fromJSON); /// Add Emails /// /// API docs: https://developer.github.com/v3/users/emails/#add-email-addresses - Stream addEmails(List emails) => - new PaginationHelper(_github).objects( - "POST", "/user/emails", UserEmail.fromJSON, + Stream addEmails(List emails) => PaginationHelper(_github) + .objects("POST", "/user/emails", UserEmail.fromJSON, statusCode: 201, body: jsonEncode(emails)); /// Delete Emails @@ -98,7 +97,7 @@ class UsersService extends Service { /// List user followers. /// /// API docs: https://developer.github.com/v3/users/followers/#list-followers-of-a-user - Stream listUserFollowers(String user) => new PaginationHelper(_github) + Stream listUserFollowers(String user) => PaginationHelper(_github) .objects("GET", "/users/$user/followers", User.fromJson, statusCode: 200); /// Check if the current user is following the specified user. @@ -134,7 +133,7 @@ class UsersService extends Service { /// List current user followers. /// /// API docs: https://developer.github.com/v3/users/followers/#list-followers-of-a-user - Stream listCurrentUserFollowers() => new PaginationHelper(_github) + Stream listCurrentUserFollowers() => PaginationHelper(_github) .objects("GET", "/user/followers", User.fromJson, statusCode: 200); /// Lists the verified public keys for a [userLogin]. If no [userLogin] is specified, @@ -144,8 +143,7 @@ class UsersService extends Service { /// and https://developer.github.com/v3/users/keys/#list-your-public-keys Stream listPublicKeys([String userLogin]) { var path = userLogin == null ? "/user/keys" : "/users/$userLogin/keys"; - return new PaginationHelper(_github) - .objects("GET", path, PublicKey.fromJSON); + return PaginationHelper(_github).objects("GET", path, PublicKey.fromJSON); } // TODO: Implement getPublicKey: https://developer.github.com/v3/users/keys/#get-a-single-public-key diff --git a/lib/src/common/util/json.dart b/lib/src/common/util/json.dart index 58a9eef4..577a8eac 100644 --- a/lib/src/common/util/json.dart +++ b/lib/src/common/util/json.dart @@ -1,4 +1,4 @@ part of github.common; /// Creates a Model Object from the JSON [input] -typedef T JSONConverter(S input); +typedef JSONConverter = T Function(S input); diff --git a/lib/src/common/util/oauth2.dart b/lib/src/common/util/oauth2.dart index a5cda211..92edd3e0 100644 --- a/lib/src/common/util/oauth2.dart +++ b/lib/src/common/util/oauth2.dart @@ -36,10 +36,10 @@ class OAuth2Flow { OAuth2Flow(this.clientId, this.clientSecret, {String redirectUri, - this.scopes: const [], + this.scopes = const [], this.state, this.github, - this.baseUrl: "https://github.com/login/oauth"}) + this.baseUrl = "https://github.com/login/oauth"}) : this.redirectUri = redirectUri == null ? null : _checkRedirectUri(redirectUri); @@ -79,14 +79,14 @@ class OAuth2Flow { "redirect_uri": redirectUri }); - return (github == null ? new http.Client() : github.client) + return (github == null ? http.Client() : github.client) .post("$baseUrl/access_token", body: body, headers: headers) .then((response) { var json = jsonDecode(response.body) as Map; if (json['error'] != null) { throw json; } - return new ExchangeResponse(json['access_token'], json['token_type'], + return ExchangeResponse(json['access_token'], json['token_type'], (json['scope'] as String).split(",")); }); } diff --git a/lib/src/common/util/pagination.dart b/lib/src/common/util/pagination.dart index 61a45637..299469ab 100644 --- a/lib/src/common/util/pagination.dart +++ b/lib/src/common/util/pagination.dart @@ -16,13 +16,13 @@ class PaginationHelper { Map headers, Map params, String body, - int statusCode: 200}) async* { + int statusCode = 200}) async* { int count = 0; if (params == null) { params = {}; } else { - params = new Map.from(params); + params = Map.from(params); } assert(!params.containsKey('page')); @@ -67,7 +67,7 @@ class PaginationHelper { Map headers, Map params, String body, - int statusCode: 200, + int statusCode = 200, String preview}) async* { if (headers == null) headers = {}; if (preview != null) { @@ -95,7 +95,7 @@ class PaginationHelper { Map headers, Map params, String body, - int statusCode: 200, + int statusCode = 200, String preview}) { return jsonObjects(method, path, pages: pages, @@ -114,7 +114,7 @@ Map parseLinkHeader(String input) { var parts = input.split(", "); for (var part in parts) { if (part[0] != "<") { - throw new FormatException("Invalid Link Header"); + throw FormatException("Invalid Link Header"); } var kv = part.split("; "); var url = kv[0].substring(1); diff --git a/lib/src/common/util/utils.dart b/lib/src/common/util/utils.dart index fbe31ba0..41204ce3 100644 --- a/lib/src/common/util/utils.dart +++ b/lib/src/common/util/utils.dart @@ -28,7 +28,7 @@ RepositorySlug slugFromAPIUrl(String url) { var split = url.split("/"); var i = split.indexOf("repos") + 1; var parts = split.sublist(i, i + 2); - return new RepositorySlug(parts[0], parts[1]); + return RepositorySlug(parts[0], parts[1]); } abstract class StatusCodes { diff --git a/lib/src/server/hooks.dart b/lib/src/server/hooks.dart index 70dc9c63..3b2dcc1f 100644 --- a/lib/src/server/hooks.dart +++ b/lib/src/server/hooks.dart @@ -7,7 +7,7 @@ import "../common.dart"; class HookMiddleware { // TODO: Close this, but where? final StreamController _eventController = - new StreamController(); + StreamController(); Stream get onEvent => _eventController.stream; void handleHookRequest(HttpRequest request) { @@ -26,7 +26,7 @@ class HookMiddleware { } request.transform(const Utf8Decoder()).join().then((content) { - _eventController.add(new HookEvent.fromJSON( + _eventController.add(HookEvent.fromJSON( request.headers.value("X-GitHub-Event"), jsonDecode(content) as Map)); request.response @@ -76,7 +76,7 @@ class HookEvent { } else if (event == "repository") { return RepositoryEvent.fromJSON(json); } - return new UnknownHookEvent(event, json); + return UnknownHookEvent(event, json); } } @@ -93,7 +93,7 @@ class RepositoryEvent extends HookEvent { User sender; static RepositoryEvent fromJSON(Map json) { - return new RepositoryEvent() + return RepositoryEvent() ..action = json["action"] ..repository = Repository.fromJSON(json["repository"] as Map) @@ -107,7 +107,7 @@ class IssueCommentEvent extends HookEvent { IssueComment comment; static IssueCommentEvent fromJSON(Map json) { - return new IssueCommentEvent() + return IssueCommentEvent() ..action = json["action"] ..issue = Issue.fromJSON(json["issue"] as Map) ..comment = @@ -120,7 +120,7 @@ class ForkEvent extends HookEvent { User sender; static ForkEvent fromJSON(Map json) { - return new ForkEvent() + return ForkEvent() ..forkee = Repository.fromJSON(json["forkee"] as Map) ..sender = User.fromJson(json["sender"] as Map); } @@ -135,7 +135,7 @@ class IssueEvent extends HookEvent { Repository repository; static IssueEvent fromJSON(Map json) { - return new IssueEvent() + return IssueEvent() ..action = json["action"] ..assignee = User.fromJson(json["assignee"] as Map) ..label = IssueLabel.fromJSON(json["label"] as Map) @@ -154,7 +154,7 @@ class PullRequestEvent extends HookEvent { Repository repository; static PullRequestEvent fromJSON(Map json) { - return new PullRequestEvent() + return PullRequestEvent() ..action = json["action"] ..number = json["number"] ..repository = diff --git a/lib/src/util.dart b/lib/src/util.dart index 3edfac1a..bad6f348 100644 --- a/lib/src/util.dart +++ b/lib/src/util.dart @@ -1,7 +1,7 @@ -final RegExp githubDateRemoveRegExp = new RegExp(r'\.\d*'); +final RegExp githubDateRemoveRegExp = RegExp(r'\.\d*'); String buildQueryString(Map params) { - var queryString = new StringBuffer(); + var queryString = StringBuffer(); if (params.isNotEmpty && !params.values.every((value) => value == null)) { queryString.write("?"); @@ -23,9 +23,9 @@ String buildQueryString(Map params) { dynamic copyOf(dynamic input) { if (input is Iterable) { - return new List.from(input); + return List.from(input); } else if (input is Map) { - return new Map.from(input); + return Map.from(input); } else { throw "type could not be copied"; } @@ -42,7 +42,7 @@ void putValue(String name, dynamic value, Map map) { List> mapToList(Map input) { var out = >[]; for (var key in input.keys) { - out.add(new MapEntry(key, input[key])); + out.add(MapEntry(key, input[key])); } return out; } diff --git a/test/code_search_test.dart b/test/code_search_test.dart index be02d802..7b437a0c 100644 --- a/test/code_search_test.dart +++ b/test/code_search_test.dart @@ -3,7 +3,7 @@ import 'package:github/server.dart'; Future main() async { print('Searching ...'); - GitHub github = new GitHub(); + GitHub github = GitHub(); Stream resultsStream = github.search .code('github', repo: 'DirectMyFile/github.dart', perPage: 5, pages: 1); diff --git a/test/data_object_test.dart b/test/data_object_test.dart index 76819cec..b6915f69 100644 --- a/test/data_object_test.dart +++ b/test/data_object_test.dart @@ -33,7 +33,7 @@ void main() { test('License round-trip', () { var licenseJson = jsonDecode(_licenseJson) as Map; - var instance = new LicenseDetails.fromJson(licenseJson); + var instance = LicenseDetails.fromJson(licenseJson); var toJson = instance.toJson(); diff --git a/test/experiment/crawler.dart b/test/experiment/crawler.dart index a52454ab..44f1f8d6 100644 --- a/test/experiment/crawler.dart +++ b/test/experiment/crawler.dart @@ -1,10 +1,10 @@ import "package:github/server.dart"; void main() { - var github = new GitHub(auth: new Authentication.anonymous()); + var github = GitHub(auth: Authentication.anonymous()); - var crawler = new RepositoryCrawler( - github, new RepositorySlug.full("DirectMyFile/github.dart")); + var crawler = RepositoryCrawler( + github, RepositorySlug.full("DirectMyFile/github.dart")); crawler.crawl().listen((file) { print(file.path); diff --git a/test/experiment/error_handling.dart b/test/experiment/error_handling.dart index 80492d28..776d703a 100644 --- a/test/experiment/error_handling.dart +++ b/test/experiment/error_handling.dart @@ -7,7 +7,7 @@ import '../helper.dart'; void main() { var github = createGitHubClient(); - var response = new MockResponse( + var response = MockResponse( jsonEncode({ "message": "Invalid Entity", "errors": [ diff --git a/test/experiment/files.dart b/test/experiment/files.dart index 31fc0ca4..3fa7c11e 100755 --- a/test/experiment/files.dart +++ b/test/experiment/files.dart @@ -1,11 +1,11 @@ import "package:github/server.dart"; void main() { - var github = new GitHub(); + var github = GitHub(); github.repositories .getContents( - new RepositorySlug("DirectMyFile", "github.dart"), "pubspec.yaml") + RepositorySlug("DirectMyFile", "github.dart"), "pubspec.yaml") .then((contents) => contents.file) .then((file) => print(file.text)) .then((_) => github.dispose()); diff --git a/test/experiment/limit_pager.dart b/test/experiment/limit_pager.dart index b6cfb375..317010a7 100755 --- a/test/experiment/limit_pager.dart +++ b/test/experiment/limit_pager.dart @@ -11,22 +11,21 @@ const int ACCURACY_RANGE = 5; /// Solves the most efficient way to fetch the number of objects [limit] with the least requests. PaginationInformation solve(int limit) { if (limit < 0) { - throw new RangeError("limit cannot be less than zero (was $limit)"); + throw RangeError("limit cannot be less than zero (was $limit)"); } if (limit < MAX_PER_PAGE) { - return new PaginationInformation(limit, 1, limit); + return PaginationInformation(limit, 1, limit); } if ((limit % MAX_PER_PAGE) == 0) { - return new PaginationInformation( - limit, limit ~/ MAX_PER_PAGE, MAX_PER_PAGE); + return PaginationInformation(limit, limit ~/ MAX_PER_PAGE, MAX_PER_PAGE); } int itemsPerPage = 100; int pages = (limit / itemsPerPage).ceil(); - return new PaginationInformation(limit, pages, itemsPerPage); + return PaginationInformation(limit, pages, itemsPerPage); } class PaginationInformation { diff --git a/test/experiment/readme.dart b/test/experiment/readme.dart index e08b1521..0ccd1125 100755 --- a/test/experiment/readme.dart +++ b/test/experiment/readme.dart @@ -4,7 +4,7 @@ void main() { var github = createGitHubClient(); github.repositories - .getReadme(new RepositorySlug("DirectMyFile", "github.dart")) + .getReadme(RepositorySlug("DirectMyFile", "github.dart")) .then((file) => github.misc.renderMarkdown(file.text)) .then((html) => print(html)) .then((_) => github.dispose()); diff --git a/test/git_integration_test.dart b/test/git_integration_test.dart index ef99f2af..ea74bd28 100644 --- a/test/git_integration_test.dart +++ b/test/git_integration_test.dart @@ -22,8 +22,8 @@ void main() { var repoOwner = Platform.environment['GITHUB_DART_TEST_REPO_OWNER']; var repoName = Platform.environment['GITHUB_DART_TEST_REPO_NAME']; - github = createGitHubClient(auth: new Authentication.withToken(authToken)); - slug = new RepositorySlug(repoOwner, repoName); + github = createGitHubClient(auth: Authentication.withToken(authToken)); + slug = RepositorySlug(repoOwner, repoName); }); tearDownAll(() { @@ -38,7 +38,7 @@ void main() { }); test('create and get a new blob', () async { - var newBlob = new CreateGitBlob('bbb', 'utf-8'); + var newBlob = CreateGitBlob('bbb', 'utf-8'); // createBlob() var createdBlob = await github.git.createBlob(slug, newBlob); @@ -59,12 +59,12 @@ void main() { }); test('create and get a new tree', () async { - var entry1 = new CreateGitTreeEntry('README.md', '100644', 'blob', + var entry1 = CreateGitTreeEntry('README.md', '100644', 'blob', content: 'This is a repository for integration tests.'); - var entry2 = new CreateGitTreeEntry('subdir/asdf.txt', '100644', 'blob', + var entry2 = CreateGitTreeEntry('subdir/asdf.txt', '100644', 'blob', content: 'Some file in a folder.'); - var newTree = new CreateGitTree([entry1, entry2]) + var newTree = CreateGitTree([entry1, entry2]) ..baseTree = firstCommitTreeSha; // createTree() @@ -79,7 +79,7 @@ void main() { }); test('create and get a new commit', () async { - var newCommit = new CreateGitCommit('My test commit', createdTreeSha) + var newCommit = CreateGitCommit('My test commit', createdTreeSha) ..parents = [firstCommitSha]; // createCommit() @@ -113,8 +113,8 @@ void main() { test('create and get a new tag', () async { var tagName = 'v${_randomGitName()}'; - var newTag = new CreateGitTag(tagName, 'Version 0.0.1', createdCommitSha, - 'commit', new GitCommitUser('aName', 'aEmail', new DateTime.now())); + var newTag = CreateGitTag(tagName, 'Version 0.0.1', createdCommitSha, + 'commit', GitCommitUser('aName', 'aEmail', DateTime.now())); // createTag() var createdTag = await github.git.createTag(slug, newTag); @@ -138,7 +138,7 @@ void main() { var count = issues.length; - var issueRequest = new IssueRequest() + var issueRequest = IssueRequest() ..title = 'new issue - ${_randomGitName()}'; await github.issues.create(slug, issueRequest); @@ -157,7 +157,7 @@ void main() { } String _randomGitName() { - var now = new DateTime.now().toIso8601String().replaceAll(':', '_'); + var now = DateTime.now().toIso8601String().replaceAll(':', '_'); return now.toString(); } diff --git a/test/git_test.dart b/test/git_test.dart index 024140e6..759d9dcb 100644 --- a/test/git_test.dart +++ b/test/git_test.dart @@ -18,9 +18,9 @@ void main() { var someSha = 'someSHA'; setUp(() { - github = new MockGitHub(); - git = new GitService(github); - repo = new RepositorySlug('o', 'n'); + github = MockGitHub(); + git = GitService(github); + repo = RepositorySlug('o', 'n'); }); group('getBlob()', () { @@ -34,7 +34,7 @@ void main() { group('createBlob()', () { test('constructs correct path', () { - CreateGitBlob blob = new CreateGitBlob('bbb', 'utf-8'); + CreateGitBlob blob = CreateGitBlob('bbb', 'utf-8'); git.createBlob(repo, blob); verify(github.postJSON('/repos/o/n/git/blobs', @@ -44,7 +44,7 @@ void main() { }); test('creates valid JSON body', () { - CreateGitBlob blob = new CreateGitBlob('bbb', 'utf-8'); + CreateGitBlob blob = CreateGitBlob('bbb', 'utf-8'); git.createBlob(repo, blob); var body = captureSentBody(github); @@ -64,7 +64,7 @@ void main() { group('createCommit()', () { test('constructs correct path', () { - CreateGitCommit commit = new CreateGitCommit('aMessage', 'aTreeSha'); + CreateGitCommit commit = CreateGitCommit('aMessage', 'aTreeSha'); git.createCommit(repo, commit); verify(github.postJSON('/repos/o/n/git/commits', @@ -77,10 +77,10 @@ void main() { // given String date = '2014-10-02T15:21:29Z'; - CreateGitCommit commit = new CreateGitCommit('aMessage', 'aTreeSha') + CreateGitCommit commit = CreateGitCommit('aMessage', 'aTreeSha') ..parents = ['parentSha1', 'parentSha2'] - ..committer = new GitCommitUser('cName', 'cEmail', parseDateTime(date)) - ..author = new GitCommitUser('aName', 'aEmail', parseDateTime(date)); + ..committer = GitCommitUser('cName', 'cEmail', parseDateTime(date)) + ..author = GitCommitUser('aName', 'aEmail', parseDateTime(date)); // when git.createCommit(repo, commit); @@ -131,10 +131,10 @@ void main() { group('editReference()', () { test('constructs correct path', () { // given - http.Response expectedResponse = new http.Response('{}', 200); + http.Response expectedResponse = http.Response('{}', 200); when(github.request(any, any, body: any, headers: any)) - .thenReturn(new Future.value(expectedResponse)); + .thenReturn(Future.value(expectedResponse)); // when git.editReference(repo, 'heads/b', someSha); @@ -146,9 +146,9 @@ void main() { test('creates valid JSON body', () { // given - http.Response expectedResponse = new http.Response('{}', 200); + http.Response expectedResponse = http.Response('{}', 200); when(github.request(any, any, body: any, headers: any)) - .thenReturn(new Future.value(expectedResponse)); + .thenReturn(Future.value(expectedResponse)); // when git.editReference(repo, 'heads/b', someSha, force: true); @@ -170,9 +170,8 @@ void main() { group('deleteReference()', () { test('constructs correct path', () { // given - http.Response expectedResponse = new http.Response('{}', 200); - when(github.request(any, any)) - .thenReturn(new Future.value(expectedResponse)); + http.Response expectedResponse = http.Response('{}', 200); + when(github.request(any, any)).thenReturn(Future.value(expectedResponse)); // when git.deleteReference(repo, 'heads/b'); @@ -192,8 +191,8 @@ void main() { }); group('createTag()', () { - var createGitTag = new CreateGitTag('v0.0.1', 'a message', someSha, - 'commit', new GitCommitUser('aName', 'aEmail', new DateTime.now())); + var createGitTag = CreateGitTag('v0.0.1', 'a message', someSha, 'commit', + GitCommitUser('aName', 'aEmail', DateTime.now())); test('constructs correct path', () { git.createTag(repo, createGitTag); @@ -221,7 +220,7 @@ void main() { git.getTree(repo, 'sh'); verify(github.getJSON('/repos/o/n/git/trees/sh', - convert: (j) => new GitTree.fromJson(j), statusCode: StatusCodes.OK)); + convert: (j) => GitTree.fromJson(j), statusCode: StatusCodes.OK)); }); }); @@ -230,27 +229,27 @@ void main() { git.getTree(repo, 'sh', recursive: true); verify(github.getJSON('/repos/o/n/git/trees/sh?recursive=1', - convert: (j) => new GitTree.fromJson(j), statusCode: StatusCodes.OK)); + convert: (j) => GitTree.fromJson(j), statusCode: StatusCodes.OK)); }); }); group('createTree()', () { test('constructs correct path', () { - var createGitTree = new CreateGitTree([]); + var createGitTree = CreateGitTree([]); git.createTree(repo, createGitTree); verify(github.postJSON('/repos/o/n/git/trees', - convert: (j) => new GitTree.fromJson(j), + convert: (j) => GitTree.fromJson(j), statusCode: StatusCodes.CREATED, body: createGitTree.toJSON())); }); test('with sha creates valid JSON body', () { // given - var treeEntry = new CreateGitTreeEntry('file.rb', '100644', 'blob', + var treeEntry = CreateGitTreeEntry('file.rb', '100644', 'blob', sha: '44b4fc6d56897b048c772eb4087f854f46256132'); - var tree = new CreateGitTree([treeEntry]); + var tree = CreateGitTree([treeEntry]); // when git.createTree(repo, tree); @@ -268,10 +267,10 @@ void main() { test('with content creates valid JSON body', () { // given - var treeEntry = new CreateGitTreeEntry('file.rb', '100644', 'blob', + var treeEntry = CreateGitTreeEntry('file.rb', '100644', 'blob', content: 'some file content'); - var tree = new CreateGitTree([treeEntry]); + var tree = CreateGitTree([treeEntry]); // when git.createTree(repo, tree); diff --git a/test/helper.dart b/test/helper.dart index da83b0a0..0c7385af 100644 --- a/test/helper.dart +++ b/test/helper.dart @@ -19,8 +19,7 @@ GitHub _makeGitHubClient() { if (Platform.environment.containsKey("GITHUB_TOKEN")) { g = createGitHubClient( - auth: - new Authentication.withToken(Platform.environment["GITHUB_TOKEN"])); + auth: Authentication.withToken(Platform.environment["GITHUB_TOKEN"])); } else { g = createGitHubClient(); } diff --git a/test/helper/assets.dart b/test/helper/assets.dart index d2e4b9b8..a0c3cde5 100644 --- a/test/helper/assets.dart +++ b/test/helper/assets.dart @@ -1,3 +1,3 @@ part of github.test.helper; -File asset(String id) => new File("test/assets/$id"); +File asset(String id) => File("test/assets/$id"); diff --git a/test/helper/http.dart b/test/helper/http.dart index 4f6171ef..fa4f83af 100644 --- a/test/helper/http.dart +++ b/test/helper/http.dart @@ -1,8 +1,9 @@ part of github.test.helper; -final MockHTTPClient httpClient = new MockHTTPClient(); +final MockHTTPClient httpClient = MockHTTPClient(); -typedef http.StreamedResponse ResponseCreator(http.BaseRequest request); +typedef ResponseCreator = http.StreamedResponse Function( + http.BaseRequest request); class MockHTTPClient extends http.BaseClient { final Map responses = {}; @@ -14,7 +15,7 @@ class MockHTTPClient extends http.BaseClient { orElse: () => null); var creator = responses[matchingUrlCreatorKey]; if (creator == null) { - throw new Exception("No Response Configured"); + throw Exception("No Response Configured"); } return creator(request); @@ -40,6 +41,6 @@ class MockResponse extends http.Response { actualBody = body.toString(); } - return new MockResponse(actualBody, headers, statusCode); + return MockResponse(actualBody, headers, statusCode); } } From 78de6864d5239ae6111b32992f222f82820a7068 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Mon, 22 Apr 2019 12:28:37 -0700 Subject: [PATCH 005/390] Add pkg:pedantic lints --- analysis_options.yaml | 1 + pubspec.yaml | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index b953e59d..ebaab926 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1,3 +1,4 @@ +include: package:pedantic/analysis_options.yaml linter: rules: - always_declare_return_types diff --git a/pubspec.yaml b/pubspec.yaml index 6461b5a9..a2a7a692 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -18,5 +18,6 @@ dev_dependencies: build_test: any build_web_compilers: any json_serializable: ^2.0.0 - test: ^1.3.0 mockito: ^3.0.0 + pedantic: ^1.0.0 + test: ^1.3.0 From 33de12e76961e7acfc4a9ae49c9e9f165ebf2d14 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Mon, 22 Apr 2019 12:56:07 -0700 Subject: [PATCH 006/390] Breaking: fix RepositoriesService.listCollaborators Return new type that includes the right information --- CHANGELOG.md | 7 +++++++ lib/src/common/model/users.dart | 24 ++++++++++++++++++++++++ lib/src/common/model/users.g.dart | 12 ++++++++++++ lib/src/common/repos_service.dart | 10 ++++++---- pubspec.yaml | 2 +- 5 files changed, 50 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 639a65a9..9049c2fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## v5.0.0 + +- **BREAKING** `RepositoriesService.listCollaborators` now returns + `Stream` instead of `Stream`. + - `Collaborator` is a new type that includes collaborator-specific + information. + ## v4.1.1 - Require at least Dart `2.1.0`. diff --git a/lib/src/common/model/users.dart b/lib/src/common/model/users.dart index 4c837aef..c1f0eafc 100644 --- a/lib/src/common/model/users.dart +++ b/lib/src/common/model/users.dart @@ -86,6 +86,30 @@ class User { } } +/// The response from listing collaborators on a repo. +// https://developer.github.com/v3/repos/collaborators/#response +@JsonSerializable(createToJson: false, fieldRename: FieldRename.snake) +class Collaborator { + final String login; + final int id; + final String htmlUrl; + final String type; + final bool siteAdmin; + final Map permissions; + + Collaborator( + this.login, + this.id, + this.htmlUrl, + this.type, + this.siteAdmin, + this.permissions, + ); + + factory Collaborator.fromJson(Map json) => + _$CollaboratorFromJson(json); +} + /// The Currently Authenticated User @JsonSerializable(createToJson: false) class CurrentUser extends User { diff --git a/lib/src/common/model/users.g.dart b/lib/src/common/model/users.g.dart index cd737c40..adcecf25 100644 --- a/lib/src/common/model/users.g.dart +++ b/lib/src/common/model/users.g.dart @@ -53,6 +53,18 @@ Map _$UserToJson(User instance) => { 'updated_at': instance.updatedAt?.toIso8601String() }; +Collaborator _$CollaboratorFromJson(Map json) { + return Collaborator( + json['login'] as String, + json['id'] as int, + json['html_url'] as String, + json['type'] as String, + json['site_admin'] as bool, + (json['permissions'] as Map)?.map( + (k, e) => MapEntry(k, e as bool), + )); +} + CurrentUser _$CurrentUserFromJson(Map json) { return CurrentUser() ..login = json['login'] as String diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index a116e5e1..9fe47b35 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -201,10 +201,12 @@ class RepositoriesService extends Service { /// Lists the users that have access to the repository identified by [slug]. /// /// API docs: https://developer.github.com/v3/repos/collaborators/#list - Stream listCollaborators(RepositorySlug slug) { - return PaginationHelper(_github) - .objects("GET", "/repos/${slug.fullName}/collaborators", User.fromJson); - } + Stream listCollaborators(RepositorySlug slug) => + PaginationHelper(_github).objects( + "GET", + "/repos/${slug.fullName}/collaborators", + (json) => Collaborator.fromJson(json), + ); Future isCollaborator(RepositorySlug slug, String user) { return _github diff --git a/pubspec.yaml b/pubspec.yaml index a2a7a692..45cd0502 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 4.1.1-dev +version: 5.0.0-dev author: Kenneth Endfinger description: GitHub API Client Library homepage: https://github.com/DirectMyFile/github.dart From ca96181a098667b47fc1d35ee9e5acc70ddb718b Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Fri, 26 Apr 2019 06:17:10 -0700 Subject: [PATCH 007/390] Fix OrganizationsService.addTeamMembership (#142) --- lib/src/common/orgs_service.dart | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/lib/src/common/orgs_service.dart b/lib/src/common/orgs_service.dart index 817c05f2..55f3f996 100644 --- a/lib/src/common/orgs_service.dart +++ b/lib/src/common/orgs_service.dart @@ -178,23 +178,11 @@ class OrganizationsService extends Service { /// Invites a user to the specified team. /// - /// API docs: https://developer.github.com/v3/orgs/teams/#get-team-membership - Future addTeamMembership(int teamId, String user) { - var completer = Completer(); - - _github.request("POST", "/teams/$teamId/memberships/$user", statusCode: 200, - fail: (http.Response response) { - if (response.statusCode == 404) { - completer.complete(TeamMembershipState(null)); - } else { - _github.handleStatusCode(response); - } - }).then((response) { - return TeamMembershipState(jsonDecode(response.body)["state"]); - // TODO: Not sure what should go here. - }).then(completer.complete); - - return completer.future; + /// API docs: https://developer.github.com/v3/teams/members/#add-or-update-team-membership + Future addTeamMembership(int teamId, String user) async { + final response = await _github + .request("PUT", "/teams/$teamId/memberships/$user", statusCode: 200); + return TeamMembershipState(jsonDecode(response.body)["state"]); } /// Removes a user from the specified team. From 554e7a46fd923f4022e1c8c16d22694eb17945cd Mon Sep 17 00:00:00 2001 From: Lefebvre Ilyas Date: Sun, 30 Jun 2019 14:14:49 +0200 Subject: [PATCH 008/390] Add language color generator tool --- lib/src/const/language_color.dart | 524 +++++++++++++++++++++ lib/src/tool/language_color_generator.dart | 54 +++ 2 files changed, 578 insertions(+) create mode 100644 lib/src/const/language_color.dart create mode 100644 lib/src/tool/language_color_generator.dart diff --git a/lib/src/const/language_color.dart b/lib/src/const/language_color.dart new file mode 100644 index 00000000..68ffad54 --- /dev/null +++ b/lib/src/const/language_color.dart @@ -0,0 +1,524 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// VERSION OF 2019-06-30T14:13:12.668020 + +Map languagesColor = { + '1C Enterprise': '#814CCC', + 'ABAP': '#E8274B', + 'ABNF': '#000000', + 'AGS Script': '#B9D9FF', + 'AMPL': '#E6EFBB', + 'ANTLR': '#9DC3FF', + 'API Blueprint': '#2ACCA8', + 'APL': '#5A8164', + 'ASN.1': '#000000', + 'ASP': '#6A40FD', + 'ATS': '#1AC620', + 'ActionScript': '#882B0F', + 'Ada': '#02F88C', + 'Adobe Font Metrics': '#000000', + 'Agda': '#315665', + 'Alloy': '#64C800', + 'Alpine Abuild': '#000000', + 'Altium Designer': '#000000', + 'AngelScript': '#C7D7DC', + 'Ant Build System': '#000000', + 'ApacheConf': '#000000', + 'Apex': '#000000', + 'Apollo Guidance Computer': '#000000', + 'AppleScript': '#101F1F', + 'Arc': '#AA2AFE', + 'AsciiDoc': '#000000', + 'AspectJ': '#A957B0', + 'Assembly': '#6E4C13', + 'Asymptote': '#4A0C0C', + 'Augeas': '#000000', + 'AutoHotkey': '#6594B9', + 'AutoIt': '#1C3552', + 'Awk': '#000000', + 'Ballerina': '#FF5000', + 'Batchfile': '#C1F12E', + 'Befunge': '#000000', + 'Bison': '#000000', + 'BitBake': '#000000', + 'Blade': '#000000', + 'BlitzBasic': '#000000', + 'BlitzMax': '#CD6400', + 'Bluespec': '#000000', + 'Boo': '#D4BEC1', + 'Brainfuck': '#2F2530', + 'Brightscript': '#000000', + 'C': '#555555', + 'C#': '#178600', + 'C++': '#F34B7D', + 'C-ObjDump': '#000000', + 'C2hs Haskell': '#000000', + 'CLIPS': '#000000', + 'CMake': '#000000', + 'COBOL': '#000000', + 'COLLADA': '#000000', + 'CSON': '#000000', + 'CSS': '#563D7C', + 'CSV': '#000000', + 'CWeb': '#000000', + 'Cabal Config': '#000000', + 'Cap\'n Proto': '#000000', + 'CartoCSS': '#000000', + 'Ceylon': '#DFA535', + 'Chapel': '#8DC63F', + 'Charity': '#000000', + 'ChucK': '#000000', + 'Cirru': '#CCCCFF', + 'Clarion': '#DB901E', + 'Clean': '#3F85AF', + 'Click': '#E4E6F3', + 'Clojure': '#DB5855', + 'Closure Templates': '#000000', + 'Cloud Firestore Security Rules': '#000000', + 'CoNLL-U': '#000000', + 'CoffeeScript': '#244776', + 'ColdFusion': '#ED2CD6', + 'ColdFusion CFC': '#000000', + 'Common Lisp': '#3FB68B', + 'Common Workflow Language': '#B5314C', + 'Component Pascal': '#B0CE4E', + 'Cool': '#000000', + 'Coq': '#000000', + 'Cpp-ObjDump': '#000000', + 'Creole': '#000000', + 'Crystal': '#000100', + 'Csound': '#000000', + 'Csound Document': '#000000', + 'Csound Score': '#000000', + 'Cuda': '#3A4E3A', + 'Cycript': '#000000', + 'Cython': '#000000', + 'D': '#BA595E', + 'D-ObjDump': '#000000', + 'DIGITAL Command Language': '#000000', + 'DM': '#447265', + 'DNS Zone': '#000000', + 'DTrace': '#000000', + 'Darcs Patch': '#000000', + 'Dart': '#00B4AB', + 'DataWeave': '#003A52', + 'Dhall': '#DFAFFF', + 'Diff': '#000000', + 'Dockerfile': '#384D54', + 'Dogescript': '#CCA760', + 'Dylan': '#6C616E', + 'E': '#CCCE35', + 'EBNF': '#000000', + 'ECL': '#8A1267', + 'ECLiPSe': '#000000', + 'EJS': '#000000', + 'EML': '#000000', + 'EQ': '#A78649', + 'Eagle': '#000000', + 'Easybuild': '#000000', + 'Ecere Projects': '#000000', + 'EditorConfig': '#000000', + 'Edje Data Collection': '#000000', + 'Eiffel': '#946D57', + 'Elixir': '#6E4A7E', + 'Elm': '#60B5CC', + 'Emacs Lisp': '#C065DB', + 'EmberScript': '#FFF4F3', + 'Erlang': '#B83998', + 'F#': '#B845FC', + 'F*': '#572E30', + 'FIGlet Font': '#000000', + 'FLUX': '#88CCFF', + 'Factor': '#636746', + 'Fancy': '#7B9DB4', + 'Fantom': '#14253C', + 'Filebench WML': '#000000', + 'Filterscript': '#000000', + 'Formatted': '#000000', + 'Forth': '#341708', + 'Fortran': '#4D41B1', + 'FreeMarker': '#0050B2', + 'Frege': '#00CAFE', + 'G-code': '#D08CF2', + 'GAMS': '#000000', + 'GAP': '#000000', + 'GCC Machine Description': '#000000', + 'GDB': '#000000', + 'GDScript': '#355570', + 'GLSL': '#000000', + 'GN': '#000000', + 'Game Maker Language': '#71B417', + 'Genie': '#FB855D', + 'Genshi': '#000000', + 'Gentoo Ebuild': '#000000', + 'Gentoo Eclass': '#000000', + 'Gerber Image': '#000000', + 'Gettext Catalog': '#000000', + 'Gherkin': '#5B2063', + 'Git Attributes': '#000000', + 'Git Config': '#000000', + 'Glyph': '#C1AC7F', + 'Glyph Bitmap Distribution Format': '#000000', + 'Gnuplot': '#F0A9F0', + 'Go': '#00ADD8', + 'Golo': '#88562A', + 'Gosu': '#82937F', + 'Grace': '#000000', + 'Gradle': '#000000', + 'Grammatical Framework': '#79AA7A', + 'Graph Modeling Language': '#000000', + 'GraphQL': '#000000', + 'Graphviz (DOT)': '#000000', + 'Groovy': '#E69F56', + 'Groovy Server Pages': '#000000', + 'HAProxy': '#000000', + 'HCL': '#000000', + 'HLSL': '#000000', + 'HTML': '#E34C26', + 'HTML+Django': '#000000', + 'HTML+ECR': '#000000', + 'HTML+EEX': '#000000', + 'HTML+ERB': '#000000', + 'HTML+PHP': '#000000', + 'HTML+Razor': '#000000', + 'HTTP': '#000000', + 'HXML': '#000000', + 'Hack': '#878787', + 'Haml': '#000000', + 'Handlebars': '#000000', + 'Harbour': '#0E60E3', + 'Haskell': '#5E5086', + 'Haxe': '#DF7900', + 'HiveQL': '#DCE200', + 'HolyC': '#FFEFAF', + 'Hy': '#7790B2', + 'HyPhy': '#000000', + 'IDL': '#A3522F', + 'IGOR Pro': '#000000', + 'INI': '#000000', + 'IRC log': '#000000', + 'Idris': '#B30000', + 'Ignore List': '#000000', + 'Inform 7': '#000000', + 'Inno Setup': '#000000', + 'Io': '#A9188D', + 'Ioke': '#078193', + 'Isabelle': '#FEFE00', + 'Isabelle ROOT': '#000000', + 'J': '#9EEDFF', + 'JFlex': '#000000', + 'JSON': '#000000', + 'JSON with Comments': '#000000', + 'JSON5': '#000000', + 'JSONLD': '#000000', + 'JSONiq': '#40D47E', + 'JSX': '#000000', + 'Jasmin': '#000000', + 'Java': '#B07219', + 'Java Properties': '#000000', + 'Java Server Pages': '#000000', + 'JavaScript': '#F1E05A', + 'JavaScript+ERB': '#000000', + 'Jison': '#000000', + 'Jison Lex': '#000000', + 'Jolie': '#843179', + 'Jsonnet': '#0064BD', + 'Julia': '#A270BA', + 'Jupyter Notebook': '#DA5B0B', + 'KRL': '#28430A', + 'KiCad Layout': '#000000', + 'KiCad Legacy Layout': '#000000', + 'KiCad Schematic': '#000000', + 'Kit': '#000000', + 'Kotlin': '#F18E33', + 'LFE': '#4C3023', + 'LLVM': '#185619', + 'LOLCODE': '#CC9900', + 'LSL': '#3D9970', + 'LTspice Symbol': '#000000', + 'LabVIEW': '#000000', + 'Lasso': '#999999', + 'Latte': '#000000', + 'Lean': '#000000', + 'Less': '#000000', + 'Lex': '#DBCA00', + 'LilyPond': '#000000', + 'Limbo': '#000000', + 'Linker Script': '#000000', + 'Linux Kernel Module': '#000000', + 'Liquid': '#000000', + 'Literate Agda': '#000000', + 'Literate CoffeeScript': '#000000', + 'Literate Haskell': '#000000', + 'LiveScript': '#499886', + 'Logos': '#000000', + 'Logtalk': '#000000', + 'LookML': '#652B81', + 'LoomScript': '#000000', + 'Lua': '#000080', + 'M': '#000000', + 'M4': '#000000', + 'M4Sugar': '#000000', + 'MATLAB': '#E16737', + 'MAXScript': '#00A6A6', + 'MQL4': '#62A8D6', + 'MQL5': '#4A76B8', + 'MTML': '#B7E1F4', + 'MUF': '#000000', + 'Makefile': '#427819', + 'Mako': '#000000', + 'Markdown': '#000000', + 'Marko': '#000000', + 'Mask': '#F97732', + 'Mathematica': '#000000', + 'Maven POM': '#000000', + 'Max': '#C4A79C', + 'MediaWiki': '#000000', + 'Mercury': '#FF2B2B', + 'Meson': '#007800', + 'Metal': '#8F14E9', + 'MiniD': '#000000', + 'Mirah': '#C7A938', + 'Modelica': '#000000', + 'Modula-2': '#000000', + 'Modula-3': '#223388', + 'Module Management System': '#000000', + 'Monkey': '#000000', + 'Moocode': '#000000', + 'MoonScript': '#000000', + 'Motorola 68K Assembly': '#000000', + 'Myghty': '#000000', + 'NCL': '#28431F', + 'NL': '#000000', + 'NSIS': '#000000', + 'Nearley': '#990000', + 'Nemerle': '#3D3C6E', + 'NetLinx': '#0AA0FF', + 'NetLinx+ERB': '#747FAA', + 'NetLogo': '#FF6375', + 'NewLisp': '#87AED7', + 'Nextflow': '#3AC486', + 'Nginx': '#000000', + 'Nim': '#37775B', + 'Ninja': '#000000', + 'Nit': '#009917', + 'Nix': '#7E7EFF', + 'Nu': '#C9DF40', + 'NumPy': '#000000', + 'OCaml': '#3BE133', + 'ObjDump': '#000000', + 'ObjectScript': '#424893', + 'Objective-C': '#438EFF', + 'Objective-C++': '#6866FB', + 'Objective-J': '#FF0C5A', + 'Omgrofl': '#CABBFF', + 'Opa': '#000000', + 'Opal': '#F7EDE0', + 'OpenCL': '#000000', + 'OpenEdge ABL': '#000000', + 'OpenRC runscript': '#000000', + 'OpenSCAD': '#000000', + 'OpenType Feature File': '#000000', + 'Org': '#000000', + 'Ox': '#000000', + 'Oxygene': '#CDD0E3', + 'Oz': '#FAB738', + 'P4': '#7055B5', + 'PHP': '#4F5D95', + 'PLSQL': '#DAD8D8', + 'PLpgSQL': '#000000', + 'POV-Ray SDL': '#000000', + 'Pan': '#CC0000', + 'Papyrus': '#6600CC', + 'Parrot': '#F3CA0A', + 'Parrot Assembly': '#000000', + 'Parrot Internal Representation': '#000000', + 'Pascal': '#E3F171', + 'Pawn': '#DBB284', + 'Pep8': '#C76F5B', + 'Perl': '#0298C3', + 'Perl 6': '#0000FB', + 'Pic': '#000000', + 'Pickle': '#000000', + 'PicoLisp': '#000000', + 'PigLatin': '#FCD7DE', + 'Pike': '#005390', + 'Pod': '#000000', + 'Pod 6': '#000000', + 'PogoScript': '#D80074', + 'Pony': '#000000', + 'PostCSS': '#000000', + 'PostScript': '#DA291C', + 'PowerBuilder': '#8F0F8D', + 'PowerShell': '#012456', + 'Processing': '#0096D8', + 'Prolog': '#74283C', + 'Propeller Spin': '#7FA2A7', + 'Protocol Buffer': '#000000', + 'Public Key': '#000000', + 'Pug': '#000000', + 'Puppet': '#302B6D', + 'Pure Data': '#000000', + 'PureBasic': '#5A6986', + 'PureScript': '#1D222D', + 'Python': '#3572A5', + 'Python console': '#000000', + 'Python traceback': '#000000', + 'QML': '#44A51C', + 'QMake': '#000000', + 'Quake': '#882233', + 'R': '#198CE7', + 'RAML': '#77D9FB', + 'RDoc': '#000000', + 'REALbasic': '#000000', + 'REXX': '#000000', + 'RHTML': '#000000', + 'RMarkdown': '#000000', + 'RPC': '#000000', + 'RPM Spec': '#000000', + 'RUNOFF': '#665A4E', + 'Racket': '#3C5CAA', + 'Ragel': '#9D5200', + 'Rascal': '#FFFAA0', + 'Raw token data': '#000000', + 'Reason': '#000000', + 'Rebol': '#358A5B', + 'Red': '#F50000', + 'Redcode': '#000000', + 'Regular Expression': '#000000', + 'Ren\'Py': '#FF7F7F', + 'RenderScript': '#000000', + 'Rich Text Format': '#000000', + 'Ring': '#2D54CB', + 'RobotFramework': '#000000', + 'Roff': '#ECDEBE', + 'Roff Manpage': '#000000', + 'Rouge': '#CC0088', + 'Ruby': '#701516', + 'Rust': '#DEA584', + 'SAS': '#B34936', + 'SCSS': '#000000', + 'SMT': '#000000', + 'SPARQL': '#000000', + 'SQF': '#3F3F3F', + 'SQL': '#000000', + 'SQLPL': '#000000', + 'SRecode Template': '#348A34', + 'SSH Config': '#000000', + 'STON': '#000000', + 'SVG': '#000000', + 'Sage': '#000000', + 'SaltStack': '#646464', + 'Sass': '#000000', + 'Scala': '#C22D40', + 'Scaml': '#000000', + 'Scheme': '#1E4AEC', + 'Scilab': '#000000', + 'Self': '#0579AA', + 'ShaderLab': '#000000', + 'Shell': '#89E051', + 'ShellSession': '#000000', + 'Shen': '#120F14', + 'Slash': '#007EFF', + 'Slice': '#003FA2', + 'Slim': '#000000', + 'Smali': '#000000', + 'Smalltalk': '#596706', + 'Smarty': '#000000', + 'Solidity': '#AA6746', + 'SourcePawn': '#5C7611', + 'Spline Font Database': '#000000', + 'Squirrel': '#800000', + 'Stan': '#B2011D', + 'Standard ML': '#DC566D', + 'Stata': '#000000', + 'Stylus': '#000000', + 'SubRip Text': '#000000', + 'SugarSS': '#000000', + 'SuperCollider': '#46390B', + 'Svelte': '#000000', + 'Swift': '#FFAC45', + 'SystemVerilog': '#DAE1C2', + 'TI Program': '#A0AA87', + 'TLA': '#000000', + 'TOML': '#000000', + 'TSQL': '#000000', + 'TSX': '#000000', + 'TXL': '#000000', + 'Tcl': '#E4CC98', + 'Tcsh': '#000000', + 'TeX': '#3D6117', + 'Tea': '#000000', + 'Terra': '#00004C', + 'Text': '#000000', + 'Textile': '#000000', + 'Thrift': '#000000', + 'Turing': '#CF142B', + 'Turtle': '#000000', + 'Twig': '#000000', + 'Type Language': '#000000', + 'TypeScript': '#2B7489', + 'Unified Parallel C': '#000000', + 'Unity3D Asset': '#000000', + 'Unix Assembly': '#000000', + 'Uno': '#000000', + 'UnrealScript': '#A54C4D', + 'UrWeb': '#000000', + 'VCL': '#148AA8', + 'VHDL': '#ADB2CB', + 'Vala': '#FBE5CD', + 'Verilog': '#B2B7F8', + 'Vim script': '#199F4B', + 'Visual Basic': '#945DB7', + 'Volt': '#1F1F1F', + 'Vue': '#2C3E50', + 'Wavefront Material': '#000000', + 'Wavefront Object': '#000000', + 'Web Ontology Language': '#000000', + 'WebAssembly': '#04133B', + 'WebIDL': '#000000', + 'WebVTT': '#000000', + 'Windows Registry Entries': '#000000', + 'Wollok': '#A23738', + 'World of Warcraft Addon Data': '#000000', + 'X BitMap': '#000000', + 'X Font Directory Index': '#000000', + 'X PixMap': '#000000', + 'X10': '#4B6BEF', + 'XC': '#99DA07', + 'XCompose': '#000000', + 'XML': '#000000', + 'XPages': '#000000', + 'XProc': '#000000', + 'XQuery': '#5232E7', + 'XS': '#000000', + 'XSLT': '#EB8CEB', + 'Xojo': '#000000', + 'Xtend': '#000000', + 'YAML': '#000000', + 'YANG': '#000000', + 'YARA': '#220000', + 'YASnippet': '#32AB90', + 'Yacc': '#4B6C4B', + 'ZAP': '#0D665E', + 'ZIL': '#DC75E5', + 'Zeek': '#000000', + 'ZenScript': '#00BCD1', + 'Zephir': '#118F9E', + 'Zig': '#EC915C', + 'Zimpl': '#000000', + 'desktop': '#000000', + 'eC': '#913960', + 'edn': '#000000', + 'fish': '#000000', + 'mcfunction': '#E22837', + 'mupad': '#000000', + 'nanorc': '#000000', + 'nesC': '#94B0C7', + 'ooc': '#B0B77E', + 'q': '#0040CD', + 'reStructuredText': '#000000', + 'sed': '#64B970', + 'wdl': '#42F1F4', + 'wisp': '#7582D1', + 'xBase': '#403A40', +}; diff --git a/lib/src/tool/language_color_generator.dart b/lib/src/tool/language_color_generator.dart new file mode 100644 index 00000000..c5dcec1f --- /dev/null +++ b/lib/src/tool/language_color_generator.dart @@ -0,0 +1,54 @@ +import 'dart:io'; + +import 'package:http/http.dart' as http; +import 'package:yaml/yaml.dart'; + +class LanguageColorGenerator { + static final String indent = ' '; + static final String path = './lib/src/const/language_color.dart'; + static final String url = 'https://raw.githubusercontent.com/' + 'github/linguist/master/lib/linguist/languages.yml'; + + static Future buildColorMap() async { + http.Response response = await http.Client().get(url); + + YamlMap yaml = loadYaml(response.body) as YamlMap; + StringBuffer stringBuffer = StringBuffer(); + + stringBuffer.writeln('// GENERATED CODE - DO NOT MODIFY BY HAND'); + stringBuffer.writeln('// VERSION OF ${DateTime.now().toIso8601String()}'); + stringBuffer.writeln(); + + stringBuffer + .writeln('Map languagesColor = {'); + + String color; + + YamlMap map = yaml.value; + List languages = List.from(map.keys); + languages.sort(); + + languages.forEach( + (language) { + color = map[language]['color']?.toString()?.toUpperCase() ?? '#000000'; + + language = language.replaceAll("'", "\\'"); + + stringBuffer.writeln("$indent'$language': '$color',"); + }, + ); + + stringBuffer.writeln('};'); + + File output = File(path); + + output.createSync(); + output.writeAsStringSync(stringBuffer.toString()); + + print('File created with success'); + } +} + +void main() { + LanguageColorGenerator.buildColorMap(); +} From 2a9008e84101b8b706e5f22a53b318fa0ecf428a Mon Sep 17 00:00:00 2001 From: Dan Field Date: Tue, 2 Jul 2019 20:44:02 -0700 Subject: [PATCH 009/390] Add base to PR edit --- lib/src/common/pulls_service.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/src/common/pulls_service.dart b/lib/src/common/pulls_service.dart index 805fd4fb..27fa77a9 100644 --- a/lib/src/common/pulls_service.dart +++ b/lib/src/common/pulls_service.dart @@ -49,11 +49,12 @@ class PullRequestsService extends Service { /// /// API docs: https://developer.github.com/v3/pulls/#update-a-pull-request Future edit(RepositorySlug slug, int number, - {String title, String body, String state}) { + {String title, String body, String state, String base}) { var map = {}; putValue("title", title, map); putValue("body", body, map); putValue("state", state, map); + putValue("base", base, map); return _github .request("POST", '/repos/${slug.fullName}/pulls/$number', From da1d523d127792a55127df643dca66a72a13050b Mon Sep 17 00:00:00 2001 From: Todd Volkert Date: Mon, 8 Jul 2019 20:40:53 -0700 Subject: [PATCH 010/390] Prepare for upcoming change to HttpRequest and HttpClientResponse (#146) An upcoming change to the Dart SDK will change `HttpRequest` and `HttpClientResponse` from implementing `Stream>` to implementing `Stream`. This forwards-compatible change prepares for that SDK breaking change by casting the Stream to `List` before transforming it. https://github.com/dart-lang/sdk/issues/36900 --- lib/src/server/hooks.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/server/hooks.dart b/lib/src/server/hooks.dart index 3b2dcc1f..da8abfcb 100644 --- a/lib/src/server/hooks.dart +++ b/lib/src/server/hooks.dart @@ -25,7 +25,7 @@ class HookMiddleware { return; } - request.transform(const Utf8Decoder()).join().then((content) { + const Utf8Decoder().bind(request).join().then((content) { _eventController.add(HookEvent.fromJSON( request.headers.value("X-GitHub-Event"), jsonDecode(content) as Map)); From 41a8592e358eabfe8bdf47cb2e017e67f8d52c4f Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Tue, 9 Jul 2019 09:37:55 -0700 Subject: [PATCH 011/390] fix latest pedantic lint --- lib/src/common/github.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index 250c0fbe..9b864d7c 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -342,8 +342,9 @@ class GitHub { if (statusCode != null && statusCode != response.statusCode) { fail != null ? fail(response) : null; handleStatusCode(response); - } else + } else { return response; + } } /// @@ -369,8 +370,9 @@ class GitHub { throw InvalidJSON(this, message); } else if (message == "Body should be a JSON Hash") { throw InvalidJSON(this, message); - } else + } else { throw BadRequest(this); + } break; case 422: var buff = StringBuffer(); From 31ecc3511ba5ea96ef4ec96ecda200fac7ae4bad Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Tue, 9 Jul 2019 09:47:50 -0700 Subject: [PATCH 012/390] Update language_color_generator - refactor code - generate const map - move to /tool directory --- lib/src/const/language_color.dart | 4 +- lib/src/tool/language_color_generator.dart | 54 ---------------------- tool/language_color_generator.dart | 39 ++++++++++++++++ 3 files changed, 41 insertions(+), 56 deletions(-) delete mode 100644 lib/src/tool/language_color_generator.dart create mode 100644 tool/language_color_generator.dart diff --git a/lib/src/const/language_color.dart b/lib/src/const/language_color.dart index 68ffad54..87469a98 100644 --- a/lib/src/const/language_color.dart +++ b/lib/src/const/language_color.dart @@ -1,7 +1,7 @@ // GENERATED CODE - DO NOT MODIFY BY HAND -// VERSION OF 2019-06-30T14:13:12.668020 +// VERSION OF 2019-07-09T09:46:59.065183 -Map languagesColor = { +const languagesColor = { '1C Enterprise': '#814CCC', 'ABAP': '#E8274B', 'ABNF': '#000000', diff --git a/lib/src/tool/language_color_generator.dart b/lib/src/tool/language_color_generator.dart deleted file mode 100644 index c5dcec1f..00000000 --- a/lib/src/tool/language_color_generator.dart +++ /dev/null @@ -1,54 +0,0 @@ -import 'dart:io'; - -import 'package:http/http.dart' as http; -import 'package:yaml/yaml.dart'; - -class LanguageColorGenerator { - static final String indent = ' '; - static final String path = './lib/src/const/language_color.dart'; - static final String url = 'https://raw.githubusercontent.com/' - 'github/linguist/master/lib/linguist/languages.yml'; - - static Future buildColorMap() async { - http.Response response = await http.Client().get(url); - - YamlMap yaml = loadYaml(response.body) as YamlMap; - StringBuffer stringBuffer = StringBuffer(); - - stringBuffer.writeln('// GENERATED CODE - DO NOT MODIFY BY HAND'); - stringBuffer.writeln('// VERSION OF ${DateTime.now().toIso8601String()}'); - stringBuffer.writeln(); - - stringBuffer - .writeln('Map languagesColor = {'); - - String color; - - YamlMap map = yaml.value; - List languages = List.from(map.keys); - languages.sort(); - - languages.forEach( - (language) { - color = map[language]['color']?.toString()?.toUpperCase() ?? '#000000'; - - language = language.replaceAll("'", "\\'"); - - stringBuffer.writeln("$indent'$language': '$color',"); - }, - ); - - stringBuffer.writeln('};'); - - File output = File(path); - - output.createSync(); - output.writeAsStringSync(stringBuffer.toString()); - - print('File created with success'); - } -} - -void main() { - LanguageColorGenerator.buildColorMap(); -} diff --git a/tool/language_color_generator.dart b/tool/language_color_generator.dart new file mode 100644 index 00000000..59c49fe8 --- /dev/null +++ b/tool/language_color_generator.dart @@ -0,0 +1,39 @@ +import 'dart:io'; + +import 'package:http/http.dart' as http; +import 'package:yaml/yaml.dart'; + +const _indent = ' '; +const _path = './lib/src/const/language_color.dart'; +const _url = 'https://raw.githubusercontent.com/' + 'github/linguist/master/lib/linguist/languages.yml'; + +Future main() async { + var response = await http.Client().get(_url); + + var yaml = loadYaml(response.body) as YamlMap; + var stringBuffer = StringBuffer() + ..writeln('// GENERATED CODE - DO NOT MODIFY BY HAND') + ..writeln('// VERSION OF ${DateTime.now().toIso8601String()}') + ..writeln() + ..writeln('const languagesColor = {'); + + var map = yaml.value as YamlMap; + var languages = map.keys.cast().toList(growable: false)..sort(); + + for (var language in languages) { + var color = map[language]['color']?.toString()?.toUpperCase() ?? '#000000'; + + language = language.replaceAll("'", "\\'"); + + stringBuffer.writeln("$_indent'$language': '$color',"); + } + + stringBuffer.writeln('};'); + + File(_path) + ..createSync() + ..writeAsStringSync(stringBuffer.toString()); + + print('File created with success'); +} From 7621e01274820d39a6cf851d90126197e5df38f6 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Tue, 9 Jul 2019 09:48:21 -0700 Subject: [PATCH 013/390] Prepare to release v5 --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 45cd0502..39feabcf 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 5.0.0-dev +version: 5.0.0 author: Kenneth Endfinger description: GitHub API Client Library homepage: https://github.com/DirectMyFile/github.dart From 5e4b90828083b9acda1fc5be437af1eaf327c709 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Tue, 9 Jul 2019 12:09:29 -0600 Subject: [PATCH 014/390] Update readme to use ^5.0.0 (#148) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1b345a50..1d8606f5 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ First, add the following to your pubspec.yaml: ```yaml dependencies: - github: ^4.0.0 + github: ^5.0.0 ``` Then import the library and use it: From 6619603786ed966c3bc52be6daa962e784788edb Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Tue, 9 Jul 2019 12:56:30 -0600 Subject: [PATCH 015/390] update changelog, version to 5.0.1 --- CHANGELOG.md | 4 ++++ pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9049c2fe..96f69d27 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## v5.0.1 + - Fixed a runtime exception (https://github.com/DirectMyFile/github.dart/issues/139) + - Added an optional `base` argument when editing a PR (https://github.com/DirectMyFile/github.dart/pull/145) + ## v5.0.0 - **BREAKING** `RepositoriesService.listCollaborators` now returns diff --git a/pubspec.yaml b/pubspec.yaml index 39feabcf..73da6384 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 5.0.0 +version: 5.0.1 author: Kenneth Endfinger description: GitHub API Client Library homepage: https://github.com/DirectMyFile/github.dart From 84c0e9d7337d5a136006aec7caed5d5957b09077 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Wed, 10 Jul 2019 08:36:20 -0600 Subject: [PATCH 016/390] fix pollPublicEventsReceivedByUser to use the correct API URL --- lib/src/common/activity_service.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/common/activity_service.dart b/lib/src/common/activity_service.dart index 8c491493..d4d823b4 100644 --- a/lib/src/common/activity_service.dart +++ b/lib/src/common/activity_service.dart @@ -90,7 +90,7 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/events/#list-public-events-that-a-user-has-received EventPoller pollPublicEventsReceivedByUser(String user) => - EventPoller(_github, "/repos/$user/events/public"); + EventPoller(_github, "/repos/$user/received_events/public"); /// Lists the events performed by a user. /// From 15476b40790166d2628cf0ebe636263587fd91f3 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Wed, 10 Jul 2019 10:11:35 -0600 Subject: [PATCH 017/390] update changelog and version for 5.0.2 release --- CHANGELOG.md | 3 +++ pubspec.yaml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 96f69d27..3665cde7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## v5.0.2 + - Fixed pollPublicEventsReceivedByUser to use the correct API URL https://github.com/DirectMyFile/github.dart/pull/150 + ## v5.0.1 - Fixed a runtime exception (https://github.com/DirectMyFile/github.dart/issues/139) - Added an optional `base` argument when editing a PR (https://github.com/DirectMyFile/github.dart/pull/145) diff --git a/pubspec.yaml b/pubspec.yaml index 73da6384..5e83d5ac 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 5.0.1 +version: 5.0.2 author: Kenneth Endfinger description: GitHub API Client Library homepage: https://github.com/DirectMyFile/github.dart From 4847bad7ddb79c6ec84cd90ab03814a1e6df3e7b Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Thu, 25 Jul 2019 10:50:54 -0700 Subject: [PATCH 018/390] Latest json_serializable --- lib/src/common.g.dart | 255 +++++++++++---------- lib/src/common/model/repos_releases.g.dart | 16 +- lib/src/common/model/users.g.dart | 19 +- pubspec.yaml | 2 +- 4 files changed, 158 insertions(+), 134 deletions(-) diff --git a/lib/src/common.g.dart b/lib/src/common.g.dart index 823f52d1..d1d2b75b 100644 --- a/lib/src/common.g.dart +++ b/lib/src/common.g.dart @@ -9,7 +9,7 @@ part of github.common; Map _$CreateGitBlobToJson(CreateGitBlob instance) => { 'content': instance.content, - 'encoding': instance.encoding + 'encoding': instance.encoding, }; GitCommit _$GitCommitFromJson(Map json) { @@ -51,8 +51,11 @@ Map _$CreateGitCommitToJson(CreateGitCommit instance) { } GitCommitUser _$GitCommitUserFromJson(Map json) { - return GitCommitUser(json['name'] as String, json['email'] as String, - json['date'] == null ? null : DateTime.parse(json['date'] as String)); + return GitCommitUser( + json['name'] as String, + json['email'] as String, + json['date'] == null ? null : DateTime.parse(json['date'] as String), + ); } Map _$GitCommitUserToJson(GitCommitUser instance) { @@ -66,31 +69,31 @@ Map _$GitCommitUserToJson(GitCommitUser instance) { writeNotNull('name', instance.name); writeNotNull('email', instance.email); - writeNotNull('date', - instance.date == null ? null : dateToGitHubIso8601(instance.date)); + writeNotNull('date', dateToGitHubIso8601(instance.date)); return val; } GitTree _$GitTreeFromJson(Map json) { return GitTree( - json['sha'] as String, - json['url'] as String, - json['truncated'] as bool, - (json['tree'] as List) - ?.map((e) => e == null - ? null - : GitTreeEntry.fromJson(e as Map)) - ?.toList()); + json['sha'] as String, + json['url'] as String, + json['truncated'] as bool, + (json['tree'] as List) + ?.map((e) => + e == null ? null : GitTreeEntry.fromJson(e as Map)) + ?.toList(), + ); } GitTreeEntry _$GitTreeEntryFromJson(Map json) { return GitTreeEntry( - json['path'] as String, - json['mode'] as String, - json['type'] as String, - json['size'] as int, - json['sha'] as String, - json['url'] as String); + json['path'] as String, + json['mode'] as String, + json['type'] as String, + json['size'] as int, + json['sha'] as String, + json['url'] as String, + ); } GitReference _$GitReferenceFromJson(Map json) { @@ -118,7 +121,10 @@ GitTag _$GitTagFromJson(Map json) { GitObject _$GitObjectFromJson(Map json) { return GitObject( - json['type'] as String, json['sha'] as String, json['url'] as String); + json['type'] as String, + json['sha'] as String, + json['url'] as String, + ); } TeamRepository _$TeamRepositoryFromJson(Map json) { @@ -164,16 +170,20 @@ TeamRepository _$TeamRepositoryFromJson(Map json) { TeamRepositoryPermissions _$TeamRepositoryPermissionsFromJson( Map json) { return TeamRepositoryPermissions( - json['admin'] as bool, json['push'] as bool, json['pull'] as bool); + json['admin'] as bool, + json['push'] as bool, + json['pull'] as bool, + ); } GitHubComparison _$GitHubComparisonFromJson(Map json) { return GitHubComparison( - json['url'] as String, - json['status'] as String, - json['ahead_by'] as int, - json['behind_by'] as int, - json['total_commits'] as int); + json['url'] as String, + json['status'] as String, + json['ahead_by'] as int, + json['behind_by'] as int, + json['total_commits'] as int, + ); } Repository _$RepositoryFromJson(Map json) { @@ -213,90 +223,103 @@ Repository _$RepositoryFromJson(Map json) { } CloneUrls _$CloneUrlsFromJson(Map json) { - return CloneUrls(json['git'] as String, json['ssh'] as String, - json['https'] as String, json['svn'] as String); + return CloneUrls( + json['git'] as String, + json['ssh'] as String, + json['https'] as String, + json['svn'] as String, + ); } Tag _$TagFromJson(Map json) { return Tag( - json['name'] as String, - json['commit'] == null - ? null - : CommitInfo.fromJson(json['commit'] as Map), - json['zipball_url'] as String, - json['tarball_url'] as String); + json['name'] as String, + json['commit'] == null + ? null + : CommitInfo.fromJson(json['commit'] as Map), + json['zipball_url'] as String, + json['tarball_url'] as String, + ); } CommitData _$CommitDataFromJson(Map json) { return CommitData( - json['sha'] as String, - json['commit'] == null - ? null - : GitCommit.fromJson(json['commit'] as Map), - json['url'] as String, - json['html_url'] as String, - json['comments_url'] as String, - json['author'] == null - ? null - : CommitDataUser.fromJson(json['author'] as Map), - json['committer'] == null - ? null - : CommitDataUser.fromJson(json['committer'] as Map), - (json['parents'] as List) - ?.map((e) => e as Map) - ?.toList()); + json['sha'] as String, + json['commit'] == null + ? null + : GitCommit.fromJson(json['commit'] as Map), + json['url'] as String, + json['html_url'] as String, + json['comments_url'] as String, + json['author'] == null + ? null + : CommitDataUser.fromJson(json['author'] as Map), + json['committer'] == null + ? null + : CommitDataUser.fromJson(json['committer'] as Map), + (json['parents'] as List)?.map((e) => e as Map)?.toList(), + ); } CommitDataUser _$CommitDataUserFromJson(Map json) { return CommitDataUser( - json['login'] as String, json['id'] as int, json['type'] as String); + json['login'] as String, + json['id'] as int, + json['type'] as String, + ); } CommitInfo _$CommitInfoFromJson(Map json) { return CommitInfo( - json['sha'] as String, - json['tree'] == null - ? null - : GitTree.fromJson(json['tree'] as Map)); + json['sha'] as String, + json['tree'] == null + ? null + : GitTree.fromJson(json['tree'] as Map), + ); } UserInformation _$UserInformationFromJson(Map json) { - return UserInformation(json['login'] as String, json['id'] as int, - json['avatar_url'] as String, json['html_url'] as String); + return UserInformation( + json['login'] as String, + json['id'] as int, + json['avatar_url'] as String, + json['html_url'] as String, + ); } Branch _$BranchFromJson(Map json) { return Branch( - json['name'] as String, - json['commit'] == null - ? null - : CommitData.fromJson(json['commit'] as Map)); + json['name'] as String, + json['commit'] == null + ? null + : CommitData.fromJson(json['commit'] as Map), + ); } LicenseDetails _$LicenseDetailsFromJson(Map json) { return LicenseDetails( - name: json['name'] as String, - path: json['path'] as String, - sha: json['sha'] as String, - size: json['size'] as int, - url: json['url'] == null ? null : Uri.parse(json['url'] as String), - htmlUrl: json['html_url'] == null - ? null - : Uri.parse(json['html_url'] as String), - gitUrl: - json['git_url'] == null ? null : Uri.parse(json['git_url'] as String), - downloadUrl: json['download_url'] == null - ? null - : Uri.parse(json['download_url'] as String), - type: json['type'] as String, - content: json['content'] as String, - encoding: json['encoding'] as String, - links: json['_links'] == null - ? null - : Links.fromJson(json['_links'] as Map), - license: json['license'] == null - ? null - : LicenseKind.fromJson(json['license'] as Map)); + name: json['name'] as String, + path: json['path'] as String, + sha: json['sha'] as String, + size: json['size'] as int, + url: json['url'] == null ? null : Uri.parse(json['url'] as String), + htmlUrl: + json['html_url'] == null ? null : Uri.parse(json['html_url'] as String), + gitUrl: + json['git_url'] == null ? null : Uri.parse(json['git_url'] as String), + downloadUrl: json['download_url'] == null + ? null + : Uri.parse(json['download_url'] as String), + type: json['type'] as String, + content: json['content'] as String, + encoding: json['encoding'] as String, + links: json['_links'] == null + ? null + : Links.fromJson(json['_links'] as Map), + license: json['license'] == null + ? null + : LicenseKind.fromJson(json['license'] as Map), + ); } Map _$LicenseDetailsToJson(LicenseDetails instance) => @@ -313,16 +336,17 @@ Map _$LicenseDetailsToJson(LicenseDetails instance) => 'content': instance.content, 'encoding': instance.encoding, '_links': instance.links, - 'license': instance.license + 'license': instance.license, }; LicenseKind _$LicenseKindFromJson(Map json) { return LicenseKind( - key: json['key'] as String, - name: json['name'] as String, - spdxId: json['spdx_id'] as String, - url: json['url'] == null ? null : Uri.parse(json['url'] as String), - nodeId: json['node_id'] as String); + key: json['key'] as String, + name: json['name'] as String, + spdxId: json['spdx_id'] as String, + url: json['url'] == null ? null : Uri.parse(json['url'] as String), + nodeId: json['node_id'] as String, + ); } Map _$LicenseKindToJson(LicenseKind instance) => @@ -331,49 +355,53 @@ Map _$LicenseKindToJson(LicenseKind instance) => 'name': instance.name, 'spdx_id': instance.spdxId, 'url': instance.url?.toString(), - 'node_id': instance.nodeId + 'node_id': instance.nodeId, }; Links _$LinksFromJson(Map json) { return Links( - git: json['git'] == null ? null : Uri.parse(json['git'] as String), - self: json['self'] == null ? null : Uri.parse(json['self'] as String), - html: json['html'] == null ? null : Uri.parse(json['html'] as String)); + git: json['git'] == null ? null : Uri.parse(json['git'] as String), + self: json['self'] == null ? null : Uri.parse(json['self'] as String), + html: json['html'] == null ? null : Uri.parse(json['html'] as String), + ); } Map _$LinksToJson(Links instance) => { 'self': instance.self?.toString(), 'git': instance.git?.toString(), - 'html': instance.html?.toString() + 'html': instance.html?.toString(), }; ContributorStatistics _$ContributorStatisticsFromJson( Map json) { return ContributorStatistics( - json['author'] == null - ? null - : User.fromJson(json['author'] as Map), - json['total'] as int, - (json['weeks'] as List) - ?.map((e) => e == null - ? null - : ContributorWeekStatistics.fromJson(e as Map)) - ?.toList()); + json['author'] == null + ? null + : User.fromJson(json['author'] as Map), + json['total'] as int, + (json['weeks'] as List) + ?.map((e) => e == null + ? null + : ContributorWeekStatistics.fromJson(e as Map)) + ?.toList(), + ); } ContributorWeekStatistics _$ContributorWeekStatisticsFromJson( Map json) { return ContributorWeekStatistics( - json['w'] as int, json['a'] as int, json['d'] as int, json['c'] as int); + json['w'] as int, + json['a'] as int, + json['d'] as int, + json['c'] as int, + ); } CodeSearchResults _$CodeSearchResultsFromJson(Map json) { return CodeSearchResults() ..totalCount = json['total_count'] as int ..incompleteResults = json['incomplete_results'] as bool - ..items = json['items'] == null - ? null - : CodeSearchItem.fromJsonList(json['items'] as List); + ..items = CodeSearchItem.fromJsonList(json['items'] as List); } CodeSearchItem _$CodeSearchItemFromJson(Map json) { @@ -381,12 +409,9 @@ CodeSearchItem _$CodeSearchItemFromJson(Map json) { ..name = json['name'] as String ..path = json['path'] as String ..sha = json['sha'] as String - ..url = json['url'] == null ? null : Uri.parse(json['url'] as String) - ..gitUrl = - json['git_url'] == null ? null : Uri.parse(json['git_url'] as String) - ..htmlUrl = - json['html_url'] == null ? null : Uri.parse(json['html_url'] as String) - ..repository = json['repository'] == null - ? null - : Repository.fromJSON(json['repository'] as Map); + ..url = Uri.parse(json['url'] as String) + ..gitUrl = Uri.parse(json['git_url'] as String) + ..htmlUrl = Uri.parse(json['html_url'] as String) + ..repository = + Repository.fromJSON(json['repository'] as Map); } diff --git a/lib/src/common/model/repos_releases.g.dart b/lib/src/common/model/repos_releases.g.dart index b4a3b20b..28e9a07d 100644 --- a/lib/src/common/model/repos_releases.g.dart +++ b/lib/src/common/model/repos_releases.g.dart @@ -48,12 +48,8 @@ Map _$ReleaseToJson(Release instance) => { 'prerelease': instance.prerelease, 'created_at': instance.createdAt?.toIso8601String(), 'published_at': instance.publishedAt?.toIso8601String(), - 'author': instance.author == null - ? null - : Release._authorToJson(instance.author), - 'assets': instance.assets == null - ? null - : Release._assetsToJson(instance.assets) + 'author': Release._authorToJson(instance.author), + 'assets': Release._assetsToJson(instance.assets), }; ReleaseAsset _$ReleaseAssetFromJson(Map json) { @@ -85,11 +81,13 @@ Map _$ReleaseAssetToJson(ReleaseAsset instance) => 'size': instance.size, 'download_count': instance.downloadCount, 'created_at': instance.createdAt?.toIso8601String(), - 'updated_at': instance.updatedAt?.toIso8601String() + 'updated_at': instance.updatedAt?.toIso8601String(), }; CreateRelease _$CreateReleaseFromJson(Map json) { - return CreateRelease(json['tag_name'] as String) + return CreateRelease( + json['tag_name'] as String, + ) ..json = json['json'] as Map ..targetCommitish = json['target_commitish'] as String ..name = json['name'] as String @@ -106,5 +104,5 @@ Map _$CreateReleaseToJson(CreateRelease instance) => 'name': instance.name, 'body': instance.body, 'draft': instance.draft, - 'prerelease': instance.prerelease + 'prerelease': instance.prerelease, }; diff --git a/lib/src/common/model/users.g.dart b/lib/src/common/model/users.g.dart index adcecf25..715c588b 100644 --- a/lib/src/common/model/users.g.dart +++ b/lib/src/common/model/users.g.dart @@ -50,19 +50,20 @@ Map _$UserToJson(User instance) => { 'followers': instance.followersCount, 'following': instance.followingCount, 'created_at': instance.createdAt?.toIso8601String(), - 'updated_at': instance.updatedAt?.toIso8601String() + 'updated_at': instance.updatedAt?.toIso8601String(), }; Collaborator _$CollaboratorFromJson(Map json) { return Collaborator( - json['login'] as String, - json['id'] as int, - json['html_url'] as String, - json['type'] as String, - json['site_admin'] as bool, - (json['permissions'] as Map)?.map( - (k, e) => MapEntry(k, e as bool), - )); + json['login'] as String, + json['id'] as int, + json['html_url'] as String, + json['type'] as String, + json['site_admin'] as bool, + (json['permissions'] as Map)?.map( + (k, e) => MapEntry(k, e as bool), + ), + ); } CurrentUser _$CurrentUserFromJson(Map json) { diff --git a/pubspec.yaml b/pubspec.yaml index 5e83d5ac..b65a3dc5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -17,7 +17,7 @@ dev_dependencies: build_runner: any build_test: any build_web_compilers: any - json_serializable: ^2.0.0 + json_serializable: ^3.1.0 mockito: ^3.0.0 pedantic: ^1.0.0 test: ^1.3.0 From 5d8c451280a6b904ee779cbd578d1eecc151d983 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Thu, 25 Jul 2019 10:52:37 -0700 Subject: [PATCH 019/390] Repository: added updatedAt and license fields --- CHANGELOG.md | 4 ++++ lib/src/common.g.dart | 14 +++++++++++++- lib/src/common/model/repos.dart | 5 +++++ pubspec.yaml | 2 +- 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3665cde7..d3c35b11 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## v5.0.3 + +- `Repository`: added `updatedAt` and `license` fields. + ## v5.0.2 - Fixed pollPublicEventsReceivedByUser to use the correct API URL https://github.com/DirectMyFile/github.dart/pull/150 diff --git a/lib/src/common.g.dart b/lib/src/common.g.dart index d1d2b75b..35964b9a 100644 --- a/lib/src/common.g.dart +++ b/lib/src/common.g.dart @@ -161,6 +161,12 @@ TeamRepository _$TeamRepositoryFromJson(Map json) { ..pushedAt = json['pushed_at'] == null ? null : DateTime.parse(json['pushed_at'] as String) + ..updatedAt = json['updated_at'] == null + ? null + : DateTime.parse(json['updated_at'] as String) + ..license = json['license'] == null + ? null + : LicenseKind.fromJson(json['license'] as Map) ..permissions = json['permissions'] == null ? null : TeamRepositoryPermissions.fromJson( @@ -219,7 +225,13 @@ Repository _$RepositoryFromJson(Map json) { : DateTime.parse(json['created_at'] as String) ..pushedAt = json['pushed_at'] == null ? null - : DateTime.parse(json['pushed_at'] as String); + : DateTime.parse(json['pushed_at'] as String) + ..updatedAt = json['updated_at'] == null + ? null + : DateTime.parse(json['updated_at'] as String) + ..license = json['license'] == null + ? null + : LicenseKind.fromJson(json['license'] as Map); } CloneUrls _$CloneUrlsFromJson(Map json) { diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart index f8269a55..d047dd5d 100644 --- a/lib/src/common/model/repos.dart +++ b/lib/src/common/model/repos.dart @@ -122,6 +122,11 @@ class Repository { @JsonKey(name: "pushed_at") DateTime pushedAt; + @JsonKey(name: 'updated_at') + DateTime updatedAt; + + LicenseKind license; + static Repository fromJSON(Map input) { if (input == null) return null; return _$RepositoryFromJson(input); diff --git a/pubspec.yaml b/pubspec.yaml index b65a3dc5..5c70b966 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 5.0.2 +version: 5.0.3-dev author: Kenneth Endfinger description: GitHub API Client Library homepage: https://github.com/DirectMyFile/github.dart From 05ddf1ca7ed041f91416646caea3c548acddaf42 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Mon, 29 Jul 2019 11:34:48 -0700 Subject: [PATCH 020/390] bump version and SDK constraint --- CHANGELOG.md | 5 +++-- pubspec.yaml | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d3c35b11..b7a7fd70 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ -## v5.0.3 +## v5.1.0 -- `Repository`: added `updatedAt` and `license` fields. + - `Repository`: added `updatedAt` and `license` fields. + - Require at least Dart `2.2.0`. ## v5.0.2 - Fixed pollPublicEventsReceivedByUser to use the correct API URL https://github.com/DirectMyFile/github.dart/pull/150 diff --git a/pubspec.yaml b/pubspec.yaml index 5c70b966..bf46b8e9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,11 +1,11 @@ name: github -version: 5.0.3-dev +version: 5.1.0-dev author: Kenneth Endfinger description: GitHub API Client Library homepage: https://github.com/DirectMyFile/github.dart environment: - sdk: '>=2.1.0 <3.0.0' + sdk: '>=2.2.0 <3.0.0' dependencies: http: '>=0.11.3 <0.13.0' From 9cc803a44e27356b51371ebe061495c428ccf486 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Fri, 16 Aug 2019 16:41:41 -0700 Subject: [PATCH 021/390] Add labels to PRs --- lib/src/common/model/pulls.dart | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/src/common/model/pulls.dart b/lib/src/common/model/pulls.dart index a81f46d0..b4b509ec 100644 --- a/lib/src/common/model/pulls.dart +++ b/lib/src/common/model/pulls.dart @@ -112,6 +112,9 @@ class PullRequest extends PullRequestInformation { /// Pull Request ID int id; + /// Pull Request Labels + List labels; + PullRequest() : super(true); static PullRequest fromJSON(Map input) { @@ -128,6 +131,8 @@ class PullRequest extends PullRequestInformation { pr.additionsCount = input['additions']; pr.deletionsCount = input['deletions']; pr.changedFilesCount = input['changed_files']; + pr.labels = + input['labels'].cast>().map(IssueLabel.fromJSON).toList(); return pr; } } From 118d39fad6955b45049ecf99dedee5f0d6eff91f Mon Sep 17 00:00:00 2001 From: Dan Field Date: Thu, 22 Aug 2019 10:07:23 -0700 Subject: [PATCH 022/390] fix listFiles (#151) --- lib/src/common/pulls_service.dart | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/src/common/pulls_service.dart b/lib/src/common/pulls_service.dart index 27fa77a9..5acafb4d 100644 --- a/lib/src/common/pulls_service.dart +++ b/lib/src/common/pulls_service.dart @@ -75,11 +75,14 @@ class PullRequestsService extends Service { RepositoryCommit.fromJSON); } - Stream listFiles(RepositorySlug slug, int number) { + /// Lists the files in a pull request. + /// + /// API docs: https://developer.github.com/v3/pulls/#list-pull-requests-files + Stream listFiles(RepositorySlug slug, int number) { return PaginationHelper(_github).objects( "GET", '/repos/${slug.fullName}/pulls/$number/files', - PullRequestFile.fromJSON) as Stream; + PullRequestFile.fromJSON); } Future isMerged(RepositorySlug slug, int number) { From 5c2b46ee7b799aae1a402fe87719e38e9a8a99e6 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Thu, 22 Aug 2019 10:07:55 -0700 Subject: [PATCH 023/390] Fix casts on addLabelsToIssue (#152) --- lib/src/common/issues_service.dart | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/src/common/issues_service.dart b/lib/src/common/issues_service.dart index 46123076..0affc75f 100644 --- a/lib/src/common/issues_service.dart +++ b/lib/src/common/issues_service.dart @@ -286,12 +286,12 @@ class IssuesService extends Service { /// API docs: https://developer.github.com/v3/issues/labels/#add-labels-to-an-issue Future> addLabelsToIssue( RepositorySlug slug, int issueNumber, List labels) { - return _github.postJSON( - "/repos/${slug.fullName}/issues/$issueNumber/labels", - body: jsonEncode(labels), - convert: (input) => - input.map((Map it) => IssueLabel.fromJSON(it))) - as Future>; + return _github.postJSON, List>( + "/repos/${slug.fullName}/issues/$issueNumber/labels", + body: jsonEncode(labels), + convert: (input) => + input.cast>().map(IssueLabel.fromJSON).toList(), + ); } /// Replaces all labels for an issue. From fad98d2ff2785d1723c7e5eb6149f60e71cdbd45 Mon Sep 17 00:00:00 2001 From: Todd Volkert Date: Thu, 22 Aug 2019 10:08:15 -0700 Subject: [PATCH 024/390] Bump json_annotation dependency (#157) --- CHANGELOG.md | 3 ++- lib/src/common/model/search.dart | 8 ++++---- pubspec.yaml | 9 ++++++--- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b7a7fd70..0f641fe4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,8 @@ ## v5.1.0 - `Repository`: added `updatedAt` and `license` fields. - - Require at least Dart `2.2.0`. + - Require at least Dart `2.3.0`. + - Bump version constraint on `json_annotation` ## v5.0.2 - Fixed pollPublicEventsReceivedByUser to use the correct API URL https://github.com/DirectMyFile/github.dart/pull/150 diff --git a/lib/src/common/model/search.dart b/lib/src/common/model/search.dart index 9faaea3a..a17faa9d 100644 --- a/lib/src/common/model/search.dart +++ b/lib/src/common/model/search.dart @@ -6,7 +6,7 @@ abstract class SearchResults { List items; } -@JsonSerializable(generateToJsonFunction: false, createToJson: false) +@JsonSerializable(createToJson: false) class CodeSearchResults implements SearchResults { @JsonKey(name: "total_count") int totalCount; @@ -21,7 +21,7 @@ class CodeSearchResults implements SearchResults { _$CodeSearchResultsFromJson(input); } -@JsonSerializable(generateToJsonFunction: false, createToJson: false) +@JsonSerializable(createToJson: false) class CodeSearchItem { @JsonKey() String name; @@ -60,8 +60,8 @@ class CodeSearchItem { } // TODO: Issue Search -// @JsonSerializable(generateToJsonFunction: false, createToJson: false) +// @JsonSerializable(createToJson: false) // class IssueSearchResults extends SearchResults {} -// @JsonSerializable(generateToJsonFunction: false, createToJson: false) +// @JsonSerializable(createToJson: false) // class IssueSearchItem {} diff --git a/pubspec.yaml b/pubspec.yaml index bf46b8e9..a0880ff1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -5,19 +5,22 @@ description: GitHub API Client Library homepage: https://github.com/DirectMyFile/github.dart environment: - sdk: '>=2.2.0 <3.0.0' + sdk: '>=2.3.0 <3.0.0' dependencies: http: '>=0.11.3 <0.13.0' http_parser: ^3.1.1 - json_annotation: ^2.0.0 + json_annotation: '>=2.0.0 <4.0.0' meta: ^1.1.0 dev_dependencies: build_runner: any build_test: any build_web_compilers: any - json_serializable: ^3.1.0 + json_serializable: ^3.2.2 mockito: ^3.0.0 pedantic: ^1.0.0 test: ^1.3.0 + +builders: + json_serializable: ^3.2.2 From d09354afaec9df24caef65a248d26657c8ab6325 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Thu, 22 Aug 2019 10:50:15 -0700 Subject: [PATCH 025/390] dartfmt --- lib/src/common/model/pulls.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/src/common/model/pulls.dart b/lib/src/common/model/pulls.dart index b4b509ec..961c0cdc 100644 --- a/lib/src/common/model/pulls.dart +++ b/lib/src/common/model/pulls.dart @@ -131,8 +131,10 @@ class PullRequest extends PullRequestInformation { pr.additionsCount = input['additions']; pr.deletionsCount = input['deletions']; pr.changedFilesCount = input['changed_files']; - pr.labels = - input['labels'].cast>().map(IssueLabel.fromJSON).toList(); + pr.labels = input['labels'] + .cast>() + .map(IssueLabel.fromJSON) + .toList(); return pr; } } From 84d80ab29c51d4ae61e8f3a13767b97096935497 Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Mon, 26 Aug 2019 18:02:54 -0700 Subject: [PATCH 026/390] Add contents_url to PullRequestFile --- lib/src/common/model/pulls.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/src/common/model/pulls.dart b/lib/src/common/model/pulls.dart index a81f46d0..3e0e562c 100644 --- a/lib/src/common/model/pulls.dart +++ b/lib/src/common/model/pulls.dart @@ -297,6 +297,7 @@ class PullRequestFile { int changesCount; String blobUrl; String rawUrl; + String contentsUrl; String patch; static PullRequestFile fromJSON(Map input) { @@ -309,6 +310,7 @@ class PullRequestFile { file.changesCount = input['changes']; file.blobUrl = input['blob_url']; file.rawUrl = input['raw_url']; + file.contentsUrl = input['contents_url']; file.patch = input['patch']; return file; } From 2424aecf46b3b4c89f9aac501425f6d75a41c56f Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Mon, 26 Aug 2019 19:53:02 -0600 Subject: [PATCH 027/390] update pubspec to 5.1.0 --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index a0880ff1..a5f5b10a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 5.1.0-dev +version: 5.1.0 author: Kenneth Endfinger description: GitHub API Client Library homepage: https://github.com/DirectMyFile/github.dart From 3d63ca1e914e8d8dd61c34cdbd3f5ef1e50c7ae6 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Mon, 26 Aug 2019 19:56:31 -0600 Subject: [PATCH 028/390] update changelog for 5.1.0 --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f641fe4..6e8f54da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ - `Repository`: added `updatedAt` and `license` fields. - Require at least Dart `2.3.0`. - Bump version constraint on `json_annotation` + - Add contents_url to PullRequestFile https://github.com/DirectMyFile/github.dart/pull/159 ## v5.0.2 - Fixed pollPublicEventsReceivedByUser to use the correct API URL https://github.com/DirectMyFile/github.dart/pull/150 From 7de09115a93610a1040825dfb99b8115b5a87fac Mon Sep 17 00:00:00 2001 From: Igor Borges Date: Sat, 31 Aug 2019 13:51:41 -0300 Subject: [PATCH 029/390] Add putJSON fn to GitHub class and use it on updateFile call --- lib/src/common/github.dart | 37 ++++++++++++++++++++++++++++++- lib/src/common/repos_service.dart | 2 +- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index 9b864d7c..41ce5d35 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -201,7 +201,7 @@ class GitHub { convert: convert, preview: preview); - /// Handles Post Requests that respond with JSO + /// Handles Post Requests that respond with JSON /// /// [path] can either be a path like '/repos' or a full url. /// [statusCode] is the expected status code. If it is null, it is ignored. @@ -236,6 +236,41 @@ class GitHub { body: body, preview: preview); + /// Handles Put Requests that respond with JSON + /// + /// [path] can either be a path like '/repos' or a full url. + /// [statusCode] is the expected status code. If it is null, it is ignored. + /// If the status code that the response returns is not the status code you provide + /// then the [fail] function will be called with the HTTP Response. + /// + /// If you don't throw an error or break out somehow, it will go into some error checking + /// that throws exceptions when it finds a 404 or 401. If it doesn't find a general HTTP Status Code + /// for errors, it throws an Unknown Error. + /// + /// [headers] are HTTP Headers. If it doesn't exist, the 'Accept' and 'Authorization' headers are added. + /// [params] are query string parameters. + /// [convert] is a simple function that is passed this [GitHub] instance and a JSON object. + /// + /// The future will pass the object returned from this function to the then method. + /// The default [convert] function returns the input object. + /// [body] is the data to send to the server. + Future putJSON(String path, + {int statusCode, + void fail(http.Response response), + Map headers, + Map params, + JSONConverter convert, + String body, + String preview}) => + _requestJson('PUT', path, + statusCode: statusCode, + fail: fail, + headers: headers, + params: params, + convert: convert, + body: body, + preview: preview); + Future _requestJson( String method, String path, { diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 9fe47b35..1f9577f7 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -354,7 +354,7 @@ class RepositoriesService extends Service { var map = createNonNullMap( {"message": message, "content": content, "sha": sha, "branch": branch}); - return _github.postJSON("/repos/${slug.fullName}/contents/$path", + return _github.putJSON("/repos/${slug.fullName}/contents/$path", body: jsonEncode(map), statusCode: 200, convert: ContentCreation.fromJSON); From e49f035f5a21b38923f5663a29e69dfc1580a2ae Mon Sep 17 00:00:00 2001 From: Igor Borges Date: Sat, 31 Aug 2019 13:57:12 -0300 Subject: [PATCH 030/390] Use github.request directly, just like other put requests --- lib/src/common/github.dart | 35 ------------------------------- lib/src/common/repos_service.dart | 11 ++++++---- 2 files changed, 7 insertions(+), 39 deletions(-) diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index 41ce5d35..b86add66 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -236,41 +236,6 @@ class GitHub { body: body, preview: preview); - /// Handles Put Requests that respond with JSON - /// - /// [path] can either be a path like '/repos' or a full url. - /// [statusCode] is the expected status code. If it is null, it is ignored. - /// If the status code that the response returns is not the status code you provide - /// then the [fail] function will be called with the HTTP Response. - /// - /// If you don't throw an error or break out somehow, it will go into some error checking - /// that throws exceptions when it finds a 404 or 401. If it doesn't find a general HTTP Status Code - /// for errors, it throws an Unknown Error. - /// - /// [headers] are HTTP Headers. If it doesn't exist, the 'Accept' and 'Authorization' headers are added. - /// [params] are query string parameters. - /// [convert] is a simple function that is passed this [GitHub] instance and a JSON object. - /// - /// The future will pass the object returned from this function to the then method. - /// The default [convert] function returns the input object. - /// [body] is the data to send to the server. - Future putJSON(String path, - {int statusCode, - void fail(http.Response response), - Map headers, - Map params, - JSONConverter convert, - String body, - String preview}) => - _requestJson('PUT', path, - statusCode: statusCode, - fail: fail, - headers: headers, - params: params, - convert: convert, - body: body, - preview: preview); - Future _requestJson( String method, String path, { diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 1f9577f7..d65646cb 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -354,10 +354,13 @@ class RepositoriesService extends Service { var map = createNonNullMap( {"message": message, "content": content, "sha": sha, "branch": branch}); - return _github.putJSON("/repos/${slug.fullName}/contents/$path", - body: jsonEncode(map), - statusCode: 200, - convert: ContentCreation.fromJSON); + return _github + .request("PUT", "/repos/${slug.fullName}/contents/$path", + body: jsonEncode(map)) + .then((response) { + return ContentCreation.fromJSON( + jsonDecode(response.body) as Map); + }); } /// Deletes the specified file. From 23329908c99462ccd1bf1f2c077850731e83c56c Mon Sep 17 00:00:00 2001 From: Kate Lovett Date: Fri, 13 Sep 2019 12:40:52 -0700 Subject: [PATCH 031/390] Adding draft property to PR model. --- lib/src/common/model/pulls.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/src/common/model/pulls.dart b/lib/src/common/model/pulls.dart index 3e0e562c..cce716f5 100644 --- a/lib/src/common/model/pulls.dart +++ b/lib/src/common/model/pulls.dart @@ -54,6 +54,9 @@ class PullRequestInformation { /// The User who created the Pull Request User user; + /// Whether or not the pull request is a draft + bool draft; + PullRequestInformation([this.isCompletePullRequest = false]); static PullRequestInformation fromJSON(Map input, @@ -75,6 +78,7 @@ class PullRequestInformation { pr.closedAt = parseDateTime(input['closed_at']); pr.mergedAt = parseDateTime(input['merged_at']); pr.user = User.fromJson(input['user'] as Map); + pr.draft = input['draft'] ?? false; return pr; } } From 18178ecbd0703232f348c521b1ce33b7c72ecdc5 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Fri, 20 Sep 2019 09:13:28 -0600 Subject: [PATCH 032/390] add null aware to prevent errors --- lib/src/common/model/pulls.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/src/common/model/pulls.dart b/lib/src/common/model/pulls.dart index f83f105f..d031e0e3 100644 --- a/lib/src/common/model/pulls.dart +++ b/lib/src/common/model/pulls.dart @@ -136,9 +136,9 @@ class PullRequest extends PullRequestInformation { pr.deletionsCount = input['deletions']; pr.changedFilesCount = input['changed_files']; pr.labels = input['labels'] - .cast>() - .map(IssueLabel.fromJSON) - .toList(); + ?.cast>() + ?.map(IssueLabel.fromJSON) + ?.toList(); return pr; } } From 17e60c44fa0e22ee07998a63b80ca101db64a298 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Fri, 20 Sep 2019 09:15:14 -0600 Subject: [PATCH 033/390] formatted w/ 2.5.0 --- lib/src/common/model/pulls.dart | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/lib/src/common/model/pulls.dart b/lib/src/common/model/pulls.dart index d031e0e3..066bbdc1 100644 --- a/lib/src/common/model/pulls.dart +++ b/lib/src/common/model/pulls.dart @@ -59,8 +59,7 @@ class PullRequestInformation { PullRequestInformation([this.isCompletePullRequest = false]); - static PullRequestInformation fromJSON(Map input, - [PullRequestInformation into]) { + static PullRequestInformation fromJSON(Map input, [PullRequestInformation into]) { if (input == null) return null; var pr = into != null ? into : PullRequestInformation(); @@ -135,10 +134,7 @@ class PullRequest extends PullRequestInformation { pr.additionsCount = input['additions']; pr.deletionsCount = input['deletions']; pr.changedFilesCount = input['changed_files']; - pr.labels = input['labels'] - ?.cast>() - ?.map(IssueLabel.fromJSON) - ?.toList(); + pr.labels = input['labels']?.cast>()?.map(IssueLabel.fromJSON)?.toList(); return pr; } } From 4dd3b654cfbc8a69a384db25bc709b2582345494 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Fri, 20 Sep 2019 09:23:42 -0600 Subject: [PATCH 034/390] ok, dartfmt cmd line different than in VS Code. weird. --- lib/src/common/model/pulls.dart | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/src/common/model/pulls.dart b/lib/src/common/model/pulls.dart index 066bbdc1..d031e0e3 100644 --- a/lib/src/common/model/pulls.dart +++ b/lib/src/common/model/pulls.dart @@ -59,7 +59,8 @@ class PullRequestInformation { PullRequestInformation([this.isCompletePullRequest = false]); - static PullRequestInformation fromJSON(Map input, [PullRequestInformation into]) { + static PullRequestInformation fromJSON(Map input, + [PullRequestInformation into]) { if (input == null) return null; var pr = into != null ? into : PullRequestInformation(); @@ -134,7 +135,10 @@ class PullRequest extends PullRequestInformation { pr.additionsCount = input['additions']; pr.deletionsCount = input['deletions']; pr.changedFilesCount = input['changed_files']; - pr.labels = input['labels']?.cast>()?.map(IssueLabel.fromJSON)?.toList(); + pr.labels = input['labels'] + ?.cast>() + ?.map(IssueLabel.fromJSON) + ?.toList(); return pr; } } From 4328c21a5fd901a655da0f396e8243de7ce1f103 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Fri, 20 Sep 2019 10:02:36 -0600 Subject: [PATCH 035/390] bump version, update changelog, longer description for points --- CHANGELOG.md | 5 +++++ pubspec.yaml | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e8f54da..7f448d74 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## v5.2.0 + - Add access to labels on Pull Requests https://github.com/DirectMyFile/github.dart/pull/163 + - Adding draft property to PR model https://github.com/DirectMyFile/github.dart/pull/162 + - updateFile request must be a PUT https://github.com/DirectMyFile/github.dart/pull/160 + ## v5.1.0 - `Repository`: added `updatedAt` and `license` fields. diff --git a/pubspec.yaml b/pubspec.yaml index a5f5b10a..07cfe49b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: github -version: 5.1.0 +version: 5.2.0 author: Kenneth Endfinger -description: GitHub API Client Library +description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/DirectMyFile/github.dart environment: From 85ae9bf40f82928fe13396af99be29133f9fe1b4 Mon Sep 17 00:00:00 2001 From: axel-op <49279289+axel-op@users.noreply.github.com> Date: Mon, 30 Sep 2019 19:44:50 +0200 Subject: [PATCH 036/390] Added method to add a commit comment --- lib/src/common.dart | 1 + lib/src/common/repos_service.dart | 46 +++++++++++++++++++++++-------- 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/lib/src/common.dart b/lib/src/common.dart index c60faebb..f013a3c7 100644 --- a/lib/src/common.dart +++ b/lib/src/common.dart @@ -17,6 +17,7 @@ import "package:http/http.dart" as http; import 'package:http_parser/http_parser.dart' as http_parser; import "package:json_annotation/json_annotation.dart"; import 'package:meta/meta.dart' as meta show alwaysThrows; +import 'package:meta/meta.dart'; import 'common/model/repos_releases.dart'; import 'common/model/users.dart'; diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index d65646cb..35c67830 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -234,7 +234,26 @@ class RepositoriesService extends Service { // TODO: Implement listComments: https://developer.github.com/v3/repos/comments/#list-commit-comments-for-a-repository // TODO: Implement listCommitComments: https://developer.github.com/v3/repos/comments/#list-comments-for-a-single-commit - // TODO: Implement createComment: https://developer.github.com/v3/repos/comments/#create-a-commit-comment + + /// Create a comment for a commit using its sha. + /// * [body]: The contents of the comment. + /// * [path]: Relative path of the file to comment on. + /// * [position]: Line index in the diff to comment on. + /// + /// https://developer.github.com/v3/repos/comments/#create-a-commit-comment + Future createCommitComment(RepositorySlug slug, RepositoryCommit commit, + {@required String body, String path, int position}) { + final Map data = createNonNullMap({ + 'body': body, + 'path': path, + 'position': position, + }); + return _github.postJSON( + "/repos/${slug.fullName}/commits/${commit.sha}/comments", + body: jsonEncode(data), + statusCode: 201); + } + // TODO: Implement getComment: https://developer.github.com/v3/repos/comments/#get-a-single-commit-comment // TODO: Implement updateComment: https://developer.github.com/v3/repos/comments/#update-a-commit-comment // TODO: Implement deleteComment: https://developer.github.com/v3/repos/comments/#delete-a-commit-comment @@ -243,8 +262,8 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/commits/#list-commits-on-a-repository Stream listCommits(RepositorySlug slug) { - return PaginationHelper(_github).objects( - "GET", "/repos/${slug.fullName}/commits", RepositoryCommit.fromJSON); + return PaginationHelper(_github).objects("GET", + "/repos/${slug.fullName}/commits", (i) => RepositoryCommit.fromJSON(i)); } /// Fetches the specified commit. @@ -252,7 +271,7 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/commits/#get-a-single-commit Future getCommit(RepositorySlug slug, String sha) => _github.getJSON("/repos/${slug.fullName}/commits/$sha", - convert: RepositoryCommit.fromJSON); + convert: (i) => RepositoryCommit.fromJSON(i)); /// [refBase] and [refHead] can be the same value for a branch, commit, or ref /// in [slug] or specify other repositories by using `repo:ref` syntax. @@ -491,7 +510,7 @@ class RepositoriesService extends Service { Future merge(RepositorySlug slug, CreateMerge merge) { return _github.postJSON("/repos/${slug.fullName}/merges", body: merge.toJSON(), - convert: RepositoryCommit.fromJSON, + convert: (i) => RepositoryCommit.fromJSON(i), statusCode: 201); } @@ -566,7 +585,7 @@ class RepositoriesService extends Service { return PaginationHelper(_github).objects( "GET", "/repos/${slug.fullName}/stats/commit_activity", - YearCommitCountWeek.fromJSON); + (i) => YearCommitCountWeek.fromJSON(i)); } /// Fetches weekly addition and deletion counts. @@ -576,7 +595,7 @@ class RepositoriesService extends Service { return PaginationHelper(_github).objects( "GET", "/repos/${slug.fullName}/stats/code_frequency", - WeeklyChangesCount.fromJSON); + (i) => WeeklyChangesCount.fromJSON(i)); } /// Fetches Participation Breakdowns. @@ -584,14 +603,17 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/statistics/#participation Future getParticipation(RepositorySlug slug) => _github.getJSON("/repos/${slug.fullName}/stats/participation", - statusCode: 200, convert: ContributorParticipation.fromJSON); + statusCode: 200, + convert: (i) => ContributorParticipation.fromJSON(i)); /// Fetches Punchcard. /// /// API docs: https://developer.github.com/v3/repos/statistics/#punch-card Stream listPunchcard(RepositorySlug slug) { - return PaginationHelper(_github).objects("GET", - "/repos/${slug.fullName}/stats/punchcard", PunchcardEntry.fromJSON); + return PaginationHelper(_github).objects( + "GET", + "/repos/${slug.fullName}/stats/punchcard", + (i) => PunchcardEntry.fromJSON(i)); } /// Lists the statuses of a repository at the specified reference. @@ -602,7 +624,7 @@ class RepositoriesService extends Service { return PaginationHelper(_github).objects( "GET", "/repos/${slug.fullName}/commits/$ref/statuses", - RepositoryStatus.fromJSON); + (i) => RepositoryStatus.fromJSON(i)); } /// Creates a new status for a repository at the specified reference. @@ -612,7 +634,7 @@ class RepositoriesService extends Service { Future createStatus( RepositorySlug slug, String ref, CreateStatus request) { return _github.postJSON("/repos/${slug.fullName}/statuses/$ref", - body: request.toJSON(), convert: RepositoryStatus.fromJSON); + body: request.toJSON(), convert: (i) => RepositoryStatus.fromJSON(i)); } /// Gets a Combined Status for the specified repository and ref. From cb5adf3f4758f990e2d1935c1f03b45dc2e740ab Mon Sep 17 00:00:00 2001 From: axel-op <49279289+axel-op@users.noreply.github.com> Date: Wed, 2 Oct 2019 21:32:55 +0200 Subject: [PATCH 037/390] Added deprecated parameter --- lib/src/common/repos_service.dart | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 35c67830..9c7677d2 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -239,14 +239,21 @@ class RepositoriesService extends Service { /// * [body]: The contents of the comment. /// * [path]: Relative path of the file to comment on. /// * [position]: Line index in the diff to comment on. + /// * [line]: **Deprecated**. Use position parameter instead. Line number in the file to comment on. /// /// https://developer.github.com/v3/repos/comments/#create-a-commit-comment - Future createCommitComment(RepositorySlug slug, RepositoryCommit commit, - {@required String body, String path, int position}) { + // TODO: convert the JSON returned by the API + Future createCommitComment( + RepositorySlug slug, RepositoryCommit commit, + {@required String body, + String path, + int position, + @Deprecated('Use position parameter instead') int line}) { final Map data = createNonNullMap({ 'body': body, 'path': path, 'position': position, + 'line': line, }); return _github.postJSON( "/repos/${slug.fullName}/commits/${commit.sha}/comments", From 0fe0511f00b199089f78e1a733c1945db9a79d98 Mon Sep 17 00:00:00 2001 From: axel-op <49279289+axel-op@users.noreply.github.com> Date: Wed, 2 Oct 2019 23:37:17 +0200 Subject: [PATCH 038/390] Added CommitComment model --- lib/src/common/repos_service.dart | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 9c7677d2..4d4bb13b 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -242,8 +242,7 @@ class RepositoriesService extends Service { /// * [line]: **Deprecated**. Use position parameter instead. Line number in the file to comment on. /// /// https://developer.github.com/v3/repos/comments/#create-a-commit-comment - // TODO: convert the JSON returned by the API - Future createCommitComment( + Future createCommitComment( RepositorySlug slug, RepositoryCommit commit, {@required String body, String path, @@ -256,9 +255,11 @@ class RepositoriesService extends Service { 'line': line, }); return _github.postJSON( - "/repos/${slug.fullName}/commits/${commit.sha}/comments", - body: jsonEncode(data), - statusCode: 201); + "/repos/${slug.fullName}/commits/${commit.sha}/comments", + body: jsonEncode(data), + statusCode: 201, + convert: (i) => CommitComment.fromJSON(i), + ); } // TODO: Implement getComment: https://developer.github.com/v3/repos/comments/#get-a-single-commit-comment From a616d758b0971a88b6a73dd9ba941fb4551088eb Mon Sep 17 00:00:00 2001 From: axel-op <49279289+axel-op@users.noreply.github.com> Date: Thu, 3 Oct 2019 00:27:35 +0200 Subject: [PATCH 039/390] Commit was incomplete --- lib/src/common/model/repos_commits.dart | 62 +++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/lib/src/common/model/repos_commits.dart b/lib/src/common/model/repos_commits.dart index a4ba866c..c9872f5e 100644 --- a/lib/src/common/model/repos_commits.dart +++ b/lib/src/common/model/repos_commits.dart @@ -123,3 +123,65 @@ class CommitFile { ..json = input; } } + +/// Model class for a commit comment. +/// +/// See https://developer.github.com/v3/repos/comments +class CommitComment { + /// Id of the comment + final int id; + + /// Relative path of the file on which the comment has been posted + final String path; + + /// Line on file + final int line; + + /// Position on the diff + final int position; + + /// SHA of the commit where the comment has been made + final String commitId; + + final DateTime createdAt; + + /// Can be equals to [createdAt] + final DateTime updatedAt; + + /// https://github.com/... + final String htmlUrl; + + /// https://api.github.com/... + final String apiUrl; + + /// Content of the comment + final String body; + + const CommitComment._({ + @required this.id, + @required this.line, + @required this.position, + @required this.path, + @required this.apiUrl, + @required this.commitId, + @required this.createdAt, + @required this.htmlUrl, + @required this.updatedAt, + @required this.body, + }); + + factory CommitComment.fromJSON(Map input) { + return CommitComment._( + id: input['id'], + htmlUrl: input['html_url'], + apiUrl: input['url'], + body: input['body'], + path: input['path'], + position: input['position'], + line: input['line'], + commitId: input['commit_id'], + createdAt: DateTime.parse(input['created_at']), + updatedAt: DateTime.parse(input['updated_at']), + ); + } +} From 3da3ae7c498ee87fdfeed8d965011b6e63ebe9c2 Mon Sep 17 00:00:00 2001 From: axel-op <49279289+axel-op@users.noreply.github.com> Date: Thu, 3 Oct 2019 00:30:30 +0200 Subject: [PATCH 040/390] Importing all meta package --- lib/src/common.dart | 1 - lib/src/common/github.dart | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/src/common.dart b/lib/src/common.dart index f013a3c7..0245d604 100644 --- a/lib/src/common.dart +++ b/lib/src/common.dart @@ -16,7 +16,6 @@ import "dart:convert" import "package:http/http.dart" as http; import 'package:http_parser/http_parser.dart' as http_parser; import "package:json_annotation/json_annotation.dart"; -import 'package:meta/meta.dart' as meta show alwaysThrows; import 'package:meta/meta.dart'; import 'common/model/repos_releases.dart'; diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index b86add66..b80d4856 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -350,7 +350,7 @@ class GitHub { /// /// Internal method to handle status codes /// - @meta.alwaysThrows + @alwaysThrows void handleStatusCode(http.Response response) { String message; List> errors; From 9c5da6f92759009815be12fd73fadea4630ff200 Mon Sep 17 00:00:00 2001 From: axel-op <49279289+axel-op@users.noreply.github.com> Date: Thu, 3 Oct 2019 22:46:42 +0200 Subject: [PATCH 041/390] Added all commit comments methods --- lib/src/common/repos_service.dart | 82 ++++++++++++++++++++++++++++--- 1 file changed, 74 insertions(+), 8 deletions(-) diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 4d4bb13b..f3ace58b 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -232,8 +232,34 @@ class RepositoriesService extends Service { }); } - // TODO: Implement listComments: https://developer.github.com/v3/repos/comments/#list-commit-comments-for-a-repository - // TODO: Implement listCommitComments: https://developer.github.com/v3/repos/comments/#list-comments-for-a-single-commit + /// Returns a list of all comments for a specific commit. + /// + /// https://developer.github.com/v3/repos/comments/#list-commit-comments-for-a-repository + Future> listComments( + RepositorySlug slug, + RepositoryCommit commit, + ) { + return _github.getJSON, List>( + "/repos/${slug.fullName}/commits/${commit.sha}/comments", + statusCode: 200, + convert: (input) => List.castFrom>(input) + .map((i) => CommitComment.fromJSON(i)) + .toList(), + ); + } + + /// Returns a list of all commit comments in a repository. + /// + /// https://developer.github.com/v3/repos/comments/#list-comments-for-a-single-commit + Future> listCommitComments(RepositorySlug slug) async { + return await _github.getJSON, List>( + "repos/${slug.fullName}/comments", + statusCode: 200, + convert: (input) => List.castFrom>(input) + .map((i) => CommitComment.fromJSON(i)) + .toList(), + ); + } /// Create a comment for a commit using its sha. /// * [body]: The contents of the comment. @@ -247,14 +273,14 @@ class RepositoriesService extends Service { {@required String body, String path, int position, - @Deprecated('Use position parameter instead') int line}) { + @Deprecated('Use position parameter instead') int line}) async { final Map data = createNonNullMap({ 'body': body, 'path': path, 'position': position, 'line': line, }); - return _github.postJSON( + return await _github.postJSON, CommitComment>( "/repos/${slug.fullName}/commits/${commit.sha}/comments", body: jsonEncode(data), statusCode: 201, @@ -262,9 +288,48 @@ class RepositoriesService extends Service { ); } - // TODO: Implement getComment: https://developer.github.com/v3/repos/comments/#get-a-single-commit-comment - // TODO: Implement updateComment: https://developer.github.com/v3/repos/comments/#update-a-commit-comment - // TODO: Implement deleteComment: https://developer.github.com/v3/repos/comments/#delete-a-commit-comment + /// Retrieve a commit comment by its id. + /// + /// https://developer.github.com/v3/repos/comments/#get-a-single-commit-comment + Future getCommitComment(RepositorySlug slug, + {@required int id}) async { + return await _github.getJSON, CommitComment>( + "/repos/${slug.fullName}/comments/id", + statusCode: 200, + convert: (i) => CommitComment.fromJSON(i), + ); + } + + /// Update a commit comment + /// * [id]: id of the comment to update. + /// * [body]: new body of the comment. + /// + /// Returns the updated commit comment. + /// + /// https://developer.github.com/v3/repos/comments/#update-a-commit-comment + Future updateCommitComment(RepositorySlug slug, + {@required int id, @required String body}) async { + assert(body != null); + return await _github.postJSON, CommitComment>( + "/repos/${slug.fullName}/comments/${id.toString()}", + body: jsonEncode(createNonNullMap({'body': body})), + statusCode: 200, + convert: (i) => CommitComment.fromJSON(i), + ); + } + + /// Delete a commit comment. + /// *[id]: id of the comment to delete. + /// + /// https://developer.github.com/v3/repos/comments/#delete-a-commit-comment + Future deleteCommitComment(RepositorySlug slug, + {@required int id}) async { + await _github.request( + "DELETE", + "/repos/${slug.fullName}/comments/${id.toString()}", + statusCode: 204, + ); + } /// Lists the commits of the provided repository [slug]. /// @@ -413,7 +478,8 @@ class RepositoriesService extends Service { Future getArchiveLink(RepositorySlug slug, String ref, {String format = "tarball"}) { return _github - .request("GET", "/repos/${slug.fullName}/$format/$ref", statusCode: 302) + .request("GET", "/repos/${slug.fullName}/$format/$ref", + statusCode: 302) .then((response) { return response.headers["Location"]; }); From facc9202551ad020afe3d341665cb7ea68c42a95 Mon Sep 17 00:00:00 2001 From: axel-op <49279289+axel-op@users.noreply.github.com> Date: Thu, 3 Oct 2019 23:39:08 +0200 Subject: [PATCH 042/390] Marked future methods as async + added types + added rules --- analysis_options.yaml | 12 +- lib/src/common.dart | 1 + lib/src/common/repos_service.dart | 587 ++++++++++++++++++------------ 3 files changed, 362 insertions(+), 238 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index ebaab926..3166fb94 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -2,7 +2,7 @@ include: package:pedantic/analysis_options.yaml linter: rules: - always_declare_return_types -# - annotate_overrides + - annotate_overrides # - avoid_as - avoid_empty_else - avoid_init_to_null @@ -11,7 +11,7 @@ linter: - camel_case_types - close_sinks - comment_references -# - constant_identifier_names + - constant_identifier_names - control_flow_in_finally - directives_ordering - empty_catches @@ -28,7 +28,13 @@ linter: - package_api_docs - package_names - package_prefixed_library_names + - prefer_constructors_over_static_methods + - prefer_const_declarations + - prefer_const_literals_to_create_immutables - prefer_equal_for_default_values + - prefer_final_fields + - prefer_final_in_for_each + - prefer_final_locals - prefer_generic_function_type_aliases - prefer_is_not_empty - slash_for_doc_comments @@ -38,9 +44,11 @@ linter: - type_annotate_public_apis - type_init_formals - unawaited_futures + - unnecessary_await_in_return - unnecessary_brace_in_string_interps - unnecessary_const - unnecessary_getters_setters - unnecessary_new - unrelated_type_equality_checks - valid_regexps + - void_checks diff --git a/lib/src/common.dart b/lib/src/common.dart index 0245d604..7bcfb173 100644 --- a/lib/src/common.dart +++ b/lib/src/common.dart @@ -14,6 +14,7 @@ import "dart:convert" json; import "package:http/http.dart" as http; +import 'package:http/http.dart'; import 'package:http_parser/http_parser.dart' as http_parser; import "package:json_annotation/json_annotation.dart"; import 'package:meta/meta.dart'; diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index f3ace58b..d69d82de 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -14,10 +14,14 @@ class RepositoriesService extends Service { {String type = "owner", String sort = "full_name", String direction = "asc"}) { - var params = {"type": type, "sort": sort, "direction": direction}; + final params = {"type": type, "sort": sort, "direction": direction}; - return PaginationHelper(_github) - .objects("GET", "/user/repos", Repository.fromJSON, params: params); + return PaginationHelper(_github).objects, Repository>( + "GET", + "/user/repos", + (i) => Repository.fromJSON(i), + params: params, + ); } /// Lists the repositories of the user specified by [user] in a streamed fashion. @@ -27,11 +31,14 @@ class RepositoriesService extends Service { {String type = "owner", String sort = "full_name", String direction = "asc"}) { - var params = {"type": type, "sort": sort, "direction": direction}; + final params = {"type": type, "sort": sort, "direction": direction}; - return PaginationHelper(_github).objects( - "GET", "/users/$user/repos", Repository.fromJSON, - params: params); + return PaginationHelper(_github).objects, Repository>( + "GET", + "/users/$user/repos", + (i) => Repository.fromJSON(i), + params: params, + ); } /// List repositories for the specified [org]. @@ -39,13 +46,14 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/#list-user-repositories Stream listOrganizationRepositories(String org, {String type = "all"}) { - var params = { - "type": type, - }; + final params = {"type": type}; - return PaginationHelper(_github).objects( - "GET", "/orgs/$org/repos", Repository.fromJSON, - params: params); + return PaginationHelper(_github).objects, Repository>( + "GET", + "/orgs/$org/repos", + (i) => Repository.fromJSON(i), + params: params, + ); } /// Lists all the public repositories on GitHub, in the order that they were @@ -56,18 +64,18 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/#list-all-public-repositories Stream listPublicRepositories({int limit = 50, DateTime since}) { - var params = {}; + final params = {}; if (since != null) { params['since'] = since.toIso8601String(); } - var pages = limit != null ? (limit / 30).ceil() : null; + final pages = limit != null ? (limit / 30).ceil() : null; return PaginationHelper(_github) .fetchStreamed("GET", "/repositories", pages: pages, params: params) - .expand((http.Response response) { - var list = jsonDecode(response.body) as List>; + .expand((http.Response response) { + final list = jsonDecode(response.body) as List>; return list.map((Map it) => Repository.fromJSON(it)); }); @@ -79,36 +87,47 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/#create Future createRepository(CreateRepository repository, - {String org}) { + {String org}) async { if (org != null) { - return _github.postJSON('/orgs/$org/repos', - body: repository.toJSON(), convert: TeamRepository.fromJSON); + return _github.postJSON, TeamRepository>( + '/orgs/$org/repos', + body: repository.toJSON(), + convert: (i) => TeamRepository.fromJSON(i), + ); } else { - return _github.postJSON('/user/repos', - body: repository.toJSON(), convert: Repository.fromJSON); + return _github.postJSON, Repository>( + '/user/repos', + body: repository.toJSON(), + convert: (i) => Repository.fromJSON(i), + ); } } - Future getLicense(RepositorySlug slug) => - _github.getJSON("/repos/${slug.owner}/${slug.name}/license", - convert: (json) => LicenseDetails.fromJson(json)); + Future getLicense(RepositorySlug slug) async => + _github.getJSON, LicenseDetails>( + "/repos/${slug.owner}/${slug.name}/license", + convert: (json) => LicenseDetails.fromJson(json), + ); /// Fetches the repository specified by the [slug]. /// /// API docs: https://developer.github.com/v3/repos/#get - Future getRepository(RepositorySlug slug) => - _github.getJSON("/repos/${slug.owner}/${slug.name}", - convert: Repository.fromJSON, - statusCode: StatusCodes.OK, fail: (http.Response response) { - if (response.statusCode == 404) { - throw RepositoryNotFound(_github, slug.fullName); - } - }); + Future getRepository(RepositorySlug slug) async => + _github.getJSON, Repository>( + "/repos/${slug.owner}/${slug.name}", + convert: (i) => Repository.fromJSON(i), + statusCode: StatusCodes.OK, + fail: (http.Response response) { + if (response.statusCode == 404) { + throw RepositoryNotFound(_github, slug.fullName); + } + }, + ); /// Fetches a list of repositories specified by [slugs]. Stream getRepositories(List slugs) async* { - for (var slug in slugs) { - var repo = await getRepository(slug); + for (final RepositorySlug slug in slugs) { + final repo = await getRepository(slug); yield repo; } } @@ -123,8 +142,8 @@ class RepositoriesService extends Service { bool private, bool hasIssues, bool hasWiki, - bool hasDownloads}) { - var data = createNonNullMap({ + bool hasDownloads}) async { + final Map data = createNonNullMap({ "name": name, "description": description, "homepage": homepage, @@ -134,8 +153,11 @@ class RepositoriesService extends Service { "has_downloads": hasDownloads, "default_branch": "defaultBranch" }); - return _github.postJSON("/repos/${repo.fullName}", - body: jsonEncode(data), statusCode: 200); + return _github.postJSON( + "/repos/${repo.fullName}", + body: jsonEncode(data), + statusCode: 200, + ); } /// Deletes a repository. @@ -143,60 +165,77 @@ class RepositoriesService extends Service { /// Returns true if it was successfully deleted. /// /// API docs: https://developer.github.com/v3/repos/#delete-a-repository - Future deleteRepository(RepositorySlug slug) { - return _github - .request('DELETE', '/repos/${slug.fullName}') - .then((response) => response.statusCode == StatusCodes.NO_CONTENT); + Future deleteRepository(RepositorySlug slug) async { + await _github.request( + 'DELETE', + '/repos/${slug.fullName}', + statusCode: StatusCodes.NO_CONTENT, + ); } /// Lists the contributors of the specified repository. /// /// API docs: https://developer.github.com/v3/repos/#list-contributors Stream listContributors(RepositorySlug slug, {bool anon = false}) { - return PaginationHelper(_github).objects( - 'GET', '/repos/${slug.fullName}/contributors', User.fromJson, - params: {"anon": anon.toString()}); + return PaginationHelper(_github).objects, User>( + 'GET', + '/repos/${slug.fullName}/contributors', + (i) => User.fromJson(i), + params: {"anon": anon.toString()}, + ); } /// Lists the teams of the specified repository. /// /// API docs: https://developer.github.com/v3/repos/#list-teams Stream listTeams(RepositorySlug slug) { - return PaginationHelper(_github) - .objects('GET', '/repos/${slug.fullName}/teams', Team.fromJSON); + return PaginationHelper(_github).objects, Team>( + 'GET', + '/repos/${slug.fullName}/teams', + (i) => Team.fromJSON(i), + ); } /// Gets a language breakdown for the specified repository. /// /// API docs: https://developer.github.com/v3/repos/#list-languages - Future listLanguages(RepositorySlug slug) => - _github.getJSON("/repos/${slug.fullName}/languages", - statusCode: StatusCodes.OK, - convert: (Map input) => - LanguageBreakdown(input.cast())); + Future listLanguages(RepositorySlug slug) async => + _github.getJSON, LanguageBreakdown>( + "/repos/${slug.fullName}/languages", + statusCode: StatusCodes.OK, + convert: (input) => LanguageBreakdown(input.cast()), + ); /// Lists the tags of the specified repository. /// /// API docs: https://developer.github.com/v3/repos/#list-tags Stream listTags(RepositorySlug slug) { - return PaginationHelper(_github) - .objects('GET', '/repos/${slug.fullName}/tags', (j) => Tag.fromJson(j)); + return PaginationHelper(_github).objects, Tag>( + 'GET', + '/repos/${slug.fullName}/tags', + (j) => Tag.fromJson(j), + ); } /// Lists the branches of the specified repository. /// /// API docs: https://developer.github.com/v3/repos/#list-branches Stream listBranches(RepositorySlug slug) { - return PaginationHelper(_github) - .objects('GET', '/repos/${slug.fullName}/branches', Branch.fromJSON); + return PaginationHelper(_github).objects, Branch>( + 'GET', + '/repos/${slug.fullName}/branches', + (i) => Branch.fromJSON(i), + ); } /// Fetches the specified branch. /// /// API docs: https://developer.github.com/v3/repos/#get-branch - Future getBranch(RepositorySlug slug, String branch) => - _github.getJSON("/repos/${slug.fullName}/branches/$branch", - convert: Branch.fromJSON); + Future getBranch(RepositorySlug slug, String branch) async => + _github.getJSON, Branch>( + "/repos/${slug.fullName}/branches/$branch", + convert: (i) => Branch.fromJSON(i), + ); /// Lists the users that have access to the repository identified by [slug]. /// @@ -208,28 +247,28 @@ class RepositoriesService extends Service { (json) => Collaborator.fromJson(json), ); - Future isCollaborator(RepositorySlug slug, String user) { - return _github - .request("GET", "/repos/${slug.fullName}/collaborators/$user") - .then((response) { - return response.statusCode == 204; - }); + Future isCollaborator(RepositorySlug slug, String user) async { + return _github.request( + "GET", + "/repos/${slug.fullName}/collaborators/$user", + statusCode: 204, + ); } - Future addCollaborator(RepositorySlug slug, String user) { - return _github - .request("PUT", "/repos/${slug.fullName}/collaborators/$user") - .then((response) { - return response.statusCode == 204; - }); + Future addCollaborator(RepositorySlug slug, String user) async { + return _github.request( + "PUT", + "/repos/${slug.fullName}/collaborators/$user", + statusCode: 204, + ); } - Future removeCollaborator(RepositorySlug slug, String user) { - return _github - .request("DELETE", "/repos/${slug.fullName}/collaborators/$user") - .then((response) { - return response.statusCode == 204; - }); + Future removeCollaborator(RepositorySlug slug, String user) async { + return _github.request( + "DELETE", + "/repos/${slug.fullName}/collaborators/$user", + statusCode: 204, + ); } /// Returns a list of all comments for a specific commit. @@ -238,7 +277,7 @@ class RepositoriesService extends Service { Future> listComments( RepositorySlug slug, RepositoryCommit commit, - ) { + ) async { return _github.getJSON, List>( "/repos/${slug.fullName}/commits/${commit.sha}/comments", statusCode: 200, @@ -252,7 +291,7 @@ class RepositoriesService extends Service { /// /// https://developer.github.com/v3/repos/comments/#list-comments-for-a-single-commit Future> listCommitComments(RepositorySlug slug) async { - return await _github.getJSON, List>( + return _github.getJSON, List>( "repos/${slug.fullName}/comments", statusCode: 200, convert: (input) => List.castFrom>(input) @@ -269,18 +308,20 @@ class RepositoriesService extends Service { /// /// https://developer.github.com/v3/repos/comments/#create-a-commit-comment Future createCommitComment( - RepositorySlug slug, RepositoryCommit commit, - {@required String body, - String path, - int position, - @Deprecated('Use position parameter instead') int line}) async { + RepositorySlug slug, + RepositoryCommit commit, { + @required String body, + String path, + int position, + @Deprecated('Use position parameter instead') int line, + }) async { final Map data = createNonNullMap({ 'body': body, 'path': path, 'position': position, 'line': line, }); - return await _github.postJSON, CommitComment>( + return _github.postJSON, CommitComment>( "/repos/${slug.fullName}/commits/${commit.sha}/comments", body: jsonEncode(data), statusCode: 201, @@ -293,7 +334,7 @@ class RepositoriesService extends Service { /// https://developer.github.com/v3/repos/comments/#get-a-single-commit-comment Future getCommitComment(RepositorySlug slug, {@required int id}) async { - return await _github.getJSON, CommitComment>( + return _github.getJSON, CommitComment>( "/repos/${slug.fullName}/comments/id", statusCode: 200, convert: (i) => CommitComment.fromJSON(i), @@ -310,7 +351,7 @@ class RepositoriesService extends Service { Future updateCommitComment(RepositorySlug slug, {@required int id, @required String body}) async { assert(body != null); - return await _github.postJSON, CommitComment>( + return _github.postJSON, CommitComment>( "/repos/${slug.fullName}/comments/${id.toString()}", body: jsonEncode(createNonNullMap({'body': body})), statusCode: 200, @@ -335,25 +376,36 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/commits/#list-commits-on-a-repository Stream listCommits(RepositorySlug slug) { - return PaginationHelper(_github).objects("GET", - "/repos/${slug.fullName}/commits", (i) => RepositoryCommit.fromJSON(i)); + return PaginationHelper(_github) + .objects, RepositoryCommit>( + "GET", + "/repos/${slug.fullName}/commits", + (i) => RepositoryCommit.fromJSON(i), + ); } /// Fetches the specified commit. /// /// API docs: https://developer.github.com/v3/repos/commits/#get-a-single-commit - Future getCommit(RepositorySlug slug, String sha) => - _github.getJSON("/repos/${slug.fullName}/commits/$sha", - convert: (i) => RepositoryCommit.fromJSON(i)); + Future getCommit(RepositorySlug slug, String sha) async => + _github.getJSON, RepositoryCommit>( + "/repos/${slug.fullName}/commits/$sha", + convert: (i) => RepositoryCommit.fromJSON(i), + ); /// [refBase] and [refHead] can be the same value for a branch, commit, or ref /// in [slug] or specify other repositories by using `repo:ref` syntax. /// /// API docs: https://developer.github.com/v3/repos/commits/#compare-two-commits Future compareCommits( - RepositorySlug slug, String refBase, String refHead) => - _github.getJSON("/repos/${slug.fullName}/compare/$refBase...$refHead", - convert: (j) => GitHubComparison.fromJson(j)); + RepositorySlug slug, + String refBase, + String refHead, + ) async => + _github.getJSON, GitHubComparison>( + "/repos/${slug.fullName}/compare/$refBase...$refHead", + convert: (j) => GitHubComparison.fromJson(j), + ); /// Fetches the readme file for a repository. /// @@ -361,8 +413,8 @@ class RepositoriesService extends Service { /// is defined, the repository's default branch is used (usually master). /// /// API docs: https://developer.github.com/v3/repos/contents/#get-the-readme - Future getReadme(RepositorySlug slug, {String ref}) { - var headers = {}; + Future getReadme(RepositorySlug slug, {String ref}) async { + final headers = {}; String url = "/repos/${slug.fullName}/readme"; @@ -370,16 +422,17 @@ class RepositoriesService extends Service { url += '?ref=$ref'; } - return _github.getJSON(url, - headers: headers, - statusCode: StatusCodes.OK, - fail: (http.Response response) { - if (response.statusCode == 404) { - throw NotFound(_github, response.body); - } - }, - convert: (Map input) => - GitHubFile.fromJSON(input, slug)); + return _github.getJSON( + url, + headers: headers, + statusCode: StatusCodes.OK, + fail: (http.Response response) { + if (response.statusCode == 404) { + throw NotFound(_github, response.body); + } + }, + convert: (Map input) => GitHubFile.fromJSON(input, slug), + ); } /// Fetches content in a repository at the specified [path]. @@ -398,43 +451,47 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/contents/#get-contents Future getContents(RepositorySlug slug, String path, - {String ref}) { + {String ref}) async { String url = "/repos/${slug.fullName}/contents/$path"; if (ref != null) { url += '?ref=$ref'; } - return _github.getJSON(url, convert: (input) { - var contents = RepositoryContents(); - if (input is Map) { - // Weird one-off. If the content of `input` is JSON w/ a message - // it was likely a 404 – but we don't have the status code here - // But we can guess an the JSON content - if (input.containsKey('message')) { - throw GitHubError(_github, input['message'], - apiUrl: input['documentation_url']); + return _github.getJSON( + url, + convert: (input) { + final contents = RepositoryContents(); + if (input is Map) { + // Weird one-off. If the content of `input` is JSON w/ a message + // it was likely a 404 – but we don't have the status code here + // But we can guess an the JSON content + if (input.containsKey('message')) { + throw GitHubError(_github, input['message'], + apiUrl: input['documentation_url']); + } + contents.file = GitHubFile.fromJSON(input as Map); + } else { + contents.tree = + (input as List).map((it) => GitHubFile.fromJSON(it)).toList(); } - contents.file = GitHubFile.fromJSON(input as Map); - } else { - contents.tree = - (input as List).map((it) => GitHubFile.fromJSON(it)).toList(); - } - return contents; - }); + return contents; + }, + ); } /// Creates a new file in a repository. /// /// API docs: https://developer.github.com/v3/repos/contents/#create-a-file - Future createFile(RepositorySlug slug, CreateFile file) { - return _github - .request("PUT", "/repos/${slug.fullName}/contents/${file.path}", - body: file.toJSON()) - .then((response) { - return ContentCreation.fromJSON( - jsonDecode(response.body) as Map); - }); + Future createFile( + RepositorySlug slug, CreateFile file) async { + final Response response = await _github.request( + "PUT", + "/repos/${slug.fullName}/contents/${file.path}", + body: file.toJSON(), + ); + return ContentCreation.fromJSON( + jsonDecode(response.body) as Map); } /// Updates the specified file. @@ -442,90 +499,104 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/contents/#update-a-file Future updateFile(RepositorySlug slug, String path, String message, String content, String sha, - {String branch}) { - var map = createNonNullMap( - {"message": message, "content": content, "sha": sha, "branch": branch}); - - return _github - .request("PUT", "/repos/${slug.fullName}/contents/$path", - body: jsonEncode(map)) - .then((response) { - return ContentCreation.fromJSON( - jsonDecode(response.body) as Map); + {String branch}) async { + final Map map = createNonNullMap({ + "message": message, + "content": content, + "sha": sha, + "branch": branch, }); + final Response response = await _github.request( + "PUT", + "/repos/${slug.fullName}/contents/$path", + body: jsonEncode(map), + ); + return ContentCreation.fromJSON( + jsonDecode(response.body) as Map); } /// Deletes the specified file. /// /// API docs: https://developer.github.com/v3/repos/contents/#delete-a-file Future deleteFile(RepositorySlug slug, String path, - String message, String sha, String branch) { - var map = + String message, String sha, String branch) async { + final Map map = createNonNullMap({"message": message, "sha": sha, "branch": branch}); - - return _github - .request("DELETE", "/repos/${slug.fullName}/contents/$path", - body: jsonEncode(map), statusCode: 200) - .then((response) { - return ContentCreation.fromJSON( - jsonDecode(response.body) as Map); - }); + final Response response = await _github.request( + "DELETE", + "/repos/${slug.fullName}/contents/$path", + body: jsonEncode(map), + statusCode: 200, + ); + return ContentCreation.fromJSON( + jsonDecode(response.body) as Map); } /// Gets an archive link for the specified repository and reference. /// /// API docs: https://developer.github.com/v3/repos/contents/#get-archive-link Future getArchiveLink(RepositorySlug slug, String ref, - {String format = "tarball"}) { - return _github - .request("GET", "/repos/${slug.fullName}/$format/$ref", - statusCode: 302) - .then((response) { - return response.headers["Location"]; - }); + {String format = "tarball"}) async { + final Response response = await _github.request( + "GET", + "/repos/${slug.fullName}/$format/$ref", + statusCode: 302, + ); + return response.headers["Location"]; } /// Lists the forks of the specified repository. /// /// API docs: https://developer.github.com/v3/repos/forks/#list-forks Stream listForks(RepositorySlug slug) { - return PaginationHelper(_github) - .objects("GET", "/repos/${slug.fullName}/forks", Repository.fromJSON); + return PaginationHelper(_github).objects, Repository>( + "GET", + "/repos/${slug.fullName}/forks", + (i) => Repository.fromJSON(i), + ); } /// Creates a fork for the authenticated user. /// /// API docs: https://developer.github.com/v3/repos/forks/#create-a-fork - Future createFork(RepositorySlug slug, [CreateFork fork]) { + Future createFork(RepositorySlug slug, [CreateFork fork]) async { if (fork == null) fork = CreateFork(); - return _github.postJSON("/repos/${slug.fullName}/forks", - body: fork.toJSON(), convert: Repository.fromJSON); + return await _github.postJSON, Repository>( + "/repos/${slug.fullName}/forks", + body: fork.toJSON(), + convert: (i) => Repository.fromJSON(i), + ); } /// Lists the hooks of the specified repository. /// /// API docs: https://developer.github.com/v3/repos/hooks/#list-hooks Stream listHooks(RepositorySlug slug) { - return PaginationHelper(_github).objects( - "GET", - "/repos/${slug.fullName}/hooks", - (Map input) => Hook.fromJSON(slug.fullName, input)); + return PaginationHelper(_github).objects, Hook>( + "GET", + "/repos/${slug.fullName}/hooks", + (input) => Hook.fromJSON(slug.fullName, input), + ); } /// Fetches a single hook by [id]. /// /// API docs: https://developer.github.com/v3/repos/hooks/#get-single-hook - Future getHook(RepositorySlug slug, int id) => - _github.getJSON("/repos/${slug.fullName}/hooks/$id", - convert: (Map i) => Hook.fromJSON(slug.fullName, i)); + Future getHook(RepositorySlug slug, int id) async => + await _github.getJSON, Hook>( + "/repos/${slug.fullName}/hooks/$id", + convert: (i) => Hook.fromJSON(slug.fullName, i), + ); /// Creates a repository hook based on the specified [hook]. /// /// API docs: https://developer.github.com/v3/repos/hooks/#create-a-hook - Future createHook(RepositorySlug slug, CreateHook hook) { - return _github.postJSON("/repos/${slug.fullName}/hooks", - convert: (Map i) => Hook.fromJSON(slug.fullName, i), - body: hook.toJSON()); + Future createHook(RepositorySlug slug, CreateHook hook) async { + return await _github.postJSON, Hook>( + "/repos/${slug.fullName}/hooks", + convert: (i) => Hook.fromJSON(slug.fullName, i), + body: hook.toJSON(), + ); } // TODO: Implement editHook: https://developer.github.com/v3/repos/hooks/#edit-a-hook @@ -533,27 +604,31 @@ class RepositoriesService extends Service { /// Triggers a hook with the latest push. /// /// API docs: https://developer.github.com/v3/repos/hooks/#test-a-push-hook - Future testPushHook(RepositorySlug slug, int id) { - return _github - .request("POST", "/repos/${slug.fullName}/hooks/$id/tests") - .then((response) => response.statusCode == 204); + Future testPushHook(RepositorySlug slug, int id) async { + await _github.request( + "POST", + "/repos/${slug.fullName}/hooks/$id/tests", + statusCode: 204, + ); } /// Pings the hook. /// /// API docs: https://developer.github.com/v3/repos/hooks/#ping-a-hook - Future pingHook(RepositorySlug slug, int id) { - return _github - .request("POST", "/repos/${slug.fullName}/hooks/$id/pings") - .then((response) => response.statusCode == 204); + Future pingHook(RepositorySlug slug, int id) async { + await _github.request( + "POST", + "/repos/${slug.fullName}/hooks/$id/pings", + statusCode: 204, + ); } - Future deleteHook(RepositorySlug slug, int id) { - return _github - .request("DELETE", "/repos/${slug.fullName}/hooks/$id") - .then((response) { - return response.statusCode == 204; - }); + Future deleteHook(RepositorySlug slug, int id) async { + await _github.request( + "DELETE", + "/repos/${slug.fullName}/hooks/$id", + statusCode: 204, + ); } // TODO: Implement other hook methods: https://developer.github.com/v3/repos/hooks/ @@ -562,8 +637,11 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/keys/#list Stream listDeployKeys(RepositorySlug slug) { - return PaginationHelper(_github) - .objects("GET", "/repos/${slug.fullName}/keys", PublicKey.fromJSON); + return PaginationHelper(_github).objects, PublicKey>( + "GET", + "/repos/${slug.fullName}/keys", + (i) => PublicKey.fromJSON(i), + ); } // TODO: Implement getDeployKey: https://developer.github.com/v3/repos/keys/#get @@ -571,8 +649,14 @@ class RepositoriesService extends Service { /// Adds a deploy key for a repository. /// /// API docs: https://developer.github.com/v3/repos/keys/#create - Future createDeployKey(RepositorySlug slug, CreatePublicKey key) { - return _github.postJSON("/repos/${slug.fullName}/keys", body: key.toJSON()); + Future createDeployKey( + RepositorySlug slug, CreatePublicKey key) async { + return await _github.postJSON, PublicKey>( + "/repos/${slug.fullName}/keys", + body: key.toJSON(), + statusCode: 201, + convert: (i) => PublicKey.fromJSON(i), + ); } // TODO: Implement editDeployKey: https://developer.github.com/v3/repos/keys/#edit @@ -581,19 +665,24 @@ class RepositoriesService extends Service { /// Merges a branch in the specified repository. /// /// API docs: https://developer.github.com/v3/repos/merging/#perform-a-merge - Future merge(RepositorySlug slug, CreateMerge merge) { - return _github.postJSON("/repos/${slug.fullName}/merges", - body: merge.toJSON(), - convert: (i) => RepositoryCommit.fromJSON(i), - statusCode: 201); + Future merge(RepositorySlug slug, CreateMerge merge) async { + return await _github.postJSON, RepositoryCommit>( + "/repos/${slug.fullName}/merges", + body: merge.toJSON(), + convert: (i) => RepositoryCommit.fromJSON(i), + statusCode: 201, + ); } /// Fetches the GitHub pages information for the specified repository. /// /// API docs: https://developer.github.com/v3/repos/pages/#get-information-about-a-pages-site - Future getPagesInfo(RepositorySlug slug) => - _github.getJSON("/repos/${slug.fullName}/pages", - statusCode: 200, convert: RepositoryPages.fromJSON); + Future getPagesInfo(RepositorySlug slug) async => + await _github.getJSON, RepositoryPages>( + "/repos/${slug.fullName}/pages", + statusCode: 200, + convert: RepositoryPages.fromJSON, + ); // TODO: Implement listPagesBuilds: https://developer.github.com/v3/repos/pages/#list-pages-builds // TODO: Implement getLatestPagesBuild: https://developer.github.com/v3/repos/pages/#list-latest-pages-build @@ -602,23 +691,32 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/releases/#list-releases-for-a-repository Stream listReleases(RepositorySlug slug) { - return PaginationHelper(_github) - .objects("GET", "/repos/${slug.fullName}/releases", Release.fromJson); + return PaginationHelper(_github).objects, Release>( + "GET", + "/repos/${slug.fullName}/releases", + (i) => Release.fromJson(i), + ); } /// Fetches a single release. /// /// API docs: https://developer.github.com/v3/repos/releases/#get-a-single-release - Future getRelease(RepositorySlug slug, int id) => - _github.getJSON("/repos/${slug.fullName}/releases/$id", - convert: Release.fromJson); + Future getRelease(RepositorySlug slug, int id) async => + await _github.getJSON, Release>( + "/repos/${slug.fullName}/releases/$id", + convert: (i) => Release.fromJson(i), + ); /// Creates a Release based on the specified [release]. /// /// API docs: https://developer.github.com/v3/repos/releases/#create-a-release - Future createRelease(RepositorySlug slug, CreateRelease release) { - return _github.postJSON("/repos/${slug.fullName}/releases", - convert: Release.fromJson, body: jsonEncode(release.toJson())); + Future createRelease( + RepositorySlug slug, CreateRelease release) async { + return await _github.postJSON, Release>( + "/repos/${slug.fullName}/releases", + convert: (i) => Release.fromJson(i), + body: jsonEncode(release.toJson()), + ); } // TODO: Implement editRelease: https://developer.github.com/v3/repos/releases/#edit-a-release @@ -656,38 +754,47 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/statistics/#commit-activity Stream listCommitActivity(RepositorySlug slug) { - return PaginationHelper(_github).objects( - "GET", - "/repos/${slug.fullName}/stats/commit_activity", - (i) => YearCommitCountWeek.fromJSON(i)); + return PaginationHelper(_github) + .objects, YearCommitCountWeek>( + "GET", + "/repos/${slug.fullName}/stats/commit_activity", + (i) => YearCommitCountWeek.fromJSON(i), + ); } /// Fetches weekly addition and deletion counts. /// /// API docs: https://developer.github.com/v3/repos/statistics/#code-frequency Stream listCodeFrequency(RepositorySlug slug) { - return PaginationHelper(_github).objects( - "GET", - "/repos/${slug.fullName}/stats/code_frequency", - (i) => WeeklyChangesCount.fromJSON(i)); + return PaginationHelper(_github) + .objects, WeeklyChangesCount>( + "GET", + "/repos/${slug.fullName}/stats/code_frequency", + (i) => WeeklyChangesCount.fromJSON(i), + ); } /// Fetches Participation Breakdowns. /// /// API docs: https://developer.github.com/v3/repos/statistics/#participation - Future getParticipation(RepositorySlug slug) => - _github.getJSON("/repos/${slug.fullName}/stats/participation", - statusCode: 200, - convert: (i) => ContributorParticipation.fromJSON(i)); + Future getParticipation( + RepositorySlug slug) async => + await _github.getJSON( + "/repos/${slug.fullName}/stats/participation", + statusCode: 200, + convert: (i) => ContributorParticipation.fromJSON(i), + ); /// Fetches Punchcard. /// /// API docs: https://developer.github.com/v3/repos/statistics/#punch-card Stream listPunchcard(RepositorySlug slug) { - return PaginationHelper(_github).objects( - "GET", - "/repos/${slug.fullName}/stats/punchcard", - (i) => PunchcardEntry.fromJSON(i)); + return PaginationHelper(_github) + .objects, PunchcardEntry>( + "GET", + "/repos/${slug.fullName}/stats/punchcard", + (i) => PunchcardEntry.fromJSON(i), + ); } /// Lists the statuses of a repository at the specified reference. @@ -695,10 +802,12 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/statuses/#list-statuses-for-a-specific-ref Stream listStatuses(RepositorySlug slug, String ref) { - return PaginationHelper(_github).objects( - "GET", - "/repos/${slug.fullName}/commits/$ref/statuses", - (i) => RepositoryStatus.fromJSON(i)); + return PaginationHelper(_github) + .objects, RepositoryStatus>( + "GET", + "/repos/${slug.fullName}/commits/$ref/statuses", + (i) => RepositoryStatus.fromJSON(i), + ); } /// Creates a new status for a repository at the specified reference. @@ -706,16 +815,22 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/statuses/#create-a-status Future createStatus( - RepositorySlug slug, String ref, CreateStatus request) { - return _github.postJSON("/repos/${slug.fullName}/statuses/$ref", - body: request.toJSON(), convert: (i) => RepositoryStatus.fromJSON(i)); + RepositorySlug slug, String ref, CreateStatus request) async { + return await _github.postJSON, RepositoryStatus>( + "/repos/${slug.fullName}/statuses/$ref", + body: request.toJSON(), + convert: (i) => RepositoryStatus.fromJSON(i), + ); } /// Gets a Combined Status for the specified repository and ref. /// /// API docs: https://developer.github.com/v3/repos/statuses/#get-the-combined-status-for-a-specific-ref Future getCombinedStatus( - RepositorySlug slug, String ref) => - _github.getJSON("/repos/${slug.fullName}/commits/$ref/status", - convert: CombinedRepositoryStatus.fromJSON, statusCode: 200); + RepositorySlug slug, String ref) async => + await _github.getJSON, CombinedRepositoryStatus>( + "/repos/${slug.fullName}/commits/$ref/status", + convert: CombinedRepositoryStatus.fromJSON, + statusCode: 200, + ); } From a6dda6468386fd0bb406dd323bb16035489f7b43 Mon Sep 17 00:00:00 2001 From: axel-op <49279289+axel-op@users.noreply.github.com> Date: Fri, 4 Oct 2019 00:43:37 +0200 Subject: [PATCH 043/390] Implemented methods in repos_service + replaced some Futures by Streams --- lib/src/common/model/repos_hooks.dart | 1 + lib/src/common/model/repos_pages.dart | 79 ++++++++++++++ lib/src/common/repos_service.dart | 150 ++++++++++++++++++-------- 3 files changed, 185 insertions(+), 45 deletions(-) diff --git a/lib/src/common/model/repos_hooks.dart b/lib/src/common/model/repos_hooks.dart index 3a482afb..dd241de9 100644 --- a/lib/src/common/model/repos_hooks.dart +++ b/lib/src/common/model/repos_hooks.dart @@ -29,6 +29,7 @@ class Hook { /// The Repository Name String repoName; + // TODO create a HookConfig class and implement a getter that returns the Map type Map config; static Hook fromJSON(String repoName, Map input) { diff --git a/lib/src/common/model/repos_pages.dart b/lib/src/common/model/repos_pages.dart index 7f778ea3..a6bb098f 100644 --- a/lib/src/common/model/repos_pages.dart +++ b/lib/src/common/model/repos_pages.dart @@ -22,3 +22,82 @@ class RepositoryPages { return pages; } } + +class PageBuild { + final String url; + final String status; + final PageBuildError error; + final PageBuildPusher pusher; + final String commit; + final int duration; + final DateTime createdAt; + final DateTime updatedAt; + + PageBuild._({ + @required this.url, + @required this.status, + @required this.error, + @required this.pusher, + @required this.commit, + @required this.duration, + @required this.createdAt, + @required this.updatedAt, + }); + + factory PageBuild._fromJSON(Map input) { + if (input == null) return null; + return PageBuild._( + url: input["url"], + status: input["status"], + error: PageBuildError._fromJSON(input["error"] as Map), + pusher: + PageBuildPusher._fromJSON(input["pusher"] as Map), + commit: input["commit"], + duration: input["duration"], + createdAt: DateTime.tryParse(input["created_at"]), + updatedAt: DateTime.tryParse(input["updated_at"]), + ); + } +} + +class PageBuildPusher { + final String login; + final int id; + final String apiUrl; + final String htmlUrl; + final String type; + final bool siteAdmin; + + PageBuildPusher._({ + @required this.login, + @required this.id, + @required this.apiUrl, + @required this.htmlUrl, + @required this.type, + @required this.siteAdmin, + }); + + factory PageBuildPusher._fromJSON(Map input) { + if (input == null) return null; + return PageBuildPusher._( + login: input["login"], + id: input["id"], + apiUrl: input["url"], + htmlUrl: input["html_url"], + type: input["type"], + siteAdmin: input["site_admin"], + ); + } +} + +class PageBuildError { + final String message; + PageBuildError._({@required this.message}); + + factory PageBuildError._fromJSON(Map input) { + if (input == null) return null; + return PageBuildError._( + message: input["message"], + ); + } +} diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index d69d82de..29e49edb 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -274,29 +274,29 @@ class RepositoriesService extends Service { /// Returns a list of all comments for a specific commit. /// /// https://developer.github.com/v3/repos/comments/#list-commit-comments-for-a-repository - Future> listComments( + Stream listComments( RepositorySlug slug, RepositoryCommit commit, - ) async { - return _github.getJSON, List>( + ) { + return PaginationHelper(_github) + .objects, CommitComment>( + "GET", "/repos/${slug.fullName}/commits/${commit.sha}/comments", - statusCode: 200, - convert: (input) => List.castFrom>(input) - .map((i) => CommitComment.fromJSON(i)) - .toList(), + (i) => CommitComment.fromJSON(i), + statusCode: StatusCodes.OK, ); } /// Returns a list of all commit comments in a repository. /// /// https://developer.github.com/v3/repos/comments/#list-comments-for-a-single-commit - Future> listCommitComments(RepositorySlug slug) async { - return _github.getJSON, List>( + Stream listCommitComments(RepositorySlug slug) { + return PaginationHelper(_github) + .objects, CommitComment>( + "GET", "repos/${slug.fullName}/comments", - statusCode: 200, - convert: (input) => List.castFrom>(input) - .map((i) => CommitComment.fromJSON(i)) - .toList(), + (i) => CommitComment.fromJSON(i), + statusCode: StatusCodes.OK, ); } @@ -561,7 +561,7 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/forks/#create-a-fork Future createFork(RepositorySlug slug, [CreateFork fork]) async { if (fork == null) fork = CreateFork(); - return await _github.postJSON, Repository>( + return _github.postJSON, Repository>( "/repos/${slug.fullName}/forks", body: fork.toJSON(), convert: (i) => Repository.fromJSON(i), @@ -583,7 +583,7 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/hooks/#get-single-hook Future getHook(RepositorySlug slug, int id) async => - await _github.getJSON, Hook>( + _github.getJSON, Hook>( "/repos/${slug.fullName}/hooks/$id", convert: (i) => Hook.fromJSON(slug.fullName, i), ); @@ -592,14 +592,30 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/hooks/#create-a-hook Future createHook(RepositorySlug slug, CreateHook hook) async { - return await _github.postJSON, Hook>( + return _github.postJSON, Hook>( "/repos/${slug.fullName}/hooks", convert: (i) => Hook.fromJSON(slug.fullName, i), body: hook.toJSON(), ); } - // TODO: Implement editHook: https://developer.github.com/v3/repos/hooks/#edit-a-hook + /// Edits a hook. + /// Returns the edited hook. + /// + /// https://developer.github.com/v3/repos/hooks/#edit-a-hook + // TODO implement methods in Hook class to edit some fields + Future editHook(RepositorySlug slug, Hook editedHook) async { + return _github.postJSON, Hook>( + "/repos/${slug.fullName}/hooks/${editedHook.id.toString()}", + statusCode: StatusCodes.OK, + convert: (i) => Hook.fromJSON(slug.fullName, i), + body: jsonEncode({ + "config": editedHook.config, + "events": editedHook.events, + "active": editedHook.active, + }), + ); + } /// Triggers a hook with the latest push. /// @@ -608,7 +624,7 @@ class RepositoriesService extends Service { await _github.request( "POST", "/repos/${slug.fullName}/hooks/$id/tests", - statusCode: 204, + statusCode: StatusCodes.NO_CONTENT, ); } @@ -619,7 +635,7 @@ class RepositoriesService extends Service { await _github.request( "POST", "/repos/${slug.fullName}/hooks/$id/pings", - statusCode: 204, + statusCode: StatusCodes.NO_CONTENT, ); } @@ -627,7 +643,7 @@ class RepositoriesService extends Service { await _github.request( "DELETE", "/repos/${slug.fullName}/hooks/$id", - statusCode: 204, + statusCode: StatusCodes.NO_CONTENT, ); } @@ -644,33 +660,57 @@ class RepositoriesService extends Service { ); } - // TODO: Implement getDeployKey: https://developer.github.com/v3/repos/keys/#get + /// Get a deploy key. + /// * [id]: id of the key to retrieve. + /// + /// https://developer.github.com/v3/repos/keys/#get + Future getDeployKey(RepositorySlug slug, + {@required int id}) async { + return _github.getJSON, PublicKey>( + "/repos/${slug.fullName}/keys/${id.toString()}", + statusCode: StatusCodes.OK, + convert: (i) => PublicKey.fromJSON(i), + ); + } /// Adds a deploy key for a repository. /// /// API docs: https://developer.github.com/v3/repos/keys/#create - Future createDeployKey( - RepositorySlug slug, CreatePublicKey key) async { - return await _github.postJSON, PublicKey>( + // TODO add to Changelog new args + Future createDeployKey(RepositorySlug slug, + {@required String title, @required String key}) async { + assert(title != null && key != null); + return _github.postJSON, PublicKey>( "/repos/${slug.fullName}/keys", - body: key.toJSON(), - statusCode: 201, + body: jsonEncode({ + "title": title, + "key": key, + }), + statusCode: StatusCodes.CREATED, convert: (i) => PublicKey.fromJSON(i), ); } - // TODO: Implement editDeployKey: https://developer.github.com/v3/repos/keys/#edit - // TODO: Implement deleteDeployKey: https://developer.github.com/v3/repos/keys/#delete + /// Delete a deploy key. + /// + /// https://developer.github.com/v3/repos/keys/#delete + Future deleteDeployKey({RepositorySlug slug, PublicKey key}) async { + await _github.request( + "DELETE", + "/repos/${slug.fullName}/keys/${key.id}", + statusCode: StatusCodes.NO_CONTENT, + ); + } /// Merges a branch in the specified repository. /// /// API docs: https://developer.github.com/v3/repos/merging/#perform-a-merge Future merge(RepositorySlug slug, CreateMerge merge) async { - return await _github.postJSON, RepositoryCommit>( + return _github.postJSON, RepositoryCommit>( "/repos/${slug.fullName}/merges", body: merge.toJSON(), convert: (i) => RepositoryCommit.fromJSON(i), - statusCode: 201, + statusCode: StatusCodes.CREATED, ); } @@ -678,14 +718,34 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/pages/#get-information-about-a-pages-site Future getPagesInfo(RepositorySlug slug) async => - await _github.getJSON, RepositoryPages>( + _github.getJSON, RepositoryPages>( "/repos/${slug.fullName}/pages", - statusCode: 200, - convert: RepositoryPages.fromJSON, + statusCode: StatusCodes.OK, + convert: (i) => RepositoryPages.fromJSON(i), ); - // TODO: Implement listPagesBuilds: https://developer.github.com/v3/repos/pages/#list-pages-builds - // TODO: Implement getLatestPagesBuild: https://developer.github.com/v3/repos/pages/#list-latest-pages-build + /// List Pages builds. + /// + /// API docs: https://developer.github.com/v3/repos/pages/#list-pages-builds + Stream listPagesBuilds(RepositorySlug slug) { + return PaginationHelper(_github).objects, PageBuild>( + "GET", + "/repos/${slug.fullName}/pages/builds", + (i) => PageBuild._fromJSON(i), + statusCode: StatusCodes.OK, + ); + } + + /// Get latest Pages build. + /// + /// API docs: https://developer.github.com/v3/repos/pages/#list-latest-pages-build + Future getLatestPagesBuild(RepositorySlug slug) async { + return _github.getJSON( + "/repos/${slug.fullName}/pages/builds/latest", + convert: (i) => PageBuild._fromJSON(i), + statusCode: StatusCodes.OK, + ); + } /// Lists releases for the specified repository. /// @@ -702,7 +762,7 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/releases/#get-a-single-release Future getRelease(RepositorySlug slug, int id) async => - await _github.getJSON, Release>( + _github.getJSON, Release>( "/repos/${slug.fullName}/releases/$id", convert: (i) => Release.fromJson(i), ); @@ -712,7 +772,7 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/releases/#create-a-release Future createRelease( RepositorySlug slug, CreateRelease release) async { - return await _github.postJSON, Release>( + return _github.postJSON, Release>( "/repos/${slug.fullName}/releases", convert: (i) => Release.fromJson(i), body: jsonEncode(release.toJson()), @@ -736,15 +796,15 @@ class RepositoriesService extends Service { Future> listContributorStats( RepositorySlug slug, ) async { - var path = "/repos/${slug.fullName}/stats/contributors"; - var response = await _github.request('GET', path, + final String path = "/repos/${slug.fullName}/stats/contributors"; + final Response response = await _github.request('GET', path, headers: {"Accept": "application/vnd.github.v3+json"}); - if (response.statusCode == 200) { + if (response.statusCode == StatusCodes.OK) { return (jsonDecode(response.body) as List) .map((e) => ContributorStatistics.fromJson(e)) .toList(); - } else if (response.statusCode == 202) { + } else if (response.statusCode == StatusCodes.ACCEPTED) { throw NotReady(_github, path); } _github.handleStatusCode(response); @@ -779,7 +839,7 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/statistics/#participation Future getParticipation( RepositorySlug slug) async => - await _github.getJSON( + _github.getJSON( "/repos/${slug.fullName}/stats/participation", statusCode: 200, convert: (i) => ContributorParticipation.fromJSON(i), @@ -816,7 +876,7 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/statuses/#create-a-status Future createStatus( RepositorySlug slug, String ref, CreateStatus request) async { - return await _github.postJSON, RepositoryStatus>( + return _github.postJSON, RepositoryStatus>( "/repos/${slug.fullName}/statuses/$ref", body: request.toJSON(), convert: (i) => RepositoryStatus.fromJSON(i), @@ -828,9 +888,9 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/statuses/#get-the-combined-status-for-a-specific-ref Future getCombinedStatus( RepositorySlug slug, String ref) async => - await _github.getJSON, CombinedRepositoryStatus>( + _github.getJSON, CombinedRepositoryStatus>( "/repos/${slug.fullName}/commits/$ref/status", convert: CombinedRepositoryStatus.fromJSON, - statusCode: 200, + statusCode: StatusCodes.OK, ); } From 6bb0519f568e01b86f111e785fef1c212eb6784f Mon Sep 17 00:00:00 2001 From: axel-op <49279289+axel-op@users.noreply.github.com> Date: Fri, 4 Oct 2019 17:38:19 +0200 Subject: [PATCH 044/390] Implemented methods in repos_service.dart --- CHANGELOG.md | 5 + analysis_options.yaml | 20 +-- lib/src/common/model/repos_releases.dart | 2 +- lib/src/common/model/repos_releases.g.dart | 4 +- lib/src/common/repos_service.dart | 161 +++++++++++++++++++-- 5 files changed, 163 insertions(+), 29 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f448d74..aebdda2e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## v.6.0.0 + - **BREAKING**: methods `deleteRepository`, `isCollaborator`, `addCollaborator`, `removeCollaborator`, `testPushHook`, `pingHook`, and `deleteHook` now return a `Future` instead of a `Future`. + - **BREAKING**: parameters of method `createDeployKey` have been modified. + - New methods in `repos_service.dart`. + ## v5.2.0 - Add access to labels on Pull Requests https://github.com/DirectMyFile/github.dart/pull/163 - Adding draft property to PR model https://github.com/DirectMyFile/github.dart/pull/162 diff --git a/analysis_options.yaml b/analysis_options.yaml index 3166fb94..7a82c304 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -2,7 +2,7 @@ include: package:pedantic/analysis_options.yaml linter: rules: - always_declare_return_types - - annotate_overrides +# - annotate_overrides # - avoid_as - avoid_empty_else - avoid_init_to_null @@ -11,7 +11,7 @@ linter: - camel_case_types - close_sinks - comment_references - - constant_identifier_names +# - constant_identifier_names - control_flow_in_finally - directives_ordering - empty_catches @@ -28,13 +28,13 @@ linter: - package_api_docs - package_names - package_prefixed_library_names - - prefer_constructors_over_static_methods - - prefer_const_declarations - - prefer_const_literals_to_create_immutables +# - prefer_constructors_over_static_methods +# - prefer_const_declarations +# - prefer_const_literals_to_create_immutables - prefer_equal_for_default_values - - prefer_final_fields - - prefer_final_in_for_each - - prefer_final_locals +# - prefer_final_fields +# - prefer_final_in_for_each +# - prefer_final_locals - prefer_generic_function_type_aliases - prefer_is_not_empty - slash_for_doc_comments @@ -44,11 +44,11 @@ linter: - type_annotate_public_apis - type_init_formals - unawaited_futures - - unnecessary_await_in_return +# - unnecessary_await_in_return - unnecessary_brace_in_string_interps - unnecessary_const - unnecessary_getters_setters - unnecessary_new - unrelated_type_equality_checks - valid_regexps - - void_checks +# - void_checks diff --git a/lib/src/common/model/repos_releases.dart b/lib/src/common/model/repos_releases.dart index 23fe085d..d4cf41f0 100644 --- a/lib/src/common/model/repos_releases.dart +++ b/lib/src/common/model/repos_releases.dart @@ -30,7 +30,7 @@ class Release { /// Target Commit @JsonKey(name: "target_commitish") - String targetCommitsh; + String targetCommitish; /// Release Name String name; diff --git a/lib/src/common/model/repos_releases.g.dart b/lib/src/common/model/repos_releases.g.dart index 28e9a07d..192bf7b0 100644 --- a/lib/src/common/model/repos_releases.g.dart +++ b/lib/src/common/model/repos_releases.g.dart @@ -13,7 +13,7 @@ Release _$ReleaseFromJson(Map json) { ..zipballUrl = json['zipball_url'] as String ..id = json['id'] as int ..tagName = json['tag_name'] as String - ..targetCommitsh = json['target_commitish'] as String + ..targetCommitish = json['target_commitish'] as String ..name = json['name'] as String ..body = json['body'] as String ..description = json['description'] as String @@ -40,7 +40,7 @@ Map _$ReleaseToJson(Release instance) => { 'zipball_url': instance.zipballUrl, 'id': instance.id, 'tag_name': instance.tagName, - 'target_commitish': instance.targetCommitsh, + 'target_commitish': instance.targetCommitish, 'name': instance.name, 'body': instance.body, 'description': instance.description, diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 29e49edb..be3a7dee 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -600,20 +600,51 @@ class RepositoriesService extends Service { } /// Edits a hook. + /// * [configUrl]: The URL to which the payloads will be delivered. + /// * [configContentType]: The media type used to serialize the payloads. Supported values include json and form. The default is form. + /// * [configSecret]: If provided, the secret will be used as the key to generate the HMAC hex digest value in the X-Hub-Signature header. + /// * [configInsecureSsl]: Determines whether the SSL certificate of the host for url will be verified when delivering payloads. We strongly recommend not setting this to true as you are subject to man-in-the-middle and other attacks. + /// * [events]: Determines what events the hook is triggered for. This replaces the entire array of events. Default: ["push"]. + /// * [addEvents]: Determines a list of events to be added to the list of events that the Hook triggers for. + /// * [removeEvents]: Determines a list of events to be removed from the list of events that the Hook triggers for. + /// * [active]: Determines if notifications are sent when the webhook is triggered. Set to true to send notifications. + /// + /// Leave blank the unedited fields. /// Returns the edited hook. /// /// https://developer.github.com/v3/repos/hooks/#edit-a-hook - // TODO implement methods in Hook class to edit some fields - Future editHook(RepositorySlug slug, Hook editedHook) async { + Future editHook( + RepositorySlug slug, + Hook hookToEdit, { + String configUrl, + String configContentType, + String configSecret, + bool configInsecureSsl, + List events, + List addEvents, + List removeEvents, + bool active, + }) async { + assert(configUrl != null || hookToEdit.config['url'] != null); + assert(configContentType == 'json' || configContentType == 'form'); return _github.postJSON, Hook>( - "/repos/${slug.fullName}/hooks/${editedHook.id.toString()}", + "/repos/${slug.fullName}/hooks/${hookToEdit.id.toString()}", statusCode: StatusCodes.OK, convert: (i) => Hook.fromJSON(slug.fullName, i), - body: jsonEncode({ - "config": editedHook.config, - "events": editedHook.events, - "active": editedHook.active, - }), + body: jsonEncode(createNonNullMap({ + "active": active ?? hookToEdit.active, + "events": events ?? hookToEdit.events, + "add_events": addEvents, + "remove_events": removeEvents, + "config": { + "url": configUrl ?? hookToEdit.config["url"], + "content_type": + configContentType ?? hookToEdit.config["content_type"], + "secret": configSecret ?? hookToEdit.config["secret"], + "insecure_ssl": + configInsecureSsl == null || !configInsecureSsl ? "0" : "1", + }, + })), ); } @@ -676,7 +707,6 @@ class RepositoriesService extends Service { /// Adds a deploy key for a repository. /// /// API docs: https://developer.github.com/v3/repos/keys/#create - // TODO add to Changelog new args Future createDeployKey(RepositorySlug slug, {@required String title, @required String key}) async { assert(title != null && key != null); @@ -737,7 +767,7 @@ class RepositoriesService extends Service { } /// Get latest Pages build. - /// + /// /// API docs: https://developer.github.com/v3/repos/pages/#list-latest-pages-build Future getLatestPagesBuild(RepositorySlug slug) async { return _github.getJSON( @@ -779,12 +809,111 @@ class RepositoriesService extends Service { ); } - // TODO: Implement editRelease: https://developer.github.com/v3/repos/releases/#edit-a-release - // TODO: Implement deleteRelease: https://developer.github.com/v3/repos/releases/#delete-a-release - // TODO: Implement listReleaseAssets: https://developer.github.com/v3/repos/releases/#list-assets-for-a-release - // TODO: Implement getReleaseAssets: https://developer.github.com/v3/repos/releases/#get-a-single-release-asset - // TODO: Implement editReleaseAssets: https://developer.github.com/v3/repos/releases/#edit-a-release-asset - // TODO: Implement deleteReleaseAssets: https://developer.github.com/v3/repos/releases/#delete-a-release-asset + /// Edits the given release with new fields. + /// * [tagName]: The name of the tag. + /// * [targetCommitish]: Specifies the commitish value that determines where the Git tag is created from. Can be any branch or commit SHA. Unused if the Git tag already exists. Default: the repository's default branch (usually master). + /// * [name]: The name of the release. + /// * [body]: Text describing the contents of the tag. + /// * [draft]: true makes the release a draft, and false publishes the release. + /// * [preRelease]: true to identify the release as a prerelease, false to identify the release as a full release. + /// + /// Leave blank the fields you don't want to edit. + /// + /// API docs: https://developer.github.com/v3/repos/releases/#edit-a-release + Future editRelease( + RepositorySlug slug, + Release releaseToEdit, { + String tagName, + String targetCommitish, + String name, + String body, + bool draft, + bool preRelease, + }) async { + return _github.postJSON, Release>( + "/repos/${slug.fullName}/releases/${releaseToEdit.id.toString()}", + body: jsonEncode(createNonNullMap({ + "tag_name": tagName ?? releaseToEdit.tagName, + "target_commitish": targetCommitish ?? releaseToEdit.targetCommitish, + "name": name ?? releaseToEdit.name, + "body": body ?? releaseToEdit.body, + "draft": draft ?? releaseToEdit.draft, + "prerelease": preRelease ?? releaseToEdit.prerelease, + })), + statusCode: StatusCodes.OK, + convert: (i) => Release.fromJson(i), + ); + } + + /// Delete the release. + /// + /// API docs: https://developer.github.com/v3/repos/releases/#delete-a-release + Future deleteRelease(RepositorySlug slug, Release release) async { + await _github.request( + "DELETE", + "/repos/${slug.fullName}/releases/${release.id.toString}", + statusCode: StatusCodes.NO_CONTENT, + ); + } + + /// Lists assets for a release. + /// + /// API docs: https://developer.github.com/v3/repos/releases/#list-assets-for-a-release + Stream listReleaseAssets(RepositorySlug slug, Release release) { + return PaginationHelper(_github) + .objects, ReleaseAsset>( + "GET", + "/repos/${slug.fullName}/releases/${release.id.toString()}/assets", + (i) => ReleaseAsset.fromJson(i), + statusCode: StatusCodes.OK, + ); + } + + /// Get a single release asset. + /// + /// API docs: https://developer.github.com/v3/repos/releases/#get-a-single-release-asset + // TODO: implement a way to retrieve the asset's binary content + Future getReleaseAsset(RepositorySlug slug, Release release, + {@required int assetId}) async { + return _github.postJSON, ReleaseAsset>( + "/repos/${slug.fullName}/releases/assets/${assetId.toString()}", + statusCode: StatusCodes.OK, + convert: (i) => ReleaseAsset.fromJson(i), + ); + } + + /// Edits a release asset. + /// + /// API docs: https://developer.github.com/v3/repos/releases/#edit-a-release-asset + Future editReleaseAsset( + RepositorySlug slug, + ReleaseAsset assetToEdit, { + String name, + String label, + }) async { + return _github.postJSON, ReleaseAsset>( + "/repos/${slug.fullName}/releases/assets/${assetToEdit.id.toString()}", + statusCode: StatusCodes.OK, + convert: (i) => ReleaseAsset.fromJson(i), + body: jsonEncode(createNonNullMap({ + "name": name ?? assetToEdit.name, + "label": label ?? assetToEdit.label, + })), + ); + } + + /// Delete a release asset. + /// + /// API docs: https://developer.github.com/v3/repos/releases/#delete-a-release-asset + Future deleteReleaseAsset( + RepositorySlug slug, ReleaseAsset asset) async { + await _github.request( + "DELETE", + "/repos/${slug.fullName}/releases/assets/${asset.id.toString()}", + statusCode: 204, + ); + } + // TODO: Implement uploadReleaseAsset: https://developer.github.com/v3/repos/releases/#upload-a-release-asset /// Lists repository contributor statistics. From ed06a4bb8781c1363168bd3d0860e2adf1219476 Mon Sep 17 00:00:00 2001 From: axel-op <49279289+axel-op@users.noreply.github.com> Date: Fri, 4 Oct 2019 17:40:43 +0200 Subject: [PATCH 045/390] Reversed changes on analysis_options.yml --- analysis_options.yaml | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index 7a82c304..ebaab926 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -2,7 +2,7 @@ include: package:pedantic/analysis_options.yaml linter: rules: - always_declare_return_types -# - annotate_overrides +# - annotate_overrides # - avoid_as - avoid_empty_else - avoid_init_to_null @@ -11,7 +11,7 @@ linter: - camel_case_types - close_sinks - comment_references -# - constant_identifier_names +# - constant_identifier_names - control_flow_in_finally - directives_ordering - empty_catches @@ -28,13 +28,7 @@ linter: - package_api_docs - package_names - package_prefixed_library_names -# - prefer_constructors_over_static_methods -# - prefer_const_declarations -# - prefer_const_literals_to_create_immutables - prefer_equal_for_default_values -# - prefer_final_fields -# - prefer_final_in_for_each -# - prefer_final_locals - prefer_generic_function_type_aliases - prefer_is_not_empty - slash_for_doc_comments @@ -44,11 +38,9 @@ linter: - type_annotate_public_apis - type_init_formals - unawaited_futures -# - unnecessary_await_in_return - unnecessary_brace_in_string_interps - unnecessary_const - unnecessary_getters_setters - unnecessary_new - unrelated_type_equality_checks - valid_regexps -# - void_checks From ac5f2908192a2ce69cdb76b70ad51f6a898c7f6c Mon Sep 17 00:00:00 2001 From: axel-op <49279289+axel-op@users.noreply.github.com> Date: Fri, 4 Oct 2019 17:43:03 +0200 Subject: [PATCH 046/390] Edited imports --- lib/src/common.dart | 1 - lib/src/common/repos_service.dart | 10 +++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/lib/src/common.dart b/lib/src/common.dart index 7bcfb173..0245d604 100644 --- a/lib/src/common.dart +++ b/lib/src/common.dart @@ -14,7 +14,6 @@ import "dart:convert" json; import "package:http/http.dart" as http; -import 'package:http/http.dart'; import 'package:http_parser/http_parser.dart' as http_parser; import "package:json_annotation/json_annotation.dart"; import 'package:meta/meta.dart'; diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index be3a7dee..a36bb673 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -485,7 +485,7 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/contents/#create-a-file Future createFile( RepositorySlug slug, CreateFile file) async { - final Response response = await _github.request( + final http.Response response = await _github.request( "PUT", "/repos/${slug.fullName}/contents/${file.path}", body: file.toJSON(), @@ -506,7 +506,7 @@ class RepositoriesService extends Service { "sha": sha, "branch": branch, }); - final Response response = await _github.request( + final http.Response response = await _github.request( "PUT", "/repos/${slug.fullName}/contents/$path", body: jsonEncode(map), @@ -522,7 +522,7 @@ class RepositoriesService extends Service { String message, String sha, String branch) async { final Map map = createNonNullMap({"message": message, "sha": sha, "branch": branch}); - final Response response = await _github.request( + final http.Response response = await _github.request( "DELETE", "/repos/${slug.fullName}/contents/$path", body: jsonEncode(map), @@ -537,7 +537,7 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/contents/#get-archive-link Future getArchiveLink(RepositorySlug slug, String ref, {String format = "tarball"}) async { - final Response response = await _github.request( + final http.Response response = await _github.request( "GET", "/repos/${slug.fullName}/$format/$ref", statusCode: 302, @@ -926,7 +926,7 @@ class RepositoriesService extends Service { RepositorySlug slug, ) async { final String path = "/repos/${slug.fullName}/stats/contributors"; - final Response response = await _github.request('GET', path, + final http.Response response = await _github.request('GET', path, headers: {"Accept": "application/vnd.github.v3+json"}); if (response.statusCode == StatusCodes.OK) { From 5df633773918c55f4f3dabdfa9f079a79650ec18 Mon Sep 17 00:00:00 2001 From: axel-op <49279289+axel-op@users.noreply.github.com> Date: Fri, 4 Oct 2019 17:57:12 +0200 Subject: [PATCH 047/390] Edited CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index aebdda2e..9176b69c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ ## v.6.0.0 - **BREAKING**: methods `deleteRepository`, `isCollaborator`, `addCollaborator`, `removeCollaborator`, `testPushHook`, `pingHook`, and `deleteHook` now return a `Future` instead of a `Future`. - **BREAKING**: parameters of method `createDeployKey` have been modified. + - **BREAKING**: parameter `targetCommitsh` in `Release` class has been renamed as `targetCommitish` - New methods in `repos_service.dart`. ## v5.2.0 From 73243c6320820f9d4daaef4259b91b01e69630dd Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sat, 5 Oct 2019 15:53:47 -0600 Subject: [PATCH 048/390] Fix naming targetCommitsh to targetCommitish --- lib/src/common/model/repos_releases.dart | 10 +++++++++- lib/src/common/model/repos_releases.g.dart | 4 ++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/src/common/model/repos_releases.dart b/lib/src/common/model/repos_releases.dart index 23fe085d..29714580 100644 --- a/lib/src/common/model/repos_releases.dart +++ b/lib/src/common/model/repos_releases.dart @@ -30,7 +30,15 @@ class Release { /// Target Commit @JsonKey(name: "target_commitish") - String targetCommitsh; + String targetCommitish; + + /// Target Commit (Deprecated) + /// + /// `targetCommitsh` was a typo in previous versions and has been corrected. + /// Use `targetCommitish` instead. + /// This will be removed in the next major release + @deprecated + String get targetCommitsh => targetCommitish; /// Release Name String name; diff --git a/lib/src/common/model/repos_releases.g.dart b/lib/src/common/model/repos_releases.g.dart index 28e9a07d..192bf7b0 100644 --- a/lib/src/common/model/repos_releases.g.dart +++ b/lib/src/common/model/repos_releases.g.dart @@ -13,7 +13,7 @@ Release _$ReleaseFromJson(Map json) { ..zipballUrl = json['zipball_url'] as String ..id = json['id'] as int ..tagName = json['tag_name'] as String - ..targetCommitsh = json['target_commitish'] as String + ..targetCommitish = json['target_commitish'] as String ..name = json['name'] as String ..body = json['body'] as String ..description = json['description'] as String @@ -40,7 +40,7 @@ Map _$ReleaseToJson(Release instance) => { 'zipball_url': instance.zipballUrl, 'id': instance.id, 'tag_name': instance.tagName, - 'target_commitish': instance.targetCommitsh, + 'target_commitish': instance.targetCommitish, 'name': instance.name, 'body': instance.body, 'description': instance.description, From 4d2456a66b1ba8e58e79ffeceb6fc707db6dc627 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sat, 5 Oct 2019 16:13:45 -0600 Subject: [PATCH 049/390] update the changelog and pubspec --- CHANGELOG.md | 3 +++ pubspec.yaml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f448d74..91ffc336 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## v5.3.0 + - Release.targetCommitsh is now deprecated. Use targetCommitish instead. + ## v5.2.0 - Add access to labels on Pull Requests https://github.com/DirectMyFile/github.dart/pull/163 - Adding draft property to PR model https://github.com/DirectMyFile/github.dart/pull/162 diff --git a/pubspec.yaml b/pubspec.yaml index 07cfe49b..8af5e74a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 5.2.0 +version: 5.3.0 author: Kenneth Endfinger description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/DirectMyFile/github.dart From febaa11a1bad0f6d71c224f6ed50caccebfaa393 Mon Sep 17 00:00:00 2001 From: ericwindmill Date: Sun, 6 Oct 2019 14:45:08 -0700 Subject: [PATCH 050/390] implement search github issues --- lib/src/common/search_service.dart | 41 +++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/lib/src/common/search_service.dart b/lib/src/common/search_service.dart index b9bc5da5..c932372a 100644 --- a/lib/src/common/search_service.dart +++ b/lib/src/common/search_service.dart @@ -123,7 +123,46 @@ class SearchService extends Service { } return ''; } - // TODO: Implement issues: https://developer.github.com/v3/search/#search-issues + + /// Search for issues and pull-requests using [query]. + /// Since the Search Rate Limit is small, this is a best effort implementation. + /// API docs: https://developer.github.com/v3/search/#search-issues + Stream issues(String query, {String sort, int pages = 2}) { + var params = {"q": query}; + if (sort != null) { + params["sort"] = sort; + } + + var controller = StreamController(); + + var isFirst = true; + + PaginationHelper(_github) + .fetchStreamed("GET", "/search/issues", + params: params, pages: pages) + .listen((response) { + if (response.statusCode == 403 && + response.body.contains("rate limit") && + isFirst) { + throw RateLimitHit(_github); + } + + isFirst = false; + + var input = jsonDecode(response.body); + + if (input['items'] == null) { + return; + } + + var items = input['items'] as List; + + items.map((item) => Issue.fromJSON(item)).forEach(controller.add); + }).onDone(controller.close); + + return controller.stream; + } + /// Search for users using [query]. /// Since the Search Rate Limit is small, this is a best effort implementation. From 7b315caa73940d96233429e3fe0f5e5c425347e2 Mon Sep 17 00:00:00 2001 From: ericwindmill Date: Sun, 6 Oct 2019 15:37:59 -0700 Subject: [PATCH 051/390] dartfmt --- lib/src/common/search_service.dart | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/lib/src/common/search_service.dart b/lib/src/common/search_service.dart index c932372a..8e2a516a 100644 --- a/lib/src/common/search_service.dart +++ b/lib/src/common/search_service.dart @@ -22,12 +22,9 @@ class SearchService extends Service { var isFirst = true; PaginationHelper(_github) - .fetchStreamed("GET", "/search/repositories", - params: params, pages: pages) + .fetchStreamed("GET", "/search/repositories", params: params, pages: pages) .listen((response) { - if (response.statusCode == 403 && - response.body.contains("rate limit") && - isFirst) { + if (response.statusCode == 403 && response.body.contains("rate limit") && isFirst) { throw RateLimitHit(_github); } @@ -138,12 +135,9 @@ class SearchService extends Service { var isFirst = true; PaginationHelper(_github) - .fetchStreamed("GET", "/search/issues", - params: params, pages: pages) + .fetchStreamed("GET", "/search/issues", params: params, pages: pages) .listen((response) { - if (response.statusCode == 403 && - response.body.contains("rate limit") && - isFirst) { + if (response.statusCode == 403 && response.body.contains("rate limit") && isFirst) { throw RateLimitHit(_github); } @@ -163,13 +157,11 @@ class SearchService extends Service { return controller.stream; } - /// Search for users using [query]. /// Since the Search Rate Limit is small, this is a best effort implementation. /// /// API docs: https://developer.github.com/v3/search/#search-users - Stream users(String query, - {String sort, int pages = 2, int perPage = 30}) { + Stream users(String query, {String sort, int pages = 2, int perPage = 30}) { var params = {"q": query}; if (sort != null) { @@ -185,9 +177,7 @@ class SearchService extends Service { PaginationHelper(_github) .fetchStreamed("GET", "/search/users", params: params, pages: pages) .listen((response) { - if (response.statusCode == 403 && - response.body.contains("rate limit") && - isFirst) { + if (response.statusCode == 403 && response.body.contains("rate limit") && isFirst) { throw RateLimitHit(_github); } From 401da72b3bde6b331bb8148ad1c79bf830e2af7e Mon Sep 17 00:00:00 2001 From: Jonathan White Date: Fri, 20 Sep 2019 15:57:46 -0700 Subject: [PATCH 052/390] Add the ability to upload release assets. Add the ability to get an existing release by tag name. BREAKING CHANGES: - The "draft" and "prerelease" properties in the CreateRelease and Release - classes have been renamed to "isDraft" and "isPrerelease" for clarity. - Release.targetCommitsh has been renamed to Release.targetCommitish. (spelling) - The "release" parameter in RepositoriesService.createRelease has been renamed to "createRelease". - RepositoriesService.getRelease has been renamed to "RepositoriesService.getReleaseById" --- CHANGELOG.md | 11 ++- lib/server.dart | 6 +- lib/src/common.dart | 2 +- lib/src/common/github.dart | 89 +++++++++++++--------- lib/src/common/model/repos_releases.dart | 65 +++++++++++++++- lib/src/common/model/repos_releases.g.dart | 24 +++--- lib/src/common/repos_service.dart | 62 +++++++++++++-- pubspec.yaml | 2 +- 8 files changed, 199 insertions(+), 62 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 91ffc336..fa032375 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ ## v5.3.0 - - Release.targetCommitsh is now deprecated. Use targetCommitish instead. +- Add the ability to upload release assets. +- Add the ability to get an existing release by tag name. + +Deprecations: +- The `draft` and `prerelease` properties in the CreateRelease and Release +- classes have been renamed to `isDraft` and `isPrerelease` for clarity. +- Release.targetCommitsh has been renamed to Release.targetCommitish. +- The `release` parameter in RepositoriesService.createRelease +has been renamed to `createRelease`. +- `RepositoriesService.getRelease` has been renamed to `RepositoriesService.getReleaseById` ## v5.2.0 - Add access to labels on Pull Requests https://github.com/DirectMyFile/github.dart/pull/163 diff --git a/lib/server.dart b/lib/server.dart index ccb83bd5..51bfa311 100644 --- a/lib/server.dart +++ b/lib/server.dart @@ -11,8 +11,10 @@ export "src/server/hooks.dart"; /// Creates a GitHub Client. /// If [auth] is not specified, then it will be automatically configured /// from the environment as per [findAuthenticationFromEnvironment]. -GitHub createGitHubClient( - {Authentication auth, String endpoint = "https://api.github.com"}) { +GitHub createGitHubClient({ + Authentication auth, + String endpoint = "https://api.github.com", +}) { if (auth == null) { auth = findAuthenticationFromEnvironment(); } diff --git a/lib/src/common.dart b/lib/src/common.dart index c60faebb..e18d5c85 100644 --- a/lib/src/common.dart +++ b/lib/src/common.dart @@ -27,7 +27,6 @@ export 'common/model/repos_releases.dart'; export "common/model/users.dart"; export "common/util/pagination.dart"; -part "common.g.dart"; part "common/activity_service.dart"; part "common/authorizations_service.dart"; part "common/gists_service.dart"; @@ -68,6 +67,7 @@ part "common/util/json.dart"; part "common/util/oauth2.dart"; part "common/util/service.dart"; part "common/util/utils.dart"; +part "common.g.dart"; void _applyExpandos(Object target, http.Response response) { _etagExpando[target] = response.headers['etag']; diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index b86add66..d7ca40d4 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -40,11 +40,11 @@ class GitHub { /// /// [endpoint] is the api endpoint to use /// [auth] is the authentication information - GitHub( - {Authentication auth, - this.endpoint = "https://api.github.com", - http.Client client}) - : this.auth = auth == null ? Authentication.anonymous() : auth, + GitHub({ + Authentication auth, + this.endpoint = "https://api.github.com", + http.Client client, + }) : this.auth = auth == null ? Authentication.anonymous() : auth, this.client = client == null ? http.Client() : client; /// The maximum number of requests that the consumer is permitted to make per @@ -219,22 +219,29 @@ class GitHub { /// The future will pass the object returned from this function to the then method. /// The default [convert] function returns the input object. /// [body] is the data to send to the server. - Future postJSON(String path, - {int statusCode, - void fail(http.Response response), - Map headers, - Map params, - JSONConverter convert, - String body, - String preview}) => - _requestJson('POST', path, - statusCode: statusCode, - fail: fail, - headers: headers, - params: params, - convert: convert, - body: body, - preview: preview); + /// [S] represents the input type. + /// [T] represents the type return from this function after conversion + Future postJSON( + String path, { + int statusCode, + void fail(http.Response response), + Map headers, + Map params, + JSONConverter convert, + dynamic body, + String preview, + }) => + _requestJson( + 'POST', + path, + statusCode: statusCode, + fail: fail, + headers: headers, + params: params, + convert: convert, + body: body, + preview: preview, + ); Future _requestJson( String method, @@ -244,7 +251,7 @@ class GitHub { Map headers, Map params, JSONConverter convert, - String body, + dynamic body, String preview, }) async { convert ??= (input) => input as T; @@ -256,12 +263,15 @@ class GitHub { headers.putIfAbsent("Accept", () => "application/vnd.github.v3+json"); - var response = await request(method, path, - headers: headers, - params: params, - body: body, - statusCode: statusCode, - fail: fail); + var response = await request( + method, + path, + headers: headers, + params: params, + body: body, + statusCode: statusCode, + fail: fail, + ); var json = jsonDecode(response.body); @@ -283,13 +293,16 @@ class GitHub { /// [params] are query string parameters. /// [body] is the body content of requests that take content. /// - Future request(String method, String path, - {Map headers, - Map params, - String body, - int statusCode, - void fail(http.Response response), - String preview}) async { + Future request( + String method, + String path, { + Map headers, + Map params, + dynamic body, + int statusCode, + void fail(http.Response response), + String preview, + }) async { if (headers == null) headers = {}; if (preview != null) { @@ -331,7 +344,11 @@ class GitHub { var request = http.Request(method, Uri.parse(url.toString())); request.headers.addAll(headers); if (body != null) { - request.body = body; + if (body is String) { + request.body = body; + } else { + request.bodyBytes = body; + } } var streamedResponse = await client.send(request); diff --git a/lib/src/common/model/repos_releases.dart b/lib/src/common/model/repos_releases.dart index 29714580..35c75357 100644 --- a/lib/src/common/model/repos_releases.dart +++ b/lib/src/common/model/repos_releases.dart @@ -1,5 +1,8 @@ +import 'dart:typed_data'; + import 'package:github/src/common/model/users.dart'; import 'package:json_annotation/json_annotation.dart'; +import 'package:meta/meta.dart'; part 'repos_releases.g.dart'; @@ -21,9 +24,17 @@ class Release { @JsonKey(name: "zipball_url") String zipballUrl; + /// The endpoint for uploading release assets. + /// This key is a hypermedia resource. https://developer.github.com/v3/#hypermedia + @JsonKey(name: "upload_url") + String uploadUrl; + /// Release ID int id; + @JsonKey(name: "node_id") + String nodeId; + /// Release Tag Name @JsonKey(name: "tag_name") String tagName; @@ -50,10 +61,12 @@ class Release { String description; /// If the release is a draft. - bool draft; + @JsonKey(name: "draft") + bool isDraft; /// If the release is a pre-release. - bool prerelease; + @JsonKey(name: "prerelease") + bool isPrerelease; /// The time this release was created at. @JsonKey(name: "created_at") @@ -85,6 +98,14 @@ class Release { Map toJson() { return _$ReleaseToJson(this); } + + String getUploadUrlFor(String name, [String label]) => + "${uploadUrl.substring(0, uploadUrl.indexOf('{'))}?name=$name${label != null ? ",$label" : ""}"; + + bool get hasErrors => + json['errors'] != null && (json['errors'] as List).isNotEmpty; + + List get errors => json['errors']; } /// Model class for a release asset. @@ -159,13 +180,22 @@ class CreateRelease { String body; /// If the release is a draft - bool draft; + bool isDraft; /// If the release should actually be released. - bool prerelease; + bool isPrerelease; CreateRelease(this.tagName); + CreateRelease.from({ + @required this.tagName, + @required this.name, + @required this.targetCommitish, + @required this.isDraft, + @required this.isPrerelease, + this.body, + }); + static CreateRelease fromJson(Map input) { if (input == null) return null; @@ -176,3 +206,30 @@ class CreateRelease { return _$CreateReleaseToJson(this); } } + +class CreateReleaseAsset { + /// The file name of the asset. + String name; + + /// An alternate short description of the asset. Used in place of the filename. + String label; + + /// The media type of the asset. + /// + /// For a list of media types, + /// see [Media Types](https://www.iana.org/assignments/media-types/media-types.xhtml). + /// For example: application/zip + String contentType; + + /// The raw binary data for the asset being uploaded. + /// + /// GitHub expects the asset data in its raw binary form, rather than JSON. + Uint8List assetData; + + CreateReleaseAsset({ + @required this.name, + @required this.contentType, + @required this.assetData, + this.label, + }); +} diff --git a/lib/src/common/model/repos_releases.g.dart b/lib/src/common/model/repos_releases.g.dart index 192bf7b0..0f103aed 100644 --- a/lib/src/common/model/repos_releases.g.dart +++ b/lib/src/common/model/repos_releases.g.dart @@ -11,14 +11,16 @@ Release _$ReleaseFromJson(Map json) { ..htmlUrl = json['html_url'] as String ..tarballUrl = json['tarball_url'] as String ..zipballUrl = json['zipball_url'] as String + ..uploadUrl = json['upload_url'] as String ..id = json['id'] as int + ..nodeId = json['node_id'] as String ..tagName = json['tag_name'] as String ..targetCommitish = json['target_commitish'] as String ..name = json['name'] as String ..body = json['body'] as String ..description = json['description'] as String - ..draft = json['draft'] as bool - ..prerelease = json['prerelease'] as bool + ..isDraft = json['draft'] as bool + ..isPrerelease = json['prerelease'] as bool ..createdAt = json['created_at'] == null ? null : DateTime.parse(json['created_at'] as String) @@ -38,18 +40,20 @@ Map _$ReleaseToJson(Release instance) => { 'html_url': instance.htmlUrl, 'tarball_url': instance.tarballUrl, 'zipball_url': instance.zipballUrl, + 'upload_url': instance.uploadUrl, 'id': instance.id, + 'node_id': instance.nodeId, 'tag_name': instance.tagName, 'target_commitish': instance.targetCommitish, 'name': instance.name, 'body': instance.body, 'description': instance.description, - 'draft': instance.draft, - 'prerelease': instance.prerelease, + 'draft': instance.isDraft, + 'prerelease': instance.isPrerelease, 'created_at': instance.createdAt?.toIso8601String(), 'published_at': instance.publishedAt?.toIso8601String(), - 'author': Release._authorToJson(instance.author), - 'assets': Release._assetsToJson(instance.assets), + 'author': instance.author, + 'assets': instance.assets, }; ReleaseAsset _$ReleaseAssetFromJson(Map json) { @@ -92,8 +96,8 @@ CreateRelease _$CreateReleaseFromJson(Map json) { ..targetCommitish = json['target_commitish'] as String ..name = json['name'] as String ..body = json['body'] as String - ..draft = json['draft'] as bool - ..prerelease = json['prerelease'] as bool; + ..isDraft = json['isDraft'] as bool + ..isPrerelease = json['isPrerelease'] as bool; } Map _$CreateReleaseToJson(CreateRelease instance) => @@ -103,6 +107,6 @@ Map _$CreateReleaseToJson(CreateRelease instance) => 'target_commitish': instance.targetCommitish, 'name': instance.name, 'body': instance.body, - 'draft': instance.draft, - 'prerelease': instance.prerelease, + 'isDraft': instance.isDraft, + 'isPrerelease': instance.isPrerelease, }; diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index d65646cb..1a373009 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -505,6 +505,8 @@ class RepositoriesService extends Service { // TODO: Implement listPagesBuilds: https://developer.github.com/v3/repos/pages/#list-pages-builds // TODO: Implement getLatestPagesBuild: https://developer.github.com/v3/repos/pages/#list-latest-pages-build + // Releases + /// Lists releases for the specified repository. /// /// API docs: https://developer.github.com/v3/repos/releases/#list-releases-for-a-repository @@ -513,28 +515,74 @@ class RepositoriesService extends Service { .objects("GET", "/repos/${slug.fullName}/releases", Release.fromJson); } - /// Fetches a single release. + /// Fetches a single release by the release ID. /// /// API docs: https://developer.github.com/v3/repos/releases/#get-a-single-release - Future getRelease(RepositorySlug slug, int id) => + Future getReleaseById(RepositorySlug slug, int id) => _github.getJSON("/repos/${slug.fullName}/releases/$id", convert: Release.fromJson); - /// Creates a Release based on the specified [release]. + /// Fetches a single release by the release tag name. + /// + /// API docs: https://developer.github.com/v3/repos/releases/#get-a-release-by-tag-name + Future getReleaseByTagName(RepositorySlug slug, String tagName) => + _github.getJSON("/repos/${slug.fullName}/releases/tags/$tagName", + convert: Release.fromJson); + + /// Creates a Release based on the specified [createRelease]. /// + /// If [getIfExists] is true, this returns an already existing release instead of an error. + /// Defaults to true. /// API docs: https://developer.github.com/v3/repos/releases/#create-a-release - Future createRelease(RepositorySlug slug, CreateRelease release) { - return _github.postJSON("/repos/${slug.fullName}/releases", - convert: Release.fromJson, body: jsonEncode(release.toJson())); + Future createRelease( + RepositorySlug slug, + CreateRelease createRelease, { + bool getIfExists = true, + }) async { + Release release = await _github.postJSON("/repos/${slug.fullName}/releases", + convert: Release.fromJson, body: jsonEncode(createRelease.toJson())); + if (release.hasErrors) { + var alreadyExistsErrorCode = release.errors.firstWhere( + (error) => error['code'] == 'already_exists', + orElse: () => null); + if (alreadyExistsErrorCode != null) { + var field = alreadyExistsErrorCode['field']; + if (field == "tag_name") { + return getReleaseByTagName(slug, createRelease.tagName); + } + } else { + print( + "Unexpected response from the API. Returning response. \n Errors: ${release.errors}"); + } + } + return release; } + Future> uploadReleaseAssets( + Release release, + Iterable createReleaseAssets, + ) async { + List releaseAssets = []; + for (final createReleaseAsset in createReleaseAssets) { + final headers = {'Content-Type': createReleaseAsset.contentType}; + final releaseAsset = await _github.postJSON( + release.getUploadUrlFor( + createReleaseAsset.name, + createReleaseAsset.label, + ), + headers: headers, + body: createReleaseAsset.assetData, + convert: ReleaseAsset.fromJson); + releaseAssets.add(releaseAsset); + } + return releaseAssets; + } // TODO: Implement editRelease: https://developer.github.com/v3/repos/releases/#edit-a-release // TODO: Implement deleteRelease: https://developer.github.com/v3/repos/releases/#delete-a-release // TODO: Implement listReleaseAssets: https://developer.github.com/v3/repos/releases/#list-assets-for-a-release // TODO: Implement getReleaseAssets: https://developer.github.com/v3/repos/releases/#get-a-single-release-asset // TODO: Implement editReleaseAssets: https://developer.github.com/v3/repos/releases/#edit-a-release-asset // TODO: Implement deleteReleaseAssets: https://developer.github.com/v3/repos/releases/#delete-a-release-asset - // TODO: Implement uploadReleaseAsset: https://developer.github.com/v3/repos/releases/#upload-a-release-asset /// Lists repository contributor statistics. /// diff --git a/pubspec.yaml b/pubspec.yaml index 8af5e74a..8b482834 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 5.3.0 +version: 5.3. author: Kenneth Endfinger description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/DirectMyFile/github.dart From e4c93abedcf7e8935aafe926cbd0f17d1c498894 Mon Sep 17 00:00:00 2001 From: Jonathan White Date: Fri, 20 Sep 2019 15:57:46 -0700 Subject: [PATCH 053/390] Add the ability to upload release assets. Add the ability to get an existing release by tag name. BREAKING CHANGES: - The "draft" and "prerelease" properties in the CreateRelease and Release - classes have been renamed to "isDraft" and "isPrerelease" for clarity. - Release.targetCommitsh has been renamed to Release.targetCommitish. (spelling) - The "release" parameter in RepositoriesService.createRelease has been renamed to "createRelease". - RepositoriesService.getRelease has been renamed to "RepositoriesService.getReleaseById" --- lib/src/common/model/repos_releases.dart | 47 ++++++++++++++++--- lib/src/common/repos_service.dart | 9 ++++ .../common/model/repos_releases_test.dart | 12 +++++ 3 files changed, 61 insertions(+), 7 deletions(-) diff --git a/lib/src/common/model/repos_releases.dart b/lib/src/common/model/repos_releases.dart index 35c75357..85ed11eb 100644 --- a/lib/src/common/model/repos_releases.dart +++ b/lib/src/common/model/repos_releases.dart @@ -64,6 +64,13 @@ class Release { @JsonKey(name: "draft") bool isDraft; + @Deprecated('Use isDraft') + bool get draft => isDraft; + + /// If the release is a pre-release. + @Deprecated('Use isPrerelease') + bool get prerelease => isPrerelease; + /// If the release is a pre-release. @JsonKey(name: "prerelease") bool isPrerelease; @@ -155,9 +162,7 @@ class ReleaseAsset { return _$ReleaseAssetFromJson(input)..json = input; } - Map toJson() { - return _$ReleaseAssetToJson(this); - } + Map toJson() => _$ReleaseAssetToJson(this); } /// Model class for a new release to be created. @@ -179,10 +184,19 @@ class CreateRelease { /// Release Body String body; + @Deprecated('Use isDraft') + bool get draft => isDraft; + /// If the release is a draft bool isDraft; - /// If the release should actually be released. + @Deprecated('Use isPrerelease') + bool get prerelease => isPrerelease; + + set prerelease(bool prerelease) => isPrerelease = prerelease; + + /// true to identify the release as a prerelease. + /// false to identify the release as a full release. Default: false bool isPrerelease; CreateRelease(this.tagName); @@ -196,15 +210,34 @@ class CreateRelease { this.body, }); + @override + bool operator ==(Object other) => + identical(this, other) || + other is CreateRelease && + runtimeType == other.runtimeType && + tagName == other.tagName && + targetCommitish == other.targetCommitish && + name == other.name && + body == other.body && + isDraft == other.isDraft && + isPrerelease == other.isPrerelease; + + @override + int get hashCode => + tagName.hashCode ^ + targetCommitish.hashCode ^ + name.hashCode ^ + body.hashCode ^ + isDraft.hashCode ^ + isPrerelease.hashCode; + static CreateRelease fromJson(Map input) { if (input == null) return null; return _$CreateReleaseFromJson(input)..json = input; } - Map toJson() { - return _$CreateReleaseToJson(this); - } + Map toJson() => _$CreateReleaseToJson(this); } class CreateReleaseAsset { diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 1a373009..86f6136d 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -515,6 +515,14 @@ class RepositoriesService extends Service { .objects("GET", "/repos/${slug.fullName}/releases", Release.fromJson); } + /// Fetches a single release by the release ID. + /// + /// API docs: https://developer.github.com/v3/repos/releases/#get-a-single-release + @Deprecated( + 'Use getReleaseById or for getting a release using a tag name, use getReleaseByTagName') + Future getRelease(RepositorySlug slug, int id) => + getReleaseById(slug, id); + /// Fetches a single release by the release ID. /// /// API docs: https://developer.github.com/v3/repos/releases/#get-a-single-release @@ -577,6 +585,7 @@ class RepositoriesService extends Service { } return releaseAssets; } + // TODO: Implement editRelease: https://developer.github.com/v3/repos/releases/#edit-a-release // TODO: Implement deleteRelease: https://developer.github.com/v3/repos/releases/#delete-a-release // TODO: Implement listReleaseAssets: https://developer.github.com/v3/repos/releases/#list-assets-for-a-release diff --git a/test/unit/common/model/repos_releases_test.dart b/test/unit/common/model/repos_releases_test.dart index 4e001fb1..e953ebac 100644 --- a/test/unit/common/model/repos_releases_test.dart +++ b/test/unit/common/model/repos_releases_test.dart @@ -38,5 +38,17 @@ void main() { final createRelease = CreateRelease.fromJson(createReleasePayload); expect(() => createRelease.toJson(), returnsNormally); }); + + test('toJson reserializes back to the same type of object', () { + final createRelease = CreateRelease.from( + tagName: 'v1.0.0', + name: "Initial Release", + targetCommitish: "master", + isDraft: false, + isPrerelease: true); + final json = createRelease.toJson(); + + expect(CreateRelease.fromJson(json), createRelease); + }); }); } From d19be2a74b8edb8aa38571a20412df9888ee33fa Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sun, 6 Oct 2019 18:14:33 -0600 Subject: [PATCH 054/390] Update .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index e89347f1..f2bb121e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,4 +9,4 @@ dart_task: # - test: --platform vm # - test: --platform chrome - dartanalyzer: lib test # TODO fix examples and add example dir - - dartfmt: true + - dartfmt From f6eb9419c3aebf075d08011b7e5bb85fd1b1edb4 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sun, 6 Oct 2019 18:15:45 -0600 Subject: [PATCH 055/390] dartfmt 80 chars --- lib/src/common/search_service.dart | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/lib/src/common/search_service.dart b/lib/src/common/search_service.dart index 8e2a516a..d1f3bbc4 100644 --- a/lib/src/common/search_service.dart +++ b/lib/src/common/search_service.dart @@ -22,9 +22,12 @@ class SearchService extends Service { var isFirst = true; PaginationHelper(_github) - .fetchStreamed("GET", "/search/repositories", params: params, pages: pages) + .fetchStreamed("GET", "/search/repositories", + params: params, pages: pages) .listen((response) { - if (response.statusCode == 403 && response.body.contains("rate limit") && isFirst) { + if (response.statusCode == 403 && + response.body.contains("rate limit") && + isFirst) { throw RateLimitHit(_github); } @@ -137,7 +140,9 @@ class SearchService extends Service { PaginationHelper(_github) .fetchStreamed("GET", "/search/issues", params: params, pages: pages) .listen((response) { - if (response.statusCode == 403 && response.body.contains("rate limit") && isFirst) { + if (response.statusCode == 403 && + response.body.contains("rate limit") && + isFirst) { throw RateLimitHit(_github); } @@ -161,7 +166,8 @@ class SearchService extends Service { /// Since the Search Rate Limit is small, this is a best effort implementation. /// /// API docs: https://developer.github.com/v3/search/#search-users - Stream users(String query, {String sort, int pages = 2, int perPage = 30}) { + Stream users(String query, + {String sort, int pages = 2, int perPage = 30}) { var params = {"q": query}; if (sort != null) { @@ -177,7 +183,9 @@ class SearchService extends Service { PaginationHelper(_github) .fetchStreamed("GET", "/search/users", params: params, pages: pages) .listen((response) { - if (response.statusCode == 403 && response.body.contains("rate limit") && isFirst) { + if (response.statusCode == 403 && + response.body.contains("rate limit") && + isFirst) { throw RateLimitHit(_github); } From 0b7944e3a244bd4174409d621b2158ed0f0fbcde Mon Sep 17 00:00:00 2001 From: Jonathan White Date: Sun, 6 Oct 2019 17:22:26 -0700 Subject: [PATCH 056/390] Fix version number in pubspec.yaml Co-Authored-By: Rob Becker --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 8b482834..8af5e74a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 5.3. +version: 5.3.0 author: Kenneth Endfinger description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/DirectMyFile/github.dart From b3a8f2b6e3b910d6a3740dbc6e2b89b44b007b38 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sun, 6 Oct 2019 21:12:46 -0600 Subject: [PATCH 057/390] Setup a simple Github CI --- .github/workflows/dart.yml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .github/workflows/dart.yml diff --git a/.github/workflows/dart.yml b/.github/workflows/dart.yml new file mode 100644 index 00000000..32887a53 --- /dev/null +++ b/.github/workflows/dart.yml @@ -0,0 +1,20 @@ +name: Dart CI + +on: [push] + +jobs: + build: + + runs-on: ubuntu-latest + + container: + image: google/dart:latest + + steps: + - uses: actions/checkout@v1 + - name: Install dependencies + run: pub get + - name: Dart Analyzer + run: dartanalyzer . + - name: Check Dart Format + run: dartfmt -n --set-exit-if-changed From 5cc8498fcc8be18fa3336628351704c8b969bcf6 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sun, 6 Oct 2019 21:16:47 -0600 Subject: [PATCH 058/390] Update dart.yml --- .github/workflows/dart.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dart.yml b/.github/workflows/dart.yml index 32887a53..255bcec2 100644 --- a/.github/workflows/dart.yml +++ b/.github/workflows/dart.yml @@ -17,4 +17,4 @@ jobs: - name: Dart Analyzer run: dartanalyzer . - name: Check Dart Format - run: dartfmt -n --set-exit-if-changed + run: dartfmt -n --set-exit-if-changed . From c2eb1fa0b0691515ca426d9b2f47c1106e4782c4 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sun, 6 Oct 2019 21:35:07 -0600 Subject: [PATCH 059/390] Update README build shield to use Github CI --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1d8606f5..765b1c9b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # GitHub for Dart -[![Build Status](https://travis-ci.org/DirectMyFile/github.dart.svg?branch=master)](https://travis-ci.org/DirectMyFile/github.dart) +![](https://github.com/SpinlockLabs/github.dart/workflows/Dart%20CI/badge.svg) [![Pub](https://img.shields.io/pub/v/github.svg)](https://pub.dartlang.org/packages/github) This is a Client Library for GitHub in Dart. I wrote this out of necessity, and then when I got a great reaction from the Dart community, I decided to put a lot of effort into it. From 3e4beb2c228eeff46585be1a5f9afdb2b1c9a328 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sun, 6 Oct 2019 21:37:59 -0600 Subject: [PATCH 060/390] Delete .travis.yml --- .travis.yml | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index f2bb121e..00000000 --- a/.travis.yml +++ /dev/null @@ -1,12 +0,0 @@ -language: dart -sudo: required -addons: - chrome: stable -dart: - - stable -dart_task: - # TODO enable once automated tests are working - # - test: --platform vm - # - test: --platform chrome - - dartanalyzer: lib test # TODO fix examples and add example dir - - dartfmt From bf7c05ff3c3bcc77564718b4579a894cc4d90bb0 Mon Sep 17 00:00:00 2001 From: Axel Ogereau-Peltier <49279289+axel-op@users.noreply.github.com> Date: Mon, 7 Oct 2019 06:41:44 +0200 Subject: [PATCH 061/390] Apply suggestions from code review Co-Authored-By: Rob Becker --- lib/src/common/repos_service.dart | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index a36bb673..55651046 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -14,7 +14,7 @@ class RepositoriesService extends Service { {String type = "owner", String sort = "full_name", String direction = "asc"}) { - final params = {"type": type, "sort": sort, "direction": direction}; + final params = {"type": type, "sort": sort, "direction": direction}; return PaginationHelper(_github).objects, Repository>( "GET", @@ -31,7 +31,7 @@ class RepositoriesService extends Service { {String type = "owner", String sort = "full_name", String direction = "asc"}) { - final params = {"type": type, "sort": sort, "direction": direction}; + final params = {"type": type, "sort": sort, "direction": direction}; return PaginationHelper(_github).objects, Repository>( "GET", @@ -46,7 +46,7 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/#list-user-repositories Stream listOrganizationRepositories(String org, {String type = "all"}) { - final params = {"type": type}; + final params = {"type": type}; return PaginationHelper(_github).objects, Repository>( "GET", @@ -64,7 +64,7 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/#list-all-public-repositories Stream listPublicRepositories({int limit = 50, DateTime since}) { - final params = {}; + final params = {}; if (since != null) { params['since'] = since.toIso8601String(); @@ -213,7 +213,7 @@ class RepositoriesService extends Service { return PaginationHelper(_github).objects, Tag>( 'GET', '/repos/${slug.fullName}/tags', - (j) => Tag.fromJson(j), + (i) => Tag.fromJson(i), ); } @@ -335,7 +335,7 @@ class RepositoriesService extends Service { Future getCommitComment(RepositorySlug slug, {@required int id}) async { return _github.getJSON, CommitComment>( - "/repos/${slug.fullName}/comments/id", + "/repos/${slug.fullName}/comments/$id", statusCode: 200, convert: (i) => CommitComment.fromJSON(i), ); @@ -352,7 +352,7 @@ class RepositoriesService extends Service { {@required int id, @required String body}) async { assert(body != null); return _github.postJSON, CommitComment>( - "/repos/${slug.fullName}/comments/${id.toString()}", + "/repos/${slug.fullName}/comments/$id", body: jsonEncode(createNonNullMap({'body': body})), statusCode: 200, convert: (i) => CommitComment.fromJSON(i), @@ -367,7 +367,7 @@ class RepositoriesService extends Service { {@required int id}) async { await _github.request( "DELETE", - "/repos/${slug.fullName}/comments/${id.toString()}", + "/repos/${slug.fullName}/comments/$id", statusCode: 204, ); } @@ -698,7 +698,7 @@ class RepositoriesService extends Service { Future getDeployKey(RepositorySlug slug, {@required int id}) async { return _github.getJSON, PublicKey>( - "/repos/${slug.fullName}/keys/${id.toString()}", + "/repos/${slug.fullName}/keys/$id", statusCode: StatusCodes.OK, convert: (i) => PublicKey.fromJSON(i), ); @@ -851,7 +851,7 @@ class RepositoriesService extends Service { Future deleteRelease(RepositorySlug slug, Release release) async { await _github.request( "DELETE", - "/repos/${slug.fullName}/releases/${release.id.toString}", + "/repos/${slug.fullName}/releases/${release.id}", statusCode: StatusCodes.NO_CONTENT, ); } @@ -863,7 +863,7 @@ class RepositoriesService extends Service { return PaginationHelper(_github) .objects, ReleaseAsset>( "GET", - "/repos/${slug.fullName}/releases/${release.id.toString()}/assets", + "/repos/${slug.fullName}/releases/${release.id}/assets", (i) => ReleaseAsset.fromJson(i), statusCode: StatusCodes.OK, ); @@ -876,7 +876,7 @@ class RepositoriesService extends Service { Future getReleaseAsset(RepositorySlug slug, Release release, {@required int assetId}) async { return _github.postJSON, ReleaseAsset>( - "/repos/${slug.fullName}/releases/assets/${assetId.toString()}", + "/repos/${slug.fullName}/releases/assets/${assetId}", statusCode: StatusCodes.OK, convert: (i) => ReleaseAsset.fromJson(i), ); @@ -892,7 +892,7 @@ class RepositoriesService extends Service { String label, }) async { return _github.postJSON, ReleaseAsset>( - "/repos/${slug.fullName}/releases/assets/${assetToEdit.id.toString()}", + "/repos/${slug.fullName}/releases/assets/${assetToEdit.id}", statusCode: StatusCodes.OK, convert: (i) => ReleaseAsset.fromJson(i), body: jsonEncode(createNonNullMap({ @@ -909,7 +909,7 @@ class RepositoriesService extends Service { RepositorySlug slug, ReleaseAsset asset) async { await _github.request( "DELETE", - "/repos/${slug.fullName}/releases/assets/${asset.id.toString()}", + "/repos/${slug.fullName}/releases/assets/${asset.id}", statusCode: 204, ); } From c4c9c8547612d211085c08c7341ad8675806657e Mon Sep 17 00:00:00 2001 From: axel-op <49279289+axel-op@users.noreply.github.com> Date: Mon, 7 Oct 2019 06:46:09 +0200 Subject: [PATCH 062/390] Formatting --- lib/src/common/repos_service.dart | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 55651046..7c91b881 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -14,7 +14,11 @@ class RepositoriesService extends Service { {String type = "owner", String sort = "full_name", String direction = "asc"}) { - final params = {"type": type, "sort": sort, "direction": direction}; + final params = { + "type": type, + "sort": sort, + "direction": direction, + }; return PaginationHelper(_github).objects, Repository>( "GET", @@ -31,7 +35,11 @@ class RepositoriesService extends Service { {String type = "owner", String sort = "full_name", String direction = "asc"}) { - final params = {"type": type, "sort": sort, "direction": direction}; + final params = { + "type": type, + "sort": sort, + "direction": direction + }; return PaginationHelper(_github).objects, Repository>( "GET", @@ -876,7 +884,7 @@ class RepositoriesService extends Service { Future getReleaseAsset(RepositorySlug slug, Release release, {@required int assetId}) async { return _github.postJSON, ReleaseAsset>( - "/repos/${slug.fullName}/releases/assets/${assetId}", + "/repos/${slug.fullName}/releases/assets/$assetId", statusCode: StatusCodes.OK, convert: (i) => ReleaseAsset.fromJson(i), ); From 003620215b097f875ae7c28058fe23c23b39845d Mon Sep 17 00:00:00 2001 From: axel-op <49279289+axel-op@users.noreply.github.com> Date: Mon, 7 Oct 2019 07:00:14 +0200 Subject: [PATCH 063/390] Edited isCollaborator --- CHANGELOG.md | 2 +- lib/src/common/repos_service.dart | 23 +++++++++++++++++------ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b3e6e4f0..3770b091 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,5 @@ ## v.6.0.0 - - **BREAKING**: methods `deleteRepository`, `isCollaborator`, `addCollaborator`, `removeCollaborator`, `testPushHook`, `pingHook`, and `deleteHook` now return a `Future` instead of a `Future`. + - **BREAKING**: methods `deleteRepository`, `addCollaborator`, `removeCollaborator`, `testPushHook`, `pingHook`, and `deleteHook` now return a `Future` instead of a `Future`. - **BREAKING**: parameters of method `createDeployKey` have been modified. ## v5.3.0 diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 7c91b881..01d094c6 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -255,12 +255,23 @@ class RepositoriesService extends Service { (json) => Collaborator.fromJson(json), ); - Future isCollaborator(RepositorySlug slug, String user) async { - return _github.request( - "GET", - "/repos/${slug.fullName}/collaborators/$user", - statusCode: 204, - ); + Future isCollaborator(RepositorySlug slug, String user) async { + bool catchError = false; + http.Response response; + try { + response = await _github.request( + "GET", + "/repos/${slug.fullName}/collaborators/$user", + statusCode: StatusCodes.NO_CONTENT, + fail: (response) { + if (response.statusCode == StatusCodes.NOT_FOUND) catchError = true; + }, + ); + if (response.statusCode == StatusCodes.NO_CONTENT) return true; + } catch (e) { + if (!catchError) rethrow; + } + return false; } Future addCollaborator(RepositorySlug slug, String user) async { From 9f57ab09c55bbf1ccb9b919ac84e805df60fe3ee Mon Sep 17 00:00:00 2001 From: axel-op <49279289+axel-op@users.noreply.github.com> Date: Mon, 7 Oct 2019 07:07:07 +0200 Subject: [PATCH 064/390] Replaced raw status codes by their enum value --- lib/src/common/repos_service.dart | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 01d094c6..ff1d4c3d 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -278,7 +278,7 @@ class RepositoriesService extends Service { return _github.request( "PUT", "/repos/${slug.fullName}/collaborators/$user", - statusCode: 204, + statusCode: StatusCodes.NO_CONTENT, ); } @@ -286,7 +286,7 @@ class RepositoriesService extends Service { return _github.request( "DELETE", "/repos/${slug.fullName}/collaborators/$user", - statusCode: 204, + statusCode: StatusCodes.NO_CONTENT, ); } @@ -343,7 +343,7 @@ class RepositoriesService extends Service { return _github.postJSON, CommitComment>( "/repos/${slug.fullName}/commits/${commit.sha}/comments", body: jsonEncode(data), - statusCode: 201, + statusCode: StatusCodes.CREATED, convert: (i) => CommitComment.fromJSON(i), ); } @@ -355,7 +355,7 @@ class RepositoriesService extends Service { {@required int id}) async { return _github.getJSON, CommitComment>( "/repos/${slug.fullName}/comments/$id", - statusCode: 200, + statusCode: StatusCodes.OK, convert: (i) => CommitComment.fromJSON(i), ); } @@ -373,7 +373,7 @@ class RepositoriesService extends Service { return _github.postJSON, CommitComment>( "/repos/${slug.fullName}/comments/$id", body: jsonEncode(createNonNullMap({'body': body})), - statusCode: 200, + statusCode: StatusCodes.OK, convert: (i) => CommitComment.fromJSON(i), ); } @@ -387,7 +387,7 @@ class RepositoriesService extends Service { await _github.request( "DELETE", "/repos/${slug.fullName}/comments/$id", - statusCode: 204, + statusCode: StatusCodes.NO_CONTENT, ); } @@ -446,7 +446,7 @@ class RepositoriesService extends Service { headers: headers, statusCode: StatusCodes.OK, fail: (http.Response response) { - if (response.statusCode == 404) { + if (response.statusCode == StatusCodes.NOT_FOUND) { throw NotFound(_github, response.body); } }, @@ -545,7 +545,7 @@ class RepositoriesService extends Service { "DELETE", "/repos/${slug.fullName}/contents/$path", body: jsonEncode(map), - statusCode: 200, + statusCode: StatusCodes.OK, ); return ContentCreation.fromJSON( jsonDecode(response.body) as Map); @@ -559,7 +559,7 @@ class RepositoriesService extends Service { final http.Response response = await _github.request( "GET", "/repos/${slug.fullName}/$format/$ref", - statusCode: 302, + statusCode: StatusCodes.FOUND, ); return response.headers["Location"]; } @@ -929,7 +929,7 @@ class RepositoriesService extends Service { await _github.request( "DELETE", "/repos/${slug.fullName}/releases/assets/${asset.id}", - statusCode: 204, + statusCode: StatusCodes.NO_CONTENT, ); } @@ -989,7 +989,7 @@ class RepositoriesService extends Service { RepositorySlug slug) async => _github.getJSON( "/repos/${slug.fullName}/stats/participation", - statusCode: 200, + statusCode: StatusCodes.OK, convert: (i) => ContributorParticipation.fromJSON(i), ); From 761a584331072bfe8e0b31246a73f2e37266ef30 Mon Sep 17 00:00:00 2001 From: axel-op <49279289+axel-op@users.noreply.github.com> Date: Mon, 7 Oct 2019 07:12:38 +0200 Subject: [PATCH 065/390] Corrected API docs URLs + renamed 'listComments' into 'listSingleCommitComments' --- lib/src/common/repos_service.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index ff1d4c3d..6800a400 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -292,8 +292,8 @@ class RepositoriesService extends Service { /// Returns a list of all comments for a specific commit. /// - /// https://developer.github.com/v3/repos/comments/#list-commit-comments-for-a-repository - Stream listComments( + /// https://developer.github.com/v3/repos/comments/#list-comments-for-a-single-commit + Stream listSingleCommitComments( RepositorySlug slug, RepositoryCommit commit, ) { @@ -308,7 +308,7 @@ class RepositoriesService extends Service { /// Returns a list of all commit comments in a repository. /// - /// https://developer.github.com/v3/repos/comments/#list-comments-for-a-single-commit + /// https://developer.github.com/v3/repos/comments/#list-commit-comments-for-a-repository Stream listCommitComments(RepositorySlug slug) { return PaginationHelper(_github) .objects, CommitComment>( From c43408b5aa9f3060a61ec76e9cb1c25e18713f1a Mon Sep 17 00:00:00 2001 From: axel-op <49279289+axel-op@users.noreply.github.com> Date: Mon, 7 Oct 2019 07:24:11 +0200 Subject: [PATCH 066/390] Arguments checking --- lib/src/common/repos_service.dart | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 6800a400..a7726ad5 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -369,7 +369,7 @@ class RepositoriesService extends Service { /// https://developer.github.com/v3/repos/comments/#update-a-commit-comment Future updateCommitComment(RepositorySlug slug, {@required int id, @required String body}) async { - assert(body != null); + ArgumentError.checkNotNull(body); return _github.postJSON, CommitComment>( "/repos/${slug.fullName}/comments/$id", body: jsonEncode(createNonNullMap({'body': body})), @@ -644,8 +644,10 @@ class RepositoriesService extends Service { List removeEvents, bool active, }) async { - assert(configUrl != null || hookToEdit.config['url'] != null); - assert(configContentType == 'json' || configContentType == 'form'); + ArgumentError.checkNotNull(configUrl ?? hookToEdit.config['url']); + if (configContentType != 'json' && configContentType != 'form') { + throw ArgumentError.value(configContentType, 'configContentType'); + } return _github.postJSON, Hook>( "/repos/${slug.fullName}/hooks/${hookToEdit.id.toString()}", statusCode: StatusCodes.OK, @@ -728,7 +730,8 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/keys/#create Future createDeployKey(RepositorySlug slug, {@required String title, @required String key}) async { - assert(title != null && key != null); + ArgumentError.checkNotNull(title); + ArgumentError.checkNotNull(key); return _github.postJSON, PublicKey>( "/repos/${slug.fullName}/keys", body: jsonEncode({ @@ -910,6 +913,7 @@ class RepositoriesService extends Service { String name, String label, }) async { + ArgumentError.checkNotNull(assetToEdit); return _github.postJSON, ReleaseAsset>( "/repos/${slug.fullName}/releases/assets/${assetToEdit.id}", statusCode: StatusCodes.OK, From 0867eeddf720de9ed9a4687f827148456c44167a Mon Sep 17 00:00:00 2001 From: axel-op <49279289+axel-op@users.noreply.github.com> Date: Mon, 7 Oct 2019 07:52:31 +0200 Subject: [PATCH 067/390] Null checking --- lib/src/common/repos_service.dart | 267 +++++++++++++++++++++--------- 1 file changed, 192 insertions(+), 75 deletions(-) diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index a7726ad5..acce7de2 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -35,6 +35,7 @@ class RepositoriesService extends Service { {String type = "owner", String sort = "full_name", String direction = "asc"}) { + ArgumentError.checkNotNull(user); final params = { "type": type, "sort": sort, @@ -54,6 +55,7 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/#list-user-repositories Stream listOrganizationRepositories(String org, {String type = "all"}) { + ArgumentError.checkNotNull(org); final params = {"type": type}; return PaginationHelper(_github).objects, Repository>( @@ -96,6 +98,7 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/#create Future createRepository(CreateRepository repository, {String org}) async { + ArgumentError.checkNotNull(repository); if (org != null) { return _github.postJSON, TeamRepository>( '/orgs/$org/repos', @@ -111,26 +114,30 @@ class RepositoriesService extends Service { } } - Future getLicense(RepositorySlug slug) async => - _github.getJSON, LicenseDetails>( - "/repos/${slug.owner}/${slug.name}/license", - convert: (json) => LicenseDetails.fromJson(json), - ); + Future getLicense(RepositorySlug slug) async { + ArgumentError.checkNotNull(slug); + return _github.getJSON, LicenseDetails>( + "/repos/${slug.owner}/${slug.name}/license", + convert: (json) => LicenseDetails.fromJson(json), + ); + } /// Fetches the repository specified by the [slug]. /// /// API docs: https://developer.github.com/v3/repos/#get - Future getRepository(RepositorySlug slug) async => - _github.getJSON, Repository>( - "/repos/${slug.owner}/${slug.name}", - convert: (i) => Repository.fromJSON(i), - statusCode: StatusCodes.OK, - fail: (http.Response response) { - if (response.statusCode == 404) { - throw RepositoryNotFound(_github, slug.fullName); - } - }, - ); + Future getRepository(RepositorySlug slug) async { + ArgumentError.checkNotNull(slug); + return _github.getJSON, Repository>( + "/repos/${slug.owner}/${slug.name}", + convert: (i) => Repository.fromJSON(i), + statusCode: StatusCodes.OK, + fail: (http.Response response) { + if (response.statusCode == 404) { + throw RepositoryNotFound(_github, slug.fullName); + } + }, + ); + } /// Fetches a list of repositories specified by [slugs]. Stream getRepositories(List slugs) async* { @@ -143,7 +150,7 @@ class RepositoriesService extends Service { /// Edit a Repository. /// /// API docs: https://developer.github.com/v3/repos/#edit - Future editRepository(RepositorySlug repo, + Future editRepository(RepositorySlug slug, {String name, String description, String homepage, @@ -151,6 +158,7 @@ class RepositoriesService extends Service { bool hasIssues, bool hasWiki, bool hasDownloads}) async { + ArgumentError.checkNotNull(slug); final Map data = createNonNullMap({ "name": name, "description": description, @@ -162,7 +170,7 @@ class RepositoriesService extends Service { "default_branch": "defaultBranch" }); return _github.postJSON( - "/repos/${repo.fullName}", + "/repos/${slug.fullName}", body: jsonEncode(data), statusCode: 200, ); @@ -174,6 +182,7 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/#delete-a-repository Future deleteRepository(RepositorySlug slug) async { + ArgumentError.checkNotNull(slug); await _github.request( 'DELETE', '/repos/${slug.fullName}', @@ -185,10 +194,13 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/#list-contributors Stream listContributors(RepositorySlug slug, {bool anon = false}) { + ArgumentError.checkNotNull(slug); + ArgumentError.checkNotNull(anon); return PaginationHelper(_github).objects, User>( 'GET', '/repos/${slug.fullName}/contributors', (i) => User.fromJson(i), + // TODO add type params: {"anon": anon.toString()}, ); } @@ -197,6 +209,7 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/#list-teams Stream listTeams(RepositorySlug slug) { + ArgumentError.checkNotNull(slug); return PaginationHelper(_github).objects, Team>( 'GET', '/repos/${slug.fullName}/teams', @@ -207,17 +220,20 @@ class RepositoriesService extends Service { /// Gets a language breakdown for the specified repository. /// /// API docs: https://developer.github.com/v3/repos/#list-languages - Future listLanguages(RepositorySlug slug) async => - _github.getJSON, LanguageBreakdown>( - "/repos/${slug.fullName}/languages", - statusCode: StatusCodes.OK, - convert: (input) => LanguageBreakdown(input.cast()), - ); + Future listLanguages(RepositorySlug slug) async { + ArgumentError.checkNotNull(slug); + return _github.getJSON, LanguageBreakdown>( + "/repos/${slug.fullName}/languages", + statusCode: StatusCodes.OK, + convert: (input) => LanguageBreakdown(input.cast()), + ); + } /// Lists the tags of the specified repository. /// /// API docs: https://developer.github.com/v3/repos/#list-tags Stream listTags(RepositorySlug slug) { + ArgumentError.checkNotNull(slug); return PaginationHelper(_github).objects, Tag>( 'GET', '/repos/${slug.fullName}/tags', @@ -229,6 +245,7 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/#list-branches Stream listBranches(RepositorySlug slug) { + ArgumentError.checkNotNull(slug); return PaginationHelper(_github).objects, Branch>( 'GET', '/repos/${slug.fullName}/branches', @@ -239,23 +256,30 @@ class RepositoriesService extends Service { /// Fetches the specified branch. /// /// API docs: https://developer.github.com/v3/repos/#get-branch - Future getBranch(RepositorySlug slug, String branch) async => - _github.getJSON, Branch>( - "/repos/${slug.fullName}/branches/$branch", - convert: (i) => Branch.fromJSON(i), - ); + Future getBranch(RepositorySlug slug, String branch) async { + ArgumentError.checkNotNull(slug); + ArgumentError.checkNotNull(branch); + return _github.getJSON, Branch>( + "/repos/${slug.fullName}/branches/$branch", + convert: (i) => Branch.fromJSON(i), + ); + } /// Lists the users that have access to the repository identified by [slug]. /// /// API docs: https://developer.github.com/v3/repos/collaborators/#list - Stream listCollaborators(RepositorySlug slug) => - PaginationHelper(_github).objects( - "GET", - "/repos/${slug.fullName}/collaborators", - (json) => Collaborator.fromJson(json), - ); + Stream listCollaborators(RepositorySlug slug) { + ArgumentError.checkNotNull(slug); + return PaginationHelper(_github).objects( + "GET", + "/repos/${slug.fullName}/collaborators", + (json) => Collaborator.fromJson(json), + ); + } Future isCollaborator(RepositorySlug slug, String user) async { + ArgumentError.checkNotNull(slug); + ArgumentError.checkNotNull(user); bool catchError = false; http.Response response; try { @@ -275,6 +299,8 @@ class RepositoriesService extends Service { } Future addCollaborator(RepositorySlug slug, String user) async { + ArgumentError.checkNotNull(slug); + ArgumentError.checkNotNull(user); return _github.request( "PUT", "/repos/${slug.fullName}/collaborators/$user", @@ -283,6 +309,8 @@ class RepositoriesService extends Service { } Future removeCollaborator(RepositorySlug slug, String user) async { + ArgumentError.checkNotNull(slug); + ArgumentError.checkNotNull(user); return _github.request( "DELETE", "/repos/${slug.fullName}/collaborators/$user", @@ -297,6 +325,8 @@ class RepositoriesService extends Service { RepositorySlug slug, RepositoryCommit commit, ) { + ArgumentError.checkNotNull(slug); + ArgumentError.checkNotNull(commit); return PaginationHelper(_github) .objects, CommitComment>( "GET", @@ -310,6 +340,7 @@ class RepositoriesService extends Service { /// /// https://developer.github.com/v3/repos/comments/#list-commit-comments-for-a-repository Stream listCommitComments(RepositorySlug slug) { + ArgumentError.checkNotNull(slug); return PaginationHelper(_github) .objects, CommitComment>( "GET", @@ -334,6 +365,8 @@ class RepositoriesService extends Service { int position, @Deprecated('Use position parameter instead') int line, }) async { + ArgumentError.checkNotNull(slug); + ArgumentError.checkNotNull(commit); final Map data = createNonNullMap({ 'body': body, 'path': path, @@ -353,6 +386,8 @@ class RepositoriesService extends Service { /// https://developer.github.com/v3/repos/comments/#get-a-single-commit-comment Future getCommitComment(RepositorySlug slug, {@required int id}) async { + ArgumentError.checkNotNull(slug); + ArgumentError.checkNotNull(id); return _github.getJSON, CommitComment>( "/repos/${slug.fullName}/comments/$id", statusCode: StatusCodes.OK, @@ -369,6 +404,8 @@ class RepositoriesService extends Service { /// https://developer.github.com/v3/repos/comments/#update-a-commit-comment Future updateCommitComment(RepositorySlug slug, {@required int id, @required String body}) async { + ArgumentError.checkNotNull(slug); + ArgumentError.checkNotNull(id); ArgumentError.checkNotNull(body); return _github.postJSON, CommitComment>( "/repos/${slug.fullName}/comments/$id", @@ -384,6 +421,7 @@ class RepositoriesService extends Service { /// https://developer.github.com/v3/repos/comments/#delete-a-commit-comment Future deleteCommitComment(RepositorySlug slug, {@required int id}) async { + ArgumentError.checkNotNull(slug); await _github.request( "DELETE", "/repos/${slug.fullName}/comments/$id", @@ -395,6 +433,7 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/commits/#list-commits-on-a-repository Stream listCommits(RepositorySlug slug) { + ArgumentError.checkNotNull(slug); return PaginationHelper(_github) .objects, RepositoryCommit>( "GET", @@ -406,11 +445,14 @@ class RepositoriesService extends Service { /// Fetches the specified commit. /// /// API docs: https://developer.github.com/v3/repos/commits/#get-a-single-commit - Future getCommit(RepositorySlug slug, String sha) async => - _github.getJSON, RepositoryCommit>( - "/repos/${slug.fullName}/commits/$sha", - convert: (i) => RepositoryCommit.fromJSON(i), - ); + Future getCommit(RepositorySlug slug, String sha) async { + ArgumentError.checkNotNull(slug); + ArgumentError.checkNotNull(sha); + return _github.getJSON, RepositoryCommit>( + "/repos/${slug.fullName}/commits/$sha", + convert: (i) => RepositoryCommit.fromJSON(i), + ); + } /// [refBase] and [refHead] can be the same value for a branch, commit, or ref /// in [slug] or specify other repositories by using `repo:ref` syntax. @@ -420,11 +462,15 @@ class RepositoriesService extends Service { RepositorySlug slug, String refBase, String refHead, - ) async => - _github.getJSON, GitHubComparison>( - "/repos/${slug.fullName}/compare/$refBase...$refHead", - convert: (j) => GitHubComparison.fromJson(j), - ); + ) async { + ArgumentError.checkNotNull(slug); + ArgumentError.checkNotNull(refBase); + ArgumentError.checkNotNull(refHead); + return _github.getJSON, GitHubComparison>( + "/repos/${slug.fullName}/compare/$refBase...$refHead", + convert: (j) => GitHubComparison.fromJson(j), + ); + } /// Fetches the readme file for a repository. /// @@ -433,6 +479,7 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/contents/#get-the-readme Future getReadme(RepositorySlug slug, {String ref}) async { + ArgumentError.checkNotNull(slug); final headers = {}; String url = "/repos/${slug.fullName}/readme"; @@ -471,6 +518,8 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/contents/#get-contents Future getContents(RepositorySlug slug, String path, {String ref}) async { + ArgumentError.checkNotNull(slug); + ArgumentError.checkNotNull(path); String url = "/repos/${slug.fullName}/contents/$path"; if (ref != null) { @@ -504,6 +553,8 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/contents/#create-a-file Future createFile( RepositorySlug slug, CreateFile file) async { + ArgumentError.checkNotNull(slug); + ArgumentError.checkNotNull(file); final http.Response response = await _github.request( "PUT", "/repos/${slug.fullName}/contents/${file.path}", @@ -519,6 +570,8 @@ class RepositoriesService extends Service { Future updateFile(RepositorySlug slug, String path, String message, String content, String sha, {String branch}) async { + ArgumentError.checkNotNull(slug); + ArgumentError.checkNotNull(path); final Map map = createNonNullMap({ "message": message, "content": content, @@ -539,6 +592,8 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/contents/#delete-a-file Future deleteFile(RepositorySlug slug, String path, String message, String sha, String branch) async { + ArgumentError.checkNotNull(slug); + ArgumentError.checkNotNull(path); final Map map = createNonNullMap({"message": message, "sha": sha, "branch": branch}); final http.Response response = await _github.request( @@ -556,6 +611,9 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/contents/#get-archive-link Future getArchiveLink(RepositorySlug slug, String ref, {String format = "tarball"}) async { + ArgumentError.checkNotNull(slug); + ArgumentError.checkNotNull(ref); + ArgumentError.checkNotNull(format); final http.Response response = await _github.request( "GET", "/repos/${slug.fullName}/$format/$ref", @@ -568,6 +626,7 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/forks/#list-forks Stream listForks(RepositorySlug slug) { + ArgumentError.checkNotNull(slug); return PaginationHelper(_github).objects, Repository>( "GET", "/repos/${slug.fullName}/forks", @@ -579,6 +638,7 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/forks/#create-a-fork Future createFork(RepositorySlug slug, [CreateFork fork]) async { + ArgumentError.checkNotNull(slug); if (fork == null) fork = CreateFork(); return _github.postJSON, Repository>( "/repos/${slug.fullName}/forks", @@ -591,6 +651,7 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/hooks/#list-hooks Stream listHooks(RepositorySlug slug) { + ArgumentError.checkNotNull(slug); return PaginationHelper(_github).objects, Hook>( "GET", "/repos/${slug.fullName}/hooks", @@ -601,16 +662,21 @@ class RepositoriesService extends Service { /// Fetches a single hook by [id]. /// /// API docs: https://developer.github.com/v3/repos/hooks/#get-single-hook - Future getHook(RepositorySlug slug, int id) async => - _github.getJSON, Hook>( - "/repos/${slug.fullName}/hooks/$id", - convert: (i) => Hook.fromJSON(slug.fullName, i), - ); + Future getHook(RepositorySlug slug, int id) async { + ArgumentError.checkNotNull(slug); + ArgumentError.checkNotNull(id); + return _github.getJSON, Hook>( + "/repos/${slug.fullName}/hooks/$id", + convert: (i) => Hook.fromJSON(slug.fullName, i), + ); + } /// Creates a repository hook based on the specified [hook]. /// /// API docs: https://developer.github.com/v3/repos/hooks/#create-a-hook Future createHook(RepositorySlug slug, CreateHook hook) async { + ArgumentError.checkNotNull(slug); + ArgumentError.checkNotNull(hook); return _github.postJSON, Hook>( "/repos/${slug.fullName}/hooks", convert: (i) => Hook.fromJSON(slug.fullName, i), @@ -644,6 +710,8 @@ class RepositoriesService extends Service { List removeEvents, bool active, }) async { + ArgumentError.checkNotNull(slug); + ArgumentError.checkNotNull(hookToEdit); ArgumentError.checkNotNull(configUrl ?? hookToEdit.config['url']); if (configContentType != 'json' && configContentType != 'form') { throw ArgumentError.value(configContentType, 'configContentType'); @@ -673,6 +741,8 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/hooks/#test-a-push-hook Future testPushHook(RepositorySlug slug, int id) async { + ArgumentError.checkNotNull(slug); + ArgumentError.checkNotNull(id); await _github.request( "POST", "/repos/${slug.fullName}/hooks/$id/tests", @@ -684,6 +754,8 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/hooks/#ping-a-hook Future pingHook(RepositorySlug slug, int id) async { + ArgumentError.checkNotNull(slug); + ArgumentError.checkNotNull(id); await _github.request( "POST", "/repos/${slug.fullName}/hooks/$id/pings", @@ -692,6 +764,8 @@ class RepositoriesService extends Service { } Future deleteHook(RepositorySlug slug, int id) async { + ArgumentError.checkNotNull(slug); + ArgumentError.checkNotNull(id); await _github.request( "DELETE", "/repos/${slug.fullName}/hooks/$id", @@ -705,6 +779,7 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/keys/#list Stream listDeployKeys(RepositorySlug slug) { + ArgumentError.checkNotNull(slug); return PaginationHelper(_github).objects, PublicKey>( "GET", "/repos/${slug.fullName}/keys", @@ -718,6 +793,8 @@ class RepositoriesService extends Service { /// https://developer.github.com/v3/repos/keys/#get Future getDeployKey(RepositorySlug slug, {@required int id}) async { + ArgumentError.checkNotNull(slug); + ArgumentError.checkNotNull(id); return _github.getJSON, PublicKey>( "/repos/${slug.fullName}/keys/$id", statusCode: StatusCodes.OK, @@ -730,6 +807,7 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/keys/#create Future createDeployKey(RepositorySlug slug, {@required String title, @required String key}) async { + ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(title); ArgumentError.checkNotNull(key); return _github.postJSON, PublicKey>( @@ -746,7 +824,10 @@ class RepositoriesService extends Service { /// Delete a deploy key. /// /// https://developer.github.com/v3/repos/keys/#delete - Future deleteDeployKey({RepositorySlug slug, PublicKey key}) async { + Future deleteDeployKey( + {@required RepositorySlug slug, @required PublicKey key}) async { + ArgumentError.checkNotNull(slug); + ArgumentError.checkNotNull(key); await _github.request( "DELETE", "/repos/${slug.fullName}/keys/${key.id}", @@ -758,6 +839,8 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/merging/#perform-a-merge Future merge(RepositorySlug slug, CreateMerge merge) async { + ArgumentError.checkNotNull(slug); + ArgumentError.checkNotNull(merge); return _github.postJSON, RepositoryCommit>( "/repos/${slug.fullName}/merges", body: merge.toJSON(), @@ -769,17 +852,20 @@ class RepositoriesService extends Service { /// Fetches the GitHub pages information for the specified repository. /// /// API docs: https://developer.github.com/v3/repos/pages/#get-information-about-a-pages-site - Future getPagesInfo(RepositorySlug slug) async => - _github.getJSON, RepositoryPages>( - "/repos/${slug.fullName}/pages", - statusCode: StatusCodes.OK, - convert: (i) => RepositoryPages.fromJSON(i), - ); + Future getPagesInfo(RepositorySlug slug) async { + ArgumentError.checkNotNull(slug); + return _github.getJSON, RepositoryPages>( + "/repos/${slug.fullName}/pages", + statusCode: StatusCodes.OK, + convert: (i) => RepositoryPages.fromJSON(i), + ); + } /// List Pages builds. /// /// API docs: https://developer.github.com/v3/repos/pages/#list-pages-builds Stream listPagesBuilds(RepositorySlug slug) { + ArgumentError.checkNotNull(slug); return PaginationHelper(_github).objects, PageBuild>( "GET", "/repos/${slug.fullName}/pages/builds", @@ -792,6 +878,7 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/pages/#list-latest-pages-build Future getLatestPagesBuild(RepositorySlug slug) async { + ArgumentError.checkNotNull(slug); return _github.getJSON( "/repos/${slug.fullName}/pages/builds/latest", convert: (i) => PageBuild._fromJSON(i), @@ -803,6 +890,7 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/releases/#list-releases-for-a-repository Stream listReleases(RepositorySlug slug) { + ArgumentError.checkNotNull(slug); return PaginationHelper(_github).objects, Release>( "GET", "/repos/${slug.fullName}/releases", @@ -813,17 +901,22 @@ class RepositoriesService extends Service { /// Fetches a single release. /// /// API docs: https://developer.github.com/v3/repos/releases/#get-a-single-release - Future getRelease(RepositorySlug slug, int id) async => - _github.getJSON, Release>( - "/repos/${slug.fullName}/releases/$id", - convert: (i) => Release.fromJson(i), - ); + Future getRelease(RepositorySlug slug, int id) async { + ArgumentError.checkNotNull(slug); + ArgumentError.checkNotNull(id); + return _github.getJSON, Release>( + "/repos/${slug.fullName}/releases/$id", + convert: (i) => Release.fromJson(i), + ); + } /// Creates a Release based on the specified [release]. /// /// API docs: https://developer.github.com/v3/repos/releases/#create-a-release Future createRelease( RepositorySlug slug, CreateRelease release) async { + ArgumentError.checkNotNull(slug); + ArgumentError.checkNotNull(release); return _github.postJSON, Release>( "/repos/${slug.fullName}/releases", convert: (i) => Release.fromJson(i), @@ -852,6 +945,8 @@ class RepositoriesService extends Service { bool draft, bool preRelease, }) async { + ArgumentError.checkNotNull(slug); + ArgumentError.checkNotNull(releaseToEdit); return _github.postJSON, Release>( "/repos/${slug.fullName}/releases/${releaseToEdit.id.toString()}", body: jsonEncode(createNonNullMap({ @@ -871,6 +966,8 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/releases/#delete-a-release Future deleteRelease(RepositorySlug slug, Release release) async { + ArgumentError.checkNotNull(slug); + ArgumentError.checkNotNull(release); await _github.request( "DELETE", "/repos/${slug.fullName}/releases/${release.id}", @@ -882,6 +979,8 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/releases/#list-assets-for-a-release Stream listReleaseAssets(RepositorySlug slug, Release release) { + ArgumentError.checkNotNull(slug); + ArgumentError.checkNotNull(release); return PaginationHelper(_github) .objects, ReleaseAsset>( "GET", @@ -897,6 +996,8 @@ class RepositoriesService extends Service { // TODO: implement a way to retrieve the asset's binary content Future getReleaseAsset(RepositorySlug slug, Release release, {@required int assetId}) async { + ArgumentError.checkNotNull(slug); + ArgumentError.checkNotNull(release); return _github.postJSON, ReleaseAsset>( "/repos/${slug.fullName}/releases/assets/$assetId", statusCode: StatusCodes.OK, @@ -913,6 +1014,7 @@ class RepositoriesService extends Service { String name, String label, }) async { + ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(assetToEdit); return _github.postJSON, ReleaseAsset>( "/repos/${slug.fullName}/releases/assets/${assetToEdit.id}", @@ -930,6 +1032,8 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/releases/#delete-a-release-asset Future deleteReleaseAsset( RepositorySlug slug, ReleaseAsset asset) async { + ArgumentError.checkNotNull(slug); + ArgumentError.checkNotNull(asset); await _github.request( "DELETE", "/repos/${slug.fullName}/releases/assets/${asset.id}", @@ -948,6 +1052,7 @@ class RepositoriesService extends Service { Future> listContributorStats( RepositorySlug slug, ) async { + ArgumentError.checkNotNull(slug); final String path = "/repos/${slug.fullName}/stats/contributors"; final http.Response response = await _github.request('GET', path, headers: {"Accept": "application/vnd.github.v3+json"}); @@ -966,6 +1071,7 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/statistics/#commit-activity Stream listCommitActivity(RepositorySlug slug) { + ArgumentError.checkNotNull(slug); return PaginationHelper(_github) .objects, YearCommitCountWeek>( "GET", @@ -978,6 +1084,7 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/statistics/#code-frequency Stream listCodeFrequency(RepositorySlug slug) { + ArgumentError.checkNotNull(slug); return PaginationHelper(_github) .objects, WeeklyChangesCount>( "GET", @@ -989,18 +1096,20 @@ class RepositoriesService extends Service { /// Fetches Participation Breakdowns. /// /// API docs: https://developer.github.com/v3/repos/statistics/#participation - Future getParticipation( - RepositorySlug slug) async => - _github.getJSON( - "/repos/${slug.fullName}/stats/participation", - statusCode: StatusCodes.OK, - convert: (i) => ContributorParticipation.fromJSON(i), - ); + Future getParticipation(RepositorySlug slug) async { + ArgumentError.checkNotNull(slug); + return _github.getJSON( + "/repos/${slug.fullName}/stats/participation", + statusCode: StatusCodes.OK, + convert: (i) => ContributorParticipation.fromJSON(i), + ); + } /// Fetches Punchcard. /// /// API docs: https://developer.github.com/v3/repos/statistics/#punch-card Stream listPunchcard(RepositorySlug slug) { + ArgumentError.checkNotNull(slug); return PaginationHelper(_github) .objects, PunchcardEntry>( "GET", @@ -1014,6 +1123,8 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/statuses/#list-statuses-for-a-specific-ref Stream listStatuses(RepositorySlug slug, String ref) { + ArgumentError.checkNotNull(slug); + ArgumentError.checkNotNull(ref); return PaginationHelper(_github) .objects, RepositoryStatus>( "GET", @@ -1028,6 +1139,9 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/statuses/#create-a-status Future createStatus( RepositorySlug slug, String ref, CreateStatus request) async { + ArgumentError.checkNotNull(slug); + ArgumentError.checkNotNull(ref); + ArgumentError.checkNotNull(request); return _github.postJSON, RepositoryStatus>( "/repos/${slug.fullName}/statuses/$ref", body: request.toJSON(), @@ -1039,10 +1153,13 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/statuses/#get-the-combined-status-for-a-specific-ref Future getCombinedStatus( - RepositorySlug slug, String ref) async => - _github.getJSON, CombinedRepositoryStatus>( - "/repos/${slug.fullName}/commits/$ref/status", - convert: CombinedRepositoryStatus.fromJSON, - statusCode: StatusCodes.OK, - ); + RepositorySlug slug, String ref) async { + ArgumentError.checkNotNull(slug); + ArgumentError.checkNotNull(ref); + return _github.getJSON, CombinedRepositoryStatus>( + "/repos/${slug.fullName}/commits/$ref/status", + convert: CombinedRepositoryStatus.fromJSON, + statusCode: StatusCodes.OK, + ); + } } From d92878457ccc0fa24f3762f848755d1fed29e812 Mon Sep 17 00:00:00 2001 From: axel-op <49279289+axel-op@users.noreply.github.com> Date: Mon, 7 Oct 2019 07:53:21 +0200 Subject: [PATCH 068/390] Type annotation --- lib/src/common/repos_service.dart | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index acce7de2..864ede5c 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -200,8 +200,7 @@ class RepositoriesService extends Service { 'GET', '/repos/${slug.fullName}/contributors', (i) => User.fromJson(i), - // TODO add type - params: {"anon": anon.toString()}, + params: {"anon": anon.toString()}, ); } From 38a0fda31e34be03c1e085e622365f3a3c3e4664 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Mon, 7 Oct 2019 08:27:47 -0600 Subject: [PATCH 069/390] Update README with new Gitter contact info --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 765b1c9b..bea1d5e3 100644 --- a/README.md +++ b/README.md @@ -5,9 +5,9 @@ This is a Client Library for GitHub in Dart. I wrote this out of necessity, and then when I got a great reaction from the Dart community, I decided to put a lot of effort into it. -Please submit issues and pull requests, join my IRC channel (#directcode on irc.esper.net), help out, or just give me encouragement. +Please submit issues and pull requests, help out, or just give me encouragement. -**Notice**: We are looking for major contributors. Contact us by email or on IRC! +**Notice**: We are looking for contributors. If you're interested, join us in https://gitter.im/SpinlockLabs/community ## Links @@ -79,4 +79,4 @@ var github = createGitHubClient(auth: new Authentication.withToken("YourTokenHer ## Contacting Us -You can find us on `irc.esper.net and irc.freenode.net` at `#directcode`. +Join our Gitter chat at https://gitter.im/SpinlockLabs/community From 9facea94bda4b53c9d1b895c1856401503f7691a Mon Sep 17 00:00:00 2001 From: axel-op <49279289+axel-op@users.noreply.github.com> Date: Mon, 7 Oct 2019 17:12:08 +0200 Subject: [PATCH 070/390] Added 'getCommitDiff' methd --- lib/src/common/repos_service.dart | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 864ede5c..2ef33efe 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -450,9 +450,25 @@ class RepositoriesService extends Service { return _github.getJSON, RepositoryCommit>( "/repos/${slug.fullName}/commits/$sha", convert: (i) => RepositoryCommit.fromJSON(i), + statusCode: StatusCodes.OK, ); } + Future getCommitDiff(RepositorySlug slug, String sha) async { + ArgumentError.checkNotNull(slug); + ArgumentError.checkNotNull(sha); + return _github + .request( + "GET", + "/repos/${slug.fullName}/commits/$sha", + headers: { + "Accept": "application/vnd.github.VERSION.diff" + }, + statusCode: StatusCodes.OK, + ) + .then((r) => r.body); + } + /// [refBase] and [refHead] can be the same value for a branch, commit, or ref /// in [slug] or specify other repositories by using `repo:ref` syntax. /// From c828d672ce0df4919cd7e58f101bc681855f8f85 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Tue, 8 Oct 2019 08:21:01 -0600 Subject: [PATCH 071/390] Adjust deprecations and binary uploads --- lib/src/common/github.dart | 10 ++++---- lib/src/common/model/repos_releases.dart | 30 +++++++++++++++++++++- lib/src/common/model/repos_releases.g.dart | 4 +-- 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index d7ca40d4..01e16dbf 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -218,7 +218,7 @@ class GitHub { /// /// The future will pass the object returned from this function to the then method. /// The default [convert] function returns the input object. - /// [body] is the data to send to the server. + /// [body] is the data to send to the server. Pass in a List if you want to post binary body data. Everything else will have .toString() called on it and set as text content /// [S] represents the input type. /// [T] represents the type return from this function after conversion Future postJSON( @@ -291,7 +291,7 @@ class GitHub { /// [path] can either be a path like '/repos' or a full url. /// [headers] are HTTP Headers. If it doesn't exist, the 'Accept' and 'Authorization' headers are added. /// [params] are query string parameters. - /// [body] is the body content of requests that take content. + /// [body] is the body content of requests that take content. Pass in a List if you want to post binary body data. Everything else will have .toString() called on it and set as text content /// Future request( String method, @@ -344,10 +344,10 @@ class GitHub { var request = http.Request(method, Uri.parse(url.toString())); request.headers.addAll(headers); if (body != null) { - if (body is String) { - request.body = body; - } else { + if (body is List) { request.bodyBytes = body; + } else { + request.body = body.toString(); } } diff --git a/lib/src/common/model/repos_releases.dart b/lib/src/common/model/repos_releases.dart index 85ed11eb..55b24cc2 100644 --- a/lib/src/common/model/repos_releases.dart +++ b/lib/src/common/model/repos_releases.dart @@ -64,14 +64,30 @@ class Release { @JsonKey(name: "draft") bool isDraft; + /// Deprecated: Use isDraft instead @Deprecated('Use isDraft') + @JsonKey(ignore: true) bool get draft => isDraft; + /// Deprecated: Use isDraft instead + @Deprecated('Use isDraft') + @JsonKey(ignore: true) + set draft(bool b) => isDraft = b; + /// If the release is a pre-release. + /// Deprecated: Use isPrerelease instead @Deprecated('Use isPrerelease') + @JsonKey(ignore: true) bool get prerelease => isPrerelease; /// If the release is a pre-release. + /// Deprecated: Use isPrerelease instead + @Deprecated('Use isPrerelease') + @JsonKey(ignore: true) + set prerelease(bool pr) => isPrerelease = pr; + + /// If the release is a pre-release. + /// Deprecated: Use isPrerelease instead @JsonKey(name: "prerelease") bool isPrerelease; @@ -184,16 +200,28 @@ class CreateRelease { /// Release Body String body; + /// Deprecated: Use isDraft instead @Deprecated('Use isDraft') + @JsonKey(ignore: true) bool get draft => isDraft; + /// Deprecated: Use isDraft instead + @Deprecated('Use isDraft') + @JsonKey(ignore: true) + set draft(bool d) => isDraft = d; + /// If the release is a draft bool isDraft; + /// Deprecated: Use isPrerelease instead @Deprecated('Use isPrerelease') + @JsonKey(ignore: true) bool get prerelease => isPrerelease; - set prerelease(bool prerelease) => isPrerelease = prerelease; + /// Deprecated: Use isPrerelease instead + @Deprecated('Use isPrerelease') + @JsonKey(ignore: true) + set prerelease(bool pr) => isPrerelease = pr; /// true to identify the release as a prerelease. /// false to identify the release as a full release. Default: false diff --git a/lib/src/common/model/repos_releases.g.dart b/lib/src/common/model/repos_releases.g.dart index 0f103aed..8d25c915 100644 --- a/lib/src/common/model/repos_releases.g.dart +++ b/lib/src/common/model/repos_releases.g.dart @@ -52,8 +52,8 @@ Map _$ReleaseToJson(Release instance) => { 'prerelease': instance.isPrerelease, 'created_at': instance.createdAt?.toIso8601String(), 'published_at': instance.publishedAt?.toIso8601String(), - 'author': instance.author, - 'assets': instance.assets, + 'author': Release._authorToJson(instance.author), + 'assets': Release._assetsToJson(instance.assets), }; ReleaseAsset _$ReleaseAssetFromJson(Map json) { From c5a4c9fb871c74b8cef65e8928e0f62d6d07da7e Mon Sep 17 00:00:00 2001 From: axel-op <49279289+axel-op@users.noreply.github.com> Date: Tue, 8 Oct 2019 21:17:34 +0200 Subject: [PATCH 072/390] Added linting rules --- analysis_options.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/analysis_options.yaml b/analysis_options.yaml index ebaab926..a121c75c 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -28,7 +28,13 @@ linter: - package_api_docs - package_names - package_prefixed_library_names + - prefer_const_constructors + - prefer_const_declarations + - prefer_const_literals_to_create_immutables + - prefer_constructors_over_static_methods - prefer_equal_for_default_values + - prefer_final_fields + - prefer_final_locals - prefer_generic_function_type_aliases - prefer_is_not_empty - slash_for_doc_comments From 3bca7f464d23921b432c5862f40fa1d8cced6764 Mon Sep 17 00:00:00 2001 From: Filip Hracek Date: Tue, 8 Oct 2019 13:23:59 -0700 Subject: [PATCH 073/390] Implement rate-limiting Rate limiting information was being gathered but never used to actually wait. This change will wait until rate limit reset before sending a request to the GitHub API. --- lib/src/common/github.dart | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index b86add66..9c0f571b 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -290,6 +290,13 @@ class GitHub { int statusCode, void fail(http.Response response), String preview}) async { + if (rateLimitRemaining != null && rateLimitRemaining <= 0) { + assert(rateLimitReset != null); + var now = DateTime.now(); + var waitTime = rateLimitReset.difference(now); + await Future.delayed(waitTime); + } + if (headers == null) headers = {}; if (preview != null) { From 80a97170551f01f4b44c8e40f97af1cef7958736 Mon Sep 17 00:00:00 2001 From: Filip Hracek Date: Tue, 8 Oct 2019 13:31:55 -0700 Subject: [PATCH 074/390] Back off when server fails (HTTP 50x) When the GitHub API replies with a server error (usually HTTP 502), retry up to `maxServerErrors` times with `serverErrorBackOff` intervals in between. Currently, the inputs above are constants: each request will tolerate at most 10 errors and will wait 10 seconds between each attempt (this is _in addition_ to any rate limiting imposed by the GitHub API). If needed, it is easy enough to add both as optional arguments to `fetchStreamed`. This is important for long-running batch jobs. Without this change, the package will just crash any time it encounteres a GitHub HTTP 50x error (which are rare, but not unheard of), losing any pagination progress. --- lib/src/common/github.dart | 4 ++++ lib/src/common/util/errors.dart | 6 ++++++ lib/src/common/util/pagination.dart | 20 ++++++++++++++++++-- 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index b86add66..3d8fe3b0 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -391,6 +391,10 @@ class GitHub { } } throw ValidationFailed(this, buff.toString()); + case 500: + case 502: + case 504: + throw ServerError(this, response.statusCode, message); } throw UnknownError(this, message); } diff --git a/lib/src/common/util/errors.dart b/lib/src/common/util/errors.dart index 6b21d2db..49ef9719 100644 --- a/lib/src/common/util/errors.dart +++ b/lib/src/common/util/errors.dart @@ -60,6 +60,12 @@ class RateLimitHit extends GitHubError { RateLimitHit(GitHub github) : super(github, "Rate Limit Hit"); } +/// A GitHub Server Error +class ServerError extends GitHubError { + ServerError(GitHub github, int statusCode, String message) + : super(github, "${message ?? 'Server Error'} ($statusCode)"); +} + /// An Unknown Error class UnknownError extends GitHubError { UnknownError(GitHub github, [String message]) diff --git a/lib/src/common/util/pagination.dart b/lib/src/common/util/pagination.dart index 299469ab..4b69b94e 100644 --- a/lib/src/common/util/pagination.dart +++ b/lib/src/common/util/pagination.dart @@ -18,6 +18,9 @@ class PaginationHelper { String body, int statusCode = 200}) async* { int count = 0; + const Duration serverErrorBackOff = Duration(seconds: 10); + const int maxServerErrors = 10; + int serverErrors = 0; if (params == null) { params = {}; @@ -27,8 +30,21 @@ class PaginationHelper { assert(!params.containsKey('page')); do { - var response = await github.request(method, path, - headers: headers, params: params, body: body, statusCode: statusCode); + http.Response response; + try { + response = await github.request(method, path, + headers: headers, + params: params, + body: body, + statusCode: statusCode); + } on ServerError { + serverErrors += 1; + if (serverErrors >= maxServerErrors) { + break; + } + await Future.delayed(serverErrorBackOff); + continue; + } yield response; From 64bcee16931e1a43ab5fc801cab87ff3e60a78de Mon Sep 17 00:00:00 2001 From: axel-op <49279289+axel-op@users.noreply.github.com> Date: Tue, 8 Oct 2019 22:48:35 +0200 Subject: [PATCH 075/390] Updated CHANGELOG --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6beceabe..80a9997c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ ## v.6.0.0 + - All remaining methods in repos_service.dart (accessible via the getter `repositories` from `GitHub` client class) have been implemented. - **BREAKING**: methods `deleteRepository`, `addCollaborator`, `removeCollaborator`, `testPushHook`, `pingHook`, and `deleteHook` now return a `Future` instead of a `Future`. - **BREAKING**: parameters of method `createDeployKey` have been modified. + - `targetCommitsh` field in `Release` class is deprecated. Use the new `targetCommitish` instead. ## v5.3.0 - Add the ability to upload release assets. From f744306e21289fb15e2d407feb5659178bdee555 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Tue, 8 Oct 2019 15:22:02 -0600 Subject: [PATCH 076/390] depend on yaml package tool/language_color_generator.dart imports yaml but that package was never declared inthe pubspec. So let's add it as a dev dependency. --- pubspec.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/pubspec.yaml b/pubspec.yaml index 8af5e74a..bf4aaacd 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -21,6 +21,7 @@ dev_dependencies: mockito: ^3.0.0 pedantic: ^1.0.0 test: ^1.3.0 + yaml: ^2.2.0 builders: json_serializable: ^3.2.2 From 8d0da8dd9edf8c24f014eae07ee5b6f8cde4cf01 Mon Sep 17 00:00:00 2001 From: axel-op <49279289+axel-op@users.noreply.github.com> Date: Tue, 8 Oct 2019 23:59:36 +0200 Subject: [PATCH 077/390] Marked all non-reassigned variables as final --- analysis_options.yaml | 1 + example/common.dart | 2 +- example/emoji.dart | 16 ++-- example/index.dart | 4 +- example/languages.dart | 16 ++-- example/organization.dart | 4 +- example/readme.dart | 6 +- example/releases.dart | 6 +- example/repos.dart | 12 +-- example/search.dart | 14 ++-- example/stars.dart | 2 +- example/status.dart | 11 +-- example/user_info.dart | 6 +- example/users.dart | 4 +- example/zen.dart | 2 +- lib/server.dart | 8 +- lib/src/browser/helper.dart | 15 ++-- lib/src/common/activity_service.dart | 44 ++++++----- lib/src/common/gists_service.dart | 42 ++++++---- lib/src/common/git_service.dart | 13 ++-- lib/src/common/github.dart | 26 +++---- lib/src/common/issues_service.dart | 33 ++++---- lib/src/common/misc_service.dart | 10 ++- lib/src/common/model/activity.dart | 2 +- lib/src/common/model/authorizations.dart | 2 +- lib/src/common/model/gists.dart | 9 +-- lib/src/common/model/git.dart | 18 +++-- lib/src/common/model/issues.dart | 4 +- lib/src/common/model/keys.dart | 2 +- lib/src/common/model/misc.dart | 6 +- lib/src/common/model/orgs.dart | 2 +- lib/src/common/model/pulls.dart | 12 +-- lib/src/common/model/repos.dart | 16 ++-- lib/src/common/model/repos_commits.dart | 2 +- lib/src/common/model/repos_contents.dart | 4 +- lib/src/common/model/repos_forks.dart | 2 +- lib/src/common/model/repos_merging.dart | 2 +- lib/src/common/model/repos_pages.dart | 2 +- lib/src/common/model/repos_stats.dart | 6 +- lib/src/common/model/repos_statuses.dart | 2 +- lib/src/common/model/search.dart | 4 +- lib/src/common/orgs_service.dart | 47 +++++++----- lib/src/common/pulls_service.dart | 29 ++++--- lib/src/common/search_service.dart | 36 +++++---- lib/src/common/url_shortener_service.dart | 2 +- lib/src/common/users_service.dart | 16 ++-- lib/src/common/util/crawler.dart | 4 +- lib/src/common/util/errors.dart | 40 ++++++---- lib/src/common/util/oauth2.dart | 6 +- lib/src/common/util/pagination.dart | 49 ++++++------ lib/src/common/util/service.dart | 2 +- lib/src/common/util/utils.dart | 6 +- lib/src/util.dart | 18 ++--- test/code_search_test.dart | 14 ++-- test/data_object_test.dart | 8 +- test/experiment/crawler.dart | 8 +- test/experiment/error_handling.dart | 25 +++--- test/experiment/fancy_numbers.dart | 2 +- test/experiment/files.dart | 6 +- test/experiment/limit_pager.dart | 4 +- test/experiment/link_header.dart | 2 +- test/experiment/org_hooks.dart | 6 +- test/experiment/orglist.dart | 4 +- test/experiment/polling.dart | 4 +- test/experiment/public_repos.dart | 2 +- test/experiment/readme.dart | 4 +- test/experiment/search.dart | 2 +- test/experiment/wisdom.dart | 2 +- test/git_integration_test.dart | 56 +++++++------- test/git_test.dart | 93 +++++++++++++---------- test/helper/http.dart | 12 +-- tool/language_color_generator.dart | 14 ++-- 72 files changed, 510 insertions(+), 407 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index a121c75c..b4b5f8e5 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -34,6 +34,7 @@ linter: - prefer_constructors_over_static_methods - prefer_equal_for_default_values - prefer_final_fields + - prefer_final_in_for_each - prefer_final_locals - prefer_generic_function_type_aliases - prefer_is_not_empty diff --git a/example/common.dart b/example/common.dart index 74750345..db4182c3 100644 --- a/example/common.dart +++ b/example/common.dart @@ -10,7 +10,7 @@ import "package:github/browser.dart"; Future initViewSourceButton(String script) async { // query the DOM for the view source button, handle clicks document.querySelector("#view-source")?.onClick?.listen((_) { - var popup = window.open("view_source.html?script=$script", "View Source"); + final WindowBase popup = window.open("view_source.html?script=$script", "View Source"); String code; var fetched = false; diff --git a/example/emoji.dart b/example/emoji.dart index dd455cd0..32a58058 100644 --- a/example/emoji.dart +++ b/example/emoji.dart @@ -9,17 +9,17 @@ Future main() async { await initViewSourceButton("emoji.dart"); emojiDiv = querySelector("#emojis"); await loadEmojis(); - var searchBox = querySelector("#search-box") as InputElement; + final searchBox = querySelector("#search-box") as InputElement; searchBox.onKeyUp.listen((event) { filter(searchBox.value); }); } Future loadEmojis() async { - var emojis = await github.misc.listEmojis(); + final emojis = await github.misc.listEmojis(); emojis.forEach((name, url) { - var h = DivElement(); + final h = DivElement(); h.className = 'emojibox'; h.style.textAlign = "center"; h.append( @@ -36,11 +36,11 @@ void filter(String query) { return; } lastQuery = query; - var boxes = emojiDiv.children; - for (var box in boxes) { - var boxName = box.querySelector("p"); - var t = boxName.text; - var name = t.substring(1, t.length - 1); + final boxes = emojiDiv.children; + for (final box in boxes) { + final boxName = box.querySelector("p"); + final t = boxName.text; + final name = t.substring(1, t.length - 1); if (name.contains(query)) { box.style.display = "inline"; } else { diff --git a/example/index.dart b/example/index.dart index 8ccf4e8b..09789328 100644 --- a/example/index.dart +++ b/example/index.dart @@ -1,8 +1,8 @@ import 'dart:html'; void main() { - InputElement tokenInput = querySelector('#token'); - String token = window.sessionStorage['token']; + final InputElement tokenInput = querySelector('#token'); + final String token = window.sessionStorage['token']; tokenInput.value = token; tokenInput.onKeyUp.listen((_) { window.sessionStorage['token'] = tokenInput.value; diff --git a/example/languages.dart b/example/languages.dart index 24abf35c..db9efeb0 100644 --- a/example/languages.dart +++ b/example/languages.dart @@ -17,7 +17,7 @@ Future loadRepository() async { var user = "dart-lang"; var reponame = "sdk"; - var params = queryString; + final params = queryString; if (params.containsKey("user")) { user = params["user"]; @@ -29,7 +29,7 @@ Future loadRepository() async { document.getElementById("name").setInnerHtml("$user/$reponame"); - var repo = RepositorySlug(user, reponame); + final repo = RepositorySlug(user, reponame); breakdown = await github.repositories.listLanguages(repo); reloadTable(); } @@ -42,7 +42,7 @@ void reloadTable({int accuracy = 4}) { } isReloadingTable = true; - String md = generateMarkdown(accuracy); + final String md = generateMarkdown(accuracy); github.misc.renderMarkdown(md).then((html) { tableDiv.setInnerHtml(html, treeSanitizer: NodeTreeSanitizer.trusted); isReloadingTable = false; @@ -54,17 +54,17 @@ int totalBytes(LanguageBreakdown breakdown) { } String generateMarkdown(int accuracy) { - int total = totalBytes(breakdown); - var data = breakdown.toList(); + final int total = totalBytes(breakdown); + final data = breakdown.toList(); String md = '|Name|Bytes|Percentage|\n'; md += '|-----|-----|-----|\n'; data.sort((a, b) => b[1].compareTo(a[1])); data.forEach((info) { - String name = info[0]; - int bytes = info[1]; - num percentage = ((bytes / total) * 100); + final String name = info[0]; + final int bytes = info[1]; + final num percentage = ((bytes / total) * 100); md += '|$name|$bytes|${percentage.toStringAsFixed(accuracy)}|\n'; }); return md; diff --git a/example/organization.dart b/example/organization.dart index 111a7290..4aafe439 100644 --- a/example/organization.dart +++ b/example/organization.dart @@ -24,8 +24,8 @@ Future main() async { Future loadOrganization(String orgToLoad) async { try { - Organization org = await github.organizations.get(orgToLoad); - String html = ''' + final Organization org = await github.organizations.get(orgToLoad); + final String html = '''
Name: ${org.name}
Id: ${org.id}
Company: ${org.company} diff --git a/example/readme.dart b/example/readme.dart index bde2e057..acaa9de1 100644 --- a/example/readme.dart +++ b/example/readme.dart @@ -10,13 +10,13 @@ DivElement readmeDiv; Future main() async { await initViewSourceButton("readme.dart"); readmeDiv = querySelector("#readme"); - var repo = RepositorySlug("DirectMyFile", "github.dart"); - var readme = await github.repositories.getReadme(repo); + const repo = RepositorySlug("DirectMyFile", "github.dart"); + final readme = await github.repositories.getReadme(repo); String markdown = readme.content; if (readme.encoding == 'base64') { markdown = String.fromCharCodes(base64.decode(markdown)); } print(markdown); - var html = await github.misc.renderMarkdown(markdown); + final html = await github.misc.renderMarkdown(markdown); readmeDiv.appendHtml(html, treeSanitizer: NodeTreeSanitizer.trusted); } diff --git a/example/releases.dart b/example/releases.dart index 2a9ec082..23e223c5 100644 --- a/example/releases.dart +++ b/example/releases.dart @@ -14,16 +14,16 @@ Future main() async { void loadReleases() { github.repositories - .listReleases(RepositorySlug("twbs", "bootstrap")) + .listReleases(const RepositorySlug("twbs", "bootstrap")) .toList() .then((releases) { - for (var release in releases) { + for (final release in releases) { releasesDiv.appendHtml("""

${release.name}

""", treeSanitizer: NodeTreeSanitizer.trusted); - var rel = releasesDiv.querySelector("#release-${release.id}"); + final Element rel = releasesDiv.querySelector("#release-${release.id}"); void append(String key, String value) { if (value == null) return; rel.appendHtml("
$key: $value", diff --git a/example/repos.dart b/example/repos.dart index 57243e7a..6f24d731 100644 --- a/example/repos.dart +++ b/example/repos.dart @@ -40,11 +40,13 @@ Future main() async { List _reposCache; -void updateRepos(List repos, - [int compare(Repository a, Repository b)]) { +void updateRepos( + List repos, [ + int compare(Repository a, Repository b), +]) { document.querySelector("#repos").children.clear(); repos.sort(compare); - for (var repo in repos) { + for (final repo in repos) { repositoriesDiv.appendHtml("""
@@ -68,7 +70,7 @@ void updateRepos(List repos, } void loadRepos([int compare(Repository a, Repository b)]) { - var title = querySelector("#title"); + final title = querySelector("#title"); if (title.text.contains("(")) { title.replaceWith(HeadingElement.h2() ..text = "GitHub for Dart - Repositories" @@ -82,7 +84,7 @@ void loadRepos([int compare(Repository a, Repository b)]) { } if (queryString.containsKey("sort") && compare == null) { - var sorter = queryString['sort']; + final sorter = queryString['sort']; if (sorts.containsKey(sorter)) { compare = sorts[sorter]; } diff --git a/example/search.dart b/example/search.dart index 06f76f9c..800f9efd 100644 --- a/example/search.dart +++ b/example/search.dart @@ -5,12 +5,12 @@ import 'common.dart'; Future main() async { await initViewSourceButton('search.dart'); - var searchBtn = querySelector('#submit'); + final searchBtn = querySelector('#submit'); searchBtn.onClick.listen(search); } Future search(_) async { - Stream resultsStream = github.search.code( + final Stream resultsStream = github.search.code( val('query'), language: val('language'), filename: val('filename'), @@ -26,18 +26,18 @@ Future search(_) async { perPage: int.tryParse(val('perpage')), pages: int.tryParse(val('pages')), ); - DivElement resultsDiv = querySelector('#results'); + final DivElement resultsDiv = querySelector('#results'); resultsDiv.innerHtml = ''; int count = 0; - await for (var results in resultsStream) { + await for (final results in resultsStream) { count += results.items.length; querySelector('#nresults').text = '${results.totalCount} result${results.totalCount == 1 ? "" : "s"} (showing $count)'; - for (CodeSearchItem item in results.items) { - var url = item.htmlUrl; - var path = item.path; + for (final CodeSearchItem item in results.items) { + final url = item.htmlUrl; + final path = item.path; resultsDiv.append(DivElement() ..append(AnchorElement(href: url.toString()) ..text = path diff --git a/example/stars.dart b/example/stars.dart index 339ec13b..8527c20c 100644 --- a/example/stars.dart +++ b/example/stars.dart @@ -28,7 +28,7 @@ void loadStars() { github.activity .listStargazers(RepositorySlug(user, repo)) .listen((stargazer) { - var h = DivElement(); + final h = DivElement(); h.classes.add("box"); h.classes.add("user"); h.style.textAlign = "center"; diff --git a/example/status.dart b/example/status.dart index 3b890b1f..d9e8c5d9 100644 --- a/example/status.dart +++ b/example/status.dart @@ -3,12 +3,13 @@ import "dart:convert"; import "dart:html"; Future main() async { - var request = await HttpRequest.request( - "https://status.github.com/api/status.json", - requestHeaders: {"Origin": window.location.origin}); + final request = await HttpRequest.request( + "https://status.github.com/api/status.json", + requestHeaders: {"Origin": window.location.origin}, + ); - var text = request.responseText; - var map = json.decode(text); + final text = request.responseText; + final map = json.decode(text); querySelector("#status") ..appendText(map["status"]) diff --git a/example/user_info.dart b/example/user_info.dart index c89dc811..d65108c3 100644 --- a/example/user_info.dart +++ b/example/user_info.dart @@ -16,9 +16,9 @@ GitHub createClient(String token) { } void loadUser() { - var localToken = document.getElementById("token") as InputElement; + final localToken = document.getElementById("token") as InputElement; - var loadBtn = document.getElementById("load"); + final loadBtn = document.getElementById("load"); loadBtn.onClick.listen((event) { if (localToken.value == null || localToken.value.isEmpty) { window.alert("Please Enter a Token"); @@ -27,7 +27,7 @@ void loadUser() { github = createClient(localToken.value); - github.users.getCurrentUser().then((CurrentUser user) { + github.users.getCurrentUser().then((final CurrentUser user) { info.children.clear(); info.hidden = false; info.appendHtml(""" diff --git a/example/users.dart b/example/users.dart index 41b6b111..18903eed 100644 --- a/example/users.dart +++ b/example/users.dart @@ -16,7 +16,7 @@ Future main() async { void loadUsers() { github.users.listUsers(pages: 2).take(12).listen((User baseUser) { github.users.getUser(baseUser.login).then((user) { - var userDiv = DivElement(); + final userDiv = DivElement(); for (int i = 1; i <= 2; i++) { userDiv.append(BRElement()); @@ -25,7 +25,7 @@ void loadUsers() { userDiv.append( GitHubBrowserHelper.createAvatarImage(user, width: 64, height: 64) ..classes.add("avatar")); - var buff = StringBuffer(); + final buff = StringBuffer(); buff ..writeln("Username: ${user.login}") diff --git a/example/zen.dart b/example/zen.dart index 85a14048..66383c49 100644 --- a/example/zen.dart +++ b/example/zen.dart @@ -3,6 +3,6 @@ import "common.dart"; Future main() async { await initViewSourceButton("zen.dart"); - String msg = await github.misc.getZen(); + final String msg = await github.misc.getZen(); querySelector("#zen").text = msg; } diff --git a/lib/server.dart b/lib/server.dart index 51bfa311..909add95 100644 --- a/lib/server.dart +++ b/lib/server.dart @@ -37,11 +37,11 @@ const List COMMON_GITHUB_TOKEN_ENV_KEYS = [ /// If the above fails, the GITHUB_USERNAME and GITHUB_PASSWORD keys will be checked. Authentication findAuthenticationFromEnvironment() { if (Platform.isMacOS) { - var result = Process.runSync( + final result = Process.runSync( "security", const ["find-internet-password", "-g", "-s", "github.com"]); if (result.exitCode == 0) { - String out = result.stdout.toString(); + final String out = result.stdout.toString(); String username = out.split('"acct"="')[1]; username = username.substring(0, username.indexOf("\n")); @@ -52,9 +52,9 @@ Authentication findAuthenticationFromEnvironment() { } } - Map env = Platform.environment; + final Map env = Platform.environment; - for (String key in COMMON_GITHUB_TOKEN_ENV_KEYS) { + for (final String key in COMMON_GITHUB_TOKEN_ENV_KEYS) { if (env[key] is String) { return Authentication.withToken(env[key]); } diff --git a/lib/src/browser/helper.dart b/lib/src/browser/helper.dart index 664b1079..573b4376 100644 --- a/lib/src/browser/helper.dart +++ b/lib/src/browser/helper.dart @@ -12,14 +12,14 @@ class GitHubBrowserHelper { /// [selector] is the selector to use to find markdown elements. /// [indent] is the indent that needs to be stripped out. static void renderMarkdown(GitHub github, String selector, {int indent = 4}) { - ElementList elements = document.querySelectorAll(selector); + final ElementList elements = document.querySelectorAll(selector); elements.removeWhere((Element it) => it.attributes.containsKey("rendered")); - for (Element e in elements) { - var txt = e.text; + for (final Element e in elements) { + final txt = e.text; - var md = txt.split("\n").map((it) { + final md = txt.split("\n").map((it) { return it.length >= indent ? it.substring(indent) : it; }).join("\n"); @@ -33,8 +33,11 @@ class GitHubBrowserHelper { } /// Creates an Image Element from a User that has the user's avatar. - static ImageElement createAvatarImage(User user, - {int width = 128, int height = 128}) { + static ImageElement createAvatarImage( + User user, { + int width = 128, + int height = 128, + }) { return ImageElement(src: user.avatarUrl, width: width, height: height); } } diff --git a/lib/src/common/activity_service.dart b/lib/src/common/activity_service.dart index d4d823b4..fc135b4c 100644 --- a/lib/src/common/activity_service.dart +++ b/lib/src/common/activity_service.dart @@ -142,7 +142,7 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/notifications/#mark-as-read Future markNotificationsRead({DateTime lastRead}) { - var data = {}; + final data = {}; if (lastRead != null) data["last_read_at"] = lastRead.toIso8601String(); @@ -157,9 +157,11 @@ class ActivityService extends Service { /// read. /// /// API docs:https://developer.github.com/v3/activity/notifications/#mark-notifications-as-read-in-a-repository - Future markRepositoryNotificationsRead(RepositorySlug slug, - {DateTime lastRead}) { - var data = {}; + Future markRepositoryNotificationsRead( + RepositorySlug slug, { + DateTime lastRead, + }) { + final data = {}; if (lastRead != null) data["last_read_at"] = lastRead.toIso8601String(); @@ -273,14 +275,20 @@ class ActivityService extends Service { /// Sets the Repository Subscription Status /// /// API docs: https://developer.github.com/v3/activity/watching/#set-a-repository-subscription - Future setRepositorySubscription(RepositorySlug slug, - {bool subscribed, bool ignored}) { - var map = createNonNullMap({"subscribed": subscribed, "ignored": ignored}); - - return _github.postJSON("/repos/${slug.fullName}/subscription", - statusCode: StatusCodes.OK, - convert: RepositorySubscription.fromJSON, - body: jsonEncode(map)); + Future setRepositorySubscription( + RepositorySlug slug, { + bool subscribed, + bool ignored, + }) { + final map = + createNonNullMap({"subscribed": subscribed, "ignored": ignored}); + + return _github.postJSON( + "/repos/${slug.fullName}/subscription", + statusCode: StatusCodes.OK, + convert: RepositorySubscription.fromJSON, + body: jsonEncode(map), + ); } /// Deletes a Repository Subscription @@ -326,11 +334,11 @@ class EventPoller { _lastFetched = response.headers['ETag']; - var json = jsonDecode(response.body) as List>; + final json = jsonDecode(response.body) as List>; if (!(onlyNew && _timer == null)) { - for (var item in json) { - var event = Event.fromJSON(item); + for (final item in json) { + final event = Event.fromJSON(item); if (after == null ? false : event.createdAt.toUtc().isBefore(after)) { continue; @@ -348,7 +356,7 @@ class EventPoller { if (_timer == null) { _timer = Timer.periodic(Duration(seconds: interval), (timer) { - var headers = {}; + final headers = {}; if (_lastFetched != null) { headers['If-None-Match'] = _lastFetched; @@ -359,7 +367,7 @@ class EventPoller { } } - var headers = {}; + final headers = {}; if (_lastFetched != null) { headers['If-None-Match'] = _lastFetched; @@ -376,7 +384,7 @@ class EventPoller { } _timer.cancel(); - var future = _controller.close(); + final future = _controller.close(); _timer = null; _controller = null; diff --git a/lib/src/common/gists_service.dart b/lib/src/common/gists_service.dart index 124cb3f4..b86f0966 100644 --- a/lib/src/common/gists_service.dart +++ b/lib/src/common/gists_service.dart @@ -48,9 +48,12 @@ class GistsService extends Service { /// Creates a Gist /// /// API docs: https://developer.github.com/v3/gists/#create-a-gist - Future createGist(Map files, - {String description, bool public = false}) { - var map = {"files": {}}; + Future createGist( + Map files, { + String description, + bool public = false, + }) { + final map = {"files": {}}; if (description != null) { map["description"] = description; @@ -58,16 +61,20 @@ class GistsService extends Service { map["public"] = public; - var f = {}; + final f = {}; - for (var key in files.keys) { + for (final key in files.keys) { f[key] = {"content": files[key]}; } map["files"] = f; - return _github.postJSON("/gists", - statusCode: 201, body: jsonEncode(map), convert: Gist.fromJSON); + return _github.postJSON( + "/gists", + statusCode: 201, + body: jsonEncode(map), + convert: Gist.fromJSON, + ); } /// Deletes the specified Gist. @@ -82,24 +89,31 @@ class GistsService extends Service { /// Edits a Gist. /// /// API docs: https://developer.github.com/v3/gists/#edit-a-gist - Future editGist(String id, - {String description, Map files}) { - var map = {}; + Future editGist( + String id, { + String description, + Map files, + }) { + final map = {}; if (description != null) { map["description"] = description; } if (files != null) { - var f = {}; - for (var key in files.keys) { + final f = {}; + for (final key in files.keys) { f[key] = files[key] == null ? null : {"content": files[key]}; } map["files"] = f; } - return _github.postJSON("/gists/$id", - statusCode: 200, body: jsonEncode(map), convert: Gist.fromJSON); + return _github.postJSON( + "/gists/$id", + statusCode: 200, + body: jsonEncode(map), + convert: Gist.fromJSON, + ); } // TODO: Implement listGistCommits: https://developer.github.com/v3/gists/#list-gist-commits diff --git a/lib/src/common/git_service.dart b/lib/src/common/git_service.dart index d5fc64ae..0da8d9f2 100644 --- a/lib/src/common/git_service.dart +++ b/lib/src/common/git_service.dart @@ -5,7 +5,7 @@ part of github.common; /// /// API docs: https://developer.github.com/v3/git/blobs/ class GitService extends Service { - GitService(GitHub github) : super(github); + const GitService(GitHub github) : super(github); /// Fetches a blob from [slug] for a given [sha]. /// @@ -85,11 +85,14 @@ class GitService extends Service { /// /// API docs: https://developer.github.com/v3/git/refs/#update-a-reference Future editReference( - RepositorySlug slug, String ref, String sha, - {bool force = false}) { - String body = jsonEncode({'sha': sha, 'force': force}); + RepositorySlug slug, + String ref, + String sha, { + bool force = false, + }) { + final String body = jsonEncode({'sha': sha, 'force': force}); // Somehow the reference updates PATCH request needs a valid content-length. - var headers = {'content-length': body.length.toString()}; + final headers = {'content-length': body.length.toString()}; return _github .request('PATCH', '/repos/${slug.fullName}/git/refs/$ref', diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index c6151dae..1cad957b 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -263,7 +263,7 @@ class GitHub { headers.putIfAbsent("Accept", () => "application/vnd.github.v3+json"); - var response = await request( + final response = await request( method, path, headers: headers, @@ -273,7 +273,7 @@ class GitHub { fail: fail, ); - var json = jsonDecode(response.body); + final json = jsonDecode(response.body); if (convert == null) { _applyExpandos(json, response); @@ -312,7 +312,7 @@ class GitHub { if (auth.isToken) { headers.putIfAbsent("Authorization", () => "token ${auth.token}"); } else if (auth.isBasic) { - var userAndPass = + final userAndPass = base64Encode(utf8.encode('${auth.username}:${auth.password}')); headers.putIfAbsent("Authorization", () => "basic $userAndPass"); } @@ -327,7 +327,7 @@ class GitHub { queryString = buildQueryString(params); } - var url = StringBuffer(); + final url = StringBuffer(); if (path.startsWith("http://") || path.startsWith("https://")) { url.write(path); @@ -341,7 +341,7 @@ class GitHub { url.write(queryString); } - var request = http.Request(method, Uri.parse(url.toString())); + final request = http.Request(method, Uri.parse(url.toString())); request.headers.addAll(headers); if (body != null) { if (body is List) { @@ -351,9 +351,9 @@ class GitHub { } } - var streamedResponse = await client.send(request); + final streamedResponse = await client.send(request); - var response = await http.Response.fromStream(streamedResponse); + final response = await http.Response.fromStream(streamedResponse); _updateRateLimit(response.headers); if (statusCode != null && statusCode != response.statusCode) { @@ -372,7 +372,7 @@ class GitHub { String message; List> errors; if (response.headers['content-type'].contains('application/json')) { - var json = jsonDecode(response.body); + final json = jsonDecode(response.body); message = json['message']; errors = json['errors'] as List>; } @@ -392,15 +392,15 @@ class GitHub { } break; case 422: - var buff = StringBuffer(); + final buff = StringBuffer(); buff.writeln(); buff.writeln(" Message: $message"); if (errors != null) { buff.writeln(" Errors:"); - for (Map error in errors) { - var resource = error['resource']; - var field = error['field']; - var code = error['code']; + for (final Map error in errors) { + final resource = error['resource']; + final field = error['field']; + final code = error['code']; buff ..writeln(" Resource: $resource") ..writeln(" Field $field") diff --git a/lib/src/common/issues_service.dart b/lib/src/common/issues_service.dart index 0affc75f..1bb839d9 100644 --- a/lib/src/common/issues_service.dart +++ b/lib/src/common/issues_service.dart @@ -80,7 +80,7 @@ class IssuesService extends Service { DateTime since, int perPage, List labels) { - var params = {}; + final params = {}; if (perPage != null) { params['per_page'] = perPage.toString(); @@ -117,8 +117,12 @@ class IssuesService extends Service { params['labels'] = labels.join(','); } - return PaginationHelper(_github) - .objects("GET", pathSegment, Issue.fromJSON, params: params); + return PaginationHelper(_github).objects( + "GET", + pathSegment, + Issue.fromJSON, + params: params, + ); } /// Edit an issue. @@ -145,9 +149,11 @@ class IssuesService extends Service { /// /// API docs: https://developer.github.com/v3/issues/#create-an-issue Future create(RepositorySlug slug, IssueRequest issue) async { - var response = await _github.request( - "POST", '/repos/${slug.fullName}/issues', - body: issue.toJSON()); + final response = await _github.request( + "POST", + '/repos/${slug.fullName}/issues', + body: issue.toJSON(), + ); if (StatusCodes.isClientError(response.statusCode)) { //TODO: throw a more friendly error – better this than silent failure @@ -206,12 +212,13 @@ class IssuesService extends Service { /// API docs: https://developer.github.com/v3/issues/comments/#create-a-comment Future createComment( RepositorySlug slug, int issueNumber, String body) { - var it = jsonEncode({"body": body}); + final it = jsonEncode({"body": body}); return _github.postJSON( - '/repos/${slug.fullName}/issues/$issueNumber/comments', - body: it, - convert: IssueComment.fromJSON, - statusCode: StatusCodes.CREATED); + '/repos/${slug.fullName}/issues/$issueNumber/comments', + body: it, + convert: IssueComment.fromJSON, + statusCode: StatusCodes.CREATED, + ); } // TODO: Implement editComment: https://developer.github.com/v3/issues/comments/#edit-a-comment @@ -265,7 +272,7 @@ class IssuesService extends Service { /// /// API docs: https://developer.github.com/v3/issues/labels/#delete-a-label Future deleteLabel(RepositorySlug slug, String name) async { - var response = + final response = await _github.request("DELETE", "/repos/${slug.fullName}/labels/$name"); return response.statusCode == StatusCodes.NO_CONTENT; @@ -313,7 +320,7 @@ class IssuesService extends Service { /// API docs: https://developer.github.com/v3/issues/labels/#remove-a-label-from-an-issue Future removeLabelForIssue( RepositorySlug slug, int issueNumber, String label) async { - var response = await _github.request( + final response = await _github.request( "DELETE", "/repos/${slug.fullName}/issues/$issueNumber/labels/$label"); return response.statusCode == StatusCodes.OK; diff --git a/lib/src/common/misc_service.dart b/lib/src/common/misc_service.dart index 369f094e..60f969f7 100644 --- a/lib/src/common/misc_service.dart +++ b/lib/src/common/misc_service.dart @@ -12,9 +12,11 @@ class MiscService extends Service { /// /// API docs: https://developer.github.com/v3/emojis/ Future> listEmojis() { - var r = _github.getJSON>("/emojis", - statusCode: StatusCodes.OK, - convert: (Map json) => json.cast()); + final r = _github.getJSON>( + "/emojis", + statusCode: StatusCodes.OK, + convert: (Map json) => json.cast(), + ); return r; } @@ -69,7 +71,7 @@ class MiscService extends Service { /// Returns an ASCII Octocat with the specified [text]. Future getOctocat([String text]) { - var params = {}; + final params = {}; if (text != null) { params["s"] = text; diff --git a/lib/src/common/model/activity.dart b/lib/src/common/model/activity.dart index 6f539d69..f2443491 100644 --- a/lib/src/common/model/activity.dart +++ b/lib/src/common/model/activity.dart @@ -22,7 +22,7 @@ class Event { static Event fromJSON(Map input) { if (input == null) return null; - var event = Event(); + final event = Event(); event.json = input; diff --git a/lib/src/common/model/authorizations.dart b/lib/src/common/model/authorizations.dart index b3b7f0b0..f8600923 100644 --- a/lib/src/common/model/authorizations.dart +++ b/lib/src/common/model/authorizations.dart @@ -64,7 +64,7 @@ class CreateAuthorization { CreateAuthorization(this.note); String toJSON() { - var map = {}; + final map = {}; putValue("note", note, map); putValue("note_url", noteUrl, map); putValue("client_id", clientID, map); diff --git a/lib/src/common/model/gists.dart b/lib/src/common/model/gists.dart index 52a411bc..71af8738 100644 --- a/lib/src/common/model/gists.dart +++ b/lib/src/common/model/gists.dart @@ -30,7 +30,7 @@ class Gist { static Gist fromJSON(Map input) { if (input == null) return null; - var gist = Gist() + final gist = Gist() ..id = input['id'] ..description = input['description'] ..public = input['public'] @@ -40,8 +40,8 @@ class Gist { if (input['files'] != null) { gist.files = []; - for (var key in input['files'].keys) { - var map = copyOf(input['files'][key]) as Map; + for (final key in input['files'].keys) { + final map = copyOf(input['files'][key]) as Map; map['name'] = key; gist.files.add(GistFile.fromJson(map)); } @@ -170,8 +170,7 @@ class CreateGistComment { CreateGistComment(this.body); String toJSON() { - var map = {}; - map['body'] = body; + final map = {'body': body}; return jsonEncode(map); } } diff --git a/lib/src/common/model/git.dart b/lib/src/common/model/git.dart index 598e1b9c..890df782 100644 --- a/lib/src/common/model/git.dart +++ b/lib/src/common/model/git.dart @@ -28,7 +28,7 @@ class CreateGitBlob { final String content; final String encoding; - CreateGitBlob(this.content, this.encoding); + const CreateGitBlob(this.content, this.encoding); Map toJson() => _$CreateGitBlobToJson(this); } @@ -96,7 +96,7 @@ class GitCommitUser { @JsonKey(toJson: dateToGitHubIso8601) final DateTime date; - GitCommitUser(this.name, this.email, this.date); + const GitCommitUser(this.name, this.email, this.date); factory GitCommitUser.fromJson(Map json) => _$GitCommitUserFromJson(json); @@ -157,7 +157,7 @@ class CreateGitTree { CreateGitTree(this.entries); String toJSON() { - var map = {}; + final map = {}; putValue('base_tree', baseTree, map); @@ -180,10 +180,16 @@ class CreateGitTreeEntry { /// Constructor. /// Either [sha] or [content] must be defined. - CreateGitTreeEntry(this.path, this.mode, this.type, {this.sha, this.content}); + const CreateGitTreeEntry( + this.path, + this.mode, + this.type, { + this.sha, + this.content, + }); Map toMap() { - var map = {}; + final map = {}; putValue('path', path, map); putValue('mode', mode, map); @@ -235,7 +241,7 @@ class CreateGitTag { CreateGitTag(this.tag, this.message, this.object, this.type, this.tagger); String toJSON() { - var map = {}; + final map = {}; putValue('tag', tag, map); putValue('message', message, map); diff --git a/lib/src/common/model/issues.dart b/lib/src/common/model/issues.dart index 7ff8f73a..f248ec5d 100644 --- a/lib/src/common/model/issues.dart +++ b/lib/src/common/model/issues.dart @@ -103,7 +103,7 @@ class IssueRequest { IssueRequest(); String toJSON() { - var map = {}; + final map = {}; putValue("title", title, map); putValue("body", body, map); putValue("labels", labels, map); @@ -265,7 +265,7 @@ class CreateMilestone { CreateMilestone(this.title); String toJSON() { - var map = {}; + final map = {}; putValue("title", title, map); putValue("state", state, map); putValue(description, description, map); diff --git a/lib/src/common/model/keys.dart b/lib/src/common/model/keys.dart index 617c5069..72ae423f 100644 --- a/lib/src/common/model/keys.dart +++ b/lib/src/common/model/keys.dart @@ -27,7 +27,7 @@ class CreatePublicKey { CreatePublicKey(this.title, this.key); String toJSON() { - var map = {}; + final map = {}; putValue("title", title, map); putValue("key", key, map); return jsonEncode(map); diff --git a/lib/src/common/model/misc.dart b/lib/src/common/model/misc.dart index e5c649c2..4207d61a 100644 --- a/lib/src/common/model/misc.dart +++ b/lib/src/common/model/misc.dart @@ -31,9 +31,9 @@ class RateLimit { RateLimit(this.limit, this.remaining, this.resets); static RateLimit fromHeaders(Map headers) { - var limit = int.parse(headers['x-ratelimit-limit']); - var remaining = int.parse(headers['x-ratelimit-remaining']); - var resets = DateTime.fromMillisecondsSinceEpoch( + final limit = int.parse(headers['x-ratelimit-limit']); + final remaining = int.parse(headers['x-ratelimit-remaining']); + final resets = DateTime.fromMillisecondsSinceEpoch( int.parse(headers['x-ratelimit-reset']) * 1000); return RateLimit(limit, remaining, resets); } diff --git a/lib/src/common/model/orgs.dart b/lib/src/common/model/orgs.dart index ebedc7ab..1102ef98 100644 --- a/lib/src/common/model/orgs.dart +++ b/lib/src/common/model/orgs.dart @@ -164,7 +164,7 @@ class TeamMember { static TeamMember fromJSON(Map input) { if (input == null) return null; - var member = TeamMember(); + final member = TeamMember(); member.login = input['login']; member.id = input['id']; member.avatarUrl = input['avatar_url']; diff --git a/lib/src/common/model/pulls.dart b/lib/src/common/model/pulls.dart index d031e0e3..5c4daaaa 100644 --- a/lib/src/common/model/pulls.dart +++ b/lib/src/common/model/pulls.dart @@ -63,7 +63,7 @@ class PullRequestInformation { [PullRequestInformation into]) { if (input == null) return null; - var pr = into != null ? into : PullRequestInformation(); + final pr = into != null ? into : PullRequestInformation(); pr.head = PullRequestHead.fromJSON(input['head'] as Map); pr.base = PullRequestHead.fromJSON(input['base'] as Map); pr.htmlUrl = input['html_url']; @@ -124,7 +124,7 @@ class PullRequest extends PullRequestInformation { static PullRequest fromJSON(Map input) { if (input == null) return null; - PullRequest pr = PullRequestInformation.fromJSON(input, PullRequest()); + final PullRequest pr = PullRequestInformation.fromJSON(input, PullRequest()); pr.mergeable = input['mergeable']; pr.merged = input['merged']; pr.id = input['id']; @@ -181,7 +181,7 @@ class PullRequestHead { static PullRequestHead fromJSON(Map input) { if (input == null) return null; - var head = PullRequestHead(); + final head = PullRequestHead(); head.label = input['label']; head.ref = input['ref']; head.sha = input['sha']; @@ -208,7 +208,7 @@ class CreatePullRequest { CreatePullRequest(this.title, this.head, this.base, {this.body}); String toJSON() { - var map = {}; + final map = {}; putValue("title", title, map); putValue("head", head, map); putValue("base", base, map); @@ -287,7 +287,7 @@ class CreatePullRequestComment { CreatePullRequestComment(this.body, this.commitId, this.path, this.position); String toJSON() { - var map = {}; + final map = {}; putValue("body", body, map); putValue("commit_id", commitId, map); putValue("path", path, map); @@ -312,7 +312,7 @@ class PullRequestFile { String patch; static PullRequestFile fromJSON(Map input) { - var file = PullRequestFile(); + final file = PullRequestFile(); file.sha = input['sha']; file.filename = input['filename']; file.status = input['status']; diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart index d047dd5d..6f6d4ccb 100644 --- a/lib/src/common/model/repos.dart +++ b/lib/src/common/model/repos.dart @@ -256,13 +256,13 @@ class RepositorySlug { /// Repository Name final String name; - RepositorySlug(this.owner, this.name); + const RepositorySlug(this.owner, this.name); /// Creates a Repository Slug from a full name. factory RepositorySlug.full(String f) { - var split = f.split("/"); - var o = split[0]; - var n = (split..removeAt(0)).join("/"); + final split = f.split("/"); + final o = split[0]; + final n = (split..removeAt(0)).join("/"); return RepositorySlug(o, n); } @@ -372,7 +372,7 @@ class LanguageBreakdown { /// The Primary Language String get primary { - var list = mapToList(_data); + final list = mapToList(_data); list.sort((a, b) { return a.value.compareTo(b.value); }); @@ -389,8 +389,8 @@ class LanguageBreakdown { /// Creates a list of lists with a tuple of the language name and the bytes. List> toList() { - var out = >[]; - for (var key in info.keys) { + final out = >[]; + for (final key in info.keys) { out.add([key, info[key]]); } return out; @@ -398,7 +398,7 @@ class LanguageBreakdown { @override String toString() { - var buffer = StringBuffer(); + final buffer = StringBuffer(); _data.forEach((key, value) { buffer.writeln("$key: $value"); }); diff --git a/lib/src/common/model/repos_commits.dart b/lib/src/common/model/repos_commits.dart index c9872f5e..39bb22a0 100644 --- a/lib/src/common/model/repos_commits.dart +++ b/lib/src/common/model/repos_commits.dart @@ -41,7 +41,7 @@ class RepositoryCommit { static RepositoryCommit fromJSON(Map input) { if (input == null) return null; - var commit = RepositoryCommit() + final commit = RepositoryCommit() ..url = input['url'] ..sha = input['sha'] ..htmlUrl = input['html_url'] diff --git a/lib/src/common/model/repos_contents.dart b/lib/src/common/model/repos_contents.dart index bfe6eec7..68e6c1bf 100644 --- a/lib/src/common/model/repos_contents.dart +++ b/lib/src/common/model/repos_contents.dart @@ -107,7 +107,7 @@ class CreateFile { CreateFile(this.path, this.content, this.message); String toJSON() { - var map = {}; + final map = {}; putValue("path", path, map); putValue("message", message, map); putValue("content", content, map); @@ -125,7 +125,7 @@ class CommitUser { CommitUser(this.name, this.email); Map toMap() { - var map = {}; + final map = {}; putValue('name', name, map); putValue('email', email, map); diff --git a/lib/src/common/model/repos_forks.dart b/lib/src/common/model/repos_forks.dart index dfd66ca5..d3183a7c 100644 --- a/lib/src/common/model/repos_forks.dart +++ b/lib/src/common/model/repos_forks.dart @@ -7,7 +7,7 @@ class CreateFork { CreateFork([this.organization]); String toJSON() { - var map = {}; + final map = {}; putValue("organization", organization, map); return jsonEncode(map); } diff --git a/lib/src/common/model/repos_merging.dart b/lib/src/common/model/repos_merging.dart index 019c0765..3754b227 100644 --- a/lib/src/common/model/repos_merging.dart +++ b/lib/src/common/model/repos_merging.dart @@ -11,7 +11,7 @@ class CreateMerge { CreateMerge(this.base, this.head); String toJSON() { - var map = {}; + final map = {}; putValue("base", base, map); putValue("head", head, map); putValue("commit_message", commitMessage, map); diff --git a/lib/src/common/model/repos_pages.dart b/lib/src/common/model/repos_pages.dart index a6bb098f..6cfc77c5 100644 --- a/lib/src/common/model/repos_pages.dart +++ b/lib/src/common/model/repos_pages.dart @@ -15,7 +15,7 @@ class RepositoryPages { static RepositoryPages fromJSON(Map input) { if (input == null) return null; - var pages = RepositoryPages(); + final pages = RepositoryPages(); pages.cname = input['cname']; pages.status = input['status']; pages.hasCustom404 = input['custom_404']; diff --git a/lib/src/common/model/repos_stats.dart b/lib/src/common/model/repos_stats.dart index b26e9746..d9c02266 100644 --- a/lib/src/common/model/repos_stats.dart +++ b/lib/src/common/model/repos_stats.dart @@ -79,7 +79,7 @@ class YearCommitCountWeek { static YearCommitCountWeek fromJSON(Map input) { if (input == null) return null; - var c = YearCommitCountWeek(); + final c = YearCommitCountWeek(); c.days = input["days"] as List; c.total = input["total"]; c.timestamp = input["week"]; @@ -100,7 +100,7 @@ class WeeklyChangesCount { static WeeklyChangesCount fromJSON(Map input) { if (input == null) return null; - var c = WeeklyChangesCount(); + final c = WeeklyChangesCount(); c.timestamp = input[0]; c.additions = input[1]; c.deletions = input[2]; @@ -121,7 +121,7 @@ class PunchcardEntry { static PunchcardEntry fromJSON(Map input) { if (input == null) return null; - var c = PunchcardEntry(); + final c = PunchcardEntry(); c.weekday = input[0]; c.hour = input[1]; c.commits = input[2]; diff --git a/lib/src/common/model/repos_statuses.dart b/lib/src/common/model/repos_statuses.dart index 0fdc153c..9152acd6 100644 --- a/lib/src/common/model/repos_statuses.dart +++ b/lib/src/common/model/repos_statuses.dart @@ -60,7 +60,7 @@ class CreateStatus { CreateStatus(this.state); String toJSON() { - var map = {}; + final map = {}; putValue("state", state, map); putValue("target_url", targetUrl, map); putValue("description", description, map); diff --git a/lib/src/common/model/search.dart b/lib/src/common/model/search.dart index a17faa9d..8748a5af 100644 --- a/lib/src/common/model/search.dart +++ b/lib/src/common/model/search.dart @@ -49,8 +49,8 @@ class CodeSearchItem { } static List fromJsonList(List input) { - var result = []; - for (var item in input) { + final result = []; + for (final item in input) { if (item is Map) { result.add(CodeSearchItem.fromJson(item)); } diff --git a/lib/src/common/orgs_service.dart b/lib/src/common/orgs_service.dart index 55f3f996..f790d988 100644 --- a/lib/src/common/orgs_service.dart +++ b/lib/src/common/orgs_service.dart @@ -34,8 +34,8 @@ class OrganizationsService extends Service { /// Fetches the organizations specified by [names]. Stream getMulti(List names) async* { - for (var name in names) { - var org = await get(name); + for (final name in names) { + final org = await get(name); yield org; } } @@ -50,7 +50,7 @@ class OrganizationsService extends Service { String location, String name, String description}) { - var map = createNonNullMap({ + final map = createNonNullMap({ "billing_email": billingEmail, "company": company, "email": email, @@ -84,7 +84,7 @@ class OrganizationsService extends Service { /// API docs: https://developer.github.com/v3/orgs/teams/#create-team Future createTeam(String org, String name, {String description, List repos, String permission}) { - var map = createNonNullMap({ + final map = createNonNullMap({ "name": name, "description": description, "repo_names": repos, @@ -100,11 +100,18 @@ class OrganizationsService extends Service { /// API docs: https://developer.github.com/v3/orgs/teams/#edit-team Future editTeam(int teamId, String name, {String description, String permission}) { - var map = createNonNullMap( - {"name": name, "description": description, "permission": permission}); + final map = createNonNullMap({ + "name": name, + "description": description, + "permission": permission, + }); - return _github.postJSON("/teams/$teamId", - statusCode: 200, convert: Team.fromJSON, body: jsonEncode(map)); + return _github.postJSON( + "/teams/$teamId", + statusCode: 200, + convert: Team.fromJSON, + body: jsonEncode(map), + ); } /// Deletes the team specified by the [teamId] @@ -158,19 +165,21 @@ class OrganizationsService extends Service { /// /// API docs: https://developer.github.com/v3/orgs/teams/#get-team-membership Future getTeamMembership(int teamId, String user) { - var completer = Completer(); + final completer = Completer(); _github - .getJSON("/teams/$teamId/memberships/$user", - statusCode: 200, - fail: (http.Response response) { - if (response.statusCode == 404) { - completer.complete(TeamMembershipState(null)); - } else { - _github.handleStatusCode(response); - } - }, - convert: (json) => TeamMembershipState(json['state'])) + .getJSON( + "/teams/$teamId/memberships/$user", + statusCode: 200, + fail: (http.Response response) { + if (response.statusCode == 404) { + completer.complete(TeamMembershipState(null)); + } else { + _github.handleStatusCode(response); + } + }, + convert: (json) => TeamMembershipState(json['state']), + ) .then(completer.complete); return completer.future; diff --git a/lib/src/common/pulls_service.dart b/lib/src/common/pulls_service.dart index 5acafb4d..b9da5783 100644 --- a/lib/src/common/pulls_service.dart +++ b/lib/src/common/pulls_service.dart @@ -10,14 +10,16 @@ class PullRequestsService extends Service { /// Fetches several pull requests. /// /// API docs: https://developer.github.com/v3/pulls/#list-pull-requests - Stream list(RepositorySlug slug, - {int pages, - String base, - String direction = 'desc', - String head, - String sort = 'created', - String state = 'open'}) { - var params = {}; + Stream list( + RepositorySlug slug, { + int pages, + String base, + String direction = 'desc', + String head, + String sort = 'created', + String state = 'open', + }) { + final params = {}; putValue("base", base, params); putValue("direction", direction, params); putValue("head", head, params); @@ -50,7 +52,7 @@ class PullRequestsService extends Service { /// API docs: https://developer.github.com/v3/pulls/#update-a-pull-request Future edit(RepositorySlug slug, int number, {String title, String body, String state, String base}) { - var map = {}; + final map = {}; putValue("title", title, map); putValue("body", body, map); putValue("state", state, map); @@ -96,9 +98,12 @@ class PullRequestsService extends Service { /// Merge a pull request (Merge Button). /// /// API docs: https://developer.github.com/v3/pulls/#merge-a-pull-request-merge-button - Future merge(RepositorySlug slug, int number, - {String message}) { - var json = {}; + Future merge( + RepositorySlug slug, + int number, { + String message, + }) { + final json = {}; if (message != null) { json['commit_message'] = message; diff --git a/lib/src/common/search_service.dart b/lib/src/common/search_service.dart index d1f3bbc4..0b65f7f7 100644 --- a/lib/src/common/search_service.dart +++ b/lib/src/common/search_service.dart @@ -12,14 +12,14 @@ class SearchService extends Service { /// /// API docs: https://developer.github.com/v3/search/#search-repositories Stream repositories(String query, {String sort, int pages = 2}) { - var params = {"q": query}; + final params = {"q": query}; if (sort != null) { params["sort"] = sort; } - var controller = StreamController(); + final controller = StreamController(); - var isFirst = true; + bool isFirst = true; PaginationHelper(_github) .fetchStreamed("GET", "/search/repositories", @@ -33,13 +33,13 @@ class SearchService extends Service { isFirst = false; - var input = jsonDecode(response.body); + final input = jsonDecode(response.body); if (input['items'] == null) { return; } - var items = input['items'] as List; + final items = input['items'] as List; items.map((item) => Repository.fromJSON(item)).forEach(controller.add); }).onDone(controller.close); @@ -106,7 +106,7 @@ class SearchService extends Service { query += ' in:$_in'; } - var params = {}; + final params = {}; params['q'] = query ?? ''; if (perPage != null) { params['per_page'] = perPage.toString(); @@ -128,12 +128,12 @@ class SearchService extends Service { /// Since the Search Rate Limit is small, this is a best effort implementation. /// API docs: https://developer.github.com/v3/search/#search-issues Stream issues(String query, {String sort, int pages = 2}) { - var params = {"q": query}; + final params = {"q": query}; if (sort != null) { params["sort"] = sort; } - var controller = StreamController(); + final controller = StreamController(); var isFirst = true; @@ -148,13 +148,13 @@ class SearchService extends Service { isFirst = false; - var input = jsonDecode(response.body); + final input = jsonDecode(response.body); if (input['items'] == null) { return; } - var items = input['items'] as List; + final items = input['items'] as List; items.map((item) => Issue.fromJSON(item)).forEach(controller.add); }).onDone(controller.close); @@ -166,9 +166,13 @@ class SearchService extends Service { /// Since the Search Rate Limit is small, this is a best effort implementation. /// /// API docs: https://developer.github.com/v3/search/#search-users - Stream users(String query, - {String sort, int pages = 2, int perPage = 30}) { - var params = {"q": query}; + Stream users( + String query, { + String sort, + int pages = 2, + int perPage = 30, + }) { + final params = {"q": query}; if (sort != null) { params["sort"] = sort; @@ -176,7 +180,7 @@ class SearchService extends Service { params["per_page"] = perPage.toString(); - var controller = StreamController(); + final controller = StreamController(); var isFirst = true; @@ -191,13 +195,13 @@ class SearchService extends Service { isFirst = false; - var input = jsonDecode(response.body); + final input = jsonDecode(response.body); if (input['items'] == null) { return; } - var items = input['items'] as List; + final items = input['items'] as List; items.map((item) => User.fromJson(item)).forEach(controller.add); }).onDone(controller.close); diff --git a/lib/src/common/url_shortener_service.dart b/lib/src/common/url_shortener_service.dart index c8fd9406..ffb4d543 100644 --- a/lib/src/common/url_shortener_service.dart +++ b/lib/src/common/url_shortener_service.dart @@ -10,7 +10,7 @@ class UrlShortenerService extends Service { /// Shortens the provided [url]. An optional [code] can be provided to create /// your own vanity URL. Future shortenUrl(String url, {String code}) { - var params = {}; + final params = {}; params['url'] = url; diff --git a/lib/src/common/users_service.dart b/lib/src/common/users_service.dart index 2e225d2b..8e669172 100644 --- a/lib/src/common/users_service.dart +++ b/lib/src/common/users_service.dart @@ -24,7 +24,7 @@ class UsersService extends Service { String location, bool hireable, String bio}) { - var map = createNonNullMap({ + final map = createNonNullMap({ "name": name, "email": email, "blog": blog, @@ -34,14 +34,18 @@ class UsersService extends Service { "bio": bio }); - return _github.postJSON("/user", - body: jsonEncode(map), statusCode: 200, convert: CurrentUser.fromJSON); + return _github.postJSON( + "/user", + body: jsonEncode(map), + statusCode: 200, + convert: CurrentUser.fromJSON, + ); } /// Fetches a list of users specified by [names]. Stream getUsers(List names, {int pages}) async* { - for (var name in names) { - var user = await getUser(name); + for (final name in names) { + final user = await getUser(name); yield user; } } @@ -142,7 +146,7 @@ class UsersService extends Service { /// API docs: https://developer.github.com/v3/users/keys/#list-public-keys-for-a-user /// and https://developer.github.com/v3/users/keys/#list-your-public-keys Stream listPublicKeys([String userLogin]) { - var path = userLogin == null ? "/user/keys" : "/users/$userLogin/keys"; + final path = userLogin == null ? "/user/keys" : "/users/$userLogin/keys"; return PaginationHelper(_github).objects("GET", path, PublicKey.fromJSON); } diff --git a/lib/src/common/util/crawler.dart b/lib/src/common/util/crawler.dart index 32ccd10b..1a22f6a7 100644 --- a/lib/src/common/util/crawler.dart +++ b/lib/src/common/util/crawler.dart @@ -9,9 +9,9 @@ class RepositoryCrawler { Stream crawl() async* { Stream scan(String path) async* { - var contents = await github.repositories.getContents(slug, path); + final contents = await github.repositories.getContents(slug, path); - for (var content in contents.tree) { + for (final content in contents.tree) { if (content.type == 'dir') { yield* scan(content.path); } else { diff --git a/lib/src/common/util/errors.dart b/lib/src/common/util/errors.dart index 6b21d2db..4d0e6949 100644 --- a/lib/src/common/util/errors.dart +++ b/lib/src/common/util/errors.dart @@ -7,76 +7,86 @@ class GitHubError implements Exception { final GitHub github; final Object source; - GitHubError(this.github, this.message, {this.apiUrl, this.source}); + const GitHubError(this.github, this.message, {this.apiUrl, this.source}); @override String toString() => "GitHub Error: $message"; } class NotReady extends GitHubError { - NotReady(GitHub github, String path) - : super(github, 'Not ready. Try again later', apiUrl: path); + const NotReady(GitHub github, String path) + : super( + github, + 'Not ready. Try again later', + apiUrl: path, + ); } /// GitHub Entity was not found class NotFound extends GitHubError { - NotFound(GitHub github, String msg) : super(github, msg); + const NotFound( + GitHub github, + String msg, + ) : super(github, msg); } class BadRequest extends GitHubError { - BadRequest(GitHub github, [String msg = 'Not Found']) : super(github, msg); + const BadRequest(GitHub github, [String msg = 'Not Found']) + : super(github, msg); } /// GitHub Repository was not found class RepositoryNotFound extends NotFound { - RepositoryNotFound(GitHub github, String repo) + const RepositoryNotFound(GitHub github, String repo) : super(github, "Repository Not Found: $repo"); } /// GitHub User was not found class UserNotFound extends NotFound { - UserNotFound(GitHub github, String user) + const UserNotFound(GitHub github, String user) : super(github, "User Not Found: $user"); } /// GitHub Organization was not found class OrganizationNotFound extends NotFound { - OrganizationNotFound(GitHub github, String organization) + const OrganizationNotFound(GitHub github, String organization) : super(github, "Organization Not Found: $organization"); } /// GitHub Team was not found class TeamNotFound extends NotFound { - TeamNotFound(GitHub github, int id) : super(github, "Team Not Found: $id"); + const TeamNotFound(GitHub github, int id) + : super(github, "Team Not Found: $id"); } /// Access was forbidden to a resource class AccessForbidden extends GitHubError { - AccessForbidden(GitHub github) : super(github, "Access Forbidden"); + const AccessForbidden(GitHub github) : super(github, "Access Forbidden"); } /// Client hit the rate limit. class RateLimitHit extends GitHubError { - RateLimitHit(GitHub github) : super(github, "Rate Limit Hit"); + const RateLimitHit(GitHub github) : super(github, "Rate Limit Hit"); } /// An Unknown Error class UnknownError extends GitHubError { - UnknownError(GitHub github, [String message]) + const UnknownError(GitHub github, [String message]) : super(github, message != null ? message : "Unknown Error"); } /// GitHub Client was not authenticated class NotAuthenticated extends GitHubError { - NotAuthenticated(GitHub github) : super(github, "Client not Authenticated"); + const NotAuthenticated(GitHub github) + : super(github, "Client not Authenticated"); } class InvalidJSON extends BadRequest { - InvalidJSON(GitHub github, [String message = "Invalid JSON"]) + const InvalidJSON(GitHub github, [String message = "Invalid JSON"]) : super(github, message); } class ValidationFailed extends GitHubError { - ValidationFailed(GitHub github, [String message = "Validation Failed"]) + const ValidationFailed(GitHub github, [String message = "Validation Failed"]) : super(github, message); } diff --git a/lib/src/common/util/oauth2.dart b/lib/src/common/util/oauth2.dart index 92edd3e0..747ef7a5 100644 --- a/lib/src/common/util/oauth2.dart +++ b/lib/src/common/util/oauth2.dart @@ -63,7 +63,7 @@ class OAuth2Flow { /// Exchanges the given [code] for a token. Future exchange(String code, [String origin]) { - var headers = { + final headers = { "Accept": "application/json", "content-type": "application/json" }; @@ -72,7 +72,7 @@ class OAuth2Flow { headers['Origin'] = origin; } - var body = jsonEncode({ + final body = jsonEncode({ "client_id": clientId, "client_secret": clientSecret, "code": code, @@ -82,7 +82,7 @@ class OAuth2Flow { return (github == null ? http.Client() : github.client) .post("$baseUrl/access_token", body: body, headers: headers) .then((response) { - var json = jsonDecode(response.body) as Map; + final json = jsonDecode(response.body) as Map; if (json['error'] != null) { throw json; } diff --git a/lib/src/common/util/pagination.dart b/lib/src/common/util/pagination.dart index 299469ab..ec964261 100644 --- a/lib/src/common/util/pagination.dart +++ b/lib/src/common/util/pagination.dart @@ -27,7 +27,7 @@ class PaginationHelper { assert(!params.containsKey('page')); do { - var response = await github.request(method, path, + final response = await github.request(method, path, headers: headers, params: params, body: body, statusCode: statusCode); yield response; @@ -38,52 +38,55 @@ class PaginationHelper { break; } - var link = response.headers['link']; + final link = response.headers['link']; if (link == null) { break; } - var info = parseLinkHeader(link); + final info = parseLinkHeader(link); if (info == null) { break; } - var next = info['next']; + final next = info['next']; if (next == null) { break; } - var nextUrl = Uri.parse(next); - var nextPageArg = nextUrl.queryParameters['page']; + final nextUrl = Uri.parse(next); + final nextPageArg = nextUrl.queryParameters['page']; assert(nextPageArg != null); params['page'] = nextPageArg; } while (true); } - Stream jsonObjects(String method, String path, - {int pages, - Map headers, - Map params, - String body, - int statusCode = 200, - String preview}) async* { + Stream jsonObjects( + String method, + String path, { + int pages, + Map headers, + Map params, + String body, + int statusCode = 200, + String preview, + }) async* { if (headers == null) headers = {}; if (preview != null) { headers["Accept"] = preview; } headers.putIfAbsent("Accept", () => "application/vnd.github.v3+json"); - await for (var response in fetchStreamed(method, path, + await for (final response in fetchStreamed(method, path, pages: pages, headers: headers, params: params, body: body, statusCode: statusCode)) { - var json = jsonDecode(response.body) as List; + final json = jsonDecode(response.body) as List; - for (var item in json) { + for (final item in json) { yield item as T; } } @@ -110,16 +113,16 @@ class PaginationHelper { //TODO(kevmoo): use regex here. Map parseLinkHeader(String input) { - var out = {}; - var parts = input.split(", "); - for (var part in parts) { + final out = {}; + final parts = input.split(", "); + for (final part in parts) { if (part[0] != "<") { - throw FormatException("Invalid Link Header"); + throw const FormatException("Invalid Link Header"); } - var kv = part.split("; "); - var url = kv[0].substring(1); + final kv = part.split("; "); + String url = kv[0].substring(1); url = url.substring(0, url.length - 1); - var key = kv[1]; + String key = kv[1]; key = key.replaceAll('"', "").substring(4); out[key] = url; } diff --git a/lib/src/common/util/service.dart b/lib/src/common/util/service.dart index a70a9bcc..d434bf2c 100644 --- a/lib/src/common/util/service.dart +++ b/lib/src/common/util/service.dart @@ -4,5 +4,5 @@ part of github.common; abstract class Service { final GitHub _github; - Service(this._github); + const Service(this._github); } diff --git a/lib/src/common/util/utils.dart b/lib/src/common/util/utils.dart index 41204ce3..8f02dce8 100644 --- a/lib/src/common/util/utils.dart +++ b/lib/src/common/util/utils.dart @@ -25,9 +25,9 @@ String dateToGitHubIso8601(DateTime date) { } RepositorySlug slugFromAPIUrl(String url) { - var split = url.split("/"); - var i = split.indexOf("repos") + 1; - var parts = split.sublist(i, i + 2); + final split = url.split("/"); + final i = split.indexOf("repos") + 1; + final parts = split.sublist(i, i + 2); return RepositorySlug(parts[0], parts[1]); } diff --git a/lib/src/util.dart b/lib/src/util.dart index bad6f348..eaca7c4d 100644 --- a/lib/src/util.dart +++ b/lib/src/util.dart @@ -1,14 +1,14 @@ final RegExp githubDateRemoveRegExp = RegExp(r'\.\d*'); String buildQueryString(Map params) { - var queryString = StringBuffer(); + final queryString = StringBuffer(); if (params.isNotEmpty && !params.values.every((value) => value == null)) { queryString.write("?"); } - var i = 0; - for (var key in params.keys) { + int i = 0; + for (final key in params.keys) { i++; if (params[key] == null) { continue; @@ -40,8 +40,8 @@ void putValue(String name, dynamic value, Map map) { } List> mapToList(Map input) { - var out = >[]; - for (var key in input.keys) { + final out = >[]; + for (final key in input.keys) { out.add(MapEntry(key, input[key])); } return out; @@ -64,8 +64,8 @@ DateTime parseDateTime(String input) { } Map createNonNullMap(Map input) { - var map = {}; - for (var key in input.keys) { + final map = {}; + for (final key in input.keys) { if (input[key] != null) { map[key] = input[key]; } @@ -78,13 +78,13 @@ int parseFancyNumber(String input) { input = input.trim(); if (input.contains(",")) input = input.replaceAll(",", ""); - var multipliers = {"h": 100, "k": 1000, "ht": 100000, "m": 1000000}; + const multipliers = {"h": 100, "k": 1000, "ht": 100000, "m": 1000000}; int value; if (!multipliers.keys.any((m) => input.endsWith(m))) { value = int.parse(input); } else { - var m = multipliers.keys.firstWhere((m) => input.endsWith(m)); + final m = multipliers.keys.firstWhere((m) => input.endsWith(m)); input = input.substring(0, input.length - m.length); value = num.parse(input) * multipliers[m]; } diff --git a/test/code_search_test.dart b/test/code_search_test.dart index 7b437a0c..4cc22806 100644 --- a/test/code_search_test.dart +++ b/test/code_search_test.dart @@ -3,14 +3,18 @@ import 'package:github/server.dart'; Future main() async { print('Searching ...'); - GitHub github = GitHub(); + final GitHub github = GitHub(); - Stream resultsStream = github.search - .code('github', repo: 'DirectMyFile/github.dart', perPage: 5, pages: 1); - var results = await resultsStream.first; + final Stream resultsStream = github.search.code( + 'github', + repo: 'DirectMyFile/github.dart', + perPage: 5, + pages: 1, + ); + final results = await resultsStream.first; print('${results.totalCount} results'); int k = 1; - for (var i in results.items) { + for (final i in results.items) { print('${k++} ${i.path}'); } exit(0); diff --git a/test/data_object_test.dart b/test/data_object_test.dart index b6915f69..93962433 100644 --- a/test/data_object_test.dart +++ b/test/data_object_test.dart @@ -3,7 +3,7 @@ import 'dart:convert'; import 'package:test/test.dart'; import 'package:github/server.dart'; -final _licenseJson = r''' { +const _licenseJson = r''' { "name": "LICENSE", "path": "LICENSE", "sha": "68bcabfb39b7af5a1f5efbb8f651d51e16d60398", @@ -31,11 +31,11 @@ final _licenseJson = r''' { void main() { test('License round-trip', () { - var licenseJson = jsonDecode(_licenseJson) as Map; + final licenseJson = jsonDecode(_licenseJson) as Map; - var instance = LicenseDetails.fromJson(licenseJson); + final instance = LicenseDetails.fromJson(licenseJson); - var toJson = instance.toJson(); + final toJson = instance.toJson(); expect(_prettyEncode(toJson), _prettyEncode(licenseJson)); }); diff --git a/test/experiment/crawler.dart b/test/experiment/crawler.dart index 44f1f8d6..f7b6f375 100644 --- a/test/experiment/crawler.dart +++ b/test/experiment/crawler.dart @@ -1,10 +1,12 @@ import "package:github/server.dart"; void main() { - var github = GitHub(auth: Authentication.anonymous()); + final github = GitHub(auth: Authentication.anonymous()); - var crawler = RepositoryCrawler( - github, RepositorySlug.full("DirectMyFile/github.dart")); + final crawler = RepositoryCrawler( + github, + RepositorySlug.full("DirectMyFile/github.dart"), + ); crawler.crawl().listen((file) { print(file.path); diff --git a/test/experiment/error_handling.dart b/test/experiment/error_handling.dart index 776d703a..e895318f 100644 --- a/test/experiment/error_handling.dart +++ b/test/experiment/error_handling.dart @@ -6,16 +6,21 @@ import 'package:github/server.dart'; import '../helper.dart'; void main() { - var github = createGitHubClient(); - var response = MockResponse( - jsonEncode({ - "message": "Invalid Entity", - "errors": [ - {"resource": "Issue", "field": "body", "code": "not_found"} - ] - }), - {}, - 422); + final github = createGitHubClient(); + final response = MockResponse( + jsonEncode({ + "message": "Invalid Entity", + "errors": [ + { + "resource": "Issue", + "field": "body", + "code": "not_found", + } + ] + }), + {}, + 422, + ); try { github.handleStatusCode(response); diff --git a/test/experiment/fancy_numbers.dart b/test/experiment/fancy_numbers.dart index 5bfd8db8..c1013007 100644 --- a/test/experiment/fancy_numbers.dart +++ b/test/experiment/fancy_numbers.dart @@ -11,7 +11,7 @@ void main() { } void test(String input, int expect) { - var out = parseFancyNumber(input); + final out = parseFancyNumber(input); if (out != expect) { print("ERROR: $input was parsed as $out but we expected $expect"); } else { diff --git a/test/experiment/files.dart b/test/experiment/files.dart index 3fa7c11e..b82e3ae3 100755 --- a/test/experiment/files.dart +++ b/test/experiment/files.dart @@ -1,11 +1,13 @@ import "package:github/server.dart"; void main() { - var github = GitHub(); + final github = GitHub(); github.repositories .getContents( - RepositorySlug("DirectMyFile", "github.dart"), "pubspec.yaml") + const RepositorySlug("DirectMyFile", "github.dart"), + "pubspec.yaml", + ) .then((contents) => contents.file) .then((file) => print(file.text)) .then((_) => github.dispose()); diff --git a/test/experiment/limit_pager.dart b/test/experiment/limit_pager.dart index 317010a7..b7222ba8 100755 --- a/test/experiment/limit_pager.dart +++ b/test/experiment/limit_pager.dart @@ -22,8 +22,8 @@ PaginationInformation solve(int limit) { return PaginationInformation(limit, limit ~/ MAX_PER_PAGE, MAX_PER_PAGE); } - int itemsPerPage = 100; - int pages = (limit / itemsPerPage).ceil(); + const int itemsPerPage = 100; + final int pages = (limit / itemsPerPage).ceil(); return PaginationInformation(limit, pages, itemsPerPage); } diff --git a/test/experiment/link_header.dart b/test/experiment/link_header.dart index 33ca393d..b3856067 100644 --- a/test/experiment/link_header.dart +++ b/test/experiment/link_header.dart @@ -1,7 +1,7 @@ import 'package:github/src/common/util/pagination.dart'; void main() { - var it = parseLinkHeader( + final Map it = parseLinkHeader( '; rel="next", ; rel="last"'); print(it); } diff --git a/test/experiment/org_hooks.dart b/test/experiment/org_hooks.dart index 79959430..61837aef 100644 --- a/test/experiment/org_hooks.dart +++ b/test/experiment/org_hooks.dart @@ -2,11 +2,11 @@ import 'dart:async'; import "../helper.dart"; Future main() async { - var org = "IOT-DSA"; + const org = "IOT-DSA"; - var hooks = await github.organizations.listHooks(org).toList(); + final hooks = await github.organizations.listHooks(org).toList(); - for (var hook in hooks) { + for (final hook in hooks) { print(hook.config); } diff --git a/test/experiment/orglist.dart b/test/experiment/orglist.dart index bb8f4565..8e6b377a 100644 --- a/test/experiment/orglist.dart +++ b/test/experiment/orglist.dart @@ -2,8 +2,8 @@ import 'dart:async'; import "package:github/server.dart"; Future main() async { - var github = createGitHubClient(); - var repos = + final github = createGitHubClient(); + final repos = await github.repositories.listUserRepositories("dart-lang").toList(); github.dispose(); print(repos); diff --git a/test/experiment/polling.dart b/test/experiment/polling.dart index e3f13fa5..1ad5ad30 100755 --- a/test/experiment/polling.dart +++ b/test/experiment/polling.dart @@ -1,9 +1,9 @@ import "package:github/server.dart"; void main() { - var github = createGitHubClient(); + final github = createGitHubClient(); - EventPoller poller = github.activity.pollPublicEvents(); + final EventPoller poller = github.activity.pollPublicEvents(); poller.start().listen((event) { print("New Event:"); diff --git a/test/experiment/public_repos.dart b/test/experiment/public_repos.dart index 5ff4fa79..2fa3bc27 100755 --- a/test/experiment/public_repos.dart +++ b/test/experiment/public_repos.dart @@ -1,7 +1,7 @@ import "package:github/server.dart"; void main() { - var github = createGitHubClient(); + final github = createGitHubClient(); github.repositories.listPublicRepositories(limit: 50).listen((repo) { print("-> ${repo.fullName}"); diff --git a/test/experiment/readme.dart b/test/experiment/readme.dart index 0ccd1125..b73d5850 100755 --- a/test/experiment/readme.dart +++ b/test/experiment/readme.dart @@ -1,10 +1,10 @@ import "package:github/server.dart"; void main() { - var github = createGitHubClient(); + final github = createGitHubClient(); github.repositories - .getReadme(RepositorySlug("DirectMyFile", "github.dart")) + .getReadme(const RepositorySlug("DirectMyFile", "github.dart")) .then((file) => github.misc.renderMarkdown(file.text)) .then((html) => print(html)) .then((_) => github.dispose()); diff --git a/test/experiment/search.dart b/test/experiment/search.dart index 84b5f366..f6db5a00 100755 --- a/test/experiment/search.dart +++ b/test/experiment/search.dart @@ -1,7 +1,7 @@ import "package:github/server.dart"; void main() { - var github = createGitHubClient(); + final github = createGitHubClient(); github.search.repositories("github").listen((repo) { print( diff --git a/test/experiment/wisdom.dart b/test/experiment/wisdom.dart index 2a5738a5..422d521f 100755 --- a/test/experiment/wisdom.dart +++ b/test/experiment/wisdom.dart @@ -1,7 +1,7 @@ import "package:github/server.dart"; void main() { - var github = createGitHubClient(); + final github = createGitHubClient(); github.misc.getWisdom().then((value) { print(value); diff --git a/test/git_integration_test.dart b/test/git_integration_test.dart index ea74bd28..f390d20c 100644 --- a/test/git_integration_test.dart +++ b/test/git_integration_test.dart @@ -18,9 +18,9 @@ void main() { RepositorySlug slug; setUpAll(() { - var authToken = Platform.environment['GITHUB_API_TOKEN']; - var repoOwner = Platform.environment['GITHUB_DART_TEST_REPO_OWNER']; - var repoName = Platform.environment['GITHUB_DART_TEST_REPO_NAME']; + final authToken = Platform.environment['GITHUB_API_TOKEN']; + final repoOwner = Platform.environment['GITHUB_DART_TEST_REPO_OWNER']; + final repoName = Platform.environment['GITHUB_DART_TEST_REPO_NAME']; github = createGitHubClient(auth: Authentication.withToken(authToken)); slug = RepositorySlug(repoOwner, repoName); @@ -32,21 +32,21 @@ void main() { // Test definitions. test('get last commit of master', () async { - var branch = await github.repositories.getBranch(slug, 'master'); + final branch = await github.repositories.getBranch(slug, 'master'); firstCommitSha = branch.commit.sha; firstCommitTreeSha = branch.commit.commit.sha; }); test('create and get a new blob', () async { - var newBlob = CreateGitBlob('bbb', 'utf-8'); + const newBlob = CreateGitBlob('bbb', 'utf-8'); // createBlob() - var createdBlob = await github.git.createBlob(slug, newBlob); - var createdBlobSha = createdBlob.sha; + final createdBlob = await github.git.createBlob(slug, newBlob); + final createdBlobSha = createdBlob.sha; - var fetchedBlob = await github.git.getBlob(slug, createdBlobSha); + final fetchedBlob = await github.git.getBlob(slug, createdBlobSha); - var base64Decoded = base64Decode(fetchedBlob.content); + final base64Decoded = base64Decode(fetchedBlob.content); expect(utf8.decode(base64Decoded), equals('bbb')); expect(fetchedBlob.encoding, equals('base64')); @@ -59,35 +59,35 @@ void main() { }); test('create and get a new tree', () async { - var entry1 = CreateGitTreeEntry('README.md', '100644', 'blob', + const entry1 = CreateGitTreeEntry('README.md', '100644', 'blob', content: 'This is a repository for integration tests.'); - var entry2 = CreateGitTreeEntry('subdir/asdf.txt', '100644', 'blob', + const entry2 = CreateGitTreeEntry('subdir/asdf.txt', '100644', 'blob', content: 'Some file in a folder.'); - var newTree = CreateGitTree([entry1, entry2]) + final newTree = CreateGitTree([entry1, entry2]) ..baseTree = firstCommitTreeSha; // createTree() - var createdTree = await github.git.createTree(slug, newTree); + final createdTree = await github.git.createTree(slug, newTree); createdTreeSha = createdTree.sha; // getTree() - var fetchedTree = await github.git.getTree(slug, createdTreeSha); + final fetchedTree = await github.git.getTree(slug, createdTreeSha); expect(fetchedTree.sha, equals(createdTreeSha)); expect(fetchedTree.entries.length, equals(2)); }); test('create and get a new commit', () async { - var newCommit = CreateGitCommit('My test commit', createdTreeSha) + final newCommit = CreateGitCommit('My test commit', createdTreeSha) ..parents = [firstCommitSha]; // createCommit() - var createdCommit = await github.git.createCommit(slug, newCommit); + final createdCommit = await github.git.createCommit(slug, newCommit); createdCommitSha = createdCommit.sha; // getCommit() - var fetchedCommit = await github.git.getCommit(slug, createdCommitSha); + final fetchedCommit = await github.git.getCommit(slug, createdCommitSha); expect(fetchedCommit.sha, equals(createdCommitSha)); expect(fetchedCommit.message, equals('My test commit')); expect(fetchedCommit.tree.sha, equals(createdTreeSha)); @@ -99,29 +99,29 @@ void main() { }); test('create and get a new reference (branch)', () async { - var branchName = _randomGitName(); + final branchName = _randomGitName(); await github.git .createReference(slug, 'refs/heads/$branchName', createdCommitSha); - var fetchedRef = await github.git.getReference(slug, 'heads/$branchName'); + final fetchedRef = await github.git.getReference(slug, 'heads/$branchName'); expect(fetchedRef.ref, equals('refs/heads/$branchName')); expect(fetchedRef.object.type, equals('commit')); expect(fetchedRef.object.sha, equals(createdCommitSha)); }); test('create and get a new tag', () async { - var tagName = 'v${_randomGitName()}'; + final tagName = 'v${_randomGitName()}'; - var newTag = CreateGitTag(tagName, 'Version 0.0.1', createdCommitSha, + final newTag = CreateGitTag(tagName, 'Version 0.0.1', createdCommitSha, 'commit', GitCommitUser('aName', 'aEmail', DateTime.now())); // createTag() - var createdTag = await github.git.createTag(slug, newTag); - var createdTagSha = createdTag.sha; + final createdTag = await github.git.createTag(slug, newTag); + final createdTagSha = createdTag.sha; // getTag() - var fetchedTag = await github.git.getTag(slug, createdTagSha); + final fetchedTag = await github.git.getTag(slug, createdTagSha); expect(fetchedTag.tag, equals(tagName)); expect(fetchedTag.sha, equals(createdTagSha)); expect(fetchedTag.message, equals('Version 0.0.1')); @@ -136,9 +136,9 @@ void main() { test('query issues', () async { var issues = await github.issues.listByRepo(slug).toList(); - var count = issues.length; + final count = issues.length; - var issueRequest = IssueRequest() + final issueRequest = IssueRequest() ..title = 'new issue - ${_randomGitName()}'; await github.issues.create(slug, issueRequest); @@ -149,7 +149,7 @@ void main() { expect(issues, hasLength(count + 1)); - var issue = issues.first; + final issue = issues.first; expect(issue.title, issueRequest.title); }); @@ -157,7 +157,7 @@ void main() { } String _randomGitName() { - var now = DateTime.now().toIso8601String().replaceAll(':', '_'); + final now = DateTime.now().toIso8601String().replaceAll(':', '_'); return now.toString(); } diff --git a/test/git_test.dart b/test/git_test.dart index 759d9dcb..ac59b237 100644 --- a/test/git_test.dart +++ b/test/git_test.dart @@ -15,12 +15,12 @@ void main() { MockGitHub github; GitService git; RepositorySlug repo; - var someSha = 'someSHA'; + const someSha = 'someSHA'; setUp(() { github = MockGitHub(); git = GitService(github); - repo = RepositorySlug('o', 'n'); + repo = const RepositorySlug('o', 'n'); }); group('getBlob()', () { @@ -34,20 +34,22 @@ void main() { group('createBlob()', () { test('constructs correct path', () { - CreateGitBlob blob = CreateGitBlob('bbb', 'utf-8'); + const CreateGitBlob blob = CreateGitBlob('bbb', 'utf-8'); git.createBlob(repo, blob); - verify(github.postJSON('/repos/o/n/git/blobs', - convert: GitBlob.fromJSON, - statusCode: StatusCodes.CREATED, - body: jsonEncode(blob))); + verify(github.postJSON( + '/repos/o/n/git/blobs', + convert: GitBlob.fromJSON, + statusCode: StatusCodes.CREATED, + body: jsonEncode(blob), + )); }); test('creates valid JSON body', () { - CreateGitBlob blob = CreateGitBlob('bbb', 'utf-8'); + const CreateGitBlob blob = CreateGitBlob('bbb', 'utf-8'); git.createBlob(repo, blob); - var body = captureSentBody(github); + final body = captureSentBody(github); expect(body['content'], equals('bbb')); expect(body['encoding'], equals('utf-8')); }); @@ -64,20 +66,22 @@ void main() { group('createCommit()', () { test('constructs correct path', () { - CreateGitCommit commit = CreateGitCommit('aMessage', 'aTreeSha'); + final CreateGitCommit commit = CreateGitCommit('aMessage', 'aTreeSha'); git.createCommit(repo, commit); - verify(github.postJSON('/repos/o/n/git/commits', - convert: GitCommit.fromJSON, - statusCode: StatusCodes.CREATED, - body: jsonEncode(commit))); + verify(github.postJSON( + '/repos/o/n/git/commits', + convert: GitCommit.fromJSON, + statusCode: StatusCodes.CREATED, + body: jsonEncode(commit), + )); }); test('creates valid JSON body', () { // given - String date = '2014-10-02T15:21:29Z'; + const String date = '2014-10-02T15:21:29Z'; - CreateGitCommit commit = CreateGitCommit('aMessage', 'aTreeSha') + final CreateGitCommit commit = CreateGitCommit('aMessage', 'aTreeSha') ..parents = ['parentSha1', 'parentSha2'] ..committer = GitCommitUser('cName', 'cEmail', parseDateTime(date)) ..author = GitCommitUser('aName', 'aEmail', parseDateTime(date)); @@ -86,7 +90,7 @@ void main() { git.createCommit(repo, commit); // then - var body = captureSentBody(github); + final body = captureSentBody(github); expect(body['message'], equals('aMessage')); expect(body['tree'], equals('aTreeSha')); expect(body['parents'], equals(['parentSha1', 'parentSha2'])); @@ -109,7 +113,7 @@ void main() { }); group('createReference()', () { - var someRef = 'refs/heads/b'; + const someRef = 'refs/heads/b'; test('constructs correct path', () { git.createReference(repo, someRef, someSha); @@ -122,7 +126,7 @@ void main() { test('creates valid JSON body', () { git.createReference(repo, someRef, someSha); - var body = captureSentBody(github); + final body = captureSentBody(github); expect(body['ref'], equals(someRef)); expect(body['sha'], equals(someSha)); }); @@ -131,7 +135,7 @@ void main() { group('editReference()', () { test('constructs correct path', () { // given - http.Response expectedResponse = http.Response('{}', 200); + final http.Response expectedResponse = http.Response('{}', 200); when(github.request(any, any, body: any, headers: any)) .thenReturn(Future.value(expectedResponse)); @@ -146,7 +150,7 @@ void main() { test('creates valid JSON body', () { // given - http.Response expectedResponse = http.Response('{}', 200); + final http.Response expectedResponse = http.Response('{}', 200); when(github.request(any, any, body: any, headers: any)) .thenReturn(Future.value(expectedResponse)); @@ -154,12 +158,15 @@ void main() { git.editReference(repo, 'heads/b', someSha, force: true); // then - var captured = verify( - github.request(any, any, body: captureAny, headers: captureAny)) - .captured; + final List captured = verify(github.request( + any, + any, + body: captureAny, + headers: captureAny, + )).captured; - var body = jsonDecode(captured[0]); - var headers = captured[1]; + final body = jsonDecode(captured[0]); + final headers = captured[1]; expect(body['sha'], equals(someSha)); expect(body['force'], equals(true)); @@ -170,7 +177,7 @@ void main() { group('deleteReference()', () { test('constructs correct path', () { // given - http.Response expectedResponse = http.Response('{}', 200); + final http.Response expectedResponse = http.Response('{}', 200); when(github.request(any, any)).thenReturn(Future.value(expectedResponse)); // when @@ -191,7 +198,7 @@ void main() { }); group('createTag()', () { - var createGitTag = CreateGitTag('v0.0.1', 'a message', someSha, 'commit', + final createGitTag = CreateGitTag('v0.0.1', 'a message', someSha, 'commit', GitCommitUser('aName', 'aEmail', DateTime.now())); test('constructs correct path', () { @@ -206,7 +213,7 @@ void main() { test('creates valid JSON body', () { git.createTag(repo, createGitTag); - var body = captureSentBody(github); + final body = captureSentBody(github); expect(body['tag'], equals('v0.0.1')); expect(body['message'], equals('a message')); expect(body['object'], equals(someSha)); @@ -235,7 +242,7 @@ void main() { group('createTree()', () { test('constructs correct path', () { - var createGitTree = CreateGitTree([]); + final createGitTree = CreateGitTree([]); git.createTree(repo, createGitTree); verify(github.postJSON('/repos/o/n/git/trees', @@ -246,16 +253,16 @@ void main() { test('with sha creates valid JSON body', () { // given - var treeEntry = CreateGitTreeEntry('file.rb', '100644', 'blob', + const treeEntry = CreateGitTreeEntry('file.rb', '100644', 'blob', sha: '44b4fc6d56897b048c772eb4087f854f46256132'); - var tree = CreateGitTree([treeEntry]); + final tree = CreateGitTree([treeEntry]); // when git.createTree(repo, tree); // then - var body = captureSentBody(github); + final body = captureSentBody(github); expect(body['tree'], isNotNull); expect(body['tree'][0]['path'], equals('file.rb')); expect(body['tree'][0]['mode'], equals('100644')); @@ -267,16 +274,16 @@ void main() { test('with content creates valid JSON body', () { // given - var treeEntry = CreateGitTreeEntry('file.rb', '100644', 'blob', + const treeEntry = CreateGitTreeEntry('file.rb', '100644', 'blob', content: 'some file content'); - var tree = CreateGitTree([treeEntry]); + final tree = CreateGitTree([treeEntry]); // when git.createTree(repo, tree); // then - var body = captureSentBody(github); + final body = captureSentBody(github); expect(body['tree'], isNotNull); expect(body['tree'][0]['path'], equals('file.rb')); expect(body['tree'][0]['mode'], equals('100644')); @@ -288,11 +295,13 @@ void main() { } Map captureSentBody(MockGitHub github) { - var bodyString = verify( - github.postJSON(any, convert: any, statusCode: any, body: captureAny)) - .captured - .single; - - var body = jsonDecode(bodyString) as Map; + final bodyString = verify(github.postJSON( + any, + convert: any, + statusCode: any, + body: captureAny, + )).captured.single; + + final body = jsonDecode(bodyString) as Map; return body; } diff --git a/test/helper/http.dart b/test/helper/http.dart index fa4f83af..24ac2c2b 100644 --- a/test/helper/http.dart +++ b/test/helper/http.dart @@ -10,10 +10,10 @@ class MockHTTPClient extends http.BaseClient { @override Future send(http.BaseRequest request) async { - var matchingUrlCreatorKey = responses.keys.firstWhere( + final matchingUrlCreatorKey = responses.keys.firstWhere( (it) => it.allMatches(request.url.toString()).isNotEmpty, orElse: () => null); - var creator = responses[matchingUrlCreatorKey]; + final creator = responses[matchingUrlCreatorKey]; if (creator == null) { throw Exception("No Response Configured"); } @@ -27,13 +27,13 @@ class MockResponse extends http.Response { : super(body, statusCode, headers: headers); factory MockResponse.fromAsset(String name) { - Map responseData = + final Map responseData = jsonDecode(asset("responses/$name.json").readAsStringSync()) as Map; - Map headers = + final Map headers = responseData['headers'] as Map; - dynamic body = responseData['body']; - int statusCode = responseData['statusCode']; + final dynamic body = responseData['body']; + final int statusCode = responseData['statusCode']; String actualBody; if (body is Map || body is List) { actualBody = jsonDecode(body); diff --git a/tool/language_color_generator.dart b/tool/language_color_generator.dart index 59c49fe8..9aad9474 100644 --- a/tool/language_color_generator.dart +++ b/tool/language_color_generator.dart @@ -9,20 +9,20 @@ const _url = 'https://raw.githubusercontent.com/' 'github/linguist/master/lib/linguist/languages.yml'; Future main() async { - var response = await http.Client().get(_url); + final response = await http.Client().get(_url); - var yaml = loadYaml(response.body) as YamlMap; - var stringBuffer = StringBuffer() + final yaml = loadYaml(response.body) as YamlMap; + final stringBuffer = StringBuffer() ..writeln('// GENERATED CODE - DO NOT MODIFY BY HAND') ..writeln('// VERSION OF ${DateTime.now().toIso8601String()}') ..writeln() ..writeln('const languagesColor = {'); - var map = yaml.value as YamlMap; - var languages = map.keys.cast().toList(growable: false)..sort(); + final map = yaml.value as YamlMap; + final languages = map.keys.cast().toList(growable: false)..sort(); - for (var language in languages) { - var color = map[language]['color']?.toString()?.toUpperCase() ?? '#000000'; + for (String language in languages) { + final color = map[language]['color']?.toString()?.toUpperCase() ?? '#000000'; language = language.replaceAll("'", "\\'"); From 556f017c139f768684924b8ca7ed5aae4913f27c Mon Sep 17 00:00:00 2001 From: axel-op <49279289+axel-op@users.noreply.github.com> Date: Wed, 9 Oct 2019 00:03:00 +0200 Subject: [PATCH 078/390] Formatting --- example/common.dart | 3 ++- lib/src/common/model/pulls.dart | 3 ++- tool/language_color_generator.dart | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/example/common.dart b/example/common.dart index db4182c3..f3f270d2 100644 --- a/example/common.dart +++ b/example/common.dart @@ -10,7 +10,8 @@ import "package:github/browser.dart"; Future initViewSourceButton(String script) async { // query the DOM for the view source button, handle clicks document.querySelector("#view-source")?.onClick?.listen((_) { - final WindowBase popup = window.open("view_source.html?script=$script", "View Source"); + final WindowBase popup = + window.open("view_source.html?script=$script", "View Source"); String code; var fetched = false; diff --git a/lib/src/common/model/pulls.dart b/lib/src/common/model/pulls.dart index 5c4daaaa..5b60e57d 100644 --- a/lib/src/common/model/pulls.dart +++ b/lib/src/common/model/pulls.dart @@ -124,7 +124,8 @@ class PullRequest extends PullRequestInformation { static PullRequest fromJSON(Map input) { if (input == null) return null; - final PullRequest pr = PullRequestInformation.fromJSON(input, PullRequest()); + final PullRequest pr = + PullRequestInformation.fromJSON(input, PullRequest()); pr.mergeable = input['mergeable']; pr.merged = input['merged']; pr.id = input['id']; diff --git a/tool/language_color_generator.dart b/tool/language_color_generator.dart index 9aad9474..b2a1cd83 100644 --- a/tool/language_color_generator.dart +++ b/tool/language_color_generator.dart @@ -22,7 +22,8 @@ Future main() async { final languages = map.keys.cast().toList(growable: false)..sort(); for (String language in languages) { - final color = map[language]['color']?.toString()?.toUpperCase() ?? '#000000'; + final color = + map[language]['color']?.toString()?.toUpperCase() ?? '#000000'; language = language.replaceAll("'", "\\'"); From 4fcadb385050295d28245f44c1810c029aa54ded Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Tue, 8 Oct 2019 16:17:08 -0600 Subject: [PATCH 079/390] Make new additions non-breaking --- lib/src/common/repos_service.dart | 157 +++++++++++++++++------------- 1 file changed, 90 insertions(+), 67 deletions(-) diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index dce1a196..1519d900 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -181,13 +181,15 @@ class RepositoriesService extends Service { /// Returns true if it was successfully deleted. /// /// API docs: https://developer.github.com/v3/repos/#delete-a-repository - Future deleteRepository(RepositorySlug slug) async { + Future deleteRepository(RepositorySlug slug) async { ArgumentError.checkNotNull(slug); - await _github.request( - 'DELETE', - '/repos/${slug.fullName}', - statusCode: StatusCodes.NO_CONTENT, - ); + return _github + .request( + 'DELETE', + '/repos/${slug.fullName}', + statusCode: StatusCodes.NO_CONTENT, + ) + .then((response) => response.statusCode == StatusCodes.NO_CONTENT); } /// Lists the contributors of the specified repository. @@ -297,24 +299,28 @@ class RepositoriesService extends Service { return false; } - Future addCollaborator(RepositorySlug slug, String user) async { + Future addCollaborator(RepositorySlug slug, String user) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(user); - return _github.request( - "PUT", - "/repos/${slug.fullName}/collaborators/$user", - statusCode: StatusCodes.NO_CONTENT, - ); + return _github + .request( + "PUT", + "/repos/${slug.fullName}/collaborators/$user", + statusCode: StatusCodes.NO_CONTENT, + ) + .then((response) => response.statusCode == StatusCodes.NO_CONTENT); } - Future removeCollaborator(RepositorySlug slug, String user) async { + Future removeCollaborator(RepositorySlug slug, String user) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(user); - return _github.request( - "DELETE", - "/repos/${slug.fullName}/collaborators/$user", - statusCode: StatusCodes.NO_CONTENT, - ); + return _github + .request( + "DELETE", + "/repos/${slug.fullName}/collaborators/$user", + statusCode: StatusCodes.NO_CONTENT, + ) + .then((response) => response.statusCode == StatusCodes.NO_CONTENT); } /// Returns a list of all comments for a specific commit. @@ -418,14 +424,16 @@ class RepositoriesService extends Service { /// *[id]: id of the comment to delete. /// /// https://developer.github.com/v3/repos/comments/#delete-a-commit-comment - Future deleteCommitComment(RepositorySlug slug, + Future deleteCommitComment(RepositorySlug slug, {@required int id}) async { ArgumentError.checkNotNull(slug); - await _github.request( - "DELETE", - "/repos/${slug.fullName}/comments/$id", - statusCode: StatusCodes.NO_CONTENT, - ); + return _github + .request( + "DELETE", + "/repos/${slug.fullName}/comments/$id", + statusCode: StatusCodes.NO_CONTENT, + ) + .then((response) => response.statusCode == StatusCodes.NO_CONTENT); } /// Lists the commits of the provided repository [slug]. @@ -755,37 +763,43 @@ class RepositoriesService extends Service { /// Triggers a hook with the latest push. /// /// API docs: https://developer.github.com/v3/repos/hooks/#test-a-push-hook - Future testPushHook(RepositorySlug slug, int id) async { + Future testPushHook(RepositorySlug slug, int id) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(id); - await _github.request( - "POST", - "/repos/${slug.fullName}/hooks/$id/tests", - statusCode: StatusCodes.NO_CONTENT, - ); + return _github + .request( + "POST", + "/repos/${slug.fullName}/hooks/$id/tests", + statusCode: StatusCodes.NO_CONTENT, + ) + .then((response) => response.statusCode == StatusCodes.NO_CONTENT); } /// Pings the hook. /// /// API docs: https://developer.github.com/v3/repos/hooks/#ping-a-hook - Future pingHook(RepositorySlug slug, int id) async { + Future pingHook(RepositorySlug slug, int id) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(id); - await _github.request( - "POST", - "/repos/${slug.fullName}/hooks/$id/pings", - statusCode: StatusCodes.NO_CONTENT, - ); + return _github + .request( + "POST", + "/repos/${slug.fullName}/hooks/$id/pings", + statusCode: StatusCodes.NO_CONTENT, + ) + .then((response) => response.statusCode == StatusCodes.NO_CONTENT); } - Future deleteHook(RepositorySlug slug, int id) async { + Future deleteHook(RepositorySlug slug, int id) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(id); - await _github.request( - "DELETE", - "/repos/${slug.fullName}/hooks/$id", - statusCode: StatusCodes.NO_CONTENT, - ); + return _github + .request( + "DELETE", + "/repos/${slug.fullName}/hooks/$id", + statusCode: StatusCodes.NO_CONTENT, + ) + .then((response) => response.statusCode == StatusCodes.NO_CONTENT); } // TODO: Implement other hook methods: https://developer.github.com/v3/repos/hooks/ @@ -817,20 +831,23 @@ class RepositoriesService extends Service { ); } + /// Adds a deploy key for a repository by passing in the title and key as strings. + /// + /// API docs: https://developer.github.com/v3/repos/keys/#create + Future createDeployKeyFromStrings(RepositorySlug slug, + {@required String title, @required String key}) async => + createDeployKey(slug, CreatePublicKey(title, key)); + /// Adds a deploy key for a repository. /// /// API docs: https://developer.github.com/v3/repos/keys/#create - Future createDeployKey(RepositorySlug slug, - {@required String title, @required String key}) async { + Future createDeployKey( + RepositorySlug slug, CreatePublicKey key) async { ArgumentError.checkNotNull(slug); - ArgumentError.checkNotNull(title); ArgumentError.checkNotNull(key); return _github.postJSON, PublicKey>( "/repos/${slug.fullName}/keys", - body: jsonEncode({ - "title": title, - "key": key, - }), + body: key.toJSON(), statusCode: StatusCodes.CREATED, convert: (i) => PublicKey.fromJSON(i), ); @@ -839,15 +856,17 @@ class RepositoriesService extends Service { /// Delete a deploy key. /// /// https://developer.github.com/v3/repos/keys/#delete - Future deleteDeployKey( + Future deleteDeployKey( {@required RepositorySlug slug, @required PublicKey key}) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(key); - await _github.request( - "DELETE", - "/repos/${slug.fullName}/keys/${key.id}", - statusCode: StatusCodes.NO_CONTENT, - ); + return _github + .request( + "DELETE", + "/repos/${slug.fullName}/keys/${key.id}", + statusCode: StatusCodes.NO_CONTENT, + ) + .then((response) => response.statusCode == StatusCodes.NO_CONTENT); } /// Merges a branch in the specified repository. @@ -1019,14 +1038,16 @@ class RepositoriesService extends Service { /// Delete the release. /// /// API docs: https://developer.github.com/v3/repos/releases/#delete-a-release - Future deleteRelease(RepositorySlug slug, Release release) async { + Future deleteRelease(RepositorySlug slug, Release release) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(release); - await _github.request( - "DELETE", - "/repos/${slug.fullName}/releases/${release.id}", - statusCode: StatusCodes.NO_CONTENT, - ); + return _github + .request( + "DELETE", + "/repos/${slug.fullName}/releases/${release.id}", + statusCode: StatusCodes.NO_CONTENT, + ) + .then((response) => response.statusCode == StatusCodes.NO_CONTENT); } /// Lists assets for a release. @@ -1084,15 +1105,17 @@ class RepositoriesService extends Service { /// Delete a release asset. /// /// API docs: https://developer.github.com/v3/repos/releases/#delete-a-release-asset - Future deleteReleaseAsset( + Future deleteReleaseAsset( RepositorySlug slug, ReleaseAsset asset) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(asset); - await _github.request( - "DELETE", - "/repos/${slug.fullName}/releases/assets/${asset.id}", - statusCode: StatusCodes.NO_CONTENT, - ); + return _github + .request( + "DELETE", + "/repos/${slug.fullName}/releases/assets/${asset.id}", + statusCode: StatusCodes.NO_CONTENT, + ) + .then((response) => response.statusCode == StatusCodes.NO_CONTENT); } Future> uploadReleaseAssets( From 94c5cae3b7d7b04abb3f5a4a5963116b2650088e Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Tue, 8 Oct 2019 19:59:08 -0600 Subject: [PATCH 080/390] Include Flutter in the README --- README.md | 66 ++++++++++++++++++++++--------------------------------- 1 file changed, 26 insertions(+), 40 deletions(-) diff --git a/README.md b/README.md index bea1d5e3..7f173358 100644 --- a/README.md +++ b/README.md @@ -3,32 +3,26 @@ ![](https://github.com/SpinlockLabs/github.dart/workflows/Dart%20CI/badge.svg) [![Pub](https://img.shields.io/pub/v/github.svg)](https://pub.dartlang.org/packages/github) -This is a Client Library for GitHub in Dart. I wrote this out of necessity, and then when I got a great reaction from the Dart community, I decided to put a lot of effort into it. +This is a library for interacting with GitHub in Dart. It works on all platforms including web, server, and Flutter. +Please submit issues and pull requests, help out, or just give encouragement. -Please submit issues and pull requests, help out, or just give me encouragement. - -**Notice**: We are looking for contributors. If you're interested, join us in https://gitter.im/SpinlockLabs/community - -## Links - -- [Library Demos](http://github.directcode.org/demos/) -- [Pub Package](https://pub.dartlang.org/packages/github) -- [Wiki](https://github.com/DirectMyFile/github.dart/wiki) +**Notice**: We are looking for contributors. If you're interested or have questions, join the chat at https://gitter.im/SpinlockLabs/community ## Features -### Current - -- Works on the Server and in the Browser +- Works on the Server, Browser, and Flutter - Really Fast - Plugable API - Supports Authentication - Builtin OAuth2 Flow - Hook Server Helper -### Work in Progress +## Links -- Support all the GitHub APIs (Progress: 98%) +- [Library Demos](http://github.directcode.org/demos/) +- [Pub Package](https://pub.dartlang.org/packages/github) +- [Wiki](https://github.com/DirectMyFile/github.dart/wiki) +- [Latest API reference](https://pub.dev/documentation/github/latest/) ## Getting Started @@ -39,42 +33,34 @@ dependencies: github: ^5.0.0 ``` -Then import the library and use it: +Then import the library -**For the Server** +For the browser use: ```dart -import 'package:github/server.dart'; +import 'package:github/browser.dart'; +``` -void main() { - /* Creates a GitHub Client */ - var github = createGitHubClient(); - - github.repositories.getRepository(new RepositorySlug("DirectMyFile", "github.dart")).then((Repository repo) { - /* Do Something */ - }); -} +and for the server or Flutter use: +```dart +import 'package:github/server.dart'; ``` -**For the Browser** +and then use it: + +**Example** ```dart import 'package:github/browser.dart'; -void main() { - /* Creates a GitHub Client */ +void main() async { + /* Create a GitHub Client */ var github = createGitHubClient(); - - github.repositories.getRepository(new RepositorySlug("DirectMyFile", "github.dart")).then((Repository repo) { - /* Do Something */ - }); -} -``` -## Authentication + /* or Create a GitHub Client using an auth token */ + var github = createGitHubClient(auth: new Authentication.withToken("YourTokenHere")); -To use a GitHub token: - -```dart -var github = createGitHubClient(auth: new Authentication.withToken("YourTokenHere")); + Repository repo = await github.repositories.getRepository(new RepositorySlug("user_or_org", "repo_name")); + /* Do Something with repo */ +} ``` ## Contacting Us From 44e698551719025dda8ddc88421ee1020362328a Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Fri, 11 Oct 2019 22:11:38 -0600 Subject: [PATCH 081/390] keep createDeployKey the same as it was --- lib/src/common/repos_service.dart | 7 ------- 1 file changed, 7 deletions(-) diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 1519d900..59bd2970 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -831,13 +831,6 @@ class RepositoriesService extends Service { ); } - /// Adds a deploy key for a repository by passing in the title and key as strings. - /// - /// API docs: https://developer.github.com/v3/repos/keys/#create - Future createDeployKeyFromStrings(RepositorySlug slug, - {@required String title, @required String key}) async => - createDeployKey(slug, CreatePublicKey(title, key)); - /// Adds a deploy key for a repository. /// /// API docs: https://developer.github.com/v3/repos/keys/#create From bfa72e72abc68fb9baddbfd83b7e2c42ae86fc58 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Fri, 11 Oct 2019 22:27:30 -0600 Subject: [PATCH 082/390] update changelog for 5.4.0 --- CHANGELOG.md | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 80a9997c..6bdda48b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,14 +1,15 @@ -## v.6.0.0 - - All remaining methods in repos_service.dart (accessible via the getter `repositories` from `GitHub` client class) have been implemented. - - **BREAKING**: methods `deleteRepository`, `addCollaborator`, `removeCollaborator`, `testPushHook`, `pingHook`, and `deleteHook` now return a `Future` instead of a `Future`. - - **BREAKING**: parameters of method `createDeployKey` have been modified. - - `targetCommitsh` field in `Release` class is deprecated. Use the new `targetCommitish` instead. +## v5.4.0 + +- All remaining methods in repos_service.dart (accessible via the getter `repositories` from `GitHub` client class) have been implemented. `isCollaborator`, `listSingleCommitComments`, `listCommitComments`, `createCommitComment`, `getComment`, `updateComment`, `deleteComment` + ## v5.3.0 + - Add the ability to upload release assets. -- Add the ability to get an existing release by tag name. +- Add the ability to get an existing release by tag name. + +Deprecations: -Deprecations: - The `draft` and `prerelease` properties in the CreateRelease and Release - classes have been renamed to `isDraft` and `isPrerelease` for clarity. - Release.targetCommitsh has been renamed to Release.targetCommitish. @@ -17,6 +18,7 @@ has been renamed to `createRelease`. - `RepositoriesService.getRelease` has been renamed to `RepositoriesService.getReleaseById` ## v5.2.0 + - Add access to labels on Pull Requests https://github.com/DirectMyFile/github.dart/pull/163 - Adding draft property to PR model https://github.com/DirectMyFile/github.dart/pull/162 - updateFile request must be a PUT https://github.com/DirectMyFile/github.dart/pull/160 From 4bce1ac48a84ae2d8620db85b5327bb06eb54322 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sat, 12 Oct 2019 13:03:16 -0600 Subject: [PATCH 083/390] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6bdda48b..0729dacb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,5 @@ ## v5.4.0 - +- Implement rate-limiting https://github.com/SpinlockLabs/github.dart/pull/172 - All remaining methods in repos_service.dart (accessible via the getter `repositories` from `GitHub` client class) have been implemented. `isCollaborator`, `listSingleCommitComments`, `listCommitComments`, `createCommitComment`, `getComment`, `updateComment`, `deleteComment` From 269d91edeacc458e0598ed3bf9848399f6897ba8 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sat, 12 Oct 2019 14:20:08 -0600 Subject: [PATCH 084/390] Setup an issue triage workflow --- .github/workflows/triage.yml | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 .github/workflows/triage.yml diff --git a/.github/workflows/triage.yml b/.github/workflows/triage.yml new file mode 100644 index 00000000..1e25d91d --- /dev/null +++ b/.github/workflows/triage.yml @@ -0,0 +1,29 @@ +name: Triage Issues +on: + issues: + types: [opened] + +jobs: + assignRob: + name: Assign Rob + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - name: Assign Rob + uses: actions/github@v1.0.0 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + args: assign @robrbecker + - name: Apply triage label + uses: actions/github@v1.0.0 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + args: label triage + - name: Comment On New Issues + uses: actions/github@v1.0.0 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + args: comment "Thanks for submitting an issue! @robrbecker will take a look soon!" From 88dd7ee31aedc6f759bf23db84e022f72c989450 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Mon, 14 Oct 2019 21:55:13 -0600 Subject: [PATCH 085/390] Fix to correctly return Future --- lib/src/common/issues_service.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/src/common/issues_service.dart b/lib/src/common/issues_service.dart index 1bb839d9..a9fc5a6f 100644 --- a/lib/src/common/issues_service.dart +++ b/lib/src/common/issues_service.dart @@ -128,7 +128,8 @@ class IssuesService extends Service { /// Edit an issue. /// /// API docs: https://developer.github.com/v3/issues/#edit-an-issue - Future edit(RepositorySlug slug, int issueNumber, IssueRequest issue) { + Future edit( + RepositorySlug slug, int issueNumber, IssueRequest issue) async { return _github .request("PATCH", '/repos/${slug.fullName}/issues/$issueNumber', body: issue.toJSON()) From 6a50bc976f6cf9e9c2a8941eb346c2895891cf00 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Mon, 14 Oct 2019 22:00:28 -0600 Subject: [PATCH 086/390] remove cast --- lib/src/common/issues_service.dart | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/src/common/issues_service.dart b/lib/src/common/issues_service.dart index a9fc5a6f..3a107a4a 100644 --- a/lib/src/common/issues_service.dart +++ b/lib/src/common/issues_service.dart @@ -133,9 +133,8 @@ class IssuesService extends Service { return _github .request("PATCH", '/repos/${slug.fullName}/issues/$issueNumber', body: issue.toJSON()) - .then((response) { - return Issue.fromJSON(jsonDecode(response.body) as Map) - as Future; + .then((response) { + return Issue.fromJSON(jsonDecode(response.body) as Map); }); } From 76085a6e3181b080d0b257f43b9ded05cea5b430 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Tue, 15 Oct 2019 11:43:17 -0600 Subject: [PATCH 087/390] Prep 5.4.0 release --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0729dacb..dda3dfdf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,8 @@ ## v5.4.0 - Implement rate-limiting https://github.com/SpinlockLabs/github.dart/pull/172 +- Back off when server fails (HTTP 50x) https://github.com/SpinlockLabs/github.dart/pull/173 - All remaining methods in repos_service.dart (accessible via the getter `repositories` from `GitHub` client class) have been implemented. `isCollaborator`, `listSingleCommitComments`, `listCommitComments`, `createCommitComment`, `getComment`, `updateComment`, `deleteComment` - ## v5.3.0 - Add the ability to upload release assets. From 2acc399b0bb75b6cc37ea141f001bce6988e641c Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Tue, 15 Oct 2019 11:55:58 -0600 Subject: [PATCH 088/390] update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index dda3dfdf..2ec42dd1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ - Implement rate-limiting https://github.com/SpinlockLabs/github.dart/pull/172 - Back off when server fails (HTTP 50x) https://github.com/SpinlockLabs/github.dart/pull/173 - All remaining methods in repos_service.dart (accessible via the getter `repositories` from `GitHub` client class) have been implemented. `isCollaborator`, `listSingleCommitComments`, `listCommitComments`, `createCommitComment`, `getComment`, `updateComment`, `deleteComment` +- Fixed issues.get to correctly return Future https://github.com/SpinlockLabs/github.dart/pull/180 ## v5.3.0 From c1208cad78b6ae544480398d032415eb6c00680b Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Tue, 15 Oct 2019 12:20:15 -0600 Subject: [PATCH 089/390] Update pubspec.yaml --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index bf4aaacd..631006e4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 5.3.0 +version: 5.4.0 author: Kenneth Endfinger description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/DirectMyFile/github.dart From f609b14d43a76794d501d9ff1337996fcac0b837 Mon Sep 17 00:00:00 2001 From: Caijinglong Date: Fri, 18 Oct 2019 16:49:17 +0800 Subject: [PATCH 090/390] Imitate the way http is written, let the createGitHubClient method work on dart vm, flutter and web. --- lib/github.dart | 11 +++++++++++ lib/github_stub.dart | 6 ++++++ 2 files changed, 17 insertions(+) create mode 100644 lib/github.dart create mode 100644 lib/github_stub.dart diff --git a/lib/github.dart b/lib/github.dart new file mode 100644 index 00000000..35fd01a9 --- /dev/null +++ b/lib/github.dart @@ -0,0 +1,11 @@ +/// The code come from https://github.com/dart-lang/http/blob/9a17157e6a71972f929a95c6b2b36992e5e02c6d/lib/src/client.dart#L11-L16 + +// ignore: uri_does_not_exist +// ignore: +export 'github_stub.dart' +// ignore: uri_does_not_exist + if (dart.library.html) 'browser.dart' +// ignore: uri_does_not_exist + if (dart.library.io) 'server.dart'; + +export 'src/common.dart'; diff --git a/lib/github_stub.dart b/lib/github_stub.dart new file mode 100644 index 00000000..8d45f487 --- /dev/null +++ b/lib/github_stub.dart @@ -0,0 +1,6 @@ +import 'src/common.dart'; + +GitHub createGitHubClient( + {Authentication auth, String endpoint = "https://api.github.com"}) => + throw UnsupportedError( + 'Cannot create a client without dart:html or dart:io.'); From 4f50e361a69e0e3234cd7e619e03485300d4eca0 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Mon, 21 Oct 2019 08:54:32 -0600 Subject: [PATCH 091/390] move github_stub.dart into src --- CHANGELOG.md | 5 +++++ lib/github.dart | 15 ++++++--------- lib/{ => src}/github_stub.dart | 0 pubspec.yaml | 2 +- 4 files changed, 12 insertions(+), 10 deletions(-) rename lib/{ => src}/github_stub.dart (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ec42dd1..8aa40b53 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,9 @@ +## v5.5.0 + +- Provide a single platform independent import `import 'package:github/githb.dart';` + ## v5.4.0 + - Implement rate-limiting https://github.com/SpinlockLabs/github.dart/pull/172 - Back off when server fails (HTTP 50x) https://github.com/SpinlockLabs/github.dart/pull/173 - All remaining methods in repos_service.dart (accessible via the getter `repositories` from `GitHub` client class) have been implemented. `isCollaborator`, `listSingleCommitComments`, `listCommitComments`, `createCommitComment`, `getComment`, `updateComment`, `deleteComment` diff --git a/lib/github.dart b/lib/github.dart index 35fd01a9..d0472b38 100644 --- a/lib/github.dart +++ b/lib/github.dart @@ -1,11 +1,8 @@ -/// The code come from https://github.com/dart-lang/http/blob/9a17157e6a71972f929a95c6b2b36992e5e02c6d/lib/src/client.dart#L11-L16 +/// The code inspired by the http package from +/// https://github.com/dart-lang/http/blob/9a17157e6a71972f929a95c6b2b36992e5e02c6d/lib/src/client.dart#L11-L16 -// ignore: uri_does_not_exist -// ignore: -export 'github_stub.dart' -// ignore: uri_does_not_exist - if (dart.library.html) 'browser.dart' -// ignore: uri_does_not_exist - if (dart.library.io) 'server.dart'; +export 'package:github/src/github_stub.dart' + if (dart.library.html) 'package:github/browser.dart' + if (dart.library.io) 'package:github/server.dart'; -export 'src/common.dart'; +export 'package:github/src/common.dart'; diff --git a/lib/github_stub.dart b/lib/src/github_stub.dart similarity index 100% rename from lib/github_stub.dart rename to lib/src/github_stub.dart diff --git a/pubspec.yaml b/pubspec.yaml index 631006e4..551a0259 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 5.4.0 +version: 5.5.0-dev author: Kenneth Endfinger description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/DirectMyFile/github.dart From f45596901f3fc2970ba944f3b6faa08c6208bcad Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Mon, 21 Oct 2019 09:00:05 -0600 Subject: [PATCH 092/390] fix import in github_stub.dart --- lib/src/github_stub.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/github_stub.dart b/lib/src/github_stub.dart index 8d45f487..25754b64 100644 --- a/lib/src/github_stub.dart +++ b/lib/src/github_stub.dart @@ -1,4 +1,4 @@ -import 'src/common.dart'; +import 'package:github/src/common.dart'; GitHub createGitHubClient( {Authentication auth, String endpoint = "https://api.github.com"}) => From 086695de75cc2c6a8fe79afa8cc3d2f78e7510ba Mon Sep 17 00:00:00 2001 From: AlexVincent525 Date: Wed, 23 Oct 2019 14:25:04 +0800 Subject: [PATCH 093/390] Implemented `markThreadRead`. --- lib/src/common/activity_service.dart | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/src/common/activity_service.dart b/lib/src/common/activity_service.dart index fc135b4c..f4ba2335 100644 --- a/lib/src/common/activity_service.dart +++ b/lib/src/common/activity_service.dart @@ -180,7 +180,14 @@ class ActivityService extends Service { _github.getJSON("/notification/threads/$threadId", statusCode: StatusCodes.OK, convert: Notification.fromJSON); - // TODO: Implement markThreadRead: https://developer.github.com/v3/activity/notifications/#mark-a-thread-as-read + /// Mark the specified notification thread as read. + /// + /// API docs: https://developer.github.com/v3/activity/notifications/#mark-a-thread-as-read + Future markThreadRead(String threadId) => + _github.request("PATCH", "/notifications/thread/$threadId").then((response) { + return response.statusCode == StatusCodes.RESET_CONTENT; + }); + // TODO: Implement getThreadSubscription: https://developer.github.com/v3/activity/notifications/#get-a-thread-subscription // TODO: Implement setThreadSubscription: https://developer.github.com/v3/activity/notifications/#set-a-thread-subscription // TODO: Implement deleteThreadSubscription: https://developer.github.com/v3/activity/notifications/#delete-a-thread-subscription From 97db96109591dc39b1cfb4ca6ffac61047c372ed Mon Sep 17 00:00:00 2001 From: AlexVincent525 Date: Wed, 23 Oct 2019 14:29:18 +0800 Subject: [PATCH 094/390] Fix invalid uri `thread` to `threads` --- lib/src/common/activity_service.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/common/activity_service.dart b/lib/src/common/activity_service.dart index f4ba2335..2fdd1a13 100644 --- a/lib/src/common/activity_service.dart +++ b/lib/src/common/activity_service.dart @@ -184,7 +184,7 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/notifications/#mark-a-thread-as-read Future markThreadRead(String threadId) => - _github.request("PATCH", "/notifications/thread/$threadId").then((response) { + _github.request("PATCH", "/notifications/threads/$threadId").then((response) { return response.statusCode == StatusCodes.RESET_CONTENT; }); From bc5b6921d53209bacf98923b79bf55e4b9909719 Mon Sep 17 00:00:00 2001 From: AlexVincent525 Date: Wed, 23 Oct 2019 14:32:52 +0800 Subject: [PATCH 095/390] Fix invalid uri `thread` to `threads` && 205. --- lib/src/common/activity_service.dart | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/src/common/activity_service.dart b/lib/src/common/activity_service.dart index 2fdd1a13..8a805d0b 100644 --- a/lib/src/common/activity_service.dart +++ b/lib/src/common/activity_service.dart @@ -183,10 +183,14 @@ class ActivityService extends Service { /// Mark the specified notification thread as read. /// /// API docs: https://developer.github.com/v3/activity/notifications/#mark-a-thread-as-read - Future markThreadRead(String threadId) => - _github.request("PATCH", "/notifications/threads/$threadId").then((response) { - return response.statusCode == StatusCodes.RESET_CONTENT; - }); + Future markThreadRead(String threadId) { + return _github + .request("PATCH", "/notifications/threads/$threadId") + .then((response) { + return response.statusCode == 205; + }); + } + // TODO: Implement getThreadSubscription: https://developer.github.com/v3/activity/notifications/#get-a-thread-subscription // TODO: Implement setThreadSubscription: https://developer.github.com/v3/activity/notifications/#set-a-thread-subscription From f900eb9b6a8b25607fc937559baf71654bebfdb9 Mon Sep 17 00:00:00 2001 From: Alex Vincent Date: Thu, 24 Oct 2019 09:14:19 +0800 Subject: [PATCH 096/390] Update lib/src/common/activity_service.dart Co-Authored-By: Rob Becker --- lib/src/common/activity_service.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/common/activity_service.dart b/lib/src/common/activity_service.dart index 8a805d0b..9a8a50a7 100644 --- a/lib/src/common/activity_service.dart +++ b/lib/src/common/activity_service.dart @@ -187,7 +187,7 @@ class ActivityService extends Service { return _github .request("PATCH", "/notifications/threads/$threadId") .then((response) { - return response.statusCode == 205; + return response.statusCode == StatusCodes.RESET_CONTENT; }); } From abe69bb0ff4cf702da706f578967d3cd8d1730ca Mon Sep 17 00:00:00 2001 From: AlexVincent525 Date: Fri, 25 Oct 2019 11:01:20 +0800 Subject: [PATCH 097/390] Fix wrong service with list received by user. --- lib/src/common/activity_service.dart | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/src/common/activity_service.dart b/lib/src/common/activity_service.dart index 9a8a50a7..e61fd8c0 100644 --- a/lib/src/common/activity_service.dart +++ b/lib/src/common/activity_service.dart @@ -80,13 +80,13 @@ class ActivityService extends Service { EventPoller pollEventsForOrganization(String name) => EventPoller(_github, "/orgs/$name/events"); - /// Returns an [EventPoller] for events performed by a user. + /// Returns an [EventPoller] for events received by a user. /// /// API docs: https://developer.github.com/v3/activity/events/#list-events-that-a-user-has-received EventPoller pollEventsReceivedByUser(String user) => - EventPoller(_github, "/users/$user/events"); + EventPoller(_github, "/users/$user/received_events"); - /// Returns an [EventPoller] for events performed by a user. + /// Returns an [EventPoller] for public events received by a user. /// /// API docs: https://developer.github.com/v3/activity/events/#list-public-events-that-a-user-has-received EventPoller pollPublicEventsReceivedByUser(String user) => @@ -191,7 +191,6 @@ class ActivityService extends Service { }); } - // TODO: Implement getThreadSubscription: https://developer.github.com/v3/activity/notifications/#get-a-thread-subscription // TODO: Implement setThreadSubscription: https://developer.github.com/v3/activity/notifications/#set-a-thread-subscription // TODO: Implement deleteThreadSubscription: https://developer.github.com/v3/activity/notifications/#delete-a-thread-subscription From 6235707b7e883be052729cd50df40e04ce27469b Mon Sep 17 00:00:00 2001 From: AlexVincent525 Date: Fri, 25 Oct 2019 14:18:43 +0800 Subject: [PATCH 098/390] `repos` -> `users` --- lib/src/common/activity_service.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/common/activity_service.dart b/lib/src/common/activity_service.dart index e61fd8c0..7f55e653 100644 --- a/lib/src/common/activity_service.dart +++ b/lib/src/common/activity_service.dart @@ -90,7 +90,7 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/events/#list-public-events-that-a-user-has-received EventPoller pollPublicEventsReceivedByUser(String user) => - EventPoller(_github, "/repos/$user/received_events/public"); + EventPoller(_github, "/users/$user/received_events/public"); /// Lists the events performed by a user. /// From 4aa3cf56b79ddfdfb49cbea0d0bba384e8aefa42 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sat, 26 Oct 2019 13:10:11 -0600 Subject: [PATCH 099/390] Fixes https://github.com/SpinlockLabs/github.dart/issues/187 --- lib/src/common/activity_service.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/common/activity_service.dart b/lib/src/common/activity_service.dart index 7f55e653..31389f4d 100644 --- a/lib/src/common/activity_service.dart +++ b/lib/src/common/activity_service.dart @@ -344,7 +344,7 @@ class EventPoller { _lastFetched = response.headers['ETag']; - final json = jsonDecode(response.body) as List>; + final json = List>.from(jsonDecode(response.body)); if (!(onlyNew && _timer == null)) { for (final item in json) { From 0f08f8dcd30f022025614a43abe19dac21d4f8f5 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sat, 26 Oct 2019 13:21:24 -0600 Subject: [PATCH 100/390] update changelog with recent merges --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8aa40b53..63d3eb44 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ ## v5.5.0 - Provide a single platform independent import `import 'package:github/githb.dart';` +- Implement markThreadRead https://github.com/SpinlockLabs/github.dart/pull/185 +- Fix for activity service https://github.com/SpinlockLabs/github.dart/issues/187 ## v5.4.0 From 66309ebd37e270b70239448a96910ebaa74ef8c2 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sun, 27 Oct 2019 13:09:55 -0600 Subject: [PATCH 101/390] Refactor to a single cross platform library --- CHANGELOG.md | 124 ++-- CONTRIBUTING.md | 2 +- README.md | 6 +- analysis_options.yaml | 806 ++++++++++++++++++++- example/common.dart | 31 +- example/emoji.dart | 24 +- example/languages.dart | 24 +- example/markdown.dart | 7 +- example/markdown.html | 4 +- example/organization.dart | 10 +- example/organization.html | 2 +- example/readme.dart | 12 +- example/releases.dart | 28 +- example/repos.dart | 44 +- example/search.dart | 3 +- example/search.html | 2 +- example/stars.dart | 36 +- example/status.dart | 14 +- example/user_info.dart | 46 +- example/users.dart | 29 +- example/zen.dart | 8 +- lib/browser.dart | 21 - lib/browser_helper.dart | 39 + lib/github.dart | 11 +- lib/server.dart | 68 -- lib/src/browser/helper.dart | 43 -- lib/src/browser/xplat_browser.dart | 44 ++ lib/src/common.dart | 125 ++-- lib/src/common.g.dart | 429 ----------- lib/src/common/activity_service.dart | 136 ++-- lib/src/common/authorizations_service.dart | 8 +- lib/src/common/gists_service.dart | 33 +- lib/src/common/git_service.dart | 32 +- lib/src/common/github.dart | 27 +- lib/src/common/issues_service.dart | 56 +- lib/src/common/misc_service.dart | 20 +- lib/src/common/model/activity.dart | 5 +- lib/src/common/model/authorizations.dart | 6 +- lib/src/common/model/gists.dart | 6 +- lib/src/common/model/git.dart | 8 +- lib/src/common/model/git.g.dart | 128 ++++ lib/src/common/model/issues.dart | 6 +- lib/src/common/model/keys.dart | 3 +- lib/src/common/model/misc.dart | 3 +- lib/src/common/model/notifications.dart | 4 +- lib/src/common/model/orgs.dart | 6 +- lib/src/common/model/orgs.g.dart | 62 ++ lib/src/common/model/pulls.dart | 6 +- lib/src/common/model/repos.dart | 6 +- lib/src/common/model/repos.g.dart | 195 +++++ lib/src/common/model/repos_commits.dart | 5 +- lib/src/common/model/repos_contents.dart | 7 +- lib/src/common/model/repos_contents.g.dart | 21 + lib/src/common/model/repos_forks.dart | 3 +- lib/src/common/model/repos_hooks.dart | 4 +- lib/src/common/model/repos_merging.dart | 4 +- lib/src/common/model/repos_pages.dart | 5 +- lib/src/common/model/repos_stats.dart | 6 +- lib/src/common/model/repos_stats.g.dart | 32 + lib/src/common/model/repos_statuses.dart | 5 +- lib/src/common/model/search.dart | 5 +- lib/src/common/model/search.g.dart | 26 + lib/src/common/orgs_service.dart | 61 +- lib/src/common/pulls_service.dart | 28 +- lib/src/common/repos_service.dart | 169 ++--- lib/src/common/search_service.dart | 20 +- lib/src/common/url_shortener_service.dart | 7 +- lib/src/common/users_service.dart | 42 +- lib/src/common/util/auth.dart | 2 - lib/src/common/util/crawler.dart | 3 +- lib/src/common/util/errors.dart | 2 +- lib/src/common/util/json.dart | 2 - lib/src/common/util/oauth2.dart | 6 +- lib/src/common/util/service.dart | 6 +- lib/src/common/util/utils.dart | 3 +- lib/src/common/xplat_common.dart | 17 + lib/src/const/token_env_keys.dart | 8 + lib/src/server/xplat_server.dart | 31 + pubspec.yaml | 10 +- test/assets/responses/repository.json | 4 +- test/code_search_test.dart | 4 +- test/data_object_test.dart | 2 +- test/experiment/api_urls.dart | 8 +- test/experiment/crawler.dart | 4 +- test/experiment/error_handling.dart | 6 +- test/experiment/files.dart | 4 +- test/experiment/orglist.dart | 4 +- test/experiment/polling.dart | 4 +- test/experiment/public_repos.dart | 4 +- test/experiment/readme.dart | 6 +- test/experiment/search.dart | 4 +- test/experiment/wisdom.dart | 4 +- test/git_integration_test.dart | 7 +- test/git_test.dart | 2 - test/helper.dart | 17 +- test/helper/assets.dart | 2 +- test/helper/expect.dart | 3 +- test/helper/http.dart | 4 +- test/util_test.dart | 11 +- 99 files changed, 2176 insertions(+), 1266 deletions(-) delete mode 100644 lib/browser.dart create mode 100644 lib/browser_helper.dart delete mode 100644 lib/server.dart delete mode 100644 lib/src/browser/helper.dart create mode 100644 lib/src/browser/xplat_browser.dart delete mode 100644 lib/src/common.g.dart create mode 100644 lib/src/common/model/git.g.dart create mode 100644 lib/src/common/model/orgs.g.dart create mode 100644 lib/src/common/model/repos.g.dart create mode 100644 lib/src/common/model/repos_contents.g.dart create mode 100644 lib/src/common/model/repos_stats.g.dart create mode 100644 lib/src/common/model/search.g.dart create mode 100644 lib/src/common/xplat_common.dart create mode 100644 lib/src/const/token_env_keys.dart create mode 100644 lib/src/server/xplat_server.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index 63d3eb44..aafd6e85 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,23 +27,23 @@ has been renamed to `createRelease`. ## v5.2.0 - - Add access to labels on Pull Requests https://github.com/DirectMyFile/github.dart/pull/163 - - Adding draft property to PR model https://github.com/DirectMyFile/github.dart/pull/162 - - updateFile request must be a PUT https://github.com/DirectMyFile/github.dart/pull/160 + - Add access to labels on Pull Requests https://github.com/SpinlockLabs/github.dart/pull/163 + - Adding draft property to PR model https://github.com/SpinlockLabs/github.dart/pull/162 + - updateFile request must be a PUT https://github.com/SpinlockLabs/github.dart/pull/160 ## v5.1.0 - `Repository`: added `updatedAt` and `license` fields. - Require at least Dart `2.3.0`. - Bump version constraint on `json_annotation` - - Add contents_url to PullRequestFile https://github.com/DirectMyFile/github.dart/pull/159 + - Add contents_url to PullRequestFile https://github.com/SpinlockLabs/github.dart/pull/159 ## v5.0.2 - - Fixed pollPublicEventsReceivedByUser to use the correct API URL https://github.com/DirectMyFile/github.dart/pull/150 + - Fixed pollPublicEventsReceivedByUser to use the correct API URL https://github.com/SpinlockLabs/github.dart/pull/150 ## v5.0.1 - - Fixed a runtime exception (https://github.com/DirectMyFile/github.dart/issues/139) - - Added an optional `base` argument when editing a PR (https://github.com/DirectMyFile/github.dart/pull/145) + - Fixed a runtime exception (https://github.com/SpinlockLabs/github.dart/issues/139) + - Added an optional `base` argument when editing a PR (https://github.com/SpinlockLabs/github.dart/pull/145) ## v5.0.0 @@ -142,87 +142,87 @@ has been renamed to `createRelease`. - Markdown Generation Library ## v1.3.0 -- [Button Tweaks](https://github.com/DirectMyFile/github.dart/commit/5f4b5caee79758a9a2ea9eeac1521836d95eb9bd) -- [Added Emoji Searches](https://github.com/DirectMyFile/github.dart/commit/8ca46c665f844794dca56aa4eeaab5e2c9d2c245) -- [Combined all Less stylesheets into one](https://github.com/DirectMyFile/github.dart/commit/dd786c4342d70533c2d5446b33888bb42fac40e8) -- [Dates Library Cleanup](https://github.com/DirectMyFile/github.dart/commit/0518a3b0ae072e481fc1579c91c5280ff1978821) -- [String to represent Unix timestamps](https://github.com/DirectMyFile/github.dart/commit/cf93c0fe6790a27c6bbf14f1c7d64f7b6eab5247) -- [Fix date/time parsing](https://github.com/DirectMyFile/github.dart/commit/a6e459ae16a40c2c1f12cace6d84a60dd97b3332) -- [Slack Notifications for TravisCI](https://github.com/DirectMyFile/github.dart/commit/de08f8718d5a90a369cf9edf0d0f90c22ccb1e2a) +- [Button Tweaks](https://github.com/SpinlockLabs/github.dart/commit/5f4b5caee79758a9a2ea9eeac1521836d95eb9bd) +- [Added Emoji Searches](https://github.com/SpinlockLabs/github.dart/commit/8ca46c665f844794dca56aa4eeaab5e2c9d2c245) +- [Combined all Less stylesheets into one](https://github.com/SpinlockLabs/github.dart/commit/dd786c4342d70533c2d5446b33888bb42fac40e8) +- [Dates Library Cleanup](https://github.com/SpinlockLabs/github.dart/commit/0518a3b0ae072e481fc1579c91c5280ff1978821) +- [String to represent Unix timestamps](https://github.com/SpinlockLabs/github.dart/commit/cf93c0fe6790a27c6bbf14f1c7d64f7b6eab5247) +- [Fix date/time parsing](https://github.com/SpinlockLabs/github.dart/commit/a6e459ae16a40c2c1f12cace6d84a60dd97b3332) +- [Slack Notifications for TravisCI](https://github.com/SpinlockLabs/github.dart/commit/de08f8718d5a90a369cf9edf0d0f90c22ccb1e2a) ## v1.0.1 -- [Octicons](https://github.com/DirectMyFile/github.dart/commit/28cff468272066b8f70998ac9235fc6c813a88d5) +- [Octicons](https://github.com/SpinlockLabs/github.dart/commit/28cff468272066b8f70998ac9235fc6c813a88d5) ## v1.0.0 -- [Support for Creating Milestones](https://github.com/DirectMyFile/github.dart/commit/2e613d9ef662da6e5d4adee576ac3c149d15e037) +- [Support for Creating Milestones](https://github.com/SpinlockLabs/github.dart/commit/2e613d9ef662da6e5d4adee576ac3c149d15e037) ## v0.6.7 -- [Hook Server now only handles request at `/hook`](https://github.com/DirectMyFile/github.dart/commit/da0524cd054082bb016193cf167865fd6aeb5631) -- [Octodex Support](https://github.com/DirectMyFile/github.dart/commit/4481f094dca7960268447c579f1745337bbd6c25) -- [Zen API Support](https://github.com/DirectMyFile/github.dart/commit/bcf2ed540a327957485b7e610647f956d02bfa21) -- [Ability to delete issue comments](https://github.com/DirectMyFile/github.dart/commit/2316f5c6af5246d3039fb378fab6c77ac61c5e6b) -- [Client Creation Helper](https://github.com/DirectMyFile/github.dart/commit/2316f5c6af5246d3039fb378fab6c77ac61c5e6b) -- [New Hook Server Middleware](https://github.com/DirectMyFile/github.dart/commit/3af13b647291bc31d644a9ca1554861892ac7b76) -- [Issue Label Management](https://github.com/DirectMyFile/github.dart/commit/8cfe4b318d8683dc6be59ab0c6d5968325a461d9) -- [Ability to change title, body, and state of an issue](https://github.com/DirectMyFile/github.dart/commit/dabc32a66678e92321d017912c9aae60084e908f) -- [Repository Status API Support](https://github.com/DirectMyFile/github.dart/commit/b17da3befae20bbde9b8d8bfd351bf8ff3227fa6) -- [Creating/Deleting/Listing Repository Labels](https://github.com/DirectMyFile/github.dart/commit/2eb1ea81aa3fdfe99c7ed39316a946897c67ebc0) -- [Issue Assignees](https://github.com/DirectMyFile/github.dart/commit/e5e92d2c1d16ab4912522392e84d1e16a2f353ab) +- [Hook Server now only handles request at `/hook`](https://github.com/SpinlockLabs/github.dart/commit/da0524cd054082bb016193cf167865fd6aeb5631) +- [Octodex Support](https://github.com/SpinlockLabs/github.dart/commit/4481f094dca7960268447c579f1745337bbd6c25) +- [Zen API Support](https://github.com/SpinlockLabs/github.dart/commit/bcf2ed540a327957485b7e610647f956d02bfa21) +- [Ability to delete issue comments](https://github.com/SpinlockLabs/github.dart/commit/2316f5c6af5246d3039fb378fab6c77ac61c5e6b) +- [Client Creation Helper](https://github.com/SpinlockLabs/github.dart/commit/2316f5c6af5246d3039fb378fab6c77ac61c5e6b) +- [New Hook Server Middleware](https://github.com/SpinlockLabs/github.dart/commit/3af13b647291bc31d644a9ca1554861892ac7b76) +- [Issue Label Management](https://github.com/SpinlockLabs/github.dart/commit/8cfe4b318d8683dc6be59ab0c6d5968325a461d9) +- [Ability to change title, body, and state of an issue](https://github.com/SpinlockLabs/github.dart/commit/dabc32a66678e92321d017912c9aae60084e908f) +- [Repository Status API Support](https://github.com/SpinlockLabs/github.dart/commit/b17da3befae20bbde9b8d8bfd351bf8ff3227fa6) +- [Creating/Deleting/Listing Repository Labels](https://github.com/SpinlockLabs/github.dart/commit/2eb1ea81aa3fdfe99c7ed39316a946897c67ebc0) +- [Issue Assignees](https://github.com/SpinlockLabs/github.dart/commit/e5e92d2c1d16ab4912522392e84d1e16a2f353ab) ## v0.6.6 -- [Fix Typos](https://github.com/DirectMyFile/github.dart/commit/7b3fd733a306230410a0318abbfc5c15cdd79345) +- [Fix Typos](https://github.com/SpinlockLabs/github.dart/commit/7b3fd733a306230410a0318abbfc5c15cdd79345) ## v0.6.5 -- [Add Issue State Information](https://github.com/DirectMyFile/github.dart/commit/571bb4101f2c90927ecaaab0bb226c277ad7b4be) +- [Add Issue State Information](https://github.com/SpinlockLabs/github.dart/commit/571bb4101f2c90927ecaaab0bb226c277ad7b4be) ## v0.6.4 -- [Pull Request State Information](https://github.com/DirectMyFile/github.dart/commit/fef13177f959903cd1b6b2a3c17f476bea59aeaf) -- [Widen Constraint on yaml](https://github.com/DirectMyFile/github.dart/commit/faa180922b3cd1a21a3b437eb8b590529d529e23) -- [Bug Fixes in Pull Requests](https://github.com/DirectMyFile/github.dart/commit/4b9ec19a2563d4c0bf4220703d11399dee96fbb3) +- [Pull Request State Information](https://github.com/SpinlockLabs/github.dart/commit/fef13177f959903cd1b6b2a3c17f476bea59aeaf) +- [Widen Constraint on yaml](https://github.com/SpinlockLabs/github.dart/commit/faa180922b3cd1a21a3b437eb8b590529d529e23) +- [Bug Fixes in Pull Requests](https://github.com/SpinlockLabs/github.dart/commit/4b9ec19a2563d4c0bf4220703d11399dee96fbb3) ## v0.6.3 -- [Pull Request Manipulation](https://github.com/DirectMyFile/github.dart/commit/37c5323a48a403c5a88300e960e38e773a000d81) -- [Access to Issue Comments](https://github.com/DirectMyFile/github.dart/commit/82020c242998624cac31e0e879c54f63d0cab012) -- [CreateStatus Request](https://github.com/DirectMyFile/github.dart/commit/202bacdd01a132e34d63ff96124f997e6e3c18d5) -- [Widen crypto constraint](https://github.com/DirectMyFile/github.dart/commit/caaa3f9ea14025d4d9c3a966a911489f2deedc26) -- [Team Management](https://github.com/DirectMyFile/github.dart/commit/2a47b14ba975c2396e728ec4260a30dfb8048178) -- [Fix Missing Dependency](https://github.com/DirectMyFile/github.dart/commit/233c4f38f33b1a5e3886e1f4617ca34a66159080) -- [Pull Request Comment Creation](https://github.com/DirectMyFile/github.dart/commit/cab4fa151426e0461ca1ef6ac570ed1e342fe3d8) -- [Fix Bugs in Commit Model](https://github.com/DirectMyFile/github.dart/commit/58a7616baaf4ce963e6e135c2547b9315f0b2e65) -- [Pagination Bug Fix](https://github.com/DirectMyFile/github.dart/commit/b68806939ef9b7d7e5c15983dec2bb6b86343afb) -- [Event Polling](https://github.com/DirectMyFile/github.dart/commit/71d16834b6bdcfd70f9f80ce3f81af9bcabfa066) -- [Octocat Wisdom Support](https://github.com/DirectMyFile/github.dart/commit/6273170787bb2b041c8320afabec304a9f2d6bab) -- [GitHub Blog Posts Support](https://github.com/DirectMyFile/github.dart/commit/845146f5b880ed3dd2b4c73c0a4d568da7b3e2b8) -- [Deploy Key Management](https://github.com/DirectMyFile/github.dart/commit/d72d97127fe96315ae9686daf964000a54ea8806) -- [Public Key Management](https://github.com/DirectMyFile/github.dart/commit/63a0d6b66ae7f5b595979ccdf759fea101607ff1) +- [Pull Request Manipulation](https://github.com/SpinlockLabs/github.dart/commit/37c5323a48a403c5a88300e960e38e773a000d81) +- [Access to Issue Comments](https://github.com/SpinlockLabs/github.dart/commit/82020c242998624cac31e0e879c54f63d0cab012) +- [CreateStatus Request](https://github.com/SpinlockLabs/github.dart/commit/202bacdd01a132e34d63ff96124f997e6e3c18d5) +- [Widen crypto constraint](https://github.com/SpinlockLabs/github.dart/commit/caaa3f9ea14025d4d9c3a966a911489f2deedc26) +- [Team Management](https://github.com/SpinlockLabs/github.dart/commit/2a47b14ba975c2396e728ec4260a30dfb8048178) +- [Fix Missing Dependency](https://github.com/SpinlockLabs/github.dart/commit/233c4f38f33b1a5e3886e1f4617ca34a66159080) +- [Pull Request Comment Creation](https://github.com/SpinlockLabs/github.dart/commit/cab4fa151426e0461ca1ef6ac570ed1e342fe3d8) +- [Fix Bugs in Commit Model](https://github.com/SpinlockLabs/github.dart/commit/58a7616baaf4ce963e6e135c2547b9315f0b2e65) +- [Pagination Bug Fix](https://github.com/SpinlockLabs/github.dart/commit/b68806939ef9b7d7e5c15983dec2bb6b86343afb) +- [Event Polling](https://github.com/SpinlockLabs/github.dart/commit/71d16834b6bdcfd70f9f80ce3f81af9bcabfa066) +- [Octocat Wisdom Support](https://github.com/SpinlockLabs/github.dart/commit/6273170787bb2b041c8320afabec304a9f2d6bab) +- [GitHub Blog Posts Support](https://github.com/SpinlockLabs/github.dart/commit/845146f5b880ed3dd2b4c73c0a4d568da7b3e2b8) +- [Deploy Key Management](https://github.com/SpinlockLabs/github.dart/commit/d72d97127fe96315ae9686daf964000a54ea8806) +- [Public Key Management](https://github.com/SpinlockLabs/github.dart/commit/63a0d6b66ae7f5b595979ccdf759fea101607ff1) ## v0.6.2 -- [Bug Fixes in Organizations](https://github.com/DirectMyFile/github.dart/commit/0cd55093fc3da97cfadc9ffd29e3705a1e25f3ec) -- [Pull Request Comment Model](https://github.com/DirectMyFile/github.dart/commit/611588e76163c17ee4830a9b9e0609ebf5beb165) -- [Moved to Stream-based API](https://github.com/DirectMyFile/github.dart/commit/bd827ffd30a162b4e71f8d12d466e6e24383bf1e) -- [Support for Forking a Repository](https://github.com/DirectMyFile/github.dart/commit/0c61d9a8ca874c23eb4f16dd63db1d53a65f2562) -- [Gist Comments Support](https://github.com/DirectMyFile/github.dart/commit/fc0d690debae4ac857f9021d7d8265ae2e4549be) -- [Merging Support](https://github.com/DirectMyFile/github.dart/commit/56d5e4d05bb3b685cac19c61f91f81f22281bd4a) -- [Emoji Support](https://github.com/DirectMyFile/github.dart/commit/9ac77b3364a060dd2e4e202e4e38f24b2079ff9e) -- [Repository Search Support](https://github.com/DirectMyFile/github.dart/commit/305d1bcb439b188fac9553c6a07ea33f0e3505bd) -- [Notifications API Support](https://github.com/DirectMyFile/github.dart/commit/11398495adebf68958ef3bce20903acd909f514c) +- [Bug Fixes in Organizations](https://github.com/SpinlockLabs/github.dart/commit/0cd55093fc3da97cfadc9ffd29e3705a1e25f3ec) +- [Pull Request Comment Model](https://github.com/SpinlockLabs/github.dart/commit/611588e76163c17ee4830a9b9e0609ebf5beb165) +- [Moved to Stream-based API](https://github.com/SpinlockLabs/github.dart/commit/bd827ffd30a162b4e71f8d12d466e6e24383bf1e) +- [Support for Forking a Repository](https://github.com/SpinlockLabs/github.dart/commit/0c61d9a8ca874c23eb4f16dd63db1d53a65f2562) +- [Gist Comments Support](https://github.com/SpinlockLabs/github.dart/commit/fc0d690debae4ac857f9021d7d8265ae2e4549be) +- [Merging Support](https://github.com/SpinlockLabs/github.dart/commit/56d5e4d05bb3b685cac19c61f91f81f22281bd4a) +- [Emoji Support](https://github.com/SpinlockLabs/github.dart/commit/9ac77b3364a060dd2e4e202e4e38f24b2079ff9e) +- [Repository Search Support](https://github.com/SpinlockLabs/github.dart/commit/305d1bcb439b188fac9553c6a07ea33f0e3505bd) +- [Notifications API Support](https://github.com/SpinlockLabs/github.dart/commit/11398495adebf68958ef3bce20903acd909f514c) ## v0.6.1 -- [Fix Bug in Release API](https://github.com/DirectMyFile/github.dart/commit/64499a376df313f08df1669782f042a912751794) +- [Fix Bug in Release API](https://github.com/SpinlockLabs/github.dart/commit/64499a376df313f08df1669782f042a912751794) ## v0.6.0 -- [Custom HTTP System](https://github.com/DirectMyFile/github.dart/commit/3e1bfe7e45e7b83c32bf0bceb154a791ea3b68d7) -- [Gists Support](https://github.com/DirectMyFile/github.dart/commit/fe733a36ed1cd7cce89d309e61b14b8b7f8666d8) -- [API Status Information](https://github.com/DirectMyFile/github.dart/commit/c790bf9edb8e2fb99d879818a8b2ae77b5325f7c) +- [Custom HTTP System](https://github.com/SpinlockLabs/github.dart/commit/3e1bfe7e45e7b83c32bf0bceb154a791ea3b68d7) +- [Gists Support](https://github.com/SpinlockLabs/github.dart/commit/fe733a36ed1cd7cce89d309e61b14b8b7f8666d8) +- [API Status Information](https://github.com/SpinlockLabs/github.dart/commit/c790bf9edb8e2fb99d879818a8b2ae77b5325f7c) ## v0.5.9 @@ -231,12 +231,12 @@ All the things! ## v0.3.0 - Updated Documentation -- [Better Organization Support](https://github.com/DirectMyFile/github.dart/commit/cc9de92f625918eafd01a72b4e2c0921580075bb) -- [Added Organization Demos](https://github.com/DirectMyFile/github.dart/commit/cc9de92f625918eafd01a72b4e2c0921580075bb) +- [Better Organization Support](https://github.com/SpinlockLabs/github.dart/commit/cc9de92f625918eafd01a72b4e2c0921580075bb) +- [Added Organization Demos](https://github.com/SpinlockLabs/github.dart/commit/cc9de92f625918eafd01a72b4e2c0921580075bb) ## v0.2.0 -- [Organization Support](https://github.com/DirectMyFile/github.dart/commit/3de085c0fa2d629a8bebff89bdaf1a5aaf833195) +- [Organization Support](https://github.com/SpinlockLabs/github.dart/commit/3de085c0fa2d629a8bebff89bdaf1a5aaf833195) ## v0.1.0 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a45a8024..ddf07a0a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -7,7 +7,7 @@ GitHub.dart is of course Open Source! We love it when people contribute! - Make sure you have a [GitHub Account](https://github.com/signup/free). - Make sure the [Dart SDK](https://www.dartlang.org/tools/sdk/) is installed on your system. - Make sure you have [Git](http://git-scm.com/) installed on your system. -- [Fork](https://help.github.com/articles/fork-a-repo) the [repository](https://github.com/DirectMyFile/github.dart) on GitHub. +- [Fork](https://help.github.com/articles/fork-a-repo) the [repository](https://github.com/SpinlockLabs/github.dart) on GitHub. ## Making Changes diff --git a/README.md b/README.md index 7f173358..8e2f3c67 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ Please submit issues and pull requests, help out, or just give encouragement. - [Library Demos](http://github.directcode.org/demos/) - [Pub Package](https://pub.dartlang.org/packages/github) -- [Wiki](https://github.com/DirectMyFile/github.dart/wiki) +- [Wiki](https://github.com/SpinlockLabs/github.dart/wiki) - [Latest API reference](https://pub.dev/documentation/github/latest/) ## Getting Started @@ -42,7 +42,7 @@ import 'package:github/browser.dart'; and for the server or Flutter use: ```dart -import 'package:github/server.dart'; +import 'package:github/github.dart'; ``` and then use it: @@ -53,7 +53,7 @@ import 'package:github/browser.dart'; void main() async { /* Create a GitHub Client */ - var github = createGitHubClient(); + var github = GitHub(); /* or Create a GitHub Client using an auth token */ var github = createGitHubClient(auth: new Authentication.withToken("YourTokenHere")); diff --git a/analysis_options.yaml b/analysis_options.yaml index b4b5f8e5..ccd7e89f 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1,53 +1,849 @@ -include: package:pedantic/analysis_options.yaml +# analysis_options.yaml docs: https://www.dartlang.org/guides/language/analysis-options +analyzer: + # Strong mode is required. Applies to the current project. + strong-mode: + # When compiling to JS, both implicit options apply to the current + # project and all dependencies. They are useful to find possible + # Type fixes or areas for explicit typing. + implicit-casts: true + implicit-dynamic: true + +# ALL lint rules are included. Unused lints should be commented +# out with a reason. An up to date list of all options is here +# http://dart-lang.github.io/linter/lints/options/options.html +# Descriptions of each rule is here http://dart-lang.github.io/linter/lints/ +# +# To ignore a lint rule on a case by case basic in code just add a comment +# above it or at the end of the line like: // ignore: +# example: // ignore: invalid_assignment, const_initialized_with_non_constant_value +# +# More info about configuring analysis_options.yaml files +# https://www.dartlang.org/guides/language/analysis-options#excluding-lines-within-a-file linter: rules: + # Declare method return types. + # http://dart-lang.github.io/linter/lints/always_declare_return_types.html + # recommendation: recommended + # reason: React component render() method can return either ReactElement or false + # 0 issues - always_declare_return_types -# - annotate_overrides -# - avoid_as + + # Separate the control structure expression from its statement. + # http://dart-lang.github.io/linter/lints/always_put_control_body_on_new_line.html + # recommendation: optional + # 0 issues + - always_put_control_body_on_new_line + + # Put @required named parameters first. + # http://dart-lang.github.io/linter/lints/always_put_required_named_parameters_first.html + # recommendation: recommended + # 0 issues + - always_put_required_named_parameters_first + + # Use @required. + # http://dart-lang.github.io/linter/lints/always_require_non_null_named_parameters.html + # recommendation: recommended + # 0 issues + - always_require_non_null_named_parameters + + # Specify type annotations. + # http://dart-lang.github.io/linter/lints/always_specify_types.html + # recommendation: optional + # 0 issues + # - always_specify_types + + # Annotate overridden members. + # http://dart-lang.github.io/linter/lints/annotate_overrides.html + # recommendation: required + # 0 issues + - annotate_overrides + + # Avoid annotating with dynamic when not required. + # http://dart-lang.github.io/linter/lints/avoid_annotating_with_dynamic.html + # recommendation: optional + # 0 issues + - avoid_annotating_with_dynamic + + # Avoid using `as`. + # http://dart-lang.github.io/linter/lints/avoid_as.html + # recommendation: optional + # 0 issues + # - avoid_as + + # Avoid bool literals in conditional expressions. + # http://dart-lang.github.io/linter/lints/avoid_bool_literals_in_conditional_expressions.html + # recommendation: optional + # 0 issues + - avoid_bool_literals_in_conditional_expressions + + # Avoid catches without on clauses. + # http://dart-lang.github.io/linter/lints/avoid_catches_without_on_clauses.html + # recommendation: optional + # 0 issues + - avoid_catches_without_on_clauses + + # Don't explicitly catch Error or types that implement it. + # http://dart-lang.github.io/linter/lints/avoid_catching_errors.html + # recommendation: optional + # 0 issues + - avoid_catching_errors + + # Avoid defining a class that contains only static members. + # http://dart-lang.github.io/linter/lints/avoid_classes_with_only_static_members.html + # recommendation: recommended + # 0 issues + - avoid_classes_with_only_static_members + + # Avoid double and int checks. + # http://dart-lang.github.io/linter/lints/avoid_double_and_int_checks.html + # recommendation: required + # 0 issues + - avoid_double_and_int_checks + + # Avoid empty else statements. + # http://dart-lang.github.io/linter/lints/avoid_empty_else.html + # recommendation: required + # 0 issues - avoid_empty_else + + # Avoid field initializers in const classes. + # http://dart-lang.github.io/linter/lints/avoid_field_initializers_in_const_classes.html + # recommendation: optional + # 0 issues + - avoid_field_initializers_in_const_classes + + # Avoid using `forEach` with a function literal. + # http://dart-lang.github.io/linter/lints/avoid_function_literals_in_foreach_calls.html + # recommendation: recommended + # reason: Use for (x in y) or forEach(someFunc) instead + # 0 issues + - avoid_function_literals_in_foreach_calls + + # Don't implement classes that override `==`. + # http://dart-lang.github.io/linter/lints/avoid_implementing_value_types.html + # recommendation: optional + # 0 issues + - avoid_implementing_value_types + + # Don't explicitly initialize variables to null. + # http://dart-lang.github.io/linter/lints/avoid_init_to_null.html + # recommendation: recommended + # 0 issues - avoid_init_to_null + + # Avoid JavaScript rounded ints. + # http://dart-lang.github.io/linter/lints/avoid_js_rounded_ints.html + # recommendation: optional + # 0 issues + - avoid_js_rounded_ints + + # Don't check for null in custom == operators. + # http://dart-lang.github.io/linter/lints/avoid_null_checks_in_equality_operators.html + # recommendation: recommended + # 0 issues + - avoid_null_checks_in_equality_operators + + # Avoid positional boolean parameters. + # http://dart-lang.github.io/linter/lints/avoid_positional_boolean_parameters.html + # recommendation: recommended + # 0 issues + - avoid_positional_boolean_parameters + + # Avoid private typedef functions. + # http://dart-lang.github.io/linter/lints/avoid_private_typedef_functions.html + # recommendation: optional + # 0 issues + - avoid_private_typedef_functions + + # Avoid relative imports for files in `lib/`. + # http://dart-lang.github.io/linter/lints/avoid_relative_lib_imports.html + # recommendation: recommended + # reason: JS compilation will be faster without relative imports. Use package imports. + # 0 issues + - avoid_relative_lib_imports + + # Don't rename parameters of overridden methods. + # http://dart-lang.github.io/linter/lints/avoid_renaming_method_parameters.html + # recommendation: recommended + # 0 issues + - avoid_renaming_method_parameters + + # Avoid return types on setters. + # http://dart-lang.github.io/linter/lints/avoid_return_types_on_setters.html + # recommendation: required + # 0 issues - avoid_return_types_on_setters + + # Avoid returning null from members whose return type is bool, double, int, or num. + # http://dart-lang.github.io/linter/lints/avoid_returning_null.html + # recommendation: recommended + # 0 issues + - avoid_returning_null + + # Avoid returning null for Future. + # http://dart-lang.github.io/linter/lints/avoid_returning_null_for_future.html + # recommendation: optional + # 0 issues + - avoid_returning_null_for_future + + # Avoid returning null for void. + # http://dart-lang.github.io/linter/lints/avoid_returning_null_for_void.html + # recommendation: optional + # 0 issues + - avoid_returning_null_for_void + + # Avoid returning this from methods just to enable a fluent interface. + # http://dart-lang.github.io/linter/lints/avoid_returning_this.html + # recommendation: recommended + # 0 issues + - avoid_returning_this + + # Avoid setters without getters. + # http://dart-lang.github.io/linter/lints/avoid_setters_without_getters.html + # recommendation: recommended + # 0 issues + - avoid_setters_without_getters + + # Avoid shadowing type parameters. + # http://dart-lang.github.io/linter/lints/avoid_shadowing_type_parameters.html + # recommendation: optional + # 0 issues + - avoid_shadowing_type_parameters + + # Avoid single cascade in expression statements. + # http://dart-lang.github.io/linter/lints/avoid_single_cascade_in_expression_statements.html + # recommendation: optional + # 0 issues + - avoid_single_cascade_in_expression_statements + + # Avoid slow async `dart:io` methods. + # http://dart-lang.github.io/linter/lints/avoid_slow_async_io.html + # recommendation: recommended + # 0 issues + - avoid_slow_async_io + + # Avoid types as parameter names. + # http://dart-lang.github.io/linter/lints/avoid_types_as_parameter_names.html + # recommendation: required + # 0 issues + - avoid_types_as_parameter_names + + # Avoid annotating types for function expression parameters. + # http://dart-lang.github.io/linter/lints/avoid_types_on_closure_parameters.html + # recommendation: optional + # 0 issues + - avoid_types_on_closure_parameters + + # Avoid defining unused parameters in constructors. + # http://dart-lang.github.io/linter/lints/avoid_unused_constructor_parameters.html + # recommendation: recommended + # 0 issues + - avoid_unused_constructor_parameters + + # Avoid async functions that return void. + # http://dart-lang.github.io/linter/lints/avoid_void_async.html + # recommendation: optional + # 0 issues + - avoid_void_async + + # Await only futures. + # http://dart-lang.github.io/linter/lints/await_only_futures.html + # recommendation: required + # 0 issues - await_only_futures + + # Name types using UpperCamelCase. + # http://dart-lang.github.io/linter/lints/camel_case_types.html + # recommendation: required + # 0 issues - camel_case_types + + # Cancel instances of dart.async.StreamSubscription. + # http://dart-lang.github.io/linter/lints/cancel_subscriptions.html + # recommendation: required + # 0 issues + - cancel_subscriptions + + # Cascade consecutive method invocations on the same reference. + # http://dart-lang.github.io/linter/lints/cascade_invocations.html + # recommendation: optional + # 0 issues + # - cascade_invocations + + # Close instances of `dart.core.Sink`. + # http://dart-lang.github.io/linter/lints/close_sinks.html + # recommendation: required + # 0 issues - close_sinks + + # Only reference in scope identifiers in doc comments. + # http://dart-lang.github.io/linter/lints/comment_references.html + # recommendation: recommended + # 0 issues - comment_references -# - constant_identifier_names + + # Prefer using lowerCamelCase for constant names. + # http://dart-lang.github.io/linter/lints/constant_identifier_names.html + # recommendation: optional + # 0 issues + # - constant_identifier_names + + # Avoid control flow in finally blocks. + # http://dart-lang.github.io/linter/lints/control_flow_in_finally.html + # recommendation: required + # 0 issues - control_flow_in_finally + + # DO use curly braces for all flow control structures. + # http://dart-lang.github.io/linter/lints/curly_braces_in_flow_control_structures.html + # recommendation: optional + # 0 issues + - curly_braces_in_flow_control_structures + + # Adhere to Effective Dart Guide directives sorting conventions. + # http://dart-lang.github.io/linter/lints/directives_ordering.html + # recommendation: recommended + # 0 issues - directives_ordering + + # Avoid empty catch blocks. + # http://dart-lang.github.io/linter/lints/empty_catches.html + # recommendation: required + # 0 issues - empty_catches + + # Use `;` instead of `{}` for empty constructor bodies. + # http://dart-lang.github.io/linter/lints/empty_constructor_bodies.html + # recommendation: recommended + # 0 issues - empty_constructor_bodies + + # Avoid empty statements. + # http://dart-lang.github.io/linter/lints/empty_statements.html + # recommendation: required + # 0 issues - empty_statements + + # Name source files using `lowercase_with_underscores`. + # http://dart-lang.github.io/linter/lints/file_names.html + # recommendation: optional + # 0 issues + - file_names + + # Use Flutter TODO format: // TODO(username): message, https://URL-to-issue. + # http://dart-lang.github.io/linter/lints/flutter_style_todos.html + # recommendation: optional + # 0 issues + - flutter_style_todos + + # Always override `hashCode` if overriding `==`. + # http://dart-lang.github.io/linter/lints/hash_and_equals.html + # recommendation: required + # 0 issues - hash_and_equals + + # Don't import implementation files from another package. + # http://dart-lang.github.io/linter/lints/implementation_imports.html + # recommendation: required + # 0 issues - implementation_imports + + # Conditions should not unconditionally evaluate to `true` or to `false`. + # http://dart-lang.github.io/linter/lints/invariant_booleans.html + # recommendation: optional + # reason: There are several outstanding bugs with this lint that cause a good deal of noise + # 0 issues + - invariant_booleans + + # Invocation of Iterable.contains with references of unrelated types. + # http://dart-lang.github.io/linter/lints/iterable_contains_unrelated_type.html + # recommendation: required + # 0 issues - iterable_contains_unrelated_type + + # Join return statement with assignment when possible. + # http://dart-lang.github.io/linter/lints/join_return_with_assignment.html + # recommendation: optional + # 0 issues + - join_return_with_assignment + + # Name libraries using `lowercase_with_underscores`. + # http://dart-lang.github.io/linter/lints/library_names.html + # recommendation: recommended + # 0 issues - library_names + + # Use `lowercase_with_underscores` when specifying a library prefix. + # http://dart-lang.github.io/linter/lints/library_prefixes.html + # recommendation: recommended + # 0 issues - library_prefixes + + # AVOID lines longer than 80 characters. + # http://dart-lang.github.io/linter/lints/lines_longer_than_80_chars.html + # recommendation: optional + # 0 issues + - lines_longer_than_80_chars + + # Invocation of `remove` with references of unrelated types. + # http://dart-lang.github.io/linter/lints/list_remove_unrelated_type.html + # recommendation: required + # 0 issues - list_remove_unrelated_type + + # Boolean expression composed only with literals. + # http://dart-lang.github.io/linter/lints/literal_only_boolean_expressions.html + # recommendation: required + # 0 issues + - literal_only_boolean_expressions + + # Don't use adjacent strings in list. + # http://dart-lang.github.io/linter/lints/no_adjacent_strings_in_list.html + # recommendation: required + # 0 issues + - no_adjacent_strings_in_list + + # Don't use more than one case with same value. + # http://dart-lang.github.io/linter/lints/no_duplicate_case_values.html + # recommendation: required + # 0 issues + - no_duplicate_case_values + + # Name non-constant identifiers using lowerCamelCase. + # http://dart-lang.github.io/linter/lints/non_constant_identifier_names.html + # recommendation: recommended + # 0 issues - non_constant_identifier_names + + # Do not pass `null` as an argument where a closure is expected. + # http://dart-lang.github.io/linter/lints/null_closures.html + # recommendation: optional + # 0 issues + - null_closures + + # Omit type annotations for local variables. + # http://dart-lang.github.io/linter/lints/omit_local_variable_types.html + # recommendation: optional + # reason: Conflicts with always_specify_types. Recommend commenting this one out. + # 0 issues + # - omit_local_variable_types + + # Avoid defining a one-member abstract class when a simple function will do. + # http://dart-lang.github.io/linter/lints/one_member_abstracts.html + # recommendation: optional + # 0 issues - one_member_abstracts + + # Only throw instances of classes extending either Exception or Error. + # http://dart-lang.github.io/linter/lints/only_throw_errors.html + # recommendation: required + # 0 issues + - only_throw_errors + + # Don't override fields. + # http://dart-lang.github.io/linter/lints/overridden_fields.html + # recommendation: optional + # 0 issues + - overridden_fields + + # Provide doc comments for all public APIs. + # http://dart-lang.github.io/linter/lints/package_api_docs.html + # recommendation: optional + # 0 issues - package_api_docs + + # Use `lowercase_with_underscores` for package names. + # http://dart-lang.github.io/linter/lints/package_names.html + # recommendation: recommended + # 0 issues - package_names + + # Prefix library names with the package name and a dot-separated path. + # http://dart-lang.github.io/linter/lints/package_prefixed_library_names.html + # recommendation: recommended + # 0 issues - package_prefixed_library_names + + # Don't reassign references to parameters of functions or methods. + # http://dart-lang.github.io/linter/lints/parameter_assignments.html + # recommendation: optional + # 0 issues + - parameter_assignments + + # Use adjacent strings to concatenate string literals. + # http://dart-lang.github.io/linter/lints/prefer_adjacent_string_concatenation.html + # recommendation: optional + # 0 issues + - prefer_adjacent_string_concatenation + + # Prefer putting asserts in initializer list. + # http://dart-lang.github.io/linter/lints/prefer_asserts_in_initializer_lists.html + # recommendation: optional + # 0 issues + - prefer_asserts_in_initializer_lists + + # Prefer using a boolean as the assert condition. + # http://dart-lang.github.io/linter/lints/prefer_bool_in_asserts.html + # recommendation: optional + # 0 issues + # - prefer_bool_in_asserts + + # Use collection literals when possible. + # http://dart-lang.github.io/linter/lints/prefer_collection_literals.html + # recommendation: recommended + # 0 issues + - prefer_collection_literals + + # Prefer using `??=` over testing for null. + # http://dart-lang.github.io/linter/lints/prefer_conditional_assignment.html + # recommendation: optional + # 0 issues + - prefer_conditional_assignment + + # Prefer const with constant constructors. + # http://dart-lang.github.io/linter/lints/prefer_const_constructors.html + # recommendation: optional + # 0 issues - prefer_const_constructors + + # Prefer declare const constructors on `@immutable` classes. + # http://dart-lang.github.io/linter/lints/prefer_const_constructors_in_immutables.html + # recommendation: optional + # 0 issues + - prefer_const_constructors_in_immutables + + # Prefer const over final for declarations. + # http://dart-lang.github.io/linter/lints/prefer_const_declarations.html + # recommendation: recommended + # 0 issues - prefer_const_declarations + + # Prefer const literals as parameters of constructors on @immutable classes. + # http://dart-lang.github.io/linter/lints/prefer_const_literals_to_create_immutables.html + # recommendation: optional + # 0 issues - prefer_const_literals_to_create_immutables - - prefer_constructors_over_static_methods + + # Prefer defining constructors instead of static methods to create instances. + # http://dart-lang.github.io/linter/lints/prefer_constructors_over_static_methods.html + # recommendation: optional + # 0 issues + # - prefer_constructors_over_static_methods + + # Use contains for `List` and `String` instances. + # http://dart-lang.github.io/linter/lints/prefer_contains.html + # recommendation: recommended + # 0 issues + - prefer_contains + + # Use `=` to separate a named parameter from its default value. + # http://dart-lang.github.io/linter/lints/prefer_equal_for_default_values.html + # recommendation: optional + # 0 issues - prefer_equal_for_default_values + + # Use => for short members whose body is a single return statement. + # http://dart-lang.github.io/linter/lints/prefer_expression_function_bodies.html + # recommendation: optional + # 0 issues + - prefer_expression_function_bodies + + # Private field could be final. + # http://dart-lang.github.io/linter/lints/prefer_final_fields.html + # recommendation: optional + # 0 issues - prefer_final_fields + + # Prefer final in for-each loop variable if reference is not reassigned. + # http://dart-lang.github.io/linter/lints/prefer_final_in_for_each.html + # recommendation: optional + # 0 issues - prefer_final_in_for_each + + # Prefer final for variable declaration if reference is not reassigned. + # http://dart-lang.github.io/linter/lints/prefer_final_locals.html + # recommendation: optional + # reason: Generates a lot of lint since people use var a lot for local variables. + # 0 issues - prefer_final_locals + + # Use `forEach` to only apply a function to all the elements. + # http://dart-lang.github.io/linter/lints/prefer_foreach.html + # recommendation: optional + # 0 issues + - prefer_foreach + + # Use a function declaration to bind a function to a name. + # http://dart-lang.github.io/linter/lints/prefer_function_declarations_over_variables.html + # recommendation: recommended + # 0 issues + - prefer_function_declarations_over_variables + + # Prefer generic function type aliases. + # http://dart-lang.github.io/linter/lints/prefer_generic_function_type_aliases.html + # recommendation: optional + # 0 issues - prefer_generic_function_type_aliases + + # Use initializing formals when possible. + # http://dart-lang.github.io/linter/lints/prefer_initializing_formals.html + # recommendation: recommended + # 0 issues + - prefer_initializing_formals + + # Prefer int literals over double literals. + # http://dart-lang.github.io/linter/lints/prefer_int_literals.html + # recommendation: optional + # 0 issues + - prefer_int_literals + + # Use interpolation to compose strings and values. + # http://dart-lang.github.io/linter/lints/prefer_interpolation_to_compose_strings.html + # recommendation: optional + # 0 issues + - prefer_interpolation_to_compose_strings + + # Use `isEmpty` for Iterables and Maps. + # http://dart-lang.github.io/linter/lints/prefer_is_empty.html + # recommendation: required + # 0 issues + - prefer_is_empty + + # Use `isNotEmpty` for Iterables and Maps. + # http://dart-lang.github.io/linter/lints/prefer_is_not_empty.html + # recommendation: required + # 0 issues - prefer_is_not_empty + + # Prefer to use whereType on iterable. + # http://dart-lang.github.io/linter/lints/prefer_iterable_whereType.html + # recommendation: optional + # reason: Optional for now since it is only available in Dart 2 + # 0 issues + - prefer_iterable_whereType + + # Prefer using mixins. + # http://dart-lang.github.io/linter/lints/prefer_mixin.html + # recommendation: optional + # 0 issues + - prefer_mixin + + # Prefer using null aware operators. + # http://dart-lang.github.io/linter/lints/prefer_null_aware_operators.html + # recommendation: optional + # 0 issues + - prefer_null_aware_operators + + # Prefer single quotes where they won't require escape sequences. + # http://dart-lang.github.io/linter/lints/prefer_single_quotes.html + # recommendation: recommended + # 0 issues + - prefer_single_quotes + + # Prefer typing uninitialized variables and fields. + # http://dart-lang.github.io/linter/lints/prefer_typing_uninitialized_variables.html + # recommendation: required + # 0 issues + - prefer_typing_uninitialized_variables + + # Don't use the Null type, unless you are positive that you don't want void. + # http://dart-lang.github.io/linter/lints/prefer_void_to_null.html + # recommendation: optional + # 0 issues + - prefer_void_to_null + + # Document all public members. + # http://dart-lang.github.io/linter/lints/public_member_api_docs.html + # recommendation: optional + # reason: Can get annoying for React component lifecycle methods, constructors. + # 0 issues + - public_member_api_docs + + # Property getter recursively returns itself. + # http://dart-lang.github.io/linter/lints/recursive_getters.html + # recommendation: optional + # 0 issues + - recursive_getters + + # Prefer using /// for doc comments. + # http://dart-lang.github.io/linter/lints/slash_for_doc_comments.html + # recommendation: recommended + # 0 issues - slash_for_doc_comments + + # Sort constructor declarations before other members. + # http://dart-lang.github.io/linter/lints/sort_constructors_first.html + # recommendation: optional + # 0 issues + - sort_constructors_first + + # Sort pub dependencies. + # http://dart-lang.github.io/linter/lints/sort_pub_dependencies.html + # recommendation: optional + # 0 issues + - sort_pub_dependencies + + # Sort unnamed constructor declarations first. + # http://dart-lang.github.io/linter/lints/sort_unnamed_constructors_first.html + # recommendation: optional + # 0 issues - sort_unnamed_constructors_first + + # Test type arguments in operator ==(Object other). + # http://dart-lang.github.io/linter/lints/test_types_in_equals.html + # recommendation: required + # 0 issues - test_types_in_equals + + # Avoid `throw` in finally block. + # http://dart-lang.github.io/linter/lints/throw_in_finally.html + # recommendation: required + # 0 issues - throw_in_finally + + # Type annotate public APIs. + # http://dart-lang.github.io/linter/lints/type_annotate_public_apis.html + # recommendation: recommended + # reason: React component render() method can return either ReactElement or false. Use overrides. + # 0 issues - type_annotate_public_apis + + # Don't type annotate initializing formals. + # http://dart-lang.github.io/linter/lints/type_init_formals.html + # recommendation: optional + # 0 issues - type_init_formals + + # `Future` results in `async` function bodies must be `await`ed or marked `unawaited` using `package:pedantic`. + # http://dart-lang.github.io/linter/lints/unawaited_futures.html + # recommendation: recommended + # 0 issues - unawaited_futures + + # Unnecessary await keyword in return. + # http://dart-lang.github.io/linter/lints/unnecessary_await_in_return.html + # recommendation: optional + # 0 issues + - unnecessary_await_in_return + + # Avoid using braces in interpolation when not needed. + # http://dart-lang.github.io/linter/lints/unnecessary_brace_in_string_interps.html + # recommendation: optional + # 0 issues - unnecessary_brace_in_string_interps + + # Avoid const keyword. + # http://dart-lang.github.io/linter/lints/unnecessary_const.html + # recommendation: optional + # 0 issues - unnecessary_const + + # Avoid wrapping fields in getters and setters just to be "safe". + # http://dart-lang.github.io/linter/lints/unnecessary_getters_setters.html + # recommendation: optional + # 0 issues - unnecessary_getters_setters + + # Don't create a lambda when a tear-off will do. + # http://dart-lang.github.io/linter/lints/unnecessary_lambdas.html + # recommendation: recommended + # 0 issues + - unnecessary_lambdas + + # Unnecessary new keyword. + # http://dart-lang.github.io/linter/lints/unnecessary_new.html + # recommendation: optional + # 0 issues - unnecessary_new + + # Avoid null in null-aware assignment. + # http://dart-lang.github.io/linter/lints/unnecessary_null_aware_assignments.html + # recommendation: required + # 0 issues + - unnecessary_null_aware_assignments + + # Avoid using `null` in `if null` operators. + # http://dart-lang.github.io/linter/lints/unnecessary_null_in_if_null_operators.html + # recommendation: required + # 0 issues + - unnecessary_null_in_if_null_operators + + # Don't override a method to do a super method invocation with the same parameters. + # http://dart-lang.github.io/linter/lints/unnecessary_overrides.html + # recommendation: optional + # 0 issues + - unnecessary_overrides + + # Unnecessary parenthesis can be removed. + # http://dart-lang.github.io/linter/lints/unnecessary_parenthesis.html + # recommendation: optional + # 0 issues + - unnecessary_parenthesis + + # Avoid using unnecessary statements. + # http://dart-lang.github.io/linter/lints/unnecessary_statements.html + # recommendation: required + # 0 issues + - unnecessary_statements + + # Don't access members with `this` unless avoiding shadowing. + # http://dart-lang.github.io/linter/lints/unnecessary_this.html + # recommendation: recommended + # 0 issues + - unnecessary_this + + # Equality operator `==` invocation with references of unrelated types. + # http://dart-lang.github.io/linter/lints/unrelated_type_equality_checks.html + # recommendation: required + # reason: Comparing references of a type where neither is a subtype of the other most likely will return false and might not reflect programmer's intent. + # 0 issues - unrelated_type_equality_checks + + # Prefer an 8-digit hexadecimal integer(0xFFFFFFFF) to instantiate Color. + # http://dart-lang.github.io/linter/lints/use_full_hex_values_for_flutter_colors.html + # recommendation: optional + # 0 issues + - use_full_hex_values_for_flutter_colors + + # Use generic function type syntax for parameters. + # http://dart-lang.github.io/linter/lints/use_function_type_syntax_for_parameters.html + # recommendation: optional + # 0 issues + - use_function_type_syntax_for_parameters + + # Use rethrow to rethrow a caught exception. + # http://dart-lang.github.io/linter/lints/use_rethrow_when_possible.html + # recommendation: recommended + # 0 issues + - use_rethrow_when_possible + + # Use a setter for operations that conceptually change a property. + # http://dart-lang.github.io/linter/lints/use_setters_to_change_properties.html + # recommendation: optional + # 0 issues + - use_setters_to_change_properties + + # Use string buffer to compose strings. + # http://dart-lang.github.io/linter/lints/use_string_buffers.html + # recommendation: optional + # 0 issues + - use_string_buffers + + # Start the name of the method with to/_to or as/_as if applicable. + # http://dart-lang.github.io/linter/lints/use_to_and_as_if_applicable.html + # recommendation: optional + # 0 issues + - use_to_and_as_if_applicable + + # Use valid regular expression syntax. + # http://dart-lang.github.io/linter/lints/valid_regexps.html + # recommendation: required + # 0 issues - valid_regexps + + # Don't assign to void. + # http://dart-lang.github.io/linter/lints/void_checks.html + # recommendation: required + # reason: Trying to assigning a value to void is an error. + # 0 issues + - void_checks diff --git a/example/common.dart b/example/common.dart index f3f270d2..f71a1e79 100644 --- a/example/common.dart +++ b/example/common.dart @@ -1,7 +1,10 @@ -import "dart:async"; -import "dart:html"; +import 'dart:async'; +import 'dart:html'; -import "package:github/browser.dart"; +import 'package:github/github.dart'; + +export 'package:github/github.dart'; +export 'package:github/browser_helper.dart'; /// Wires up a listener to a button with an id of view-source, /// if it exists, to show the script source @@ -9,9 +12,9 @@ import "package:github/browser.dart"; /// view source button, then you don't need to call this method Future initViewSourceButton(String script) async { // query the DOM for the view source button, handle clicks - document.querySelector("#view-source")?.onClick?.listen((_) { + document.querySelector('#view-source')?.onClick?.listen((_) { final WindowBase popup = - window.open("view_source.html?script=$script", "View Source"); + window.open('view_source.html?script=$script', 'View Source'); String code; var fetched = false; @@ -19,12 +22,12 @@ Future initViewSourceButton(String script) async { void sendCode() { popup - .postMessage({"command": "code", "code": code}, window.location.href); + .postMessage({'command': 'code', 'code': code}, window.location.href); } - window.addEventListener("message", (event) { + window.addEventListener('message', (event) { if (event is MessageEvent) { - if (event.data['command'] == "ready") { + if (event.data['command'] == 'ready') { ready = true; if (fetched) { sendCode(); @@ -49,13 +52,11 @@ Map queryString = /// Gets the github token from the "token" query string param, /// falling back to getting it from session storage. /// If it is not in either, it will be null -String token = queryString["token"] ?? window.sessionStorage['token']; +String token = queryString['token'] ?? window.sessionStorage['token']; -GitHub _createGitHub() { - return GitHub( - auth: token != null - ? Authentication.withToken(token) - : Authentication.anonymous()); -} +GitHub _createGitHub() => GitHub( + auth: token != null + ? Authentication.withToken(token) + : Authentication.anonymous()); GitHub github = _createGitHub(); diff --git a/example/emoji.dart b/example/emoji.dart index 32a58058..f2802c47 100644 --- a/example/emoji.dart +++ b/example/emoji.dart @@ -1,15 +1,15 @@ import 'dart:async'; -import "dart:html"; +import 'dart:html'; -import "common.dart"; +import 'common.dart'; -DivElement emojiDiv; +Element emojiDiv; Future main() async { - await initViewSourceButton("emoji.dart"); - emojiDiv = querySelector("#emojis"); + await initViewSourceButton('emoji.dart'); + emojiDiv = querySelector('#emojis'); await loadEmojis(); - final searchBox = querySelector("#search-box") as InputElement; + final searchBox = querySelector('#search-box') as InputElement; searchBox.onKeyUp.listen((event) { filter(searchBox.value); }); @@ -21,10 +21,10 @@ Future loadEmojis() async { emojis.forEach((name, url) { final h = DivElement(); h.className = 'emojibox'; - h.style.textAlign = "center"; + h.style.textAlign = 'center'; h.append( - ImageElement(src: url, width: 64, height: 64)..classes.add("emoji")); - h.append(ParagraphElement()..text = ":$name:"); + ImageElement(src: url, width: 64, height: 64)..classes.add('emoji')); + h.append(ParagraphElement()..text = ':$name:'); emojiDiv.append(h); }); } @@ -38,13 +38,13 @@ void filter(String query) { lastQuery = query; final boxes = emojiDiv.children; for (final box in boxes) { - final boxName = box.querySelector("p"); + final boxName = box.querySelector('p'); final t = boxName.text; final name = t.substring(1, t.length - 1); if (name.contains(query)) { - box.style.display = "inline"; + box.style.display = 'inline'; } else { - box.style.display = "none"; + box.style.display = 'none'; } } } diff --git a/example/languages.dart b/example/languages.dart index db9efeb0..d9ad5c71 100644 --- a/example/languages.dart +++ b/example/languages.dart @@ -1,33 +1,33 @@ -import "dart:html"; +import 'dart:html'; -import "package:github/browser.dart"; -import "common.dart"; +import 'package:github/github.dart'; +import 'common.dart'; DivElement tableDiv; LanguageBreakdown breakdown; Future main() async { - await initViewSourceButton("languages.dart"); - tableDiv = querySelector("#table"); + await initViewSourceButton('languages.dart'); + tableDiv = querySelector('#table'); await loadRepository(); } Future loadRepository() async { - var user = "dart-lang"; - var reponame = "sdk"; + var user = 'dart-lang'; + var reponame = 'sdk'; final params = queryString; - if (params.containsKey("user")) { - user = params["user"]; + if (params.containsKey('user')) { + user = params['user']; } - if (params.containsKey("repo")) { - reponame = params["repo"]; + if (params.containsKey('repo')) { + reponame = params['repo']; } - document.getElementById("name").setInnerHtml("$user/$reponame"); + document.getElementById('name').setInnerHtml('$user/$reponame'); final repo = RepositorySlug(user, reponame); breakdown = await github.repositories.listLanguages(repo); diff --git a/example/markdown.dart b/example/markdown.dart index d883ef30..e04150a0 100644 --- a/example/markdown.dart +++ b/example/markdown.dart @@ -1,7 +1,6 @@ -import "package:github/browser.dart"; -import "common.dart"; +import 'common.dart'; Future main() async { - await initViewSourceButton("markdown.dart"); - GitHubBrowserHelper.renderMarkdown(github, "*[markdown]"); + await initViewSourceButton('markdown.dart'); + renderMarkdown(github, '*[markdown]'); } diff --git a/example/markdown.html b/example/markdown.html index f18f75bb..7155db44 100644 --- a/example/markdown.html +++ b/example/markdown.html @@ -22,10 +22,10 @@ In your Dart Code: ```dart - import "package:github/browser.dart"; + import 'package:github/github.dart'; void main() { - var github = createGitHubClient(); + var github = GitHub(); // Renders Elements with the markdown attribute GitHubBrowserHelper.renderMarkdown(github, "*[markdown]"); diff --git a/example/organization.dart b/example/organization.dart index 4aafe439..7d238ca3 100644 --- a/example/organization.dart +++ b/example/organization.dart @@ -1,8 +1,8 @@ -import "dart:async"; -import "dart:html"; +import 'dart:async'; +import 'dart:html'; -import "package:github/browser.dart"; -import "common.dart"; +import 'package:github/github.dart'; +import 'common.dart'; DivElement $output; InputElement $input; @@ -10,7 +10,7 @@ ButtonElement $btn; Future main() async { await initViewSourceButton('organization.dart'); - $output = querySelector("#output"); + $output = querySelector('#output'); $input = querySelector('#input'); $btn = querySelector('#submit'); $input.onChange.listen((_) { diff --git a/example/organization.html b/example/organization.html index 53e0818f..861bbc75 100644 --- a/example/organization.html +++ b/example/organization.html @@ -9,7 +9,7 @@

GitHub Organization


- +
diff --git a/example/readme.dart b/example/readme.dart index acaa9de1..c4eb70ea 100644 --- a/example/readme.dart +++ b/example/readme.dart @@ -1,16 +1,16 @@ import 'dart:convert'; -import "dart:html"; +import 'dart:html'; -import "package:github/browser.dart"; +import 'package:github/github.dart'; -import "common.dart"; +import 'common.dart'; DivElement readmeDiv; Future main() async { - await initViewSourceButton("readme.dart"); - readmeDiv = querySelector("#readme"); - const repo = RepositorySlug("DirectMyFile", "github.dart"); + await initViewSourceButton('readme.dart'); + readmeDiv = querySelector('#readme'); + const repo = RepositorySlug('SpinlockLabs', 'github.dart'); final readme = await github.repositories.getReadme(repo); String markdown = readme.content; if (readme.encoding == 'base64') { diff --git a/example/releases.dart b/example/releases.dart index 23e223c5..e6e39a28 100644 --- a/example/releases.dart +++ b/example/releases.dart @@ -1,37 +1,39 @@ -import "dart:html"; +import 'dart:html'; -import "package:github/browser.dart"; +import 'package:github/github.dart'; -import "common.dart"; +import 'common.dart'; DivElement releasesDiv; Future main() async { - await initViewSourceButton("releases.dart"); - releasesDiv = querySelector("#releases"); + await initViewSourceButton('releases.dart'); + releasesDiv = querySelector('#releases'); loadReleases(); } void loadReleases() { github.repositories - .listReleases(const RepositorySlug("twbs", "bootstrap")) + .listReleases(const RepositorySlug('twbs', 'bootstrap')) .toList() .then((releases) { for (final release in releases) { - releasesDiv.appendHtml(""" + releasesDiv.appendHtml('''

${release.name}

- """, treeSanitizer: NodeTreeSanitizer.trusted); - final Element rel = releasesDiv.querySelector("#release-${release.id}"); + ''', treeSanitizer: NodeTreeSanitizer.trusted); + final Element rel = releasesDiv.querySelector('#release-${release.id}'); void append(String key, String value) { - if (value == null) return; - rel.appendHtml("
$key: $value", + if (value == null) { + return; + } + rel.appendHtml('
$key: $value', treeSanitizer: NodeTreeSanitizer.trusted); } - append("Tag", '${release.tagName}'); - append("Download", + append('Tag', '${release.tagName}'); + append('Download', 'TAR | ZIP'); } }); diff --git a/example/repos.dart b/example/repos.dart index 6f24d731..4e0b598c 100644 --- a/example/repos.dart +++ b/example/repos.dart @@ -1,35 +1,35 @@ -import "dart:async"; -import "dart:html"; +import 'dart:async'; +import 'dart:html'; -import "package:github/browser.dart"; +import 'package:github/github.dart'; -import "common.dart"; +import 'common.dart'; DivElement repositoriesDiv; List repos; Map> sorts = { - "stars": (Repository a, Repository b) => + 'stars': (Repository a, Repository b) => b.stargazersCount.compareTo(a.stargazersCount), - "forks": (Repository a, Repository b) => b.forksCount.compareTo(a.forksCount), - "created": (Repository a, Repository b) => b.createdAt.compareTo(a.createdAt), - "pushed": (Repository a, Repository b) => b.pushedAt.compareTo(a.pushedAt), - "size": (Repository a, Repository b) => b.size.compareTo(a.size) + 'forks': (Repository a, Repository b) => b.forksCount.compareTo(a.forksCount), + 'created': (Repository a, Repository b) => b.createdAt.compareTo(a.createdAt), + 'pushed': (Repository a, Repository b) => b.pushedAt.compareTo(a.pushedAt), + 'size': (Repository a, Repository b) => b.size.compareTo(a.size) }; Future main() async { await initViewSourceButton('repos.dart'); - repositoriesDiv = querySelector("#repos"); + repositoriesDiv = querySelector('#repos'); loadRepos(); - querySelector("#reload").onClick.listen((event) { + querySelector('#reload').onClick.listen((event) { loadRepos(); }); sorts.keys.forEach((name) { - querySelector("#sort-$name").onClick.listen((event) { + querySelector('#sort-$name').onClick.listen((event) { if (_reposCache == null) { loadRepos(sorts[name]); } @@ -44,10 +44,10 @@ void updateRepos( List repos, [ int compare(Repository a, Repository b), ]) { - document.querySelector("#repos").children.clear(); + document.querySelector('#repos').children.clear(); repos.sort(compare); for (final repo in repos) { - repositoriesDiv.appendHtml(""" + repositoriesDiv.appendHtml('''

${repo.name}

@@ -65,25 +65,25 @@ void updateRepos( Size: ${repo.size} bytes

- """, treeSanitizer: NodeTreeSanitizer.trusted); + ''', treeSanitizer: NodeTreeSanitizer.trusted); } } void loadRepos([int compare(Repository a, Repository b)]) { - final title = querySelector("#title"); - if (title.text.contains("(")) { + final title = querySelector('#title'); + if (title.text.contains('(')) { title.replaceWith(HeadingElement.h2() - ..text = "GitHub for Dart - Repositories" - ..id = "title"); + ..text = 'GitHub for Dart - Repositories' + ..id = 'title'); } - var user = "DirectMyFile"; + var user = 'SpinlockLabs'; - if (queryString.containsKey("user")) { + if (queryString.containsKey('user')) { user = queryString['user']; } - if (queryString.containsKey("sort") && compare == null) { + if (queryString.containsKey('sort') && compare == null) { final sorter = queryString['sort']; if (sorts.containsKey(sorter)) { compare = sorts[sorter]; diff --git a/example/search.dart b/example/search.dart index 800f9efd..60f223ca 100644 --- a/example/search.dart +++ b/example/search.dart @@ -1,5 +1,4 @@ import 'dart:html'; -import 'package:github/browser.dart'; import 'common.dart'; Future main() async { @@ -46,6 +45,6 @@ Future search(_) async { } } -String val(String id) => (querySelector("#$id") as InputElement).value; +String val(String id) => (querySelector('#$id') as InputElement).value; bool isChecked(String id) => (querySelector('#$id') as CheckboxInputElement).checked; diff --git a/example/search.html b/example/search.html index 0642e3db..16f41b72 100644 --- a/example/search.html +++ b/example/search.html @@ -7,7 +7,7 @@

GitHub Search

-
Repo:
+
Repo:
Language:
Filename:
Extension:
diff --git a/example/stars.dart b/example/stars.dart index 8527c20c..c4b65f31 100644 --- a/example/stars.dart +++ b/example/stars.dart @@ -1,44 +1,44 @@ -import "dart:html"; +import 'dart:html'; -import "package:github/browser.dart"; -import "common.dart"; +import 'package:github/github.dart'; +import 'common.dart'; DivElement $stars; Future main() async { - await initViewSourceButton("stars.dart"); - $stars = querySelector("#stars"); + await initViewSourceButton('stars.dart'); + $stars = querySelector('#stars'); loadStars(); } void loadStars() { - var user = "DirectMyFile"; - var repo = "github.dart"; + var user = 'SpinlockLabs'; + var repo = 'github.dart'; - if (queryString.containsKey("user")) { - user = queryString["user"]; + if (queryString.containsKey('user')) { + user = queryString['user']; } - if (queryString.containsKey("repo")) { - repo = queryString["repo"]; + if (queryString.containsKey('repo')) { + repo = queryString['repo']; } - querySelector("#title").appendText(" for $user/$repo"); + querySelector('#title').appendText(' for $user/$repo'); github.activity .listStargazers(RepositorySlug(user, repo)) .listen((stargazer) { final h = DivElement(); - h.classes.add("box"); - h.classes.add("user"); - h.style.textAlign = "center"; + h.classes.add('box'); + h.classes.add('user'); + h.style.textAlign = 'center'; h.append(ImageElement(src: stargazer.avatarUrl, width: 64, height: 64) - ..classes.add("avatar")); + ..classes.add('avatar')); h.append(AnchorElement(href: stargazer.htmlUrl) ..append(ParagraphElement()..text = stargazer.login)); $stars.append(h); }).onDone(() { - querySelector("#total") - .appendText(querySelectorAll(".user").length.toString() + " stars"); + querySelector('#total') + .appendText(querySelectorAll('.user').length.toString() + ' stars'); }); } diff --git a/example/status.dart b/example/status.dart index d9e8c5d9..a91a860a 100644 --- a/example/status.dart +++ b/example/status.dart @@ -1,17 +1,17 @@ import 'dart:async'; -import "dart:convert"; -import "dart:html"; +import 'dart:convert'; +import 'dart:html'; Future main() async { final request = await HttpRequest.request( - "https://status.github.com/api/status.json", - requestHeaders: {"Origin": window.location.origin}, + 'https://status.github.com/api/status.json', + requestHeaders: {'Origin': window.location.origin}, ); final text = request.responseText; final map = json.decode(text); - querySelector("#status") - ..appendText(map["status"]) - ..classes.add("status-${map["status"]}"); + querySelector('#status') + ..appendText(map['status']) + ..classes.add('status-${map["status"]}'); } diff --git a/example/user_info.dart b/example/user_info.dart index d65108c3..aad7760e 100644 --- a/example/user_info.dart +++ b/example/user_info.dart @@ -1,13 +1,13 @@ -import "dart:html"; +import 'dart:html'; -import "package:github/browser.dart"; -import "common.dart"; +import 'package:github/github.dart'; +import 'common.dart'; DivElement info; Future main() async { - await initViewSourceButton("user_info.dart"); - info = document.getElementById("info"); + await initViewSourceButton('user_info.dart'); + info = document.getElementById('info'); loadUser(); } @@ -16,12 +16,12 @@ GitHub createClient(String token) { } void loadUser() { - final localToken = document.getElementById("token") as InputElement; + final localToken = document.getElementById('token') as InputElement; - final loadBtn = document.getElementById("load"); + final loadBtn = document.getElementById('load'); loadBtn.onClick.listen((event) { if (localToken.value == null || localToken.value.isEmpty) { - window.alert("Please Enter a Token"); + window.alert('Please Enter a Token'); return; } @@ -30,32 +30,32 @@ void loadUser() { github.users.getCurrentUser().then((final CurrentUser user) { info.children.clear(); info.hidden = false; - info.appendHtml(""" + info.appendHtml(''' Name: ${user.name} - """); + '''); void append(String name, dynamic value) { if (value != null) { - info.appendHtml(""" + info.appendHtml('''
$name: ${value.toString()} - """); + '''); } } - append("Biography", user.bio); - append("Company", user.company); - append("Email", user.email); - append("Followers", user.followersCount); - append("Following", user.followingCount); - append("Disk Usage", user.diskUsage); - append("Plan Name", user.plan.name); - append("Created", user.createdAt); - document.getElementById("load").hidden = true; - document.getElementById("token").hidden = true; + append('Biography', user.bio); + append('Company', user.company); + append('Email', user.email); + append('Followers', user.followersCount); + append('Following', user.followingCount); + append('Disk Usage', user.diskUsage); + append('Plan Name', user.plan.name); + append('Created', user.createdAt); + document.getElementById('load').hidden = true; + document.getElementById('token').hidden = true; }).catchError((e) { if (e is AccessForbidden) { - window.alert("Invalid Token"); + window.alert('Invalid Token'); } }); }); diff --git a/example/users.dart b/example/users.dart index 18903eed..691509d5 100644 --- a/example/users.dart +++ b/example/users.dart @@ -1,15 +1,15 @@ -import "dart:async"; -import "dart:html"; +import 'dart:async'; +import 'dart:html'; -import "package:github/browser.dart"; +import 'package:github/github.dart'; -import "common.dart"; +import 'common.dart'; DivElement usersDiv; Future main() async { - await initViewSourceButton("users.dart"); - usersDiv = querySelector("#users"); + await initViewSourceButton('users.dart'); + usersDiv = querySelector('#users'); loadUsers(); } @@ -22,24 +22,23 @@ void loadUsers() { userDiv.append(BRElement()); } - userDiv.append( - GitHubBrowserHelper.createAvatarImage(user, width: 64, height: 64) - ..classes.add("avatar")); + userDiv.append(createAvatarImage(user, width: 64, height: 64) + ..classes.add('avatar')); final buff = StringBuffer(); buff - ..writeln("Username: ${user.login}") - ..writeln("Created: ${user.createdAt}") - ..writeln("Updated: ${user.updatedAt}"); + ..writeln('Username: ${user.login}') + ..writeln('Created: ${user.createdAt}') + ..writeln('Updated: ${user.updatedAt}'); if (user.company != null && user.company.isNotEmpty) { - buff.writeln("Company: ${user.company}"); + buff.writeln('Company: ${user.company}'); } - buff.writeln("Followers: ${user.followersCount}"); + buff.writeln('Followers: ${user.followersCount}'); userDiv.append(ParagraphElement() - ..appendHtml(buff.toString().replaceAll("\n", "
"), + ..appendHtml(buff.toString().replaceAll('\n', '
'), treeSanitizer: NodeTreeSanitizer.trusted)); usersDiv.append(userDiv); diff --git a/example/zen.dart b/example/zen.dart index 66383c49..560f914f 100644 --- a/example/zen.dart +++ b/example/zen.dart @@ -1,8 +1,8 @@ -import "dart:html"; -import "common.dart"; +import 'dart:html'; +import 'common.dart'; Future main() async { - await initViewSourceButton("zen.dart"); + await initViewSourceButton('zen.dart'); final String msg = await github.misc.getZen(); - querySelector("#zen").text = msg; + querySelector('#zen').text = msg; } diff --git a/lib/browser.dart b/lib/browser.dart deleted file mode 100644 index 92065d30..00000000 --- a/lib/browser.dart +++ /dev/null @@ -1,21 +0,0 @@ -/// GitHub for the Browser -/// -/// This contains a few utilities that are browser specific. - -library github.browser; - -import 'package:http/browser_client.dart'; - -import "src/common.dart"; - -export "src/browser/helper.dart"; -export "src/common.dart"; - -/// Creates a GitHub Client -GitHub createGitHubClient( - {Authentication auth, String endpoint = "https://api.github.com"}) { - // NOTE: This library is not needed if `pkg:http` is updated to support - // pkg:http ^0.12.0. Make sure to update the dependency if/when you remove - // browser.dart - return GitHub(auth: auth, client: BrowserClient(), endpoint: endpoint); -} diff --git a/lib/browser_helper.dart b/lib/browser_helper.dart new file mode 100644 index 00000000..39e8800b --- /dev/null +++ b/lib/browser_helper.dart @@ -0,0 +1,39 @@ +import 'dart:html'; +import 'package:github/src/common.dart'; + +/// Renders Markdown in HTML using the GitHub API +/// +/// TODO: Remove the requirement of [indent] and auto-detect it. +/// +/// [github] is the GitHub instance to use. +/// [selector] is the selector to use to find markdown elements. +/// [indent] is the indent that needs to be stripped out. +void renderMarkdown(GitHub github, String selector, {int indent = 4}) { + final ElementList elements = document.querySelectorAll(selector); + + elements.removeWhere((Element it) => it.attributes.containsKey('rendered')); + + for (final Element e in elements) { + final txt = e.text; + + final md = txt.split('\n').map((it) { + return it.length >= indent ? it.substring(indent) : it; + }).join('\n'); + + github.misc.renderMarkdown(md).then((html) { + e.hidden = false; + e.setAttribute('rendered', ''); + e.classes.add('markdown-body'); + e.setInnerHtml(html, treeSanitizer: NodeTreeSanitizer.trusted); + }); + } +} + +/// Creates an Image Element from a User that has the user's avatar. +ImageElement createAvatarImage( + User user, { + int width = 128, + int height = 128, +}) { + return ImageElement(src: user.avatarUrl, width: width, height: height); +} diff --git a/lib/github.dart b/lib/github.dart index d0472b38..03396535 100644 --- a/lib/github.dart +++ b/lib/github.dart @@ -1,8 +1,7 @@ -/// The code inspired by the http package from -/// https://github.com/dart-lang/http/blob/9a17157e6a71972f929a95c6b2b36992e5e02c6d/lib/src/client.dart#L11-L16 - -export 'package:github/src/github_stub.dart' - if (dart.library.html) 'package:github/browser.dart' - if (dart.library.io) 'package:github/server.dart'; +/// Do a conditional export of the right cross platform pieces depending on +/// if dart.html or dart.io is available. +export 'package:github/src/common/xplat_common.dart' + if (dart.library.html) 'package:github/src/browser/xplat_browser.dart' + if (dart.library.io) 'package:github/src/server/xplat_server.dart'; export 'package:github/src/common.dart'; diff --git a/lib/server.dart b/lib/server.dart deleted file mode 100644 index 909add95..00000000 --- a/lib/server.dart +++ /dev/null @@ -1,68 +0,0 @@ -/// GitHub for the Server -library github.server; - -import "dart:io"; - -import "src/common.dart"; - -export "src/common.dart"; -export "src/server/hooks.dart"; - -/// Creates a GitHub Client. -/// If [auth] is not specified, then it will be automatically configured -/// from the environment as per [findAuthenticationFromEnvironment]. -GitHub createGitHubClient({ - Authentication auth, - String endpoint = "https://api.github.com", -}) { - if (auth == null) { - auth = findAuthenticationFromEnvironment(); - } - - return GitHub(auth: auth, endpoint: endpoint); -} - -const List COMMON_GITHUB_TOKEN_ENV_KEYS = [ - "GITHUB_ADMIN_TOKEN", - "GITHUB_DART_TOKEN", - "GITHUB_API_TOKEN", - "GITHUB_TOKEN", - "HOMEBREW_GITHUB_API_TOKEN", - "MACHINE_GITHUB_API_TOKEN" -]; - -/// Looks for GitHub Authentication Information in the current process environment. -/// -/// Checks all the environment variables in [COMMON_GITHUB_TOKEN_ENV_KEYS] for tokens. -/// If the above fails, the GITHUB_USERNAME and GITHUB_PASSWORD keys will be checked. -Authentication findAuthenticationFromEnvironment() { - if (Platform.isMacOS) { - final result = Process.runSync( - "security", const ["find-internet-password", "-g", "-s", "github.com"]); - - if (result.exitCode == 0) { - final String out = result.stdout.toString(); - - String username = out.split('"acct"="')[1]; - username = username.substring(0, username.indexOf("\n")); - username = username.substring(0, username.length - 1); - String password = result.stderr.toString().split("password:")[1].trim(); - password = password.substring(1, password.length - 1); - return Authentication.basic(username.trim(), password.trim()); - } - } - - final Map env = Platform.environment; - - for (final String key in COMMON_GITHUB_TOKEN_ENV_KEYS) { - if (env[key] is String) { - return Authentication.withToken(env[key]); - } - } - - if (env["GITHUB_USERNAME"] is String && env["GITHUB_PASSWORD"] is String) { - return Authentication.basic(env["GITHUB_USERNAME"], env["GITHUB_PASSWORD"]); - } - - return Authentication.anonymous(); -} diff --git a/lib/src/browser/helper.dart b/lib/src/browser/helper.dart deleted file mode 100644 index 573b4376..00000000 --- a/lib/src/browser/helper.dart +++ /dev/null @@ -1,43 +0,0 @@ -import 'dart:html' hide Client; - -import '../common.dart'; - -/// Browser-Specific Helpers -class GitHubBrowserHelper { - /// Renders Markdown in HTML using the GitHub API - /// - /// TODO: Remove the requirement of [indent] and auto-detect it. - /// - /// [github] is the GitHub instance to use. - /// [selector] is the selector to use to find markdown elements. - /// [indent] is the indent that needs to be stripped out. - static void renderMarkdown(GitHub github, String selector, {int indent = 4}) { - final ElementList elements = document.querySelectorAll(selector); - - elements.removeWhere((Element it) => it.attributes.containsKey("rendered")); - - for (final Element e in elements) { - final txt = e.text; - - final md = txt.split("\n").map((it) { - return it.length >= indent ? it.substring(indent) : it; - }).join("\n"); - - github.misc.renderMarkdown(md).then((html) { - e.hidden = false; - e.setAttribute("rendered", ""); - e.classes.add("markdown-body"); - e.setInnerHtml(html, treeSanitizer: NodeTreeSanitizer.trusted); - }); - } - } - - /// Creates an Image Element from a User that has the user's avatar. - static ImageElement createAvatarImage( - User user, { - int width = 128, - int height = 128, - }) { - return ImageElement(src: user.avatarUrl, width: width, height: height); - } -} diff --git a/lib/src/browser/xplat_browser.dart b/lib/src/browser/xplat_browser.dart new file mode 100644 index 00000000..c7074a58 --- /dev/null +++ b/lib/src/browser/xplat_browser.dart @@ -0,0 +1,44 @@ +import 'dart:html'; +import 'package:github/src/common.dart'; +import 'package:github/src/common/xplat_common.dart' + show findAuthenticationInMap; + +/// Looks for GitHub Authentication information from the browser +/// +/// Checks for query strings first, then local storage using keys in [COMMON_GITHUB_TOKEN_ENV_KEYS]. +/// If the above fails, the GITHUB_USERNAME and GITHUB_PASSWORD keys will be checked. +Authentication findAuthenticationFromEnvironment() { + // search the query string parameters first + var auth = findAuthenticationInMap(_parseQuery(window.location.href)); + if (auth == null) { + auth = findAuthenticationInMap(window.sessionStorage); + } + return auth ?? Authentication.anonymous(); +} + +/// Parse the query string to a parameter `Map` +Map _parseQuery(String path) { + final params = {}; + if (!path.contains('?')) return params; + final queryStr = path.substring(path.indexOf('?') + 1); + queryStr.split('&').forEach((String keyValPair) { + final keyVal = _parseKeyVal(keyValPair); + final key = keyVal[0]; + if (key.isNotEmpty) { + params[key] = Uri.decodeComponent(keyVal[1]); + } + }); + return params; +} + +/// Parse a key value pair (`"key=value"`) and returns a list of `["key", "value"]`. +List _parseKeyVal(String kvPair) { + if (kvPair.isEmpty) { + return const ['', '']; + } + final splitPoint = kvPair.indexOf('='); + + return (splitPoint == -1) + ? [kvPair, ''] + : [kvPair.substring(0, splitPoint), kvPair.substring(splitPoint + 1)]; +} diff --git a/lib/src/common.dart b/lib/src/common.dart index c36e619d..56bc0770 100644 --- a/lib/src/common.dart +++ b/lib/src/common.dart @@ -1,83 +1,46 @@ /// The Core of GitHub for Dart. /// Contains the Models and other GitHub stuff. -library github.common; - -import "dart:async"; -import "dart:convert" - show - base64Decode, - base64Encode, - jsonEncode, - jsonDecode, - LineSplitter, - utf8, - json; - -import "package:http/http.dart" as http; -import 'package:http_parser/http_parser.dart' as http_parser; -import "package:json_annotation/json_annotation.dart"; -import 'package:meta/meta.dart'; - -import 'common/model/repos_releases.dart'; -import 'common/model/users.dart'; -import "common/util/pagination.dart"; -import 'util.dart'; - -export 'common/model/repos_releases.dart'; -export "common/model/users.dart"; -export "common/util/pagination.dart"; - -part "common/activity_service.dart"; -part "common/authorizations_service.dart"; -part "common/gists_service.dart"; -part "common/git_service.dart"; -part "common/github.dart"; -part "common/issues_service.dart"; -part "common/misc_service.dart"; -part "common/model/activity.dart"; -part "common/model/authorizations.dart"; -part "common/model/gists.dart"; -part "common/model/git.dart"; -part "common/model/issues.dart"; -part "common/model/keys.dart"; -part "common/model/misc.dart"; -part "common/model/notifications.dart"; -part "common/model/orgs.dart"; -part "common/model/pulls.dart"; -part "common/model/repos.dart"; -part "common/model/repos_commits.dart"; -part "common/model/repos_contents.dart"; -part "common/model/repos_forks.dart"; -part "common/model/repos_hooks.dart"; -part "common/model/repos_merging.dart"; -part "common/model/repos_pages.dart"; -part "common/model/repos_stats.dart"; -part "common/model/repos_statuses.dart"; -part "common/model/search.dart"; -part "common/orgs_service.dart"; -part "common/pulls_service.dart"; -part "common/repos_service.dart"; -part "common/search_service.dart"; -part "common/url_shortener_service.dart"; -part "common/users_service.dart"; -part "common/util/auth.dart"; -part "common/util/crawler.dart"; -part "common/util/errors.dart"; -part "common/util/json.dart"; -part "common/util/oauth2.dart"; -part "common/util/service.dart"; -part "common/util/utils.dart"; -part "common.g.dart"; - -void _applyExpandos(Object target, http.Response response) { - _etagExpando[target] = response.headers['etag']; - if (response.headers['date'] != null) { - _dateExpando[target] = http_parser.parseHttpDate(response.headers['date']); - } -} - -final _etagExpando = Expando('etag'); -final _dateExpando = Expando('date'); - -String getResponseEtag(Object obj) => _etagExpando[obj]; -DateTime getResponseDate(Object obj) => _dateExpando[obj]; +export 'package:github/src/common/activity_service.dart'; +export 'package:github/src/common/authorizations_service.dart'; +export 'package:github/src/common/gists_service.dart'; +export 'package:github/src/common/git_service.dart'; +export 'package:github/src/common/github.dart'; +export 'package:github/src/common/issues_service.dart'; +export 'package:github/src/common/misc_service.dart'; +export 'package:github/src/common/model/activity.dart'; +export 'package:github/src/common/model/authorizations.dart'; +export 'package:github/src/common/model/gists.dart'; +export 'package:github/src/common/model/git.dart'; +export 'package:github/src/common/model/issues.dart'; +export 'package:github/src/common/model/keys.dart'; +export 'package:github/src/common/model/misc.dart'; +export 'package:github/src/common/model/notifications.dart'; +export 'package:github/src/common/model/orgs.dart'; +export 'package:github/src/common/model/pulls.dart'; +export 'package:github/src/common/model/repos.dart'; +export 'package:github/src/common/model/repos_commits.dart'; +export 'package:github/src/common/model/repos_contents.dart'; +export 'package:github/src/common/model/repos_forks.dart'; +export 'package:github/src/common/model/repos_hooks.dart'; +export 'package:github/src/common/model/repos_merging.dart'; +export 'package:github/src/common/model/repos_pages.dart'; +export 'package:github/src/common/model/repos_releases.dart'; +export 'package:github/src/common/model/repos_stats.dart'; +export 'package:github/src/common/model/repos_statuses.dart'; +export 'package:github/src/common/model/search.dart'; +export 'package:github/src/common/model/users.dart'; +export 'package:github/src/common/orgs_service.dart'; +export 'package:github/src/common/pulls_service.dart'; +export 'package:github/src/common/repos_service.dart'; +export 'package:github/src/common/search_service.dart'; +export 'package:github/src/common/url_shortener_service.dart'; +export 'package:github/src/common/users_service.dart'; +export 'package:github/src/common/util/auth.dart'; +export 'package:github/src/common/util/crawler.dart'; +export 'package:github/src/common/util/errors.dart'; +export 'package:github/src/common/util/json.dart'; +export 'package:github/src/common/util/oauth2.dart'; +export 'package:github/src/common/util/pagination.dart'; +export 'package:github/src/common/util/service.dart'; +export 'package:github/src/common/util/utils.dart'; +export 'package:github/src/const/token_env_keys.dart'; diff --git a/lib/src/common.g.dart b/lib/src/common.g.dart deleted file mode 100644 index 35964b9a..00000000 --- a/lib/src/common.g.dart +++ /dev/null @@ -1,429 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of github.common; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -Map _$CreateGitBlobToJson(CreateGitBlob instance) => - { - 'content': instance.content, - 'encoding': instance.encoding, - }; - -GitCommit _$GitCommitFromJson(Map json) { - return GitCommit() - ..sha = json['sha'] as String - ..url = json['url'] as String - ..author = json['author'] == null - ? null - : GitCommitUser.fromJson(json['author'] as Map) - ..committer = json['committer'] == null - ? null - : GitCommitUser.fromJson(json['committer'] as Map) - ..message = json['message'] as String - ..tree = json['tree'] == null - ? null - : GitTree.fromJson(json['tree'] as Map) - ..parents = (json['parents'] as List) - ?.map((e) => - e == null ? null : GitCommit.fromJson(e as Map)) - ?.toList() - ..commentCount = json['comment_count'] as int; -} - -Map _$CreateGitCommitToJson(CreateGitCommit instance) { - final val = {}; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('message', instance.message); - writeNotNull('tree', instance.tree); - writeNotNull('parents', instance.parents); - writeNotNull('committer', instance.committer); - writeNotNull('author', instance.author); - return val; -} - -GitCommitUser _$GitCommitUserFromJson(Map json) { - return GitCommitUser( - json['name'] as String, - json['email'] as String, - json['date'] == null ? null : DateTime.parse(json['date'] as String), - ); -} - -Map _$GitCommitUserToJson(GitCommitUser instance) { - final val = {}; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('name', instance.name); - writeNotNull('email', instance.email); - writeNotNull('date', dateToGitHubIso8601(instance.date)); - return val; -} - -GitTree _$GitTreeFromJson(Map json) { - return GitTree( - json['sha'] as String, - json['url'] as String, - json['truncated'] as bool, - (json['tree'] as List) - ?.map((e) => - e == null ? null : GitTreeEntry.fromJson(e as Map)) - ?.toList(), - ); -} - -GitTreeEntry _$GitTreeEntryFromJson(Map json) { - return GitTreeEntry( - json['path'] as String, - json['mode'] as String, - json['type'] as String, - json['size'] as int, - json['sha'] as String, - json['url'] as String, - ); -} - -GitReference _$GitReferenceFromJson(Map json) { - return GitReference() - ..ref = json['ref'] as String - ..url = json['url'] as String - ..object = json['object'] == null - ? null - : GitObject.fromJson(json['object'] as Map); -} - -GitTag _$GitTagFromJson(Map json) { - return GitTag() - ..tag = json['tag'] as String - ..sha = json['sha'] as String - ..url = json['url'] as String - ..message = json['message'] as String - ..tagger = json['tagger'] == null - ? null - : GitCommitUser.fromJson(json['tagger'] as Map) - ..object = json['object'] == null - ? null - : GitObject.fromJson(json['object'] as Map); -} - -GitObject _$GitObjectFromJson(Map json) { - return GitObject( - json['type'] as String, - json['sha'] as String, - json['url'] as String, - ); -} - -TeamRepository _$TeamRepositoryFromJson(Map json) { - return TeamRepository() - ..name = json['name'] as String - ..id = json['id'] as int - ..fullName = json['full_name'] as String - ..owner = json['owner'] == null - ? null - : UserInformation.fromJson(json['owner'] as Map) - ..isPrivate = json['private'] as bool - ..isFork = json['fork'] as bool - ..htmlUrl = json['html_url'] as String - ..description = json['description'] as String - ..cloneUrls = json['clone_urls'] == null - ? null - : CloneUrls.fromJson(json['clone_urls'] as Map) - ..homepage = json['homepage'] as String - ..size = json['size'] as int - ..stargazersCount = json['stargazers_count'] as int - ..watchersCount = json['watchers_count'] as int - ..language = json['language'] as String - ..hasIssues = json['has_issues'] as bool - ..hasWiki = json['has_wiki'] as bool - ..hasDownloads = json['has_downloads'] as bool - ..forksCount = json['forks_count'] as int - ..openIssuesCount = json['open_issues_count'] as int - ..defaultBranch = json['default_branch'] as String - ..subscribersCount = json['subscribers_count'] as int - ..networkCount = json['network_count'] as int - ..createdAt = json['created_at'] == null - ? null - : DateTime.parse(json['created_at'] as String) - ..pushedAt = json['pushed_at'] == null - ? null - : DateTime.parse(json['pushed_at'] as String) - ..updatedAt = json['updated_at'] == null - ? null - : DateTime.parse(json['updated_at'] as String) - ..license = json['license'] == null - ? null - : LicenseKind.fromJson(json['license'] as Map) - ..permissions = json['permissions'] == null - ? null - : TeamRepositoryPermissions.fromJson( - json['permissions'] as Map); -} - -TeamRepositoryPermissions _$TeamRepositoryPermissionsFromJson( - Map json) { - return TeamRepositoryPermissions( - json['admin'] as bool, - json['push'] as bool, - json['pull'] as bool, - ); -} - -GitHubComparison _$GitHubComparisonFromJson(Map json) { - return GitHubComparison( - json['url'] as String, - json['status'] as String, - json['ahead_by'] as int, - json['behind_by'] as int, - json['total_commits'] as int, - ); -} - -Repository _$RepositoryFromJson(Map json) { - return Repository() - ..name = json['name'] as String - ..id = json['id'] as int - ..fullName = json['full_name'] as String - ..owner = json['owner'] == null - ? null - : UserInformation.fromJson(json['owner'] as Map) - ..isPrivate = json['private'] as bool - ..isFork = json['fork'] as bool - ..htmlUrl = json['html_url'] as String - ..description = json['description'] as String - ..cloneUrls = json['clone_urls'] == null - ? null - : CloneUrls.fromJson(json['clone_urls'] as Map) - ..homepage = json['homepage'] as String - ..size = json['size'] as int - ..stargazersCount = json['stargazers_count'] as int - ..watchersCount = json['watchers_count'] as int - ..language = json['language'] as String - ..hasIssues = json['has_issues'] as bool - ..hasWiki = json['has_wiki'] as bool - ..hasDownloads = json['has_downloads'] as bool - ..forksCount = json['forks_count'] as int - ..openIssuesCount = json['open_issues_count'] as int - ..defaultBranch = json['default_branch'] as String - ..subscribersCount = json['subscribers_count'] as int - ..networkCount = json['network_count'] as int - ..createdAt = json['created_at'] == null - ? null - : DateTime.parse(json['created_at'] as String) - ..pushedAt = json['pushed_at'] == null - ? null - : DateTime.parse(json['pushed_at'] as String) - ..updatedAt = json['updated_at'] == null - ? null - : DateTime.parse(json['updated_at'] as String) - ..license = json['license'] == null - ? null - : LicenseKind.fromJson(json['license'] as Map); -} - -CloneUrls _$CloneUrlsFromJson(Map json) { - return CloneUrls( - json['git'] as String, - json['ssh'] as String, - json['https'] as String, - json['svn'] as String, - ); -} - -Tag _$TagFromJson(Map json) { - return Tag( - json['name'] as String, - json['commit'] == null - ? null - : CommitInfo.fromJson(json['commit'] as Map), - json['zipball_url'] as String, - json['tarball_url'] as String, - ); -} - -CommitData _$CommitDataFromJson(Map json) { - return CommitData( - json['sha'] as String, - json['commit'] == null - ? null - : GitCommit.fromJson(json['commit'] as Map), - json['url'] as String, - json['html_url'] as String, - json['comments_url'] as String, - json['author'] == null - ? null - : CommitDataUser.fromJson(json['author'] as Map), - json['committer'] == null - ? null - : CommitDataUser.fromJson(json['committer'] as Map), - (json['parents'] as List)?.map((e) => e as Map)?.toList(), - ); -} - -CommitDataUser _$CommitDataUserFromJson(Map json) { - return CommitDataUser( - json['login'] as String, - json['id'] as int, - json['type'] as String, - ); -} - -CommitInfo _$CommitInfoFromJson(Map json) { - return CommitInfo( - json['sha'] as String, - json['tree'] == null - ? null - : GitTree.fromJson(json['tree'] as Map), - ); -} - -UserInformation _$UserInformationFromJson(Map json) { - return UserInformation( - json['login'] as String, - json['id'] as int, - json['avatar_url'] as String, - json['html_url'] as String, - ); -} - -Branch _$BranchFromJson(Map json) { - return Branch( - json['name'] as String, - json['commit'] == null - ? null - : CommitData.fromJson(json['commit'] as Map), - ); -} - -LicenseDetails _$LicenseDetailsFromJson(Map json) { - return LicenseDetails( - name: json['name'] as String, - path: json['path'] as String, - sha: json['sha'] as String, - size: json['size'] as int, - url: json['url'] == null ? null : Uri.parse(json['url'] as String), - htmlUrl: - json['html_url'] == null ? null : Uri.parse(json['html_url'] as String), - gitUrl: - json['git_url'] == null ? null : Uri.parse(json['git_url'] as String), - downloadUrl: json['download_url'] == null - ? null - : Uri.parse(json['download_url'] as String), - type: json['type'] as String, - content: json['content'] as String, - encoding: json['encoding'] as String, - links: json['_links'] == null - ? null - : Links.fromJson(json['_links'] as Map), - license: json['license'] == null - ? null - : LicenseKind.fromJson(json['license'] as Map), - ); -} - -Map _$LicenseDetailsToJson(LicenseDetails instance) => - { - 'name': instance.name, - 'path': instance.path, - 'sha': instance.sha, - 'size': instance.size, - 'url': instance.url?.toString(), - 'html_url': instance.htmlUrl?.toString(), - 'git_url': instance.gitUrl?.toString(), - 'download_url': instance.downloadUrl?.toString(), - 'type': instance.type, - 'content': instance.content, - 'encoding': instance.encoding, - '_links': instance.links, - 'license': instance.license, - }; - -LicenseKind _$LicenseKindFromJson(Map json) { - return LicenseKind( - key: json['key'] as String, - name: json['name'] as String, - spdxId: json['spdx_id'] as String, - url: json['url'] == null ? null : Uri.parse(json['url'] as String), - nodeId: json['node_id'] as String, - ); -} - -Map _$LicenseKindToJson(LicenseKind instance) => - { - 'key': instance.key, - 'name': instance.name, - 'spdx_id': instance.spdxId, - 'url': instance.url?.toString(), - 'node_id': instance.nodeId, - }; - -Links _$LinksFromJson(Map json) { - return Links( - git: json['git'] == null ? null : Uri.parse(json['git'] as String), - self: json['self'] == null ? null : Uri.parse(json['self'] as String), - html: json['html'] == null ? null : Uri.parse(json['html'] as String), - ); -} - -Map _$LinksToJson(Links instance) => { - 'self': instance.self?.toString(), - 'git': instance.git?.toString(), - 'html': instance.html?.toString(), - }; - -ContributorStatistics _$ContributorStatisticsFromJson( - Map json) { - return ContributorStatistics( - json['author'] == null - ? null - : User.fromJson(json['author'] as Map), - json['total'] as int, - (json['weeks'] as List) - ?.map((e) => e == null - ? null - : ContributorWeekStatistics.fromJson(e as Map)) - ?.toList(), - ); -} - -ContributorWeekStatistics _$ContributorWeekStatisticsFromJson( - Map json) { - return ContributorWeekStatistics( - json['w'] as int, - json['a'] as int, - json['d'] as int, - json['c'] as int, - ); -} - -CodeSearchResults _$CodeSearchResultsFromJson(Map json) { - return CodeSearchResults() - ..totalCount = json['total_count'] as int - ..incompleteResults = json['incomplete_results'] as bool - ..items = CodeSearchItem.fromJsonList(json['items'] as List); -} - -CodeSearchItem _$CodeSearchItemFromJson(Map json) { - return CodeSearchItem() - ..name = json['name'] as String - ..path = json['path'] as String - ..sha = json['sha'] as String - ..url = Uri.parse(json['url'] as String) - ..gitUrl = Uri.parse(json['git_url'] as String) - ..htmlUrl = Uri.parse(json['html_url'] as String) - ..repository = - Repository.fromJSON(json['repository'] as Map); -} diff --git a/lib/src/common/activity_service.dart b/lib/src/common/activity_service.dart index 31389f4d..32714b3c 100644 --- a/lib/src/common/activity_service.dart +++ b/lib/src/common/activity_service.dart @@ -1,4 +1,10 @@ -part of github.common; +import 'dart:async'; +import 'dart:convert'; +import 'package:github/src/common.dart'; +import 'package:github/src/common/model/users.dart'; +import 'package:github/src/common/util/pagination.dart'; +import 'package:github/src/util.dart'; +import 'package:http/http.dart' as http; /// The [ActivityService] handles communication with activity related methods /// of the GitHub API. @@ -11,8 +17,8 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/events/#list-public-events Stream listPublicEvents({int pages = 2}) { - return PaginationHelper(_github) - .objects("GET", "/events", Event.fromJSON, pages: pages); + return PaginationHelper(github) + .objects('GET', '/events', Event.fromJSON, pages: pages); } /// Lists public events for a network of repositories. @@ -20,8 +26,8 @@ class ActivityService extends Service { /// API docs: https://developer.github.com/v3/activity/events/#list-public-events-for-a-network-of-repositories Stream listRepositoryNetworkEvents(RepositorySlug slug, {int pages = 2}) { - return PaginationHelper(_github).objects( - "GET", "/networks/${slug.fullName}/events", Event.fromJSON, + return PaginationHelper(github).objects( + 'GET', '/networks/${slug.fullName}/events', Event.fromJSON, pages: pages); } @@ -29,34 +35,34 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/events/#list-public-events-for-a-network-of-repositories EventPoller pollRepositoryNetworkEvents(RepositorySlug slug) => - EventPoller(_github, "/networks/${slug.fullName}/events"); + EventPoller(github, '/networks/${slug.fullName}/events'); /// Returns an [EventPoller] for repository issue events. /// /// API docs: https://developer.github.com/v3/activity/events/#list-repository-events EventPoller pollRepositoryIssueEvents(RepositorySlug slug) => - EventPoller(_github, "/repos/${slug.fullName}/issues/events"); + EventPoller(github, '/repos/${slug.fullName}/issues/events'); /// Lists repository issue events. /// /// API docs: https://developer.github.com/v3/activity/events/#list-repository-events Stream listRepositoryIssueEvents(RepositorySlug slug, {int pages}) { - return PaginationHelper(_github).objects( - "GET", "/repos/${slug.fullName}/issues/events", Event.fromJSON, + return PaginationHelper(github).objects( + 'GET', '/repos/${slug.fullName}/issues/events', Event.fromJSON, pages: pages); } /// Returns an [EventPoller] for public events. /// /// API docs: https://developer.github.com/v3/activity/events/#list-public-events - EventPoller pollPublicEvents() => EventPoller(_github, "/events"); + EventPoller pollPublicEvents() => EventPoller(github, '/events'); /// Lists repository events. /// /// API docs: https://developer.github.com/v3/activity/events/#list-repository-events Stream listRepositoryEvents(RepositorySlug slug, {int pages}) { - return PaginationHelper(_github).objects( - "GET", "/repos/${slug.fullName}/events", Event.fromJSON, + return PaginationHelper(github).objects( + 'GET', '/repos/${slug.fullName}/events', Event.fromJSON, pages: pages); } @@ -64,40 +70,40 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/events/#list-repository-events EventPoller pollRepositoryEvents(RepositorySlug slug) => - EventPoller(_github, "/repos/${slug.fullName}/events"); + EventPoller(github, '/repos/${slug.fullName}/events'); /// Lists public events for an organization. /// /// API docs: https://developer.github.com/v3/activity/events/#list-public-events-for-an-organization Stream listEventsForOrganization(String name, {int pages}) { - return PaginationHelper(_github) - .objects("GET", "/orgs/$name/events", Event.fromJSON, pages: pages); + return PaginationHelper(github) + .objects('GET', '/orgs/$name/events', Event.fromJSON, pages: pages); } /// Returns an [EventPoller] for public events for an organization. /// /// API docs: https://developer.github.com/v3/activity/events/#list-public-events-for-an-organization EventPoller pollEventsForOrganization(String name) => - EventPoller(_github, "/orgs/$name/events"); + EventPoller(github, '/orgs/$name/events'); /// Returns an [EventPoller] for events received by a user. /// /// API docs: https://developer.github.com/v3/activity/events/#list-events-that-a-user-has-received EventPoller pollEventsReceivedByUser(String user) => - EventPoller(_github, "/users/$user/received_events"); + EventPoller(github, '/users/$user/received_events'); /// Returns an [EventPoller] for public events received by a user. /// /// API docs: https://developer.github.com/v3/activity/events/#list-public-events-that-a-user-has-received EventPoller pollPublicEventsReceivedByUser(String user) => - EventPoller(_github, "/users/$user/received_events/public"); + EventPoller(github, '/users/$user/received_events/public'); /// Lists the events performed by a user. /// /// API docs: https://developer.github.com/v3/activity/events/#list-events-performed-by-a-user Stream listEventsPerformedByUser(String username, {int pages}) { - return PaginationHelper(_github).objects( - "GET", "/users/$username/events", Event.fromJSON, + return PaginationHelper(github).objects( + 'GET', '/users/$username/events', Event.fromJSON, pages: pages); } @@ -105,8 +111,8 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/events/#list-public-events-performed-by-a-user Stream listPublicEventsPerformedByUser(String username, {int pages}) { - return PaginationHelper(_github).objects( - "GET", "/users/$username/events/public", Event.fromJSON, + return PaginationHelper(github).objects( + 'GET', '/users/$username/events/public', Event.fromJSON, pages: pages); } @@ -114,7 +120,7 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/events/#list-events-for-an-organization EventPoller pollUserEventsForOrganization(String user, String organization) => - EventPoller(_github, "/users/$user/events/orgs/$organization"); + EventPoller(github, '/users/$user/events/orgs/$organization'); // TODO: Implement listFeeds: https://developer.github.com/v3/activity/feeds/#list-feeds @@ -123,9 +129,9 @@ class ActivityService extends Service { /// API docs: https://developer.github.com/v3/activity/notifications/#list-your-notifications Stream listNotifications( {bool all = false, bool participating = false}) { - return PaginationHelper(_github).objects( - "GET", '/notifications', Notification.fromJSON, - params: {"all": all, "participating": participating}); + return PaginationHelper(github).objects( + 'GET', '/notifications', Notification.fromJSON, + params: {'all': all, 'participating': participating}); } /// Lists all notifications for a given repository. @@ -133,9 +139,9 @@ class ActivityService extends Service { /// API docs: https://developer.github.com/v3/activity/notifications/#list-your-notifications-in-a-repository Stream listRepositoryNotifications(RepositorySlug repository, {bool all = false, bool participating = false}) { - return PaginationHelper(_github).objects("GET", + return PaginationHelper(github).objects('GET', '/repos/${repository.fullName}/notifications', Notification.fromJSON, - params: {"all": all, "participating": participating}); + params: {'all': all, 'participating': participating}); } /// Marks all notifications up to [lastRead] as read. @@ -144,10 +150,10 @@ class ActivityService extends Service { Future markNotificationsRead({DateTime lastRead}) { final data = {}; - if (lastRead != null) data["last_read_at"] = lastRead.toIso8601String(); + if (lastRead != null) data['last_read_at'] = lastRead.toIso8601String(); - return _github - .request("PUT", "/notifications", body: jsonEncode(data)) + return github + .request('PUT', '/notifications', body: jsonEncode(data)) .then((response) { return response.statusCode == 205; }); @@ -163,10 +169,10 @@ class ActivityService extends Service { }) { final data = {}; - if (lastRead != null) data["last_read_at"] = lastRead.toIso8601String(); + if (lastRead != null) data['last_read_at'] = lastRead.toIso8601String(); - return _github - .request("PUT", "/repos/${slug.fullName}/notifications", + return github + .request('PUT', '/repos/${slug.fullName}/notifications', body: jsonEncode(data)) .then((response) { return response.statusCode == 205; @@ -177,15 +183,15 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/notifications/#view-a-single-thread Future getThread(String threadId) => - _github.getJSON("/notification/threads/$threadId", + github.getJSON('/notification/threads/$threadId', statusCode: StatusCodes.OK, convert: Notification.fromJSON); /// Mark the specified notification thread as read. /// /// API docs: https://developer.github.com/v3/activity/notifications/#mark-a-thread-as-read Future markThreadRead(String threadId) { - return _github - .request("PATCH", "/notifications/threads/$threadId") + return github + .request('PATCH', '/notifications/threads/$threadId') .then((response) { return response.statusCode == StatusCodes.RESET_CONTENT; }); @@ -199,32 +205,32 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/starring/#list-stargazers Stream listStargazers(RepositorySlug slug) { - return PaginationHelper(_github) - .objects("GET", "/repos/${slug.fullName}/stargazers", User.fromJson); + return PaginationHelper(github) + .objects('GET', '/repos/${slug.fullName}/stargazers', User.fromJson); } /// Lists all the repos starred by a user. /// /// API docs: https://developer.github.com/v3/activity/starring/#list-repositories-being-starred Stream listStarredByUser(String user) { - return PaginationHelper(_github) - .objects("GET", "/users/$user/starred", Repository.fromJSON); + return PaginationHelper(github) + .objects('GET', '/users/$user/starred', Repository.fromJSON); } /// Lists all the repos by the current user. /// /// API docs: https://developer.github.com/v3/activity/starring/#list-repositories-being-starred Stream listStarred() { - return PaginationHelper(_github) - .objects("GET", "/user/starred", Repository.fromJSON); + return PaginationHelper(github) + .objects('GET', '/user/starred', Repository.fromJSON); } /// Checks if the currently authenticated user has starred the specified repository. /// /// API docs: https://developer.github.com/v3/activity/starring/#check-if-you-are-starring-a-repository Future isStarred(RepositorySlug slug) { - return _github - .request("GET", "/user/starred/${slug.fullName}") + return github + .request('GET', '/user/starred/${slug.fullName}') .then((response) { return response.statusCode == 204; }); @@ -234,8 +240,8 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/starring/#star-a-repository Future star(RepositorySlug slug) { - return _github.request("PUT", "/user/starred/${slug.fullName}", - headers: {"Content-Length": "0"}).then((response) { + return github.request('PUT', '/user/starred/${slug.fullName}', + headers: {'Content-Length': '0'}).then((response) { return null; }); } @@ -244,8 +250,8 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/starring/#unstar-a-repository Future unstar(RepositorySlug slug) { - return _github.request("DELETE", "/user/starred/${slug.fullName}", - headers: {"Content-Length": "0"}).then((response) { + return github.request('DELETE', '/user/starred/${slug.fullName}', + headers: {'Content-Length': '0'}).then((response) { return null; }); } @@ -254,24 +260,24 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/watching/#list-watchers Stream listWatchers(RepositorySlug slug) { - return PaginationHelper(_github) - .objects("GET", "/repos/${slug.fullName}/subscribers", User.fromJson); + return PaginationHelper(github) + .objects('GET', '/repos/${slug.fullName}/subscribers', User.fromJson); } /// Lists the repositories the specified user is watching. /// /// API docs: https://developer.github.com/v3/activity/watching/#list-repositories-being-watched Stream listWatchedByUser(String user) { - return PaginationHelper(_github) - .objects("GET", '/users/$user/subscriptions', Repository.fromJSON); + return PaginationHelper(github) + .objects('GET', '/users/$user/subscriptions', Repository.fromJSON); } /// Lists the repositories the current user is watching. /// /// API docs: https://developer.github.com/v3/activity/watching/#list-repositories-being-watched Stream listWatched() { - return PaginationHelper(_github) - .objects("GET", '/user/subscriptions', Repository.fromJSON); + return PaginationHelper(github) + .objects('GET', '/user/subscriptions', Repository.fromJSON); } /// Fetches repository subscription information. @@ -279,7 +285,7 @@ class ActivityService extends Service { /// API docs: https://developer.github.com/v3/activity/watching/#get-a-repository-subscription Future getRepositorySubscription( RepositorySlug slug) => - _github.getJSON("/repos/${slug.fullName}/subscription", + github.getJSON('/repos/${slug.fullName}/subscription', statusCode: StatusCodes.OK, convert: RepositorySubscription.fromJSON); /// Sets the Repository Subscription Status @@ -291,10 +297,10 @@ class ActivityService extends Service { bool ignored, }) { final map = - createNonNullMap({"subscribed": subscribed, "ignored": ignored}); + createNonNullMap({'subscribed': subscribed, 'ignored': ignored}); - return _github.postJSON( - "/repos/${slug.fullName}/subscription", + return github.postJSON( + '/repos/${slug.fullName}/subscription', statusCode: StatusCodes.OK, convert: RepositorySubscription.fromJSON, body: jsonEncode(map), @@ -305,8 +311,8 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/watching/#delete-a-repository-subscription Future deleteRepositorySubscription(RepositorySlug slug) { - return _github.request("DELETE", "/repos/${slug.fullName}/subscription", - headers: {"Content-Length": "0"}).then((response) { + return github.request('DELETE', '/repos/${slug.fullName}/subscription', + headers: {'Content-Length': '0'}).then((response) { return null; }); } @@ -326,7 +332,7 @@ class EventPoller { Stream start({bool onlyNew = false, int interval, DateTime after}) { if (_timer != null) { - throw Exception("Polling already started."); + throw Exception('Polling already started.'); } if (after != null) after = after.toUtc(); @@ -372,7 +378,7 @@ class EventPoller { headers['If-None-Match'] = _lastFetched; } - github.request("GET", path, headers: headers).then(handleEvent); + github.request('GET', path, headers: headers).then(handleEvent); }); } } @@ -383,14 +389,14 @@ class EventPoller { headers['If-None-Match'] = _lastFetched; } - github.request("GET", path, headers: headers).then(handleEvent); + github.request('GET', path, headers: headers).then(handleEvent); return _controller.stream; } Future stop() { if (_timer == null) { - throw Exception("Polling not started."); + throw Exception('Polling not started.'); } _timer.cancel(); diff --git a/lib/src/common/authorizations_service.dart b/lib/src/common/authorizations_service.dart index 0c0aa535..8f661b6a 100644 --- a/lib/src/common/authorizations_service.dart +++ b/lib/src/common/authorizations_service.dart @@ -1,4 +1,6 @@ -part of github.common; +import "dart:async"; +import 'package:github/src/common.dart'; +import "package:github/src/common/util/pagination.dart"; /// The [AuthorizationsService] handles communication with authorizations related methods /// of the GitHub API. @@ -14,7 +16,7 @@ class AuthorizationsService extends Service { /// /// API docs: https://developer.github.com/v3/oauth_authorizations/#list-your-authorizations Stream listAuthorizations() { - return PaginationHelper(_github) + return PaginationHelper(github) .objects("GET", "/authorizations", Authorization.fromJSON); } @@ -22,7 +24,7 @@ class AuthorizationsService extends Service { /// /// API docs: https://developer.github.com/v3/oauth_authorizations/#get-a-single-authorization Future getAuthorization(int id) => - _github.getJSON("/authorizations/$id", + github.getJSON("/authorizations/$id", statusCode: 200, convert: Authorization.fromJSON); // TODO: Implement remaining API methods of authorizations: diff --git a/lib/src/common/gists_service.dart b/lib/src/common/gists_service.dart index b86f0966..3b2dc1c1 100644 --- a/lib/src/common/gists_service.dart +++ b/lib/src/common/gists_service.dart @@ -1,4 +1,7 @@ -part of github.common; +import "dart:async"; +import "dart:convert"; +import 'package:github/src/common.dart'; +import "package:github/src/common/util/pagination.dart"; /// The [GistsService] handles communication with gist /// methods of the GitHub API. @@ -11,7 +14,7 @@ class GistsService extends Service { /// /// API docs: https://developer.github.com/v3/gists/#list-gists Stream listUserGists(String username) { - return PaginationHelper(_github) + return PaginationHelper(github) .objects("GET", "/users/$username/gists", Gist.fromJSON); } @@ -20,14 +23,14 @@ class GistsService extends Service { /// /// API docs: https://developer.github.com/v3/gists/#list-gists Stream listCurrentUserGists() { - return PaginationHelper(_github).objects("GET", "/gists", Gist.fromJSON); + return PaginationHelper(github).objects("GET", "/gists", Gist.fromJSON); } /// Fetches the currently authenticated user's public gists. /// /// API docs: https://developer.github.com/v3/gists/#list-gists Stream listCurrentUserPublicGists() { - return PaginationHelper(_github) + return PaginationHelper(github) .objects("GET", "/gists/public", Gist.fromJSON); } @@ -35,14 +38,14 @@ class GistsService extends Service { /// /// API docs: https://developer.github.com/v3/gists/#list-gists Stream listCurrentUserStarredGists() { - return PaginationHelper(_github) + return PaginationHelper(github) .objects("GET", "/gists/starred", Gist.fromJSON); } /// Fetches a Gist by the specified [id]. /// /// API docs: https://developer.github.com/v3/gists/#get-a-single-gist - Future getGist(String id) => _github.getJSON("/gists/$id", + Future getGist(String id) => github.getJSON("/gists/$id", statusCode: StatusCodes.OK, convert: Gist.fromJSON); /// Creates a Gist @@ -69,7 +72,7 @@ class GistsService extends Service { map["files"] = f; - return _github.postJSON( + return github.postJSON( "/gists", statusCode: 201, body: jsonEncode(map), @@ -81,7 +84,7 @@ class GistsService extends Service { /// /// API docs: https://developer.github.com/v3/gists/#delete-a-gist Future deleteGist(String id) { - return _github.request("DELETE", "/gists/$id").then((response) { + return github.request("DELETE", "/gists/$id").then((response) { return response.statusCode == 204; }); } @@ -108,7 +111,7 @@ class GistsService extends Service { map["files"] = f; } - return _github.postJSON( + return github.postJSON( "/gists/$id", statusCode: 200, body: jsonEncode(map), @@ -122,7 +125,7 @@ class GistsService extends Service { /// /// API docs: https://developer.github.com/v3/gists/#star-a-gist Future starGist(String id) { - return _github.request("POST", "/gists/$id/star").then((response) { + return github.request("POST", "/gists/$id/star").then((response) { return response.statusCode == 204; }); } @@ -131,7 +134,7 @@ class GistsService extends Service { /// /// API docs: https://developer.github.com/v3/gists/#star-a-gist Future unstarGist(String id) { - return _github.request("DELETE", "/gists/$id/star").then((response) { + return github.request("DELETE", "/gists/$id/star").then((response) { return response.statusCode == 204; }); } @@ -140,7 +143,7 @@ class GistsService extends Service { /// /// API docs: https://developer.github.com/v3/gists/#check-if-a-gist-is-starred Future isGistStarred(String id) { - return _github.request("GET", "/gists/$id/star").then((response) { + return github.request("GET", "/gists/$id/star").then((response) { return response.statusCode == 204; }); } @@ -149,7 +152,7 @@ class GistsService extends Service { /// /// API docs: https://developer.github.com/v3/gists/#check-if-a-gist-is-starred Future forkGist(String id) { - return _github + return github .request("POST", "/gists/$id/forks", statusCode: 201) .then((response) { return Gist.fromJSON(jsonDecode(response.body) as Map); @@ -162,7 +165,7 @@ class GistsService extends Service { /// /// API docs: https://developer.github.com/v3/gists/comments/#list-comments-on-a-gist Stream listComments(String gistId) { - return PaginationHelper(_github) + return PaginationHelper(github) .objects("GET", "/gists/$gistId/comments", GistComment.fromJSON); } @@ -172,7 +175,7 @@ class GistsService extends Service { /// /// API docs: https://developer.github.com/v3/gists/comments/#create-a-comment Future createComment(String gistId, CreateGistComment request) { - return _github.postJSON("/gists/$gistId/comments", + return github.postJSON("/gists/$gistId/comments", body: request.toJSON(), convert: GistComment.fromJSON); } diff --git a/lib/src/common/git_service.dart b/lib/src/common/git_service.dart index 0da8d9f2..31d17942 100644 --- a/lib/src/common/git_service.dart +++ b/lib/src/common/git_service.dart @@ -1,4 +1,7 @@ -part of github.common; +import "dart:async"; +import "dart:convert"; +import 'package:github/src/common.dart'; +import "package:github/src/common/util/pagination.dart"; /// The [GitService] handles communication with git related methods of the /// GitHub API. @@ -11,14 +14,14 @@ class GitService extends Service { /// /// API docs: https://developer.github.com/v3/git/blobs/#get-a-blob Future getBlob(RepositorySlug slug, String sha) => - _github.getJSON('/repos/${slug.fullName}/git/blobs/$sha', + github.getJSON('/repos/${slug.fullName}/git/blobs/$sha', convert: GitBlob.fromJSON, statusCode: StatusCodes.OK); /// Creates a blob with specified [blob] content. /// /// API docs: https://developer.github.com/v3/git/blobs/#create-a-blob Future createBlob(RepositorySlug slug, CreateGitBlob blob) { - return _github.postJSON('/repos/${slug.fullName}/git/blobs', + return github.postJSON('/repos/${slug.fullName}/git/blobs', convert: GitBlob.fromJSON, statusCode: StatusCodes.CREATED, body: jsonEncode(blob)); @@ -28,14 +31,14 @@ class GitService extends Service { /// /// API docs: https://developer.github.com/v3/git/commits/#get-a-commit Future getCommit(RepositorySlug slug, String sha) => - _github.getJSON('/repos/${slug.fullName}/git/commits/$sha', + github.getJSON('/repos/${slug.fullName}/git/commits/$sha', convert: GitCommit.fromJSON, statusCode: StatusCodes.OK); /// Creates a new commit in a repository. /// /// API docs: https://developer.github.com/v3/git/commits/#create-a-commit Future createCommit(RepositorySlug slug, CreateGitCommit commit) { - return _github.postJSON('/repos/${slug.fullName}/git/commits', + return github.postJSON('/repos/${slug.fullName}/git/commits', convert: GitCommit.fromJSON, statusCode: StatusCodes.CREATED, body: jsonEncode(commit)); @@ -47,7 +50,7 @@ class GitService extends Service { /// /// API docs: https://developer.github.com/v3/git/refs/#get-a-reference Future getReference(RepositorySlug slug, String ref) => - _github.getJSON('/repos/${slug.fullName}/git/refs/$ref', + github.getJSON('/repos/${slug.fullName}/git/refs/$ref', convert: GitReference.fromJSON, statusCode: StatusCodes.OK); /// Lists the references in a repository. @@ -63,8 +66,7 @@ class GitService extends Service { path += '/$type'; } - return PaginationHelper(_github) - .objects('GET', path, GitReference.fromJSON); + return PaginationHelper(github).objects('GET', path, GitReference.fromJSON); } /// Creates a new reference in a repository. @@ -75,7 +77,7 @@ class GitService extends Service { /// API docs: https://developer.github.com/v3/git/refs/#create-a-reference Future createReference( RepositorySlug slug, String ref, String sha) { - return _github.postJSON('/repos/${slug.fullName}/git/refs', + return github.postJSON('/repos/${slug.fullName}/git/refs', convert: GitReference.fromJSON, statusCode: StatusCodes.CREATED, body: jsonEncode({'ref': ref, 'sha': sha})); @@ -94,7 +96,7 @@ class GitService extends Service { // Somehow the reference updates PATCH request needs a valid content-length. final headers = {'content-length': body.length.toString()}; - return _github + return github .request('PATCH', '/repos/${slug.fullName}/git/refs/$ref', body: body, headers: headers) .then((response) { @@ -107,7 +109,7 @@ class GitService extends Service { /// /// API docs: https://developer.github.com/v3/git/refs/#delete-a-reference Future deleteReference(RepositorySlug slug, String ref) { - return _github + return github .request("DELETE", "/repos/${slug.fullName}/git/refs/$ref") .then((response) => response.statusCode == StatusCodes.NO_CONTENT); } @@ -116,14 +118,14 @@ class GitService extends Service { /// /// API docs: https://developer.github.com/v3/git/tags/#get-a-tag Future getTag(RepositorySlug slug, String sha) => - _github.getJSON('/repos/${slug.fullName}/git/tags/$sha', + github.getJSON('/repos/${slug.fullName}/git/tags/$sha', convert: GitTag.fromJSON, statusCode: StatusCodes.OK); /// Creates a new tag in a repository. /// /// API docs: https://developer.github.com/v3/git/tags/#create-a-tag-object Future createTag(RepositorySlug slug, CreateGitTag tag) => - _github.postJSON('/repos/${slug.fullName}/git/tags', + github.postJSON('/repos/${slug.fullName}/git/tags', convert: GitTag.fromJSON, statusCode: StatusCodes.CREATED, body: tag.toJSON()); @@ -141,7 +143,7 @@ class GitService extends Service { path += '?recursive=1'; } - return _github.getJSON(path, + return github.getJSON(path, convert: (j) => GitTree.fromJson(j), statusCode: StatusCodes.OK); } @@ -149,7 +151,7 @@ class GitService extends Service { /// /// API docs: https://developer.github.com/v3/git/trees/#create-a-tree Future createTree(RepositorySlug slug, CreateGitTree tree) { - return _github.postJSON('/repos/${slug.fullName}/git/trees', + return github.postJSON('/repos/${slug.fullName}/git/trees', convert: (j) => GitTree.fromJson(j), statusCode: StatusCodes.CREATED, body: tree.toJSON()); diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index 0134a9dd..2570f613 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -1,6 +1,10 @@ -part of github.common; - -typedef ClientCreator = http.Client Function(); +import "dart:async"; +import "dart:convert"; +import 'package:github/src/common.dart'; +import 'package:github/src/util.dart'; +import "package:http/http.dart" as http; +import 'package:http_parser/http_parser.dart' as http_parser; +import 'package:meta/meta.dart'; /// The Main GitHub Client /// @@ -305,8 +309,8 @@ class GitHub { }) async { if (rateLimitRemaining != null && rateLimitRemaining <= 0) { assert(rateLimitReset != null); - var now = DateTime.now(); - var waitTime = rateLimitReset.difference(now); + final now = DateTime.now(); + final waitTime = rateLimitReset.difference(now); await Future.delayed(waitTime); } @@ -442,3 +446,16 @@ class GitHub { } } } + +void _applyExpandos(Object target, http.Response response) { + _etagExpando[target] = response.headers['etag']; + if (response.headers['date'] != null) { + _dateExpando[target] = http_parser.parseHttpDate(response.headers['date']); + } +} + +final _etagExpando = Expando('etag'); +final _dateExpando = Expando('date'); + +String getResponseEtag(Object obj) => _etagExpando[obj]; +DateTime getResponseDate(Object obj) => _dateExpando[obj]; diff --git a/lib/src/common/issues_service.dart b/lib/src/common/issues_service.dart index 3a107a4a..b869d17e 100644 --- a/lib/src/common/issues_service.dart +++ b/lib/src/common/issues_service.dart @@ -1,4 +1,8 @@ -part of github.common; +import "dart:async"; +import "dart:convert"; +import 'package:github/src/common.dart'; +import 'package:github/src/common/model/users.dart'; +import "package:github/src/common/util/pagination.dart"; /// The [IssuesService] handles communication with issues related methods of the /// GitHub API. @@ -117,7 +121,7 @@ class IssuesService extends Service { params['labels'] = labels.join(','); } - return PaginationHelper(_github).objects( + return PaginationHelper(github).objects( "GET", pathSegment, Issue.fromJSON, @@ -130,7 +134,7 @@ class IssuesService extends Service { /// API docs: https://developer.github.com/v3/issues/#edit-an-issue Future edit( RepositorySlug slug, int issueNumber, IssueRequest issue) async { - return _github + return github .request("PATCH", '/repos/${slug.fullName}/issues/$issueNumber', body: issue.toJSON()) .then((response) { @@ -142,14 +146,14 @@ class IssuesService extends Service { /// /// API docs: https://developer.github.com/v3/issues/#get-a-single-issue Future get(RepositorySlug slug, int issueNumber) => - _github.getJSON("/repos/${slug.fullName}/issues/$issueNumber", + github.getJSON("/repos/${slug.fullName}/issues/$issueNumber", convert: Issue.fromJSON); /// Create an issue. /// /// API docs: https://developer.github.com/v3/issues/#create-an-issue Future create(RepositorySlug slug, IssueRequest issue) async { - final response = await _github.request( + final response = await github.request( "POST", '/repos/${slug.fullName}/issues', body: issue.toJSON(), @@ -157,7 +161,7 @@ class IssuesService extends Service { if (StatusCodes.isClientError(response.statusCode)) { //TODO: throw a more friendly error – better this than silent failure - throw GitHubError(_github, response.body); + throw GitHubError(github, response.body); } return Issue.fromJSON(jsonDecode(response.body) as Map); @@ -168,7 +172,7 @@ class IssuesService extends Service { /// /// API docs: https://developer.github.com/v3/issues/assignees/#list-assignees Stream listAssignees(RepositorySlug slug) { - return PaginationHelper(_github) + return PaginationHelper(github) .objects("GET", "/repos/${slug.fullName}/assignees", User.fromJson); } @@ -176,7 +180,7 @@ class IssuesService extends Service { /// /// API docs: https://developer.github.com/v3/issues/assignees/#check-assignee Future isAssignee(RepositorySlug slug, String repoName) { - return _github + return github .request("GET", "/repos/${slug.fullName}/assignees/$repoName") .then((response) => response.statusCode == StatusCodes.NO_CONTENT); } @@ -186,7 +190,7 @@ class IssuesService extends Service { /// API docs: https://developer.github.com/v3/issues/comments/#list-comments-on-an-issue Stream listCommentsByIssue( RepositorySlug slug, int issueNumber) { - return PaginationHelper(_github).objects( + return PaginationHelper(github).objects( 'GET', '/repos/${slug.fullName}/issues/$issueNumber/comments', IssueComment.fromJSON); @@ -196,7 +200,7 @@ class IssuesService extends Service { /// /// API docs: https://developer.github.com/v3/issues/comments/#list-comments-on-an-issue Stream listCommentsByRepo(RepositorySlug slug) { - return PaginationHelper(_github).objects('GET', + return PaginationHelper(github).objects('GET', '/repos/${slug.fullName}/issues/comments', IssueComment.fromJSON); } @@ -204,7 +208,7 @@ class IssuesService extends Service { /// /// API docs: https://developer.github.com/v3/issues/comments/#get-a-single-comment Future getComment(RepositorySlug slug, int id) => - _github.getJSON("/repos/${slug.fullName}/issues/comments/$id", + github.getJSON("/repos/${slug.fullName}/issues/comments/$id", convert: IssueComment.fromJSON); /// Creates a new comment on the specified issue @@ -213,7 +217,7 @@ class IssuesService extends Service { Future createComment( RepositorySlug slug, int issueNumber, String body) { final it = jsonEncode({"body": body}); - return _github.postJSON( + return github.postJSON( '/repos/${slug.fullName}/issues/$issueNumber/comments', body: it, convert: IssueComment.fromJSON, @@ -227,7 +231,7 @@ class IssuesService extends Service { /// /// API docs: https://developer.github.com/v3/issues/comments/#delete-a-comment Future deleteComment(RepositorySlug slug, int id) { - return _github + return github .request('DELETE', '/repos/${slug.fullName}/issues/comments/$id') .then((response) => response.statusCode == StatusCodes.NO_CONTENT); } @@ -238,7 +242,7 @@ class IssuesService extends Service { /// /// API docs: https://developer.github.com/v3/issues/labels/#list-all-labels-for-this-repository Stream listLabels(RepositorySlug slug) { - return PaginationHelper(_github) + return PaginationHelper(github) .objects("GET", "/repos/${slug.fullName}/labels", IssueLabel.fromJSON); } @@ -246,7 +250,7 @@ class IssuesService extends Service { /// /// API docs: https://developer.github.com/v3/issues/labels/#get-a-single-label Future getLabel(RepositorySlug slug, String name) => - _github.getJSON("/repos/${slug.fullName}/labels/$name", + github.getJSON("/repos/${slug.fullName}/labels/$name", convert: IssueLabel.fromJSON, statusCode: StatusCodes.OK); /// Creates a new label on the specified repository. @@ -254,7 +258,7 @@ class IssuesService extends Service { /// API docs: https://developer.github.com/v3/issues/labels/#create-a-label Future createLabel( RepositorySlug slug, String name, String color) { - return _github.postJSON("/repos/${slug.fullName}/labels", + return github.postJSON("/repos/${slug.fullName}/labels", body: jsonEncode({"name": name, "color": color}), convert: IssueLabel.fromJSON); } @@ -263,7 +267,7 @@ class IssuesService extends Service { /// /// API docs: https://developer.github.com/v3/issues/labels/#update-a-label Future editLabel(RepositorySlug slug, String name, String color) { - return _github.postJSON("/repos/${slug.fullName}/labels/$name", + return github.postJSON("/repos/${slug.fullName}/labels/$name", body: jsonEncode({"name": name, "color": color}), convert: IssueLabel.fromJSON); } @@ -273,7 +277,7 @@ class IssuesService extends Service { /// API docs: https://developer.github.com/v3/issues/labels/#delete-a-label Future deleteLabel(RepositorySlug slug, String name) async { final response = - await _github.request("DELETE", "/repos/${slug.fullName}/labels/$name"); + await github.request("DELETE", "/repos/${slug.fullName}/labels/$name"); return response.statusCode == StatusCodes.NO_CONTENT; } @@ -282,7 +286,7 @@ class IssuesService extends Service { /// /// API docs: https://developer.github.com/v3/issues/labels/#list-all-labels-for-this-repository Stream listLabelsByIssue(RepositorySlug slug, int issueNumber) { - return PaginationHelper(_github).objects( + return PaginationHelper(github).objects( "GET", "/repos/${slug.fullName}/issues/$issueNumber/labels", IssueLabel.fromJSON); @@ -293,7 +297,7 @@ class IssuesService extends Service { /// API docs: https://developer.github.com/v3/issues/labels/#add-labels-to-an-issue Future> addLabelsToIssue( RepositorySlug slug, int issueNumber, List labels) { - return _github.postJSON, List>( + return github.postJSON, List>( "/repos/${slug.fullName}/issues/$issueNumber/labels", body: jsonEncode(labels), convert: (input) => @@ -306,7 +310,7 @@ class IssuesService extends Service { /// API docs: https://developer.github.com/v3/issues/labels/#replace-all-labels-for-an-issue Future> replaceLabelsForIssue( RepositorySlug slug, int issueNumber, List labels) { - return _github + return github .request("PUT", "/repos/${slug.fullName}/issues/$issueNumber/labels", body: jsonEncode(labels)) .then((response) { @@ -320,7 +324,7 @@ class IssuesService extends Service { /// API docs: https://developer.github.com/v3/issues/labels/#remove-a-label-from-an-issue Future removeLabelForIssue( RepositorySlug slug, int issueNumber, String label) async { - final response = await _github.request( + final response = await github.request( "DELETE", "/repos/${slug.fullName}/issues/$issueNumber/labels/$label"); return response.statusCode == StatusCodes.OK; @@ -330,7 +334,7 @@ class IssuesService extends Service { /// /// API docs: https://developer.github.com/v3/issues/labels/#remove-all-labels-from-an-issue Future removeAllLabelsForIssue(RepositorySlug slug, int issueNumber) { - return _github + return github .request("DELETE", "/repos/${slug.fullName}/issues/$issueNumber/labels") .then((response) => response.statusCode == StatusCodes.NO_CONTENT); } @@ -341,7 +345,7 @@ class IssuesService extends Service { /// /// API docs: https://developer.github.com/v3/issues/milestones/#list-milestones-for-a-repository Stream listMilestones(RepositorySlug slug) { - return PaginationHelper(_github).objects( + return PaginationHelper(github).objects( "GET", "/repos/${slug.fullName}/milestones", Milestone.fromJSON); } @@ -352,7 +356,7 @@ class IssuesService extends Service { /// API docs: https://developer.github.com/v3/issues/milestones/#create-a-milestone Future createMilestone( RepositorySlug slug, CreateMilestone request) { - return _github.postJSON("/repos/${slug.fullName}/milestones", + return github.postJSON("/repos/${slug.fullName}/milestones", body: jsonEncode(request.toJSON()), convert: Milestone.fromJSON); } @@ -362,7 +366,7 @@ class IssuesService extends Service { /// /// API docs: https://developer.github.com/v3/issues/milestones/#delete-a-milestone Future deleteMilestone(RepositorySlug slug, int number) { - return _github + return github .request("DELETE", '/repos/${slug.fullName}/milestones/$number') .then((response) => response.statusCode == StatusCodes.NO_CONTENT); } diff --git a/lib/src/common/misc_service.dart b/lib/src/common/misc_service.dart index 60f969f7..52219625 100644 --- a/lib/src/common/misc_service.dart +++ b/lib/src/common/misc_service.dart @@ -1,4 +1,6 @@ -part of github.common; +import "dart:async"; +import "dart:convert"; +import 'package:github/src/common.dart'; /// The [MiscService] handles communication with misc related methods of the /// GitHub API. @@ -12,7 +14,7 @@ class MiscService extends Service { /// /// API docs: https://developer.github.com/v3/emojis/ Future> listEmojis() { - final r = _github.getJSON>( + final r = github.getJSON>( "/emojis", statusCode: StatusCodes.OK, convert: (Map json) => json.cast(), @@ -24,7 +26,7 @@ class MiscService extends Service { /// /// API docs: https://developer.github.com/v3/gitignore/#listing-available-templates Future> listGitignoreTemplates() { - return _github.getJSON("/gitignore/templates") as Future>; + return github.getJSON("/gitignore/templates") as Future>; } /// Gets a .gitignore template by [name]. @@ -32,7 +34,7 @@ class MiscService extends Service { /// /// API docs: https://developer.github.com/v3/gitignore/#get-a-single-template Future getGitignoreTemplate(String name) => - _github.getJSON("/gitignore/templates/$name", + github.getJSON("/gitignore/templates/$name", convert: GitignoreTemplate.fromJSON); /// Renders Markdown from the [input]. @@ -43,7 +45,7 @@ class MiscService extends Service { /// API docs: https://developer.github.com/v3/markdown/#render-an-arbitrary-markdown-document Future renderMarkdown(String input, {String mode = "markdown", String context}) { - return _github + return github .request("POST", "/markdown", body: jsonEncode({"text": input, "mode": mode, "context": context})) .then((response) { @@ -59,14 +61,14 @@ class MiscService extends Service { /// /// API docs: https://developer.github.com/v3/rate_limit/ Future getRateLimit() { - return _github.request("GET", "/").then((response) { + return github.request("GET", "/").then((response) { return RateLimit.fromHeaders(response.headers); }); } /// Gets the GitHub API Status. Future getApiStatus() => - _github.getJSON("https://status.github.com/api/status.json", + github.getJSON("https://status.github.com/api/status.json", statusCode: StatusCodes.OK, convert: APIStatus.fromJSON); /// Returns an ASCII Octocat with the specified [text]. @@ -77,7 +79,7 @@ class MiscService extends Service { params["s"] = text; } - return _github.request("GET", "/octocat", params: params).then((response) { + return github.request("GET", "/octocat", params: params).then((response) { return response.body; }); } @@ -86,7 +88,7 @@ class MiscService extends Service { Future getWisdom() => getOctocat(); Future getZen() => - _github.request("GET", "/zen").then((response) => response.body); + github.request("GET", "/zen").then((response) => response.body); } class Octocat { diff --git a/lib/src/common/model/activity.dart b/lib/src/common/model/activity.dart index f2443491..5df400cf 100644 --- a/lib/src/common/model/activity.dart +++ b/lib/src/common/model/activity.dart @@ -1,4 +1,7 @@ -part of github.common; +import 'package:github/src/common.dart'; +import 'package:github/src/common/model/users.dart'; +import 'package:github/src/util.dart'; +import "package:json_annotation/json_annotation.dart"; /// Model class for an event. class Event { diff --git a/lib/src/common/model/authorizations.dart b/lib/src/common/model/authorizations.dart index f8600923..2b7365f4 100644 --- a/lib/src/common/model/authorizations.dart +++ b/lib/src/common/model/authorizations.dart @@ -1,4 +1,8 @@ -part of github.common; +import "dart:convert"; +import 'package:github/src/common.dart'; +import 'package:github/src/common/model/users.dart'; +import 'package:github/src/util.dart'; +import "package:json_annotation/json_annotation.dart"; /// Model class for an authorization. class Authorization { diff --git a/lib/src/common/model/gists.dart b/lib/src/common/model/gists.dart index 71af8738..b33b8eae 100644 --- a/lib/src/common/model/gists.dart +++ b/lib/src/common/model/gists.dart @@ -1,4 +1,8 @@ -part of github.common; +import "dart:convert"; +import 'package:github/src/common.dart'; +import 'package:github/src/common/model/users.dart'; +import 'package:github/src/util.dart'; +import "package:json_annotation/json_annotation.dart"; /// Model class for gists. class Gist { diff --git a/lib/src/common/model/git.dart b/lib/src/common/model/git.dart index 890df782..3367b21f 100644 --- a/lib/src/common/model/git.dart +++ b/lib/src/common/model/git.dart @@ -1,4 +1,10 @@ -part of github.common; +import "dart:convert"; +import 'package:github/src/common.dart'; +import 'package:github/src/common/model/users.dart'; +import 'package:github/src/util.dart'; +import "package:json_annotation/json_annotation.dart"; + +part 'git.g.dart'; /// Model class for a blob. class GitBlob { diff --git a/lib/src/common/model/git.g.dart b/lib/src/common/model/git.g.dart new file mode 100644 index 00000000..8f8be9b5 --- /dev/null +++ b/lib/src/common/model/git.g.dart @@ -0,0 +1,128 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'git.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +Map _$CreateGitBlobToJson(CreateGitBlob instance) => + { + 'content': instance.content, + 'encoding': instance.encoding, + }; + +GitCommit _$GitCommitFromJson(Map json) { + return GitCommit() + ..sha = json['sha'] as String + ..url = json['url'] as String + ..author = json['author'] == null + ? null + : GitCommitUser.fromJson(json['author'] as Map) + ..committer = json['committer'] == null + ? null + : GitCommitUser.fromJson(json['committer'] as Map) + ..message = json['message'] as String + ..tree = json['tree'] == null + ? null + : GitTree.fromJson(json['tree'] as Map) + ..parents = (json['parents'] as List) + ?.map((e) => + e == null ? null : GitCommit.fromJson(e as Map)) + ?.toList() + ..commentCount = json['comment_count'] as int; +} + +Map _$CreateGitCommitToJson(CreateGitCommit instance) { + final val = {}; + + void writeNotNull(String key, dynamic value) { + if (value != null) { + val[key] = value; + } + } + + writeNotNull('message', instance.message); + writeNotNull('tree', instance.tree); + writeNotNull('parents', instance.parents); + writeNotNull('committer', instance.committer); + writeNotNull('author', instance.author); + return val; +} + +GitCommitUser _$GitCommitUserFromJson(Map json) { + return GitCommitUser( + json['name'] as String, + json['email'] as String, + json['date'] == null ? null : DateTime.parse(json['date'] as String), + ); +} + +Map _$GitCommitUserToJson(GitCommitUser instance) { + final val = {}; + + void writeNotNull(String key, dynamic value) { + if (value != null) { + val[key] = value; + } + } + + writeNotNull('name', instance.name); + writeNotNull('email', instance.email); + writeNotNull('date', dateToGitHubIso8601(instance.date)); + return val; +} + +GitTree _$GitTreeFromJson(Map json) { + return GitTree( + json['sha'] as String, + json['url'] as String, + json['truncated'] as bool, + (json['tree'] as List) + ?.map((e) => + e == null ? null : GitTreeEntry.fromJson(e as Map)) + ?.toList(), + ); +} + +GitTreeEntry _$GitTreeEntryFromJson(Map json) { + return GitTreeEntry( + json['path'] as String, + json['mode'] as String, + json['type'] as String, + json['size'] as int, + json['sha'] as String, + json['url'] as String, + ); +} + +GitReference _$GitReferenceFromJson(Map json) { + return GitReference() + ..ref = json['ref'] as String + ..url = json['url'] as String + ..object = json['object'] == null + ? null + : GitObject.fromJson(json['object'] as Map); +} + +GitTag _$GitTagFromJson(Map json) { + return GitTag() + ..tag = json['tag'] as String + ..sha = json['sha'] as String + ..url = json['url'] as String + ..message = json['message'] as String + ..tagger = json['tagger'] == null + ? null + : GitCommitUser.fromJson(json['tagger'] as Map) + ..object = json['object'] == null + ? null + : GitObject.fromJson(json['object'] as Map); +} + +GitObject _$GitObjectFromJson(Map json) { + return GitObject( + json['type'] as String, + json['sha'] as String, + json['url'] as String, + ); +} diff --git a/lib/src/common/model/issues.dart b/lib/src/common/model/issues.dart index f248ec5d..ab970809 100644 --- a/lib/src/common/model/issues.dart +++ b/lib/src/common/model/issues.dart @@ -1,4 +1,8 @@ -part of github.common; +import "dart:convert"; +import 'package:github/src/common.dart'; +import 'package:github/src/common/model/users.dart'; +import 'package:github/src/util.dart'; +import "package:json_annotation/json_annotation.dart"; /// Model class for an issue on the tracker. class Issue { diff --git a/lib/src/common/model/keys.dart b/lib/src/common/model/keys.dart index 72ae423f..67d4e0ed 100644 --- a/lib/src/common/model/keys.dart +++ b/lib/src/common/model/keys.dart @@ -1,4 +1,5 @@ -part of github.common; +import "dart:convert"; +import 'package:github/src/util.dart'; /// Model class for a public key. /// diff --git a/lib/src/common/model/misc.dart b/lib/src/common/model/misc.dart index 4207d61a..9d3337b7 100644 --- a/lib/src/common/model/misc.dart +++ b/lib/src/common/model/misc.dart @@ -1,4 +1,5 @@ -part of github.common; +import 'package:github/src/util.dart'; +import "package:json_annotation/json_annotation.dart"; /// Model class for a Gitignore Template. class GitignoreTemplate { diff --git a/lib/src/common/model/notifications.dart b/lib/src/common/model/notifications.dart index 0b8a43a2..c9f4a53f 100644 --- a/lib/src/common/model/notifications.dart +++ b/lib/src/common/model/notifications.dart @@ -1,4 +1,6 @@ -part of github.common; +import 'package:github/src/common.dart'; +import 'package:github/src/util.dart'; +import "package:json_annotation/json_annotation.dart"; /// Model class for notifications. class Notification { diff --git a/lib/src/common/model/orgs.dart b/lib/src/common/model/orgs.dart index 1102ef98..f111014d 100644 --- a/lib/src/common/model/orgs.dart +++ b/lib/src/common/model/orgs.dart @@ -1,4 +1,8 @@ -part of github.common; +import 'package:github/src/common.dart'; +import 'package:github/src/util.dart'; +import "package:json_annotation/json_annotation.dart"; + +part 'orgs.g.dart'; /// Model class for a GitHub organization. class Organization { diff --git a/lib/src/common/model/orgs.g.dart b/lib/src/common/model/orgs.g.dart new file mode 100644 index 00000000..3b62b42b --- /dev/null +++ b/lib/src/common/model/orgs.g.dart @@ -0,0 +1,62 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'orgs.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +TeamRepository _$TeamRepositoryFromJson(Map json) { + return TeamRepository() + ..name = json['name'] as String + ..id = json['id'] as int + ..fullName = json['full_name'] as String + ..owner = json['owner'] == null + ? null + : UserInformation.fromJson(json['owner'] as Map) + ..isPrivate = json['private'] as bool + ..isFork = json['fork'] as bool + ..htmlUrl = json['html_url'] as String + ..description = json['description'] as String + ..cloneUrls = json['clone_urls'] == null + ? null + : CloneUrls.fromJson(json['clone_urls'] as Map) + ..homepage = json['homepage'] as String + ..size = json['size'] as int + ..stargazersCount = json['stargazers_count'] as int + ..watchersCount = json['watchers_count'] as int + ..language = json['language'] as String + ..hasIssues = json['has_issues'] as bool + ..hasWiki = json['has_wiki'] as bool + ..hasDownloads = json['has_downloads'] as bool + ..forksCount = json['forks_count'] as int + ..openIssuesCount = json['open_issues_count'] as int + ..defaultBranch = json['default_branch'] as String + ..subscribersCount = json['subscribers_count'] as int + ..networkCount = json['network_count'] as int + ..createdAt = json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String) + ..pushedAt = json['pushed_at'] == null + ? null + : DateTime.parse(json['pushed_at'] as String) + ..updatedAt = json['updated_at'] == null + ? null + : DateTime.parse(json['updated_at'] as String) + ..license = json['license'] == null + ? null + : LicenseKind.fromJson(json['license'] as Map) + ..permissions = json['permissions'] == null + ? null + : TeamRepositoryPermissions.fromJson( + json['permissions'] as Map); +} + +TeamRepositoryPermissions _$TeamRepositoryPermissionsFromJson( + Map json) { + return TeamRepositoryPermissions( + json['admin'] as bool, + json['push'] as bool, + json['pull'] as bool, + ); +} diff --git a/lib/src/common/model/pulls.dart b/lib/src/common/model/pulls.dart index 5b60e57d..33d785a5 100644 --- a/lib/src/common/model/pulls.dart +++ b/lib/src/common/model/pulls.dart @@ -1,4 +1,8 @@ -part of github.common; +import "dart:convert"; +import 'package:github/src/common.dart'; +import 'package:github/src/common/model/users.dart'; +import 'package:github/src/util.dart'; +import "package:json_annotation/json_annotation.dart"; /// Model class for a Pull Request. class PullRequestInformation { diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart index 6f6d4ccb..8e9abccb 100644 --- a/lib/src/common/model/repos.dart +++ b/lib/src/common/model/repos.dart @@ -1,4 +1,8 @@ -part of github.common; +import "dart:convert"; +import 'package:github/src/common.dart'; +import 'package:github/src/util.dart'; +import "package:json_annotation/json_annotation.dart"; +part 'repos.g.dart'; @JsonSerializable(createToJson: false, fieldRename: FieldRename.snake) class GitHubComparison { diff --git a/lib/src/common/model/repos.g.dart b/lib/src/common/model/repos.g.dart new file mode 100644 index 00000000..8c44430a --- /dev/null +++ b/lib/src/common/model/repos.g.dart @@ -0,0 +1,195 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'repos.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +GitHubComparison _$GitHubComparisonFromJson(Map json) { + return GitHubComparison( + json['url'] as String, + json['status'] as String, + json['ahead_by'] as int, + json['behind_by'] as int, + json['total_commits'] as int, + ); +} + +Repository _$RepositoryFromJson(Map json) { + return Repository() + ..name = json['name'] as String + ..id = json['id'] as int + ..fullName = json['full_name'] as String + ..owner = json['owner'] == null + ? null + : UserInformation.fromJson(json['owner'] as Map) + ..isPrivate = json['private'] as bool + ..isFork = json['fork'] as bool + ..htmlUrl = json['html_url'] as String + ..description = json['description'] as String + ..cloneUrls = json['clone_urls'] == null + ? null + : CloneUrls.fromJson(json['clone_urls'] as Map) + ..homepage = json['homepage'] as String + ..size = json['size'] as int + ..stargazersCount = json['stargazers_count'] as int + ..watchersCount = json['watchers_count'] as int + ..language = json['language'] as String + ..hasIssues = json['has_issues'] as bool + ..hasWiki = json['has_wiki'] as bool + ..hasDownloads = json['has_downloads'] as bool + ..forksCount = json['forks_count'] as int + ..openIssuesCount = json['open_issues_count'] as int + ..defaultBranch = json['default_branch'] as String + ..subscribersCount = json['subscribers_count'] as int + ..networkCount = json['network_count'] as int + ..createdAt = json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String) + ..pushedAt = json['pushed_at'] == null + ? null + : DateTime.parse(json['pushed_at'] as String) + ..updatedAt = json['updated_at'] == null + ? null + : DateTime.parse(json['updated_at'] as String) + ..license = json['license'] == null + ? null + : LicenseKind.fromJson(json['license'] as Map); +} + +CloneUrls _$CloneUrlsFromJson(Map json) { + return CloneUrls( + json['git'] as String, + json['ssh'] as String, + json['https'] as String, + json['svn'] as String, + ); +} + +Tag _$TagFromJson(Map json) { + return Tag( + json['name'] as String, + json['commit'] == null + ? null + : CommitInfo.fromJson(json['commit'] as Map), + json['zipball_url'] as String, + json['tarball_url'] as String, + ); +} + +CommitData _$CommitDataFromJson(Map json) { + return CommitData( + json['sha'] as String, + json['commit'] == null + ? null + : GitCommit.fromJson(json['commit'] as Map), + json['url'] as String, + json['html_url'] as String, + json['comments_url'] as String, + json['author'] == null + ? null + : CommitDataUser.fromJson(json['author'] as Map), + json['committer'] == null + ? null + : CommitDataUser.fromJson(json['committer'] as Map), + (json['parents'] as List)?.map((e) => e as Map)?.toList(), + ); +} + +CommitDataUser _$CommitDataUserFromJson(Map json) { + return CommitDataUser( + json['login'] as String, + json['id'] as int, + json['type'] as String, + ); +} + +CommitInfo _$CommitInfoFromJson(Map json) { + return CommitInfo( + json['sha'] as String, + json['tree'] == null + ? null + : GitTree.fromJson(json['tree'] as Map), + ); +} + +UserInformation _$UserInformationFromJson(Map json) { + return UserInformation( + json['login'] as String, + json['id'] as int, + json['avatar_url'] as String, + json['html_url'] as String, + ); +} + +Branch _$BranchFromJson(Map json) { + return Branch( + json['name'] as String, + json['commit'] == null + ? null + : CommitData.fromJson(json['commit'] as Map), + ); +} + +LicenseDetails _$LicenseDetailsFromJson(Map json) { + return LicenseDetails( + name: json['name'] as String, + path: json['path'] as String, + sha: json['sha'] as String, + size: json['size'] as int, + url: json['url'] == null ? null : Uri.parse(json['url'] as String), + htmlUrl: + json['html_url'] == null ? null : Uri.parse(json['html_url'] as String), + gitUrl: + json['git_url'] == null ? null : Uri.parse(json['git_url'] as String), + downloadUrl: json['download_url'] == null + ? null + : Uri.parse(json['download_url'] as String), + type: json['type'] as String, + content: json['content'] as String, + encoding: json['encoding'] as String, + links: json['_links'] == null + ? null + : Links.fromJson(json['_links'] as Map), + license: json['license'] == null + ? null + : LicenseKind.fromJson(json['license'] as Map), + ); +} + +Map _$LicenseDetailsToJson(LicenseDetails instance) => + { + 'name': instance.name, + 'path': instance.path, + 'sha': instance.sha, + 'size': instance.size, + 'url': instance.url?.toString(), + 'html_url': instance.htmlUrl?.toString(), + 'git_url': instance.gitUrl?.toString(), + 'download_url': instance.downloadUrl?.toString(), + 'type': instance.type, + 'content': instance.content, + 'encoding': instance.encoding, + '_links': instance.links, + 'license': instance.license, + }; + +LicenseKind _$LicenseKindFromJson(Map json) { + return LicenseKind( + key: json['key'] as String, + name: json['name'] as String, + spdxId: json['spdx_id'] as String, + url: json['url'] == null ? null : Uri.parse(json['url'] as String), + nodeId: json['node_id'] as String, + ); +} + +Map _$LicenseKindToJson(LicenseKind instance) => + { + 'key': instance.key, + 'name': instance.name, + 'spdx_id': instance.spdxId, + 'url': instance.url?.toString(), + 'node_id': instance.nodeId, + }; diff --git a/lib/src/common/model/repos_commits.dart b/lib/src/common/model/repos_commits.dart index 39bb22a0..5211de2e 100644 --- a/lib/src/common/model/repos_commits.dart +++ b/lib/src/common/model/repos_commits.dart @@ -1,4 +1,7 @@ -part of github.common; +import 'package:github/src/common.dart'; +import 'package:github/src/common/model/users.dart'; +import "package:json_annotation/json_annotation.dart"; +import 'package:meta/meta.dart'; /// Model class for a commit in a repository. /// diff --git a/lib/src/common/model/repos_contents.dart b/lib/src/common/model/repos_contents.dart index 68e6c1bf..e0b5ebd6 100644 --- a/lib/src/common/model/repos_contents.dart +++ b/lib/src/common/model/repos_contents.dart @@ -1,4 +1,9 @@ -part of github.common; +import "dart:convert"; +import 'package:github/src/common.dart'; +import 'package:github/src/util.dart'; +import "package:json_annotation/json_annotation.dart"; + +part 'repos_contents.g.dart'; /// Model class for a file on GitHub. class GitHubFile { diff --git a/lib/src/common/model/repos_contents.g.dart b/lib/src/common/model/repos_contents.g.dart new file mode 100644 index 00000000..0837910c --- /dev/null +++ b/lib/src/common/model/repos_contents.g.dart @@ -0,0 +1,21 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'repos_contents.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +Links _$LinksFromJson(Map json) { + return Links( + git: json['git'] == null ? null : Uri.parse(json['git'] as String), + self: json['self'] == null ? null : Uri.parse(json['self'] as String), + html: json['html'] == null ? null : Uri.parse(json['html'] as String), + ); +} + +Map _$LinksToJson(Links instance) => { + 'self': instance.self?.toString(), + 'git': instance.git?.toString(), + 'html': instance.html?.toString(), + }; diff --git a/lib/src/common/model/repos_forks.dart b/lib/src/common/model/repos_forks.dart index d3183a7c..622a5364 100644 --- a/lib/src/common/model/repos_forks.dart +++ b/lib/src/common/model/repos_forks.dart @@ -1,4 +1,5 @@ -part of github.common; +import "dart:convert"; +import 'package:github/src/util.dart'; /// Model class for a new fork to be created. class CreateFork { diff --git a/lib/src/common/model/repos_hooks.dart b/lib/src/common/model/repos_hooks.dart index dd241de9..b19236fe 100644 --- a/lib/src/common/model/repos_hooks.dart +++ b/lib/src/common/model/repos_hooks.dart @@ -1,4 +1,6 @@ -part of github.common; +import "dart:convert"; +import 'package:github/src/util.dart'; +import "package:json_annotation/json_annotation.dart"; /// Model class for a repository hook. class Hook { diff --git a/lib/src/common/model/repos_merging.dart b/lib/src/common/model/repos_merging.dart index 3754b227..9746ea26 100644 --- a/lib/src/common/model/repos_merging.dart +++ b/lib/src/common/model/repos_merging.dart @@ -1,4 +1,6 @@ -part of github.common; +import "dart:convert"; +import 'package:github/src/util.dart'; +import "package:json_annotation/json_annotation.dart"; /// Model class for a new merge to be created. class CreateMerge { diff --git a/lib/src/common/model/repos_pages.dart b/lib/src/common/model/repos_pages.dart index 6cfc77c5..df95a679 100644 --- a/lib/src/common/model/repos_pages.dart +++ b/lib/src/common/model/repos_pages.dart @@ -1,4 +1,5 @@ -part of github.common; +import "package:json_annotation/json_annotation.dart"; +import 'package:meta/meta.dart'; /// GitHub Pages Information class RepositoryPages { @@ -44,7 +45,7 @@ class PageBuild { @required this.updatedAt, }); - factory PageBuild._fromJSON(Map input) { + factory PageBuild.fromJSON(Map input) { if (input == null) return null; return PageBuild._( url: input["url"], diff --git a/lib/src/common/model/repos_stats.dart b/lib/src/common/model/repos_stats.dart index d9c02266..13639973 100644 --- a/lib/src/common/model/repos_stats.dart +++ b/lib/src/common/model/repos_stats.dart @@ -1,4 +1,8 @@ -part of github.common; +import 'package:github/src/common.dart'; +import 'package:github/src/common/model/users.dart'; +import "package:json_annotation/json_annotation.dart"; + +part 'repos_stats.g.dart'; /// Model class for a contributor's statistics for a repository. @JsonSerializable(createToJson: false) diff --git a/lib/src/common/model/repos_stats.g.dart b/lib/src/common/model/repos_stats.g.dart new file mode 100644 index 00000000..25802abf --- /dev/null +++ b/lib/src/common/model/repos_stats.g.dart @@ -0,0 +1,32 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'repos_stats.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +ContributorStatistics _$ContributorStatisticsFromJson( + Map json) { + return ContributorStatistics( + json['author'] == null + ? null + : User.fromJson(json['author'] as Map), + json['total'] as int, + (json['weeks'] as List) + ?.map((e) => e == null + ? null + : ContributorWeekStatistics.fromJson(e as Map)) + ?.toList(), + ); +} + +ContributorWeekStatistics _$ContributorWeekStatisticsFromJson( + Map json) { + return ContributorWeekStatistics( + json['w'] as int, + json['a'] as int, + json['d'] as int, + json['c'] as int, + ); +} diff --git a/lib/src/common/model/repos_statuses.dart b/lib/src/common/model/repos_statuses.dart index 9152acd6..e61d14a1 100644 --- a/lib/src/common/model/repos_statuses.dart +++ b/lib/src/common/model/repos_statuses.dart @@ -1,4 +1,7 @@ -part of github.common; +import "dart:convert"; +import 'package:github/src/common.dart'; +import 'package:github/src/util.dart'; +import "package:json_annotation/json_annotation.dart"; /// Model class for the combined status of a repository. class CombinedRepositoryStatus { diff --git a/lib/src/common/model/search.dart b/lib/src/common/model/search.dart index 8748a5af..a056e9ab 100644 --- a/lib/src/common/model/search.dart +++ b/lib/src/common/model/search.dart @@ -1,4 +1,7 @@ -part of github.common; +import 'package:github/src/common.dart'; +import "package:json_annotation/json_annotation.dart"; + +part 'search.g.dart'; abstract class SearchResults { int totalCount; diff --git a/lib/src/common/model/search.g.dart b/lib/src/common/model/search.g.dart new file mode 100644 index 00000000..353a5615 --- /dev/null +++ b/lib/src/common/model/search.g.dart @@ -0,0 +1,26 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'search.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +CodeSearchResults _$CodeSearchResultsFromJson(Map json) { + return CodeSearchResults() + ..totalCount = json['total_count'] as int + ..incompleteResults = json['incomplete_results'] as bool + ..items = CodeSearchItem.fromJsonList(json['items'] as List); +} + +CodeSearchItem _$CodeSearchItemFromJson(Map json) { + return CodeSearchItem() + ..name = json['name'] as String + ..path = json['path'] as String + ..sha = json['sha'] as String + ..url = Uri.parse(json['url'] as String) + ..gitUrl = Uri.parse(json['git_url'] as String) + ..htmlUrl = Uri.parse(json['html_url'] as String) + ..repository = + Repository.fromJSON(json['repository'] as Map); +} diff --git a/lib/src/common/orgs_service.dart b/lib/src/common/orgs_service.dart index f790d988..d9a208d9 100644 --- a/lib/src/common/orgs_service.dart +++ b/lib/src/common/orgs_service.dart @@ -1,4 +1,9 @@ -part of github.common; +import "dart:async"; +import "dart:convert"; +import 'package:github/src/common.dart'; +import "package:github/src/common/util/pagination.dart"; +import 'package:github/src/util.dart'; +import "package:http/http.dart" as http; /// The [OrganizationsService] handles communication with organization /// methods of the GitHub API. @@ -17,18 +22,18 @@ class OrganizationsService extends Service { if (userName == null) { requestPath = "/user/orgs"; } - return PaginationHelper(_github) + return PaginationHelper(github) .objects("GET", requestPath, Organization.fromJSON); } /// Fetches the organization specified by [name]. /// /// API docs: https://developer.github.com/v3/orgs/#get-an-organization - Future get(String name) => _github.getJSON("/orgs/$name", + Future get(String name) => github.getJSON("/orgs/$name", convert: Organization.fromJSON, statusCode: StatusCodes.OK, fail: (http.Response response) { if (response.statusCode == 404) { - throw OrganizationNotFound(_github, name); + throw OrganizationNotFound(github, name); } }); @@ -59,7 +64,7 @@ class OrganizationsService extends Service { "description": description }); - return _github.postJSON("/orgs/$org", + return github.postJSON("/orgs/$org", statusCode: 200, convert: Organization.fromJSON, body: jsonEncode(map)); } @@ -67,7 +72,7 @@ class OrganizationsService extends Service { /// /// API docs: https://developer.github.com/v3/orgs/teams/#list-teams Stream listTeams(String orgName) { - return PaginationHelper(_github) + return PaginationHelper(github) .objects("GET", "/orgs/$orgName/teams", Team.fromJSON); } @@ -75,7 +80,7 @@ class OrganizationsService extends Service { /// /// API docs: https://developer.github.com/v3/orgs/teams/#get-team Future getTeam(int teamId) { - return _github.getJSON("/teams/$teamId", + return github.getJSON("/teams/$teamId", convert: Organization.fromJSON, statusCode: 200) as Future; } @@ -91,7 +96,7 @@ class OrganizationsService extends Service { "permission": permission }); - return _github.postJSON("/orgs/$org/teams", + return github.postJSON("/orgs/$org/teams", statusCode: 201, convert: Team.fromJSON, body: jsonEncode(map)); } @@ -106,7 +111,7 @@ class OrganizationsService extends Service { "permission": permission, }); - return _github.postJSON( + return github.postJSON( "/teams/$teamId", statusCode: 200, convert: Team.fromJSON, @@ -118,7 +123,7 @@ class OrganizationsService extends Service { /// /// API docs: https://developer.github.com/v3/orgs/teams/#delete-team Future deleteTeam(int teamId) { - return _github.request("DELETE", "/teams/$teamId").then((response) { + return github.request("DELETE", "/teams/$teamId").then((response) { return response.statusCode == 204; }); } @@ -127,12 +132,12 @@ class OrganizationsService extends Service { /// /// API docs: https://developer.github.com/v3/orgs/teams/#list-team-members Stream listTeamMembers(int teamId) { - return PaginationHelper(_github) + return PaginationHelper(github) .objects("GET", "/teams/$teamId/members", TeamMember.fromJSON); } Future getTeamMemberStatus(int teamId, String user) { - return _github.getJSON("/teams/$teamId/memberships/$user").then((json) { + return github.getJSON("/teams/$teamId/memberships/$user").then((json) { return json["state"]; }); } @@ -142,7 +147,7 @@ class OrganizationsService extends Service { /// API docs: https://developer.github.com/v3/orgs/teams/#add-team-member @deprecated Future addTeamMember(int teamId, String user) { - return _github + return github .request("PUT", "/teams/$teamId/members/$user") .then((response) { return response.statusCode == 204; @@ -154,7 +159,7 @@ class OrganizationsService extends Service { /// API docs: https://developer.github.com/v3/orgs/teams/#remove-team-member @deprecated Future removeMember(int teamId, String user) { - return _github + return github .request("DELETE", "/teams/$teamId/members/$user") .then((response) { return response.statusCode == 204; @@ -167,7 +172,7 @@ class OrganizationsService extends Service { Future getTeamMembership(int teamId, String user) { final completer = Completer(); - _github + github .getJSON( "/teams/$teamId/memberships/$user", statusCode: 200, @@ -175,7 +180,7 @@ class OrganizationsService extends Service { if (response.statusCode == 404) { completer.complete(TeamMembershipState(null)); } else { - _github.handleStatusCode(response); + github.handleStatusCode(response); } }, convert: (json) => TeamMembershipState(json['state']), @@ -189,7 +194,7 @@ class OrganizationsService extends Service { /// /// API docs: https://developer.github.com/v3/teams/members/#add-or-update-team-membership Future addTeamMembership(int teamId, String user) async { - final response = await _github + final response = await github .request("PUT", "/teams/$teamId/memberships/$user", statusCode: 200); return TeamMembershipState(jsonDecode(response.body)["state"]); } @@ -198,7 +203,7 @@ class OrganizationsService extends Service { /// /// API docs: https://developer.github.com/v3/orgs/teams/#get-team-membership Future removeTeamMembership(int teamId, String user) { - return _github.request("DELETE", "/teams/$teamId/memberships/$user", + return github.request("DELETE", "/teams/$teamId/memberships/$user", statusCode: 204); } @@ -206,7 +211,7 @@ class OrganizationsService extends Service { /// /// API docs: https://developer.github.com/v3/orgs/teams/#list-team-repos Stream listTeamRepositories(int teamId) { - return PaginationHelper(_github) + return PaginationHelper(github) .objects("GET", "/teams/$teamId/repos", Repository.fromJSON); } @@ -214,7 +219,7 @@ class OrganizationsService extends Service { /// /// API docs: https://developer.github.com/v3/orgs/teams/#get-team-repo Future isTeamRepository(int teamId, RepositorySlug slug) { - return _github + return github .request("GET", "/teams/$teamId/repos/${slug.fullName}") .then((response) { return response.statusCode == 204; @@ -225,7 +230,7 @@ class OrganizationsService extends Service { /// /// API docs: https://developer.github.com/v3/orgs/teams/#add-team-repo Future addTeamRepository(int teamId, RepositorySlug slug) { - return _github + return github .request("PUT", "/teams/$teamId/repos/${slug.fullName}") .then((response) { return response.statusCode == 204; @@ -236,7 +241,7 @@ class OrganizationsService extends Service { /// /// API docs: https://developer.github.com/v3/orgs/teams/#remove-team-repo Future removeTeamRepository(int teamId, RepositorySlug slug) { - return _github + return github .request("DELETE", "/teams/$teamId/repos/${slug.fullName}") .then((response) { return response.statusCode == 204; @@ -247,7 +252,7 @@ class OrganizationsService extends Service { /// /// API docs: https://developer.github.com/v3/orgs/teams/#list-user-teams Stream listUserTeams() { - return PaginationHelper(_github) + return PaginationHelper(github) .objects("GET", "/user/teams", Team.fromJSON); } @@ -255,7 +260,7 @@ class OrganizationsService extends Service { /// /// API docs: https://developer.github.com/v3/orgs/hooks/#list-hooks Stream listHooks(String org) { - return PaginationHelper(_github).objects("GET", "/orgs/$org/hooks", + return PaginationHelper(github).objects("GET", "/orgs/$org/hooks", (Map input) => Hook.fromJSON(org, input)); } @@ -263,14 +268,14 @@ class OrganizationsService extends Service { /// /// API docs: https://developer.github.com/v3/orgs/hooks/#get-single-hook Future getHook(String org, int id) => - _github.getJSON("/orgs/$org/hooks/$id", + github.getJSON("/orgs/$org/hooks/$id", convert: (Map i) => Hook.fromJSON(org, i)); /// Creates an organization hook based on the specified [hook]. /// /// API docs: https://developer.github.com/v3/orgs/hooks/#create-a-hook Future createHook(String org, CreateHook hook) { - return _github.postJSON("/orgs/$org/hooks", + return github.postJSON("/orgs/$org/hooks", convert: (Map i) => Hook.fromJSON(org, i), body: hook.toJSON()); } @@ -281,14 +286,14 @@ class OrganizationsService extends Service { /// /// API docs: https://developer.github.com/v3/orgs/hooks/#ping-a-hook Future pingHook(String org, int id) { - return _github + return github .request("POST", "/orgs/$org/hooks/$id/pings") .then((response) => response.statusCode == 204); } /// Deletes the specified hook. Future deleteHook(String org, int id) { - return _github.request("DELETE", "/orgs/$org/hooks/$id").then((response) { + return github.request("DELETE", "/orgs/$org/hooks/$id").then((response) { return response.statusCode == 204; }); } diff --git a/lib/src/common/pulls_service.dart b/lib/src/common/pulls_service.dart index b9da5783..ed879bed 100644 --- a/lib/src/common/pulls_service.dart +++ b/lib/src/common/pulls_service.dart @@ -1,4 +1,8 @@ -part of github.common; +import "dart:async"; +import "dart:convert"; +import 'package:github/src/common.dart'; +import "package:github/src/common/util/pagination.dart"; +import 'package:github/src/util.dart'; /// The [PullRequestsService] handles communication with pull request /// methods of the GitHub API. @@ -26,7 +30,7 @@ class PullRequestsService extends Service { putValue("sort", sort, params); putValue("state", state, params); - return PaginationHelper(_github).objects("GET", + return PaginationHelper(github).objects("GET", "/repos/${slug.fullName}/pulls?state=$state", PullRequest.fromJSON, pages: pages, params: params); } @@ -35,7 +39,7 @@ class PullRequestsService extends Service { /// /// API docs: https://developer.github.com/v3/pulls/#get-a-single-pull-request Future get(RepositorySlug slug, int number) => - _github.getJSON("/repos/${slug.fullName}/pulls/$number", + github.getJSON("/repos/${slug.fullName}/pulls/$number", convert: PullRequest.fromJSON, statusCode: StatusCodes.OK); /// Creates a Pull Request based on the given [request]. @@ -43,7 +47,7 @@ class PullRequestsService extends Service { /// API docs: https://developer.github.com/v3/pulls/#create-a-pull-request Future create( RepositorySlug slug, CreatePullRequest request) { - return _github.postJSON("/repos/${slug.fullName}/pulls", + return github.postJSON("/repos/${slug.fullName}/pulls", convert: PullRequestInformation.fromJSON, body: request.toJSON()); } @@ -58,7 +62,7 @@ class PullRequestsService extends Service { putValue("state", state, map); putValue("base", base, map); - return _github + return github .request("POST", '/repos/${slug.fullName}/pulls/$number', body: jsonEncode(map)) .then((response) { @@ -71,7 +75,7 @@ class PullRequestsService extends Service { /// /// API docs: https://developer.github.com/v3/pulls/#list-commits-on-a-pull-request Stream listCommits(RepositorySlug slug, int number) { - return PaginationHelper(_github).objects( + return PaginationHelper(github).objects( "GET", '/repos/${slug.fullName}/pulls/$number/commits', RepositoryCommit.fromJSON); @@ -81,14 +85,14 @@ class PullRequestsService extends Service { /// /// API docs: https://developer.github.com/v3/pulls/#list-pull-requests-files Stream listFiles(RepositorySlug slug, int number) { - return PaginationHelper(_github).objects( + return PaginationHelper(github).objects( "GET", '/repos/${slug.fullName}/pulls/$number/files', PullRequestFile.fromJSON); } Future isMerged(RepositorySlug slug, int number) { - return _github + return github .request("GET", "/repos/${slug.fullName}/pulls/$number/merge") .then((response) { return response.statusCode == 204; @@ -109,7 +113,7 @@ class PullRequestsService extends Service { json['commit_message'] = message; } - return _github + return github .request("PUT", "/repos/${slug.fullName}/pulls/$number/merge", body: jsonEncode(json)) .then((response) { @@ -123,7 +127,7 @@ class PullRequestsService extends Service { /// API docs: https://developer.github.com/v3/pulls/comments/#list-comments-on-a-pull-request Stream listCommentsByPullRequest( RepositorySlug slug, int number) { - return PaginationHelper(_github).objects( + return PaginationHelper(github).objects( "GET", "/repos/${slug.fullName}/pulls/$number/comments", PullRequestComment.fromJSON); @@ -133,7 +137,7 @@ class PullRequestsService extends Service { /// /// API docs: https://developer.github.com/v3/pulls/comments/#list-comments-in-a-repository Stream listComments(RepositorySlug slug) { - return PaginationHelper(_github).objects("GET", + return PaginationHelper(github).objects("GET", "/repos/${slug.fullName}/pulls/comments", PullRequestComment.fromJSON); } @@ -142,7 +146,7 @@ class PullRequestsService extends Service { /// API docs: https://developer.github.com/v3/pulls/comments/#create-a-comment Future createComment( RepositorySlug slug, int number, CreatePullRequestComment comment) { - return _github.postJSON('/repos/${slug.fullName}/pulls/$number/comments', + return github.postJSON('/repos/${slug.fullName}/pulls/$number/comments', body: comment.toJSON(), convert: PullRequestComment.fromJSON, statusCode: 201) as Future; diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 59bd2970..16a0acb6 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -1,4 +1,12 @@ -part of github.common; +import "dart:async"; +import "dart:convert"; +import 'package:github/src/common.dart'; +import 'package:github/src/common/model/repos_releases.dart'; +import 'package:github/src/common/model/users.dart'; +import "package:github/src/common/util/pagination.dart"; +import 'package:github/src/util.dart'; +import "package:http/http.dart" as http; +import 'package:meta/meta.dart'; /// The [RepositoriesService] handles communication with repository related /// methods of the GitHub API. @@ -20,7 +28,7 @@ class RepositoriesService extends Service { "direction": direction, }; - return PaginationHelper(_github).objects, Repository>( + return PaginationHelper(github).objects, Repository>( "GET", "/user/repos", (i) => Repository.fromJSON(i), @@ -42,7 +50,7 @@ class RepositoriesService extends Service { "direction": direction }; - return PaginationHelper(_github).objects, Repository>( + return PaginationHelper(github).objects, Repository>( "GET", "/users/$user/repos", (i) => Repository.fromJSON(i), @@ -58,7 +66,7 @@ class RepositoriesService extends Service { ArgumentError.checkNotNull(org); final params = {"type": type}; - return PaginationHelper(_github).objects, Repository>( + return PaginationHelper(github).objects, Repository>( "GET", "/orgs/$org/repos", (i) => Repository.fromJSON(i), @@ -82,7 +90,7 @@ class RepositoriesService extends Service { final pages = limit != null ? (limit / 30).ceil() : null; - return PaginationHelper(_github) + return PaginationHelper(github) .fetchStreamed("GET", "/repositories", pages: pages, params: params) .expand((http.Response response) { final list = jsonDecode(response.body) as List>; @@ -100,13 +108,13 @@ class RepositoriesService extends Service { {String org}) async { ArgumentError.checkNotNull(repository); if (org != null) { - return _github.postJSON, TeamRepository>( + return github.postJSON, TeamRepository>( '/orgs/$org/repos', body: repository.toJSON(), convert: (i) => TeamRepository.fromJSON(i), ); } else { - return _github.postJSON, Repository>( + return github.postJSON, Repository>( '/user/repos', body: repository.toJSON(), convert: (i) => Repository.fromJSON(i), @@ -116,7 +124,7 @@ class RepositoriesService extends Service { Future getLicense(RepositorySlug slug) async { ArgumentError.checkNotNull(slug); - return _github.getJSON, LicenseDetails>( + return github.getJSON, LicenseDetails>( "/repos/${slug.owner}/${slug.name}/license", convert: (json) => LicenseDetails.fromJson(json), ); @@ -127,13 +135,13 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/#get Future getRepository(RepositorySlug slug) async { ArgumentError.checkNotNull(slug); - return _github.getJSON, Repository>( + return github.getJSON, Repository>( "/repos/${slug.owner}/${slug.name}", convert: (i) => Repository.fromJSON(i), statusCode: StatusCodes.OK, fail: (http.Response response) { if (response.statusCode == 404) { - throw RepositoryNotFound(_github, slug.fullName); + throw RepositoryNotFound(github, slug.fullName); } }, ); @@ -169,7 +177,7 @@ class RepositoriesService extends Service { "has_downloads": hasDownloads, "default_branch": "defaultBranch" }); - return _github.postJSON( + return github.postJSON( "/repos/${slug.fullName}", body: jsonEncode(data), statusCode: 200, @@ -183,7 +191,7 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/#delete-a-repository Future deleteRepository(RepositorySlug slug) async { ArgumentError.checkNotNull(slug); - return _github + return github .request( 'DELETE', '/repos/${slug.fullName}', @@ -198,7 +206,7 @@ class RepositoriesService extends Service { Stream listContributors(RepositorySlug slug, {bool anon = false}) { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(anon); - return PaginationHelper(_github).objects, User>( + return PaginationHelper(github).objects, User>( 'GET', '/repos/${slug.fullName}/contributors', (i) => User.fromJson(i), @@ -211,7 +219,7 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/#list-teams Stream listTeams(RepositorySlug slug) { ArgumentError.checkNotNull(slug); - return PaginationHelper(_github).objects, Team>( + return PaginationHelper(github).objects, Team>( 'GET', '/repos/${slug.fullName}/teams', (i) => Team.fromJSON(i), @@ -223,7 +231,7 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/#list-languages Future listLanguages(RepositorySlug slug) async { ArgumentError.checkNotNull(slug); - return _github.getJSON, LanguageBreakdown>( + return github.getJSON, LanguageBreakdown>( "/repos/${slug.fullName}/languages", statusCode: StatusCodes.OK, convert: (input) => LanguageBreakdown(input.cast()), @@ -235,7 +243,7 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/#list-tags Stream listTags(RepositorySlug slug) { ArgumentError.checkNotNull(slug); - return PaginationHelper(_github).objects, Tag>( + return PaginationHelper(github).objects, Tag>( 'GET', '/repos/${slug.fullName}/tags', (i) => Tag.fromJson(i), @@ -247,7 +255,7 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/#list-branches Stream listBranches(RepositorySlug slug) { ArgumentError.checkNotNull(slug); - return PaginationHelper(_github).objects, Branch>( + return PaginationHelper(github).objects, Branch>( 'GET', '/repos/${slug.fullName}/branches', (i) => Branch.fromJSON(i), @@ -260,7 +268,7 @@ class RepositoriesService extends Service { Future getBranch(RepositorySlug slug, String branch) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(branch); - return _github.getJSON, Branch>( + return github.getJSON, Branch>( "/repos/${slug.fullName}/branches/$branch", convert: (i) => Branch.fromJSON(i), ); @@ -271,7 +279,7 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/collaborators/#list Stream listCollaborators(RepositorySlug slug) { ArgumentError.checkNotNull(slug); - return PaginationHelper(_github).objects( + return PaginationHelper(github).objects( "GET", "/repos/${slug.fullName}/collaborators", (json) => Collaborator.fromJson(json), @@ -284,7 +292,7 @@ class RepositoriesService extends Service { bool catchError = false; http.Response response; try { - response = await _github.request( + response = await github.request( "GET", "/repos/${slug.fullName}/collaborators/$user", statusCode: StatusCodes.NO_CONTENT, @@ -302,7 +310,7 @@ class RepositoriesService extends Service { Future addCollaborator(RepositorySlug slug, String user) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(user); - return _github + return github .request( "PUT", "/repos/${slug.fullName}/collaborators/$user", @@ -314,7 +322,7 @@ class RepositoriesService extends Service { Future removeCollaborator(RepositorySlug slug, String user) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(user); - return _github + return github .request( "DELETE", "/repos/${slug.fullName}/collaborators/$user", @@ -332,7 +340,7 @@ class RepositoriesService extends Service { ) { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(commit); - return PaginationHelper(_github) + return PaginationHelper(github) .objects, CommitComment>( "GET", "/repos/${slug.fullName}/commits/${commit.sha}/comments", @@ -346,7 +354,7 @@ class RepositoriesService extends Service { /// https://developer.github.com/v3/repos/comments/#list-commit-comments-for-a-repository Stream listCommitComments(RepositorySlug slug) { ArgumentError.checkNotNull(slug); - return PaginationHelper(_github) + return PaginationHelper(github) .objects, CommitComment>( "GET", "repos/${slug.fullName}/comments", @@ -378,7 +386,7 @@ class RepositoriesService extends Service { 'position': position, 'line': line, }); - return _github.postJSON, CommitComment>( + return github.postJSON, CommitComment>( "/repos/${slug.fullName}/commits/${commit.sha}/comments", body: jsonEncode(data), statusCode: StatusCodes.CREATED, @@ -393,7 +401,7 @@ class RepositoriesService extends Service { {@required int id}) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(id); - return _github.getJSON, CommitComment>( + return github.getJSON, CommitComment>( "/repos/${slug.fullName}/comments/$id", statusCode: StatusCodes.OK, convert: (i) => CommitComment.fromJSON(i), @@ -412,7 +420,7 @@ class RepositoriesService extends Service { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(id); ArgumentError.checkNotNull(body); - return _github.postJSON, CommitComment>( + return github.postJSON, CommitComment>( "/repos/${slug.fullName}/comments/$id", body: jsonEncode(createNonNullMap({'body': body})), statusCode: StatusCodes.OK, @@ -427,7 +435,7 @@ class RepositoriesService extends Service { Future deleteCommitComment(RepositorySlug slug, {@required int id}) async { ArgumentError.checkNotNull(slug); - return _github + return github .request( "DELETE", "/repos/${slug.fullName}/comments/$id", @@ -441,7 +449,7 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/commits/#list-commits-on-a-repository Stream listCommits(RepositorySlug slug) { ArgumentError.checkNotNull(slug); - return PaginationHelper(_github) + return PaginationHelper(github) .objects, RepositoryCommit>( "GET", "/repos/${slug.fullName}/commits", @@ -455,7 +463,7 @@ class RepositoriesService extends Service { Future getCommit(RepositorySlug slug, String sha) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(sha); - return _github.getJSON, RepositoryCommit>( + return github.getJSON, RepositoryCommit>( "/repos/${slug.fullName}/commits/$sha", convert: (i) => RepositoryCommit.fromJSON(i), statusCode: StatusCodes.OK, @@ -465,7 +473,7 @@ class RepositoriesService extends Service { Future getCommitDiff(RepositorySlug slug, String sha) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(sha); - return _github + return github .request( "GET", "/repos/${slug.fullName}/commits/$sha", @@ -489,7 +497,7 @@ class RepositoriesService extends Service { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(refBase); ArgumentError.checkNotNull(refHead); - return _github.getJSON, GitHubComparison>( + return github.getJSON, GitHubComparison>( "/repos/${slug.fullName}/compare/$refBase...$refHead", convert: (j) => GitHubComparison.fromJson(j), ); @@ -511,13 +519,13 @@ class RepositoriesService extends Service { url += '?ref=$ref'; } - return _github.getJSON( + return github.getJSON( url, headers: headers, statusCode: StatusCodes.OK, fail: (http.Response response) { if (response.statusCode == StatusCodes.NOT_FOUND) { - throw NotFound(_github, response.body); + throw NotFound(github, response.body); } }, convert: (Map input) => GitHubFile.fromJSON(input, slug), @@ -549,7 +557,7 @@ class RepositoriesService extends Service { url += '?ref=$ref'; } - return _github.getJSON( + return github.getJSON( url, convert: (input) { final contents = RepositoryContents(); @@ -558,7 +566,7 @@ class RepositoriesService extends Service { // it was likely a 404 – but we don't have the status code here // But we can guess an the JSON content if (input.containsKey('message')) { - throw GitHubError(_github, input['message'], + throw GitHubError(github, input['message'], apiUrl: input['documentation_url']); } contents.file = GitHubFile.fromJSON(input as Map); @@ -578,7 +586,7 @@ class RepositoriesService extends Service { RepositorySlug slug, CreateFile file) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(file); - final http.Response response = await _github.request( + final http.Response response = await github.request( "PUT", "/repos/${slug.fullName}/contents/${file.path}", body: file.toJSON(), @@ -601,7 +609,7 @@ class RepositoriesService extends Service { "sha": sha, "branch": branch, }); - final http.Response response = await _github.request( + final http.Response response = await github.request( "PUT", "/repos/${slug.fullName}/contents/$path", body: jsonEncode(map), @@ -619,7 +627,7 @@ class RepositoriesService extends Service { ArgumentError.checkNotNull(path); final Map map = createNonNullMap({"message": message, "sha": sha, "branch": branch}); - final http.Response response = await _github.request( + final http.Response response = await github.request( "DELETE", "/repos/${slug.fullName}/contents/$path", body: jsonEncode(map), @@ -637,7 +645,7 @@ class RepositoriesService extends Service { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(ref); ArgumentError.checkNotNull(format); - final http.Response response = await _github.request( + final http.Response response = await github.request( "GET", "/repos/${slug.fullName}/$format/$ref", statusCode: StatusCodes.FOUND, @@ -650,7 +658,7 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/forks/#list-forks Stream listForks(RepositorySlug slug) { ArgumentError.checkNotNull(slug); - return PaginationHelper(_github).objects, Repository>( + return PaginationHelper(github).objects, Repository>( "GET", "/repos/${slug.fullName}/forks", (i) => Repository.fromJSON(i), @@ -663,7 +671,7 @@ class RepositoriesService extends Service { Future createFork(RepositorySlug slug, [CreateFork fork]) async { ArgumentError.checkNotNull(slug); if (fork == null) fork = CreateFork(); - return _github.postJSON, Repository>( + return github.postJSON, Repository>( "/repos/${slug.fullName}/forks", body: fork.toJSON(), convert: (i) => Repository.fromJSON(i), @@ -675,7 +683,7 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/hooks/#list-hooks Stream listHooks(RepositorySlug slug) { ArgumentError.checkNotNull(slug); - return PaginationHelper(_github).objects, Hook>( + return PaginationHelper(github).objects, Hook>( "GET", "/repos/${slug.fullName}/hooks", (input) => Hook.fromJSON(slug.fullName, input), @@ -688,7 +696,7 @@ class RepositoriesService extends Service { Future getHook(RepositorySlug slug, int id) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(id); - return _github.getJSON, Hook>( + return github.getJSON, Hook>( "/repos/${slug.fullName}/hooks/$id", convert: (i) => Hook.fromJSON(slug.fullName, i), ); @@ -700,7 +708,7 @@ class RepositoriesService extends Service { Future createHook(RepositorySlug slug, CreateHook hook) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(hook); - return _github.postJSON, Hook>( + return github.postJSON, Hook>( "/repos/${slug.fullName}/hooks", convert: (i) => Hook.fromJSON(slug.fullName, i), body: hook.toJSON(), @@ -739,7 +747,7 @@ class RepositoriesService extends Service { if (configContentType != 'json' && configContentType != 'form') { throw ArgumentError.value(configContentType, 'configContentType'); } - return _github.postJSON, Hook>( + return github.postJSON, Hook>( "/repos/${slug.fullName}/hooks/${hookToEdit.id.toString()}", statusCode: StatusCodes.OK, convert: (i) => Hook.fromJSON(slug.fullName, i), @@ -766,7 +774,7 @@ class RepositoriesService extends Service { Future testPushHook(RepositorySlug slug, int id) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(id); - return _github + return github .request( "POST", "/repos/${slug.fullName}/hooks/$id/tests", @@ -781,7 +789,7 @@ class RepositoriesService extends Service { Future pingHook(RepositorySlug slug, int id) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(id); - return _github + return github .request( "POST", "/repos/${slug.fullName}/hooks/$id/pings", @@ -793,7 +801,7 @@ class RepositoriesService extends Service { Future deleteHook(RepositorySlug slug, int id) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(id); - return _github + return github .request( "DELETE", "/repos/${slug.fullName}/hooks/$id", @@ -809,7 +817,7 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/keys/#list Stream listDeployKeys(RepositorySlug slug) { ArgumentError.checkNotNull(slug); - return PaginationHelper(_github).objects, PublicKey>( + return PaginationHelper(github).objects, PublicKey>( "GET", "/repos/${slug.fullName}/keys", (i) => PublicKey.fromJSON(i), @@ -824,7 +832,7 @@ class RepositoriesService extends Service { {@required int id}) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(id); - return _github.getJSON, PublicKey>( + return github.getJSON, PublicKey>( "/repos/${slug.fullName}/keys/$id", statusCode: StatusCodes.OK, convert: (i) => PublicKey.fromJSON(i), @@ -838,7 +846,7 @@ class RepositoriesService extends Service { RepositorySlug slug, CreatePublicKey key) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(key); - return _github.postJSON, PublicKey>( + return github.postJSON, PublicKey>( "/repos/${slug.fullName}/keys", body: key.toJSON(), statusCode: StatusCodes.CREATED, @@ -853,7 +861,7 @@ class RepositoriesService extends Service { {@required RepositorySlug slug, @required PublicKey key}) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(key); - return _github + return github .request( "DELETE", "/repos/${slug.fullName}/keys/${key.id}", @@ -868,7 +876,7 @@ class RepositoriesService extends Service { Future merge(RepositorySlug slug, CreateMerge merge) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(merge); - return _github.postJSON, RepositoryCommit>( + return github.postJSON, RepositoryCommit>( "/repos/${slug.fullName}/merges", body: merge.toJSON(), convert: (i) => RepositoryCommit.fromJSON(i), @@ -881,7 +889,7 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/pages/#get-information-about-a-pages-site Future getPagesInfo(RepositorySlug slug) async { ArgumentError.checkNotNull(slug); - return _github.getJSON, RepositoryPages>( + return github.getJSON, RepositoryPages>( "/repos/${slug.fullName}/pages", statusCode: StatusCodes.OK, convert: (i) => RepositoryPages.fromJSON(i), @@ -893,10 +901,10 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/pages/#list-pages-builds Stream listPagesBuilds(RepositorySlug slug) { ArgumentError.checkNotNull(slug); - return PaginationHelper(_github).objects, PageBuild>( + return PaginationHelper(github).objects, PageBuild>( "GET", "/repos/${slug.fullName}/pages/builds", - (i) => PageBuild._fromJSON(i), + (i) => PageBuild.fromJSON(i), statusCode: StatusCodes.OK, ); } @@ -906,9 +914,9 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/pages/#list-latest-pages-build Future getLatestPagesBuild(RepositorySlug slug) async { ArgumentError.checkNotNull(slug); - return _github.getJSON( + return github.getJSON( "/repos/${slug.fullName}/pages/builds/latest", - convert: (i) => PageBuild._fromJSON(i), + convert: (i) => PageBuild.fromJSON(i), statusCode: StatusCodes.OK, ); } @@ -920,7 +928,7 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/releases/#list-releases-for-a-repository Stream listReleases(RepositorySlug slug) { ArgumentError.checkNotNull(slug); - return PaginationHelper(_github).objects, Release>( + return PaginationHelper(github).objects, Release>( "GET", "/repos/${slug.fullName}/releases", (i) => Release.fromJson(i), @@ -941,7 +949,7 @@ class RepositoriesService extends Service { Future getReleaseById(RepositorySlug slug, int id) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(id); - return _github.getJSON, Release>( + return github.getJSON, Release>( "/repos/${slug.fullName}/releases/$id", convert: (i) => Release.fromJson(i), ); @@ -951,7 +959,7 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/releases/#get-a-release-by-tag-name Future getReleaseByTagName(RepositorySlug slug, String tagName) => - _github.getJSON("/repos/${slug.fullName}/releases/tags/$tagName", + github.getJSON("/repos/${slug.fullName}/releases/tags/$tagName", convert: Release.fromJson); /// Creates a Release based on the specified [createRelease]. @@ -967,7 +975,7 @@ class RepositoriesService extends Service { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(createRelease); final Release release = - await _github.postJSON, Release>( + await github.postJSON, Release>( "/repos/${slug.fullName}/releases", convert: (i) => Release.fromJson(i), body: jsonEncode(createRelease.toJson()), @@ -1013,7 +1021,7 @@ class RepositoriesService extends Service { }) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(releaseToEdit); - return _github.postJSON, Release>( + return github.postJSON, Release>( "/repos/${slug.fullName}/releases/${releaseToEdit.id.toString()}", body: jsonEncode(createNonNullMap({ "tag_name": tagName ?? releaseToEdit.tagName, @@ -1034,7 +1042,7 @@ class RepositoriesService extends Service { Future deleteRelease(RepositorySlug slug, Release release) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(release); - return _github + return github .request( "DELETE", "/repos/${slug.fullName}/releases/${release.id}", @@ -1049,8 +1057,7 @@ class RepositoriesService extends Service { Stream listReleaseAssets(RepositorySlug slug, Release release) { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(release); - return PaginationHelper(_github) - .objects, ReleaseAsset>( + return PaginationHelper(github).objects, ReleaseAsset>( "GET", "/repos/${slug.fullName}/releases/${release.id}/assets", (i) => ReleaseAsset.fromJson(i), @@ -1066,7 +1073,7 @@ class RepositoriesService extends Service { {@required int assetId}) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(release); - return _github.postJSON, ReleaseAsset>( + return github.postJSON, ReleaseAsset>( "/repos/${slug.fullName}/releases/assets/$assetId", statusCode: StatusCodes.OK, convert: (i) => ReleaseAsset.fromJson(i), @@ -1084,7 +1091,7 @@ class RepositoriesService extends Service { }) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(assetToEdit); - return _github.postJSON, ReleaseAsset>( + return github.postJSON, ReleaseAsset>( "/repos/${slug.fullName}/releases/assets/${assetToEdit.id}", statusCode: StatusCodes.OK, convert: (i) => ReleaseAsset.fromJson(i), @@ -1102,7 +1109,7 @@ class RepositoriesService extends Service { RepositorySlug slug, ReleaseAsset asset) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(asset); - return _github + return github .request( "DELETE", "/repos/${slug.fullName}/releases/assets/${asset.id}", @@ -1118,7 +1125,7 @@ class RepositoriesService extends Service { final List releaseAssets = []; for (final createReleaseAsset in createReleaseAssets) { final headers = {'Content-Type': createReleaseAsset.contentType}; - final releaseAsset = await _github.postJSON( + final releaseAsset = await github.postJSON( release.getUploadUrlFor( createReleaseAsset.name, createReleaseAsset.label, @@ -1142,7 +1149,7 @@ class RepositoriesService extends Service { ) async { ArgumentError.checkNotNull(slug); final String path = "/repos/${slug.fullName}/stats/contributors"; - final http.Response response = await _github.request('GET', path, + final http.Response response = await github.request('GET', path, headers: {"Accept": "application/vnd.github.v3+json"}); if (response.statusCode == StatusCodes.OK) { @@ -1150,9 +1157,9 @@ class RepositoriesService extends Service { .map((e) => ContributorStatistics.fromJson(e)) .toList(); } else if (response.statusCode == StatusCodes.ACCEPTED) { - throw NotReady(_github, path); + throw NotReady(github, path); } - _github.handleStatusCode(response); + github.handleStatusCode(response); } /// Fetches commit counts for the past year. @@ -1160,7 +1167,7 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/statistics/#commit-activity Stream listCommitActivity(RepositorySlug slug) { ArgumentError.checkNotNull(slug); - return PaginationHelper(_github) + return PaginationHelper(github) .objects, YearCommitCountWeek>( "GET", "/repos/${slug.fullName}/stats/commit_activity", @@ -1173,7 +1180,7 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/statistics/#code-frequency Stream listCodeFrequency(RepositorySlug slug) { ArgumentError.checkNotNull(slug); - return PaginationHelper(_github) + return PaginationHelper(github) .objects, WeeklyChangesCount>( "GET", "/repos/${slug.fullName}/stats/code_frequency", @@ -1186,7 +1193,7 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/statistics/#participation Future getParticipation(RepositorySlug slug) async { ArgumentError.checkNotNull(slug); - return _github.getJSON( + return github.getJSON( "/repos/${slug.fullName}/stats/participation", statusCode: StatusCodes.OK, convert: (i) => ContributorParticipation.fromJSON(i), @@ -1198,7 +1205,7 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/statistics/#punch-card Stream listPunchcard(RepositorySlug slug) { ArgumentError.checkNotNull(slug); - return PaginationHelper(_github) + return PaginationHelper(github) .objects, PunchcardEntry>( "GET", "/repos/${slug.fullName}/stats/punchcard", @@ -1213,7 +1220,7 @@ class RepositoriesService extends Service { Stream listStatuses(RepositorySlug slug, String ref) { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(ref); - return PaginationHelper(_github) + return PaginationHelper(github) .objects, RepositoryStatus>( "GET", "/repos/${slug.fullName}/commits/$ref/statuses", @@ -1230,7 +1237,7 @@ class RepositoriesService extends Service { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(ref); ArgumentError.checkNotNull(request); - return _github.postJSON, RepositoryStatus>( + return github.postJSON, RepositoryStatus>( "/repos/${slug.fullName}/statuses/$ref", body: request.toJSON(), convert: (i) => RepositoryStatus.fromJSON(i), @@ -1244,7 +1251,7 @@ class RepositoriesService extends Service { RepositorySlug slug, String ref) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(ref); - return _github.getJSON, CombinedRepositoryStatus>( + return github.getJSON, CombinedRepositoryStatus>( "/repos/${slug.fullName}/commits/$ref/status", convert: CombinedRepositoryStatus.fromJSON, statusCode: StatusCodes.OK, diff --git a/lib/src/common/search_service.dart b/lib/src/common/search_service.dart index 0b65f7f7..a4a19282 100644 --- a/lib/src/common/search_service.dart +++ b/lib/src/common/search_service.dart @@ -1,4 +1,8 @@ -part of github.common; +import "dart:async"; +import "dart:convert"; +import 'package:github/src/common.dart'; +import 'package:github/src/common/model/users.dart'; +import "package:github/src/common/util/pagination.dart"; /// The [SearchService] handles communication with search related methods of /// the GitHub API. @@ -21,14 +25,14 @@ class SearchService extends Service { bool isFirst = true; - PaginationHelper(_github) + PaginationHelper(github) .fetchStreamed("GET", "/search/repositories", params: params, pages: pages) .listen((response) { if (response.statusCode == 403 && response.body.contains("rate limit") && isFirst) { - throw RateLimitHit(_github); + throw RateLimitHit(github); } isFirst = false; @@ -112,7 +116,7 @@ class SearchService extends Service { params['per_page'] = perPage.toString(); } - return PaginationHelper(_github) + return PaginationHelper(github) .fetchStreamed("GET", "/search/code", params: params, pages: pages) .map((r) => CodeSearchResults.fromJson(json.decode(r.body))); } @@ -137,13 +141,13 @@ class SearchService extends Service { var isFirst = true; - PaginationHelper(_github) + PaginationHelper(github) .fetchStreamed("GET", "/search/issues", params: params, pages: pages) .listen((response) { if (response.statusCode == 403 && response.body.contains("rate limit") && isFirst) { - throw RateLimitHit(_github); + throw RateLimitHit(github); } isFirst = false; @@ -184,13 +188,13 @@ class SearchService extends Service { var isFirst = true; - PaginationHelper(_github) + PaginationHelper(github) .fetchStreamed("GET", "/search/users", params: params, pages: pages) .listen((response) { if (response.statusCode == 403 && response.body.contains("rate limit") && isFirst) { - throw RateLimitHit(_github); + throw RateLimitHit(github); } isFirst = false; diff --git a/lib/src/common/url_shortener_service.dart b/lib/src/common/url_shortener_service.dart index ffb4d543..8c24e42a 100644 --- a/lib/src/common/url_shortener_service.dart +++ b/lib/src/common/url_shortener_service.dart @@ -1,4 +1,5 @@ -part of github.common; +import "dart:async"; +import 'package:github/src/common.dart'; /// The [UrlShortenerService] provides a handy method to access GitHub's /// url shortener. @@ -18,11 +19,11 @@ class UrlShortenerService extends Service { params['code'] = code; } - return _github + return github .request("POST", "http://git.io/", params: params) .then((response) { if (response.statusCode != StatusCodes.CREATED) { - throw GitHubError(_github, "Failed to create shortened url!"); + throw GitHubError(github, "Failed to create shortened url!"); } return response.headers["Location"].split("/").last; diff --git a/lib/src/common/users_service.dart b/lib/src/common/users_service.dart index 8e669172..e802adaf 100644 --- a/lib/src/common/users_service.dart +++ b/lib/src/common/users_service.dart @@ -1,4 +1,10 @@ -part of github.common; +import "dart:async"; +import "dart:convert"; +import 'package:github/src/common.dart'; +import 'package:github/src/common/model/users.dart'; +import "package:github/src/common/util/pagination.dart"; +import 'package:github/src/util.dart'; +import "package:http/http.dart" as http; /// The [UsersService] handles communication with user related methods of the /// GitHub API. @@ -11,7 +17,7 @@ class UsersService extends Service { /// /// API docs: https://developer.github.com/v3/users/#get-a-single-user Future getUser(String name) => - _github.getJSON("/users/$name", convert: User.fromJson); + github.getJSON("/users/$name", convert: User.fromJson); /// Updates the Current User. /// @@ -34,7 +40,7 @@ class UsersService extends Service { "bio": bio }); - return _github.postJSON( + return github.postJSON( "/user", body: jsonEncode(map), statusCode: 200, @@ -56,15 +62,15 @@ class UsersService extends Service { /// /// API docs: https://developer.github.com/v3/users/#get-the-authenticated-user Future getCurrentUser() => - _github.getJSON("/user", statusCode: StatusCodes.OK, + github.getJSON("/user", statusCode: StatusCodes.OK, fail: (http.Response response) { if (response.statusCode == StatusCodes.FORBIDDEN) { - throw AccessForbidden(_github); + throw AccessForbidden(github); } }, convert: CurrentUser.fromJSON); /// Checks if a user exists. - Future isUser(String name) => _github + Future isUser(String name) => github .request("GET", "/users/$name") .then((resp) => resp.statusCode == StatusCodes.OK); @@ -74,26 +80,26 @@ class UsersService extends Service { /// /// API docs: https://developer.github.com/v3/users/#get-all-users Stream listUsers({int pages, int since}) => - PaginationHelper(_github).objects("GET", "/users", User.fromJson, + PaginationHelper(github).objects("GET", "/users", User.fromJson, pages: pages, params: {"since": since}); /// Lists all email addresses for the currently authenticated user. /// /// API docs: https://developer.github.com/v3/users/emails/#list-email-addresses-for-a-user - Stream listEmails() => PaginationHelper(_github) + Stream listEmails() => PaginationHelper(github) .objects("GET", "/user/emails", UserEmail.fromJSON); /// Add Emails /// /// API docs: https://developer.github.com/v3/users/emails/#add-email-addresses - Stream addEmails(List emails) => PaginationHelper(_github) + Stream addEmails(List emails) => PaginationHelper(github) .objects("POST", "/user/emails", UserEmail.fromJSON, statusCode: 201, body: jsonEncode(emails)); /// Delete Emails /// /// API docs: https://developer.github.com/v3/users/emails/#delete-email-addresses - Future deleteEmails(List emails) => _github + Future deleteEmails(List emails) => github .request("DELETE", "/user/emails", body: jsonEncode(emails), statusCode: 204) .then((x) => x.statusCode == 204); @@ -101,24 +107,24 @@ class UsersService extends Service { /// List user followers. /// /// API docs: https://developer.github.com/v3/users/followers/#list-followers-of-a-user - Stream listUserFollowers(String user) => PaginationHelper(_github) + Stream listUserFollowers(String user) => PaginationHelper(github) .objects("GET", "/users/$user/followers", User.fromJson, statusCode: 200); /// Check if the current user is following the specified user. Future isFollowingUser(String user) => - _github.request("GET", "/user/following/$user").then((response) { + github.request("GET", "/user/following/$user").then((response) { return response.statusCode == 204; }); /// Check if the specified user is following target. Future isUserFollowing(String user, String target) => - _github.request("GET", "/users/$user/following/$target").then((x) { + github.request("GET", "/users/$user/following/$target").then((x) { return x.statusCode == 204; }); /// Follows a user. Future followUser(String user) { - return _github + return github .request("POST", "/user/following/$user", statusCode: 204) .then((response) { return response.statusCode == 204; @@ -127,7 +133,7 @@ class UsersService extends Service { /// Unfollows a user. Future unfollowUser(String user) { - return _github + return github .request("DELETE", "/user/following/$user", statusCode: 204) .then((response) { return response.statusCode == 204; @@ -137,7 +143,7 @@ class UsersService extends Service { /// List current user followers. /// /// API docs: https://developer.github.com/v3/users/followers/#list-followers-of-a-user - Stream listCurrentUserFollowers() => PaginationHelper(_github) + Stream listCurrentUserFollowers() => PaginationHelper(github) .objects("GET", "/user/followers", User.fromJson, statusCode: 200); /// Lists the verified public keys for a [userLogin]. If no [userLogin] is specified, @@ -147,7 +153,7 @@ class UsersService extends Service { /// and https://developer.github.com/v3/users/keys/#list-your-public-keys Stream listPublicKeys([String userLogin]) { final path = userLogin == null ? "/user/keys" : "/users/$userLogin/keys"; - return PaginationHelper(_github).objects("GET", path, PublicKey.fromJSON); + return PaginationHelper(github).objects("GET", path, PublicKey.fromJSON); } // TODO: Implement getPublicKey: https://developer.github.com/v3/users/keys/#get-a-single-public-key @@ -156,7 +162,7 @@ class UsersService extends Service { /// /// API docs: https://developer.github.com/v3/users/keys/#create-a-public-key Future createPublicKey(CreatePublicKey key) { - return _github.postJSON("/user/keys", body: key.toJSON()) + return github.postJSON("/user/keys", body: key.toJSON()) as Future; } diff --git a/lib/src/common/util/auth.dart b/lib/src/common/util/auth.dart index 3282fbfb..9a11ea24 100644 --- a/lib/src/common/util/auth.dart +++ b/lib/src/common/util/auth.dart @@ -1,5 +1,3 @@ -part of github.common; - /// Authentication information. class Authentication { /// OAuth2 Token diff --git a/lib/src/common/util/crawler.dart b/lib/src/common/util/crawler.dart index 1a22f6a7..3e39f0c3 100644 --- a/lib/src/common/util/crawler.dart +++ b/lib/src/common/util/crawler.dart @@ -1,4 +1,5 @@ -part of github.common; +import "dart:async"; +import 'package:github/src/common.dart'; // Crawls a Repository to Fetch All Files class RepositoryCrawler { diff --git a/lib/src/common/util/errors.dart b/lib/src/common/util/errors.dart index eefe9b85..26f09e66 100644 --- a/lib/src/common/util/errors.dart +++ b/lib/src/common/util/errors.dart @@ -1,4 +1,4 @@ -part of github.common; +import 'package:github/src/common.dart'; /// Error Generated by [GitHub] class GitHubError implements Exception { diff --git a/lib/src/common/util/json.dart b/lib/src/common/util/json.dart index 577a8eac..8b133826 100644 --- a/lib/src/common/util/json.dart +++ b/lib/src/common/util/json.dart @@ -1,4 +1,2 @@ -part of github.common; - /// Creates a Model Object from the JSON [input] typedef JSONConverter = T Function(S input); diff --git a/lib/src/common/util/oauth2.dart b/lib/src/common/util/oauth2.dart index 747ef7a5..870b98ce 100644 --- a/lib/src/common/util/oauth2.dart +++ b/lib/src/common/util/oauth2.dart @@ -1,4 +1,8 @@ -part of github.common; +import "dart:async"; +import "dart:convert"; +import 'package:github/src/common.dart'; +import 'package:github/src/util.dart'; +import "package:http/http.dart" as http; /// OAuth2 Flow Helper /// diff --git a/lib/src/common/util/service.dart b/lib/src/common/util/service.dart index d434bf2c..3e0b5d75 100644 --- a/lib/src/common/util/service.dart +++ b/lib/src/common/util/service.dart @@ -1,8 +1,8 @@ -part of github.common; +import 'package:github/src/common.dart'; /// Superclass for all services. abstract class Service { - final GitHub _github; + final GitHub github; - const Service(this._github); + const Service(this.github); } diff --git a/lib/src/common/util/utils.dart b/lib/src/common/util/utils.dart index 8f02dce8..2b6dcc65 100644 --- a/lib/src/common/util/utils.dart +++ b/lib/src/common/util/utils.dart @@ -1,4 +1,5 @@ -part of github.common; +import 'package:github/src/common.dart'; +import 'package:github/src/util.dart'; /// Marks something as not being ready or complete. class NotReadyYet { diff --git a/lib/src/common/xplat_common.dart b/lib/src/common/xplat_common.dart new file mode 100644 index 00000000..35e50bcd --- /dev/null +++ b/lib/src/common/xplat_common.dart @@ -0,0 +1,17 @@ +import 'package:github/src/common.dart'; + +Authentication findAuthenticationFromEnvironment() => + Authentication.anonymous(); + +Authentication findAuthenticationInMap(Map map) { + for (final String key in COMMON_GITHUB_TOKEN_ENV_KEYS) { + if (map.containsKey(key)) { + return Authentication.withToken(map[key]); + } + if (map["GITHUB_USERNAME"] is String && map["GITHUB_PASSWORD"] is String) { + return Authentication.basic( + map["GITHUB_USERNAME"], map["GITHUB_PASSWORD"]); + } + } + return null; +} diff --git a/lib/src/const/token_env_keys.dart b/lib/src/const/token_env_keys.dart new file mode 100644 index 00000000..8dc29b3f --- /dev/null +++ b/lib/src/const/token_env_keys.dart @@ -0,0 +1,8 @@ +const List COMMON_GITHUB_TOKEN_ENV_KEYS = [ + "GITHUB_ADMIN_TOKEN", + "GITHUB_DART_TOKEN", + "GITHUB_API_TOKEN", + "GITHUB_TOKEN", + "HOMEBREW_GITHUB_API_TOKEN", + "MACHINE_GITHUB_API_TOKEN" +]; diff --git a/lib/src/server/xplat_server.dart b/lib/src/server/xplat_server.dart new file mode 100644 index 00000000..2093c75d --- /dev/null +++ b/lib/src/server/xplat_server.dart @@ -0,0 +1,31 @@ +import 'dart:io'; +import 'package:github/src/common.dart'; +import 'package:github/src/common/xplat_common.dart' + show findAuthenticationInMap; + +export 'hooks.dart'; + +/// Looks for GitHub Authentication Information in the current process environment. +/// +/// Checks all the environment variables in [COMMON_GITHUB_TOKEN_ENV_KEYS] for tokens. +/// If the above fails, the GITHUB_USERNAME and GITHUB_PASSWORD keys will be checked. +Authentication findAuthenticationFromEnvironment() { + if (Platform.isMacOS) { + final result = Process.runSync( + 'security', const ['find-internet-password', '-g', '-s', 'github.com']); + + if (result.exitCode == 0) { + final String out = result.stdout.toString(); + + String username = out.split('"acct"="')[1]; + username = username.substring(0, username.indexOf('\n')); + username = username.substring(0, username.length - 1); + String password = result.stderr.toString().split('password:')[1].trim(); + password = password.substring(1, password.length - 1); + return Authentication.basic(username.trim(), password.trim()); + } + } + + return findAuthenticationInMap(Platform.environment) ?? + Authentication.anonymous(); +} diff --git a/pubspec.yaml b/pubspec.yaml index 551a0259..89e63cef 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,16 +1,16 @@ name: github -version: 5.5.0-dev +version: 6.0.0-dev author: Kenneth Endfinger description: A high-level GitHub API Client Library that uses Github's v3 API -homepage: https://github.com/DirectMyFile/github.dart +homepage: https://github.com/SpinlockLabs/github.dart environment: - sdk: '>=2.3.0 <3.0.0' + sdk: ">=2.3.0 <3.0.0" dependencies: - http: '>=0.11.3 <0.13.0' + http: "^0.12.0" http_parser: ^3.1.1 - json_annotation: '>=2.0.0 <4.0.0' + json_annotation: ">=2.0.0 <4.0.0" meta: ^1.1.0 dev_dependencies: diff --git a/test/assets/responses/repository.json b/test/assets/responses/repository.json index bfa6b24d..431c6b32 100644 --- a/test/assets/responses/repository.json +++ b/test/assets/responses/repository.json @@ -1,10 +1,10 @@ { "headers": {}, "body": { - "full_name": "DirectMyFile/github.dart", + "full_name": "SpinlockLabs/github.dart", "name": "github.dart", "owner": { - "login": "DirectMyFile" + "login": "SpinlockLabs" }, "default_branch": "master", "id": 0 diff --git a/test/code_search_test.dart b/test/code_search_test.dart index 4cc22806..6187009d 100644 --- a/test/code_search_test.dart +++ b/test/code_search_test.dart @@ -1,5 +1,5 @@ import 'dart:io'; -import 'package:github/server.dart'; +import 'package:github/github.dart'; Future main() async { print('Searching ...'); @@ -7,7 +7,7 @@ Future main() async { final Stream resultsStream = github.search.code( 'github', - repo: 'DirectMyFile/github.dart', + repo: 'SpinlockLabs/github.dart', perPage: 5, pages: 1, ); diff --git a/test/data_object_test.dart b/test/data_object_test.dart index 93962433..80b2a492 100644 --- a/test/data_object_test.dart +++ b/test/data_object_test.dart @@ -1,7 +1,7 @@ import 'dart:convert'; import 'package:test/test.dart'; -import 'package:github/server.dart'; +import 'package:github/github.dart'; const _licenseJson = r''' { "name": "LICENSE", diff --git a/test/experiment/api_urls.dart b/test/experiment/api_urls.dart index 94840e9e..e0b851af 100644 --- a/test/experiment/api_urls.dart +++ b/test/experiment/api_urls.dart @@ -1,10 +1,10 @@ import "package:github/src/common.dart"; void main() { - print(slugFromAPIUrl("https://api.github.com/repos/DirectMyFile/irc.dart")); - print(slugFromAPIUrl("https://api.github.com/repos/DirectMyFile/irc.dart/")); + print(slugFromAPIUrl("https://api.github.com/repos/SpinlockLabs/irc.dart")); + print(slugFromAPIUrl("https://api.github.com/repos/SpinlockLabs/irc.dart/")); print(slugFromAPIUrl( - "https://api.github.com/repos/DirectMyFile/irc.dart/issues")); + "https://api.github.com/repos/SpinlockLabs/irc.dart/issues")); print(slugFromAPIUrl( - "https://api.github.com/repos/DirectMyFile/irc.dart/issues/1")); + "https://api.github.com/repos/SpinlockLabs/irc.dart/issues/1")); } diff --git a/test/experiment/crawler.dart b/test/experiment/crawler.dart index f7b6f375..c05e17e0 100644 --- a/test/experiment/crawler.dart +++ b/test/experiment/crawler.dart @@ -1,11 +1,11 @@ -import "package:github/server.dart"; +import 'package:github/github.dart'; void main() { final github = GitHub(auth: Authentication.anonymous()); final crawler = RepositoryCrawler( github, - RepositorySlug.full("DirectMyFile/github.dart"), + RepositorySlug.full("SpinlockLabs/github.dart"), ); crawler.crawl().listen((file) { diff --git a/test/experiment/error_handling.dart b/test/experiment/error_handling.dart index e895318f..9712b71f 100644 --- a/test/experiment/error_handling.dart +++ b/test/experiment/error_handling.dart @@ -1,12 +1,12 @@ import 'dart:convert'; import 'dart:io'; -import 'package:github/server.dart'; +import 'package:github/github.dart'; -import '../helper.dart'; +import '../helper/http.dart'; void main() { - final github = createGitHubClient(); + final github = GitHub(); final response = MockResponse( jsonEncode({ "message": "Invalid Entity", diff --git a/test/experiment/files.dart b/test/experiment/files.dart index b82e3ae3..fa9835fb 100755 --- a/test/experiment/files.dart +++ b/test/experiment/files.dart @@ -1,11 +1,11 @@ -import "package:github/server.dart"; +import "package:github/github.dart"; void main() { final github = GitHub(); github.repositories .getContents( - const RepositorySlug("DirectMyFile", "github.dart"), + const RepositorySlug("SpinlockLabs", "github.dart"), "pubspec.yaml", ) .then((contents) => contents.file) diff --git a/test/experiment/orglist.dart b/test/experiment/orglist.dart index 8e6b377a..1f5406da 100644 --- a/test/experiment/orglist.dart +++ b/test/experiment/orglist.dart @@ -1,8 +1,8 @@ import 'dart:async'; -import "package:github/server.dart"; +import 'package:github/github.dart'; Future main() async { - final github = createGitHubClient(); + final github = GitHub(); final repos = await github.repositories.listUserRepositories("dart-lang").toList(); github.dispose(); diff --git a/test/experiment/polling.dart b/test/experiment/polling.dart index 1ad5ad30..b7835b46 100755 --- a/test/experiment/polling.dart +++ b/test/experiment/polling.dart @@ -1,7 +1,7 @@ -import "package:github/server.dart"; +import 'package:github/github.dart'; void main() { - final github = createGitHubClient(); + final github = GitHub(); final EventPoller poller = github.activity.pollPublicEvents(); diff --git a/test/experiment/public_repos.dart b/test/experiment/public_repos.dart index 2fa3bc27..b9407447 100755 --- a/test/experiment/public_repos.dart +++ b/test/experiment/public_repos.dart @@ -1,7 +1,7 @@ -import "package:github/server.dart"; +import 'package:github/github.dart'; void main() { - final github = createGitHubClient(); + final github = GitHub(); github.repositories.listPublicRepositories(limit: 50).listen((repo) { print("-> ${repo.fullName}"); diff --git a/test/experiment/readme.dart b/test/experiment/readme.dart index b73d5850..272bc873 100755 --- a/test/experiment/readme.dart +++ b/test/experiment/readme.dart @@ -1,10 +1,10 @@ -import "package:github/server.dart"; +import "package:github/github.dart"; void main() { - final github = createGitHubClient(); + final github = GitHub(); github.repositories - .getReadme(const RepositorySlug("DirectMyFile", "github.dart")) + .getReadme(const RepositorySlug("SpinlockLabs", "github.dart")) .then((file) => github.misc.renderMarkdown(file.text)) .then((html) => print(html)) .then((_) => github.dispose()); diff --git a/test/experiment/search.dart b/test/experiment/search.dart index f6db5a00..5afefa68 100755 --- a/test/experiment/search.dart +++ b/test/experiment/search.dart @@ -1,7 +1,7 @@ -import "package:github/server.dart"; +import 'package:github/github.dart'; void main() { - final github = createGitHubClient(); + final github = GitHub(); github.search.repositories("github").listen((repo) { print( diff --git a/test/experiment/wisdom.dart b/test/experiment/wisdom.dart index 422d521f..1a3eca38 100755 --- a/test/experiment/wisdom.dart +++ b/test/experiment/wisdom.dart @@ -1,7 +1,7 @@ -import "package:github/server.dart"; +import 'package:github/github.dart'; void main() { - final github = createGitHubClient(); + final github = GitHub(); github.misc.getWisdom().then((value) { print(value); diff --git a/test/git_integration_test.dart b/test/git_integration_test.dart index f390d20c..d02f7009 100644 --- a/test/git_integration_test.dart +++ b/test/git_integration_test.dart @@ -1,10 +1,7 @@ -library github.test.integration.git_integration_test; - import 'dart:convert'; - import 'dart:io'; -import 'package:github/server.dart'; +import 'package:github/github.dart'; import 'package:test/test.dart'; void main() { @@ -22,7 +19,7 @@ void main() { final repoOwner = Platform.environment['GITHUB_DART_TEST_REPO_OWNER']; final repoName = Platform.environment['GITHUB_DART_TEST_REPO_NAME']; - github = createGitHubClient(auth: Authentication.withToken(authToken)); + github = GitHub(auth: Authentication.withToken(authToken)); slug = RepositorySlug(repoOwner, repoName); }); diff --git a/test/git_test.dart b/test/git_test.dart index ac59b237..ed3373d2 100644 --- a/test/git_test.dart +++ b/test/git_test.dart @@ -1,5 +1,3 @@ -library github.test.git_test; - import 'dart:async'; import 'dart:convert' show jsonEncode, jsonDecode; diff --git a/test/helper.dart b/test/helper.dart index 0c7385af..f0899f73 100644 --- a/test/helper.dart +++ b/test/helper.dart @@ -1,16 +1,5 @@ -library github.test.helper; - -import 'dart:async'; -import 'dart:convert'; import 'dart:io'; - -import "package:http/http.dart" as http; -import 'package:github/server.dart'; -import 'package:test/test.dart'; - -part 'helper/assets.dart'; -part 'helper/expect.dart'; -part 'helper/http.dart'; +import 'package:github/github.dart'; GitHub github = _makeGitHubClient(); @@ -18,10 +7,10 @@ GitHub _makeGitHubClient() { GitHub g; if (Platform.environment.containsKey("GITHUB_TOKEN")) { - g = createGitHubClient( + g = GitHub( auth: Authentication.withToken(Platform.environment["GITHUB_TOKEN"])); } else { - g = createGitHubClient(); + g = GitHub(); } return g; diff --git a/test/helper/assets.dart b/test/helper/assets.dart index a0c3cde5..0934784f 100644 --- a/test/helper/assets.dart +++ b/test/helper/assets.dart @@ -1,3 +1,3 @@ -part of github.test.helper; +import 'dart:io'; File asset(String id) => File("test/assets/$id"); diff --git a/test/helper/expect.dart b/test/helper/expect.dart index ff1ac3f1..6a871658 100644 --- a/test/helper/expect.dart +++ b/test/helper/expect.dart @@ -1,4 +1,5 @@ -part of github.test.helper; +import 'package:github/src/common/model/repos.dart'; +import 'package:test/test.dart'; void expectSlug(RepositorySlug slug, String user, String repo) { expect(slug.fullName, equals("$user/$repo")); diff --git a/test/helper/http.dart b/test/helper/http.dart index 24ac2c2b..4f33bd7c 100644 --- a/test/helper/http.dart +++ b/test/helper/http.dart @@ -1,4 +1,6 @@ -part of github.test.helper; +import 'dart:convert'; +import 'package:http/http.dart' as http; +import 'assets.dart'; final MockHTTPClient httpClient = MockHTTPClient(); diff --git a/test/util_test.dart b/test/util_test.dart index a41eb39e..499be89e 100644 --- a/test/util_test.dart +++ b/test/util_test.dart @@ -1,17 +1,14 @@ -library github.test.util_test; - import "package:github/src/common.dart"; import "package:test/test.dart"; - -import "helper.dart"; +import 'helper/expect.dart'; void main() { group("slugFromAPIUrl()", () { - test("https://api.github.com/repos/DirectMyFile/irc.dart slug is correct", + test("https://api.github.com/repos/SpinlockLabs/irc.dart slug is correct", () { expectSlug( - slugFromAPIUrl("https://api.github.com/repos/DirectMyFile/irc.dart"), - "DirectMyFile", + slugFromAPIUrl("https://api.github.com/repos/SpinlockLabs/irc.dart"), + "SpinlockLabs", "irc.dart"); }); }); From 6ba8d4fa3c4c876c0fb980b05422a9051ae95c51 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sun, 27 Oct 2019 13:12:21 -0600 Subject: [PATCH 102/390] Moving unified entry point to the dev branch for 6.0 release --- lib/github.dart | 8 -------- lib/src/github_stub.dart | 6 ------ 2 files changed, 14 deletions(-) delete mode 100644 lib/github.dart delete mode 100644 lib/src/github_stub.dart diff --git a/lib/github.dart b/lib/github.dart deleted file mode 100644 index d0472b38..00000000 --- a/lib/github.dart +++ /dev/null @@ -1,8 +0,0 @@ -/// The code inspired by the http package from -/// https://github.com/dart-lang/http/blob/9a17157e6a71972f929a95c6b2b36992e5e02c6d/lib/src/client.dart#L11-L16 - -export 'package:github/src/github_stub.dart' - if (dart.library.html) 'package:github/browser.dart' - if (dart.library.io) 'package:github/server.dart'; - -export 'package:github/src/common.dart'; diff --git a/lib/src/github_stub.dart b/lib/src/github_stub.dart deleted file mode 100644 index 25754b64..00000000 --- a/lib/src/github_stub.dart +++ /dev/null @@ -1,6 +0,0 @@ -import 'package:github/src/common.dart'; - -GitHub createGitHubClient( - {Authentication auth, String endpoint = "https://api.github.com"}) => - throw UnsupportedError( - 'Cannot create a client without dart:html or dart:io.'); From 1eb8496fe91162b3f12f42c2fc55f09480302238 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sun, 27 Oct 2019 14:15:05 -0600 Subject: [PATCH 103/390] Update CHANGELOG.md --- CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 63d3eb44..52ddcf80 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,5 @@ ## v5.5.0 -- Provide a single platform independent import `import 'package:github/githb.dart';` - Implement markThreadRead https://github.com/SpinlockLabs/github.dart/pull/185 - Fix for activity service https://github.com/SpinlockLabs/github.dart/issues/187 From cd47b46c1162a83bf03236cd96c8441a1a1b714c Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sun, 27 Oct 2019 14:55:00 -0600 Subject: [PATCH 104/390] adjust markdown example, use single quotes everywhere --- analysis_options.yaml | 821 ------------------ example/markdown.html | 10 +- lib/src/common/authorizations_service.dart | 8 +- lib/src/common/gists_service.dart | 50 +- lib/src/common/git_service.dart | 8 +- lib/src/common/github.dart | 62 +- lib/src/common/issues_service.dart | 62 +- lib/src/common/misc_service.dart | 26 +- lib/src/common/model/activity.dart | 6 +- lib/src/common/model/authorizations.dart | 14 +- lib/src/common/model/gists.dart | 34 +- lib/src/common/model/git.dart | 10 +- lib/src/common/model/issues.dart | 60 +- lib/src/common/model/keys.dart | 6 +- lib/src/common/model/misc.dart | 8 +- lib/src/common/model/notifications.dart | 6 +- lib/src/common/model/orgs.dart | 32 +- lib/src/common/model/pulls.dart | 64 +- lib/src/common/model/repos.dart | 94 +- lib/src/common/model/repos_commits.dart | 12 +- lib/src/common/model/repos_contents.dart | 20 +- lib/src/common/model/repos_forks.dart | 4 +- lib/src/common/model/repos_hooks.dart | 14 +- lib/src/common/model/repos_merging.dart | 12 +- lib/src/common/model/repos_pages.dart | 34 +- lib/src/common/model/repos_releases.dart | 32 +- lib/src/common/model/repos_stats.dart | 8 +- lib/src/common/model/repos_statuses.dart | 24 +- lib/src/common/model/search.dart | 6 +- lib/src/common/model/users.dart | 30 +- lib/src/common/orgs_service.dart | 92 +- lib/src/common/pulls_service.dart | 52 +- lib/src/common/repos_service.dart | 308 +++---- lib/src/common/search_service.dart | 36 +- lib/src/common/url_shortener_service.dart | 8 +- lib/src/common/users_service.dart | 58 +- lib/src/common/util/crawler.dart | 4 +- lib/src/common/util/errors.dart | 24 +- lib/src/common/util/oauth2.dart | 38 +- lib/src/common/util/pagination.dart | 20 +- lib/src/common/util/utils.dart | 4 +- lib/src/common/xplat_common.dart | 4 +- lib/src/const/token_env_keys.dart | 12 +- lib/src/github_stub.dart | 2 +- lib/src/server/hooks.dart | 72 +- lib/src/util.dart | 12 +- test/assets/responses/create_release.dart | 12 +- test/assets/responses/release.dart | 160 ++-- test/assets/responses/release_asset.dart | 70 +- test/experiment/api_urls.dart | 10 +- test/experiment/crawler.dart | 2 +- test/experiment/error_handling.dart | 12 +- test/experiment/fancy_numbers.dart | 20 +- test/experiment/files.dart | 6 +- test/experiment/limit_pager.dart | 4 +- test/experiment/org_hooks.dart | 4 +- test/experiment/orglist.dart | 2 +- test/experiment/polling.dart | 4 +- test/experiment/public_repos.dart | 2 +- test/experiment/readme.dart | 4 +- test/experiment/search.dart | 2 +- test/git_test.dart | 2 +- test/helper.dart | 4 +- test/helper/assets.dart | 2 +- test/helper/expect.dart | 2 +- test/helper/http.dart | 4 +- .../common/model/repos_releases_test.dart | 4 +- test/util_test.dart | 14 +- 68 files changed, 925 insertions(+), 1744 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index ccd7e89f..b3f6bb7a 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -21,829 +21,8 @@ analyzer: # https://www.dartlang.org/guides/language/analysis-options#excluding-lines-within-a-file linter: rules: - # Declare method return types. - # http://dart-lang.github.io/linter/lints/always_declare_return_types.html - # recommendation: recommended - # reason: React component render() method can return either ReactElement or false - # 0 issues - - always_declare_return_types - - # Separate the control structure expression from its statement. - # http://dart-lang.github.io/linter/lints/always_put_control_body_on_new_line.html - # recommendation: optional - # 0 issues - - always_put_control_body_on_new_line - - # Put @required named parameters first. - # http://dart-lang.github.io/linter/lints/always_put_required_named_parameters_first.html - # recommendation: recommended - # 0 issues - - always_put_required_named_parameters_first - - # Use @required. - # http://dart-lang.github.io/linter/lints/always_require_non_null_named_parameters.html - # recommendation: recommended - # 0 issues - - always_require_non_null_named_parameters - - # Specify type annotations. - # http://dart-lang.github.io/linter/lints/always_specify_types.html - # recommendation: optional - # 0 issues - # - always_specify_types - - # Annotate overridden members. - # http://dart-lang.github.io/linter/lints/annotate_overrides.html - # recommendation: required - # 0 issues - - annotate_overrides - - # Avoid annotating with dynamic when not required. - # http://dart-lang.github.io/linter/lints/avoid_annotating_with_dynamic.html - # recommendation: optional - # 0 issues - - avoid_annotating_with_dynamic - - # Avoid using `as`. - # http://dart-lang.github.io/linter/lints/avoid_as.html - # recommendation: optional - # 0 issues - # - avoid_as - - # Avoid bool literals in conditional expressions. - # http://dart-lang.github.io/linter/lints/avoid_bool_literals_in_conditional_expressions.html - # recommendation: optional - # 0 issues - - avoid_bool_literals_in_conditional_expressions - - # Avoid catches without on clauses. - # http://dart-lang.github.io/linter/lints/avoid_catches_without_on_clauses.html - # recommendation: optional - # 0 issues - - avoid_catches_without_on_clauses - - # Don't explicitly catch Error or types that implement it. - # http://dart-lang.github.io/linter/lints/avoid_catching_errors.html - # recommendation: optional - # 0 issues - - avoid_catching_errors - - # Avoid defining a class that contains only static members. - # http://dart-lang.github.io/linter/lints/avoid_classes_with_only_static_members.html - # recommendation: recommended - # 0 issues - - avoid_classes_with_only_static_members - - # Avoid double and int checks. - # http://dart-lang.github.io/linter/lints/avoid_double_and_int_checks.html - # recommendation: required - # 0 issues - - avoid_double_and_int_checks - - # Avoid empty else statements. - # http://dart-lang.github.io/linter/lints/avoid_empty_else.html - # recommendation: required - # 0 issues - - avoid_empty_else - - # Avoid field initializers in const classes. - # http://dart-lang.github.io/linter/lints/avoid_field_initializers_in_const_classes.html - # recommendation: optional - # 0 issues - - avoid_field_initializers_in_const_classes - - # Avoid using `forEach` with a function literal. - # http://dart-lang.github.io/linter/lints/avoid_function_literals_in_foreach_calls.html - # recommendation: recommended - # reason: Use for (x in y) or forEach(someFunc) instead - # 0 issues - - avoid_function_literals_in_foreach_calls - - # Don't implement classes that override `==`. - # http://dart-lang.github.io/linter/lints/avoid_implementing_value_types.html - # recommendation: optional - # 0 issues - - avoid_implementing_value_types - - # Don't explicitly initialize variables to null. - # http://dart-lang.github.io/linter/lints/avoid_init_to_null.html - # recommendation: recommended - # 0 issues - - avoid_init_to_null - - # Avoid JavaScript rounded ints. - # http://dart-lang.github.io/linter/lints/avoid_js_rounded_ints.html - # recommendation: optional - # 0 issues - - avoid_js_rounded_ints - - # Don't check for null in custom == operators. - # http://dart-lang.github.io/linter/lints/avoid_null_checks_in_equality_operators.html - # recommendation: recommended - # 0 issues - - avoid_null_checks_in_equality_operators - - # Avoid positional boolean parameters. - # http://dart-lang.github.io/linter/lints/avoid_positional_boolean_parameters.html - # recommendation: recommended - # 0 issues - - avoid_positional_boolean_parameters - - # Avoid private typedef functions. - # http://dart-lang.github.io/linter/lints/avoid_private_typedef_functions.html - # recommendation: optional - # 0 issues - - avoid_private_typedef_functions - - # Avoid relative imports for files in `lib/`. - # http://dart-lang.github.io/linter/lints/avoid_relative_lib_imports.html - # recommendation: recommended - # reason: JS compilation will be faster without relative imports. Use package imports. - # 0 issues - - avoid_relative_lib_imports - - # Don't rename parameters of overridden methods. - # http://dart-lang.github.io/linter/lints/avoid_renaming_method_parameters.html - # recommendation: recommended - # 0 issues - - avoid_renaming_method_parameters - - # Avoid return types on setters. - # http://dart-lang.github.io/linter/lints/avoid_return_types_on_setters.html - # recommendation: required - # 0 issues - - avoid_return_types_on_setters - - # Avoid returning null from members whose return type is bool, double, int, or num. - # http://dart-lang.github.io/linter/lints/avoid_returning_null.html - # recommendation: recommended - # 0 issues - - avoid_returning_null - - # Avoid returning null for Future. - # http://dart-lang.github.io/linter/lints/avoid_returning_null_for_future.html - # recommendation: optional - # 0 issues - - avoid_returning_null_for_future - - # Avoid returning null for void. - # http://dart-lang.github.io/linter/lints/avoid_returning_null_for_void.html - # recommendation: optional - # 0 issues - - avoid_returning_null_for_void - - # Avoid returning this from methods just to enable a fluent interface. - # http://dart-lang.github.io/linter/lints/avoid_returning_this.html - # recommendation: recommended - # 0 issues - - avoid_returning_this - - # Avoid setters without getters. - # http://dart-lang.github.io/linter/lints/avoid_setters_without_getters.html - # recommendation: recommended - # 0 issues - - avoid_setters_without_getters - - # Avoid shadowing type parameters. - # http://dart-lang.github.io/linter/lints/avoid_shadowing_type_parameters.html - # recommendation: optional - # 0 issues - - avoid_shadowing_type_parameters - - # Avoid single cascade in expression statements. - # http://dart-lang.github.io/linter/lints/avoid_single_cascade_in_expression_statements.html - # recommendation: optional - # 0 issues - - avoid_single_cascade_in_expression_statements - - # Avoid slow async `dart:io` methods. - # http://dart-lang.github.io/linter/lints/avoid_slow_async_io.html - # recommendation: recommended - # 0 issues - - avoid_slow_async_io - - # Avoid types as parameter names. - # http://dart-lang.github.io/linter/lints/avoid_types_as_parameter_names.html - # recommendation: required - # 0 issues - - avoid_types_as_parameter_names - - # Avoid annotating types for function expression parameters. - # http://dart-lang.github.io/linter/lints/avoid_types_on_closure_parameters.html - # recommendation: optional - # 0 issues - - avoid_types_on_closure_parameters - - # Avoid defining unused parameters in constructors. - # http://dart-lang.github.io/linter/lints/avoid_unused_constructor_parameters.html - # recommendation: recommended - # 0 issues - - avoid_unused_constructor_parameters - - # Avoid async functions that return void. - # http://dart-lang.github.io/linter/lints/avoid_void_async.html - # recommendation: optional - # 0 issues - - avoid_void_async - - # Await only futures. - # http://dart-lang.github.io/linter/lints/await_only_futures.html - # recommendation: required - # 0 issues - - await_only_futures - - # Name types using UpperCamelCase. - # http://dart-lang.github.io/linter/lints/camel_case_types.html - # recommendation: required - # 0 issues - - camel_case_types - - # Cancel instances of dart.async.StreamSubscription. - # http://dart-lang.github.io/linter/lints/cancel_subscriptions.html - # recommendation: required - # 0 issues - - cancel_subscriptions - - # Cascade consecutive method invocations on the same reference. - # http://dart-lang.github.io/linter/lints/cascade_invocations.html - # recommendation: optional - # 0 issues - # - cascade_invocations - - # Close instances of `dart.core.Sink`. - # http://dart-lang.github.io/linter/lints/close_sinks.html - # recommendation: required - # 0 issues - - close_sinks - - # Only reference in scope identifiers in doc comments. - # http://dart-lang.github.io/linter/lints/comment_references.html - # recommendation: recommended - # 0 issues - - comment_references - - # Prefer using lowerCamelCase for constant names. - # http://dart-lang.github.io/linter/lints/constant_identifier_names.html - # recommendation: optional - # 0 issues - # - constant_identifier_names - - # Avoid control flow in finally blocks. - # http://dart-lang.github.io/linter/lints/control_flow_in_finally.html - # recommendation: required - # 0 issues - - control_flow_in_finally - - # DO use curly braces for all flow control structures. - # http://dart-lang.github.io/linter/lints/curly_braces_in_flow_control_structures.html - # recommendation: optional - # 0 issues - - curly_braces_in_flow_control_structures - - # Adhere to Effective Dart Guide directives sorting conventions. - # http://dart-lang.github.io/linter/lints/directives_ordering.html - # recommendation: recommended - # 0 issues - - directives_ordering - - # Avoid empty catch blocks. - # http://dart-lang.github.io/linter/lints/empty_catches.html - # recommendation: required - # 0 issues - - empty_catches - - # Use `;` instead of `{}` for empty constructor bodies. - # http://dart-lang.github.io/linter/lints/empty_constructor_bodies.html - # recommendation: recommended - # 0 issues - - empty_constructor_bodies - - # Avoid empty statements. - # http://dart-lang.github.io/linter/lints/empty_statements.html - # recommendation: required - # 0 issues - - empty_statements - - # Name source files using `lowercase_with_underscores`. - # http://dart-lang.github.io/linter/lints/file_names.html - # recommendation: optional - # 0 issues - - file_names - - # Use Flutter TODO format: // TODO(username): message, https://URL-to-issue. - # http://dart-lang.github.io/linter/lints/flutter_style_todos.html - # recommendation: optional - # 0 issues - - flutter_style_todos - - # Always override `hashCode` if overriding `==`. - # http://dart-lang.github.io/linter/lints/hash_and_equals.html - # recommendation: required - # 0 issues - - hash_and_equals - - # Don't import implementation files from another package. - # http://dart-lang.github.io/linter/lints/implementation_imports.html - # recommendation: required - # 0 issues - - implementation_imports - - # Conditions should not unconditionally evaluate to `true` or to `false`. - # http://dart-lang.github.io/linter/lints/invariant_booleans.html - # recommendation: optional - # reason: There are several outstanding bugs with this lint that cause a good deal of noise - # 0 issues - - invariant_booleans - - # Invocation of Iterable.contains with references of unrelated types. - # http://dart-lang.github.io/linter/lints/iterable_contains_unrelated_type.html - # recommendation: required - # 0 issues - - iterable_contains_unrelated_type - - # Join return statement with assignment when possible. - # http://dart-lang.github.io/linter/lints/join_return_with_assignment.html - # recommendation: optional - # 0 issues - - join_return_with_assignment - - # Name libraries using `lowercase_with_underscores`. - # http://dart-lang.github.io/linter/lints/library_names.html - # recommendation: recommended - # 0 issues - - library_names - - # Use `lowercase_with_underscores` when specifying a library prefix. - # http://dart-lang.github.io/linter/lints/library_prefixes.html - # recommendation: recommended - # 0 issues - - library_prefixes - - # AVOID lines longer than 80 characters. - # http://dart-lang.github.io/linter/lints/lines_longer_than_80_chars.html - # recommendation: optional - # 0 issues - - lines_longer_than_80_chars - - # Invocation of `remove` with references of unrelated types. - # http://dart-lang.github.io/linter/lints/list_remove_unrelated_type.html - # recommendation: required - # 0 issues - - list_remove_unrelated_type - - # Boolean expression composed only with literals. - # http://dart-lang.github.io/linter/lints/literal_only_boolean_expressions.html - # recommendation: required - # 0 issues - - literal_only_boolean_expressions - - # Don't use adjacent strings in list. - # http://dart-lang.github.io/linter/lints/no_adjacent_strings_in_list.html - # recommendation: required - # 0 issues - - no_adjacent_strings_in_list - - # Don't use more than one case with same value. - # http://dart-lang.github.io/linter/lints/no_duplicate_case_values.html - # recommendation: required - # 0 issues - - no_duplicate_case_values - - # Name non-constant identifiers using lowerCamelCase. - # http://dart-lang.github.io/linter/lints/non_constant_identifier_names.html - # recommendation: recommended - # 0 issues - - non_constant_identifier_names - - # Do not pass `null` as an argument where a closure is expected. - # http://dart-lang.github.io/linter/lints/null_closures.html - # recommendation: optional - # 0 issues - - null_closures - - # Omit type annotations for local variables. - # http://dart-lang.github.io/linter/lints/omit_local_variable_types.html - # recommendation: optional - # reason: Conflicts with always_specify_types. Recommend commenting this one out. - # 0 issues - # - omit_local_variable_types - - # Avoid defining a one-member abstract class when a simple function will do. - # http://dart-lang.github.io/linter/lints/one_member_abstracts.html - # recommendation: optional - # 0 issues - - one_member_abstracts - - # Only throw instances of classes extending either Exception or Error. - # http://dart-lang.github.io/linter/lints/only_throw_errors.html - # recommendation: required - # 0 issues - - only_throw_errors - - # Don't override fields. - # http://dart-lang.github.io/linter/lints/overridden_fields.html - # recommendation: optional - # 0 issues - - overridden_fields - - # Provide doc comments for all public APIs. - # http://dart-lang.github.io/linter/lints/package_api_docs.html - # recommendation: optional - # 0 issues - - package_api_docs - - # Use `lowercase_with_underscores` for package names. - # http://dart-lang.github.io/linter/lints/package_names.html - # recommendation: recommended - # 0 issues - - package_names - - # Prefix library names with the package name and a dot-separated path. - # http://dart-lang.github.io/linter/lints/package_prefixed_library_names.html - # recommendation: recommended - # 0 issues - - package_prefixed_library_names - - # Don't reassign references to parameters of functions or methods. - # http://dart-lang.github.io/linter/lints/parameter_assignments.html - # recommendation: optional - # 0 issues - - parameter_assignments - - # Use adjacent strings to concatenate string literals. - # http://dart-lang.github.io/linter/lints/prefer_adjacent_string_concatenation.html - # recommendation: optional - # 0 issues - - prefer_adjacent_string_concatenation - - # Prefer putting asserts in initializer list. - # http://dart-lang.github.io/linter/lints/prefer_asserts_in_initializer_lists.html - # recommendation: optional - # 0 issues - - prefer_asserts_in_initializer_lists - - # Prefer using a boolean as the assert condition. - # http://dart-lang.github.io/linter/lints/prefer_bool_in_asserts.html - # recommendation: optional - # 0 issues - # - prefer_bool_in_asserts - - # Use collection literals when possible. - # http://dart-lang.github.io/linter/lints/prefer_collection_literals.html - # recommendation: recommended - # 0 issues - - prefer_collection_literals - - # Prefer using `??=` over testing for null. - # http://dart-lang.github.io/linter/lints/prefer_conditional_assignment.html - # recommendation: optional - # 0 issues - - prefer_conditional_assignment - - # Prefer const with constant constructors. - # http://dart-lang.github.io/linter/lints/prefer_const_constructors.html - # recommendation: optional - # 0 issues - - prefer_const_constructors - - # Prefer declare const constructors on `@immutable` classes. - # http://dart-lang.github.io/linter/lints/prefer_const_constructors_in_immutables.html - # recommendation: optional - # 0 issues - - prefer_const_constructors_in_immutables - - # Prefer const over final for declarations. - # http://dart-lang.github.io/linter/lints/prefer_const_declarations.html - # recommendation: recommended - # 0 issues - - prefer_const_declarations - - # Prefer const literals as parameters of constructors on @immutable classes. - # http://dart-lang.github.io/linter/lints/prefer_const_literals_to_create_immutables.html - # recommendation: optional - # 0 issues - - prefer_const_literals_to_create_immutables - - # Prefer defining constructors instead of static methods to create instances. - # http://dart-lang.github.io/linter/lints/prefer_constructors_over_static_methods.html - # recommendation: optional - # 0 issues - # - prefer_constructors_over_static_methods - - # Use contains for `List` and `String` instances. - # http://dart-lang.github.io/linter/lints/prefer_contains.html - # recommendation: recommended - # 0 issues - - prefer_contains - - # Use `=` to separate a named parameter from its default value. - # http://dart-lang.github.io/linter/lints/prefer_equal_for_default_values.html - # recommendation: optional - # 0 issues - - prefer_equal_for_default_values - - # Use => for short members whose body is a single return statement. - # http://dart-lang.github.io/linter/lints/prefer_expression_function_bodies.html - # recommendation: optional - # 0 issues - - prefer_expression_function_bodies - - # Private field could be final. - # http://dart-lang.github.io/linter/lints/prefer_final_fields.html - # recommendation: optional - # 0 issues - - prefer_final_fields - - # Prefer final in for-each loop variable if reference is not reassigned. - # http://dart-lang.github.io/linter/lints/prefer_final_in_for_each.html - # recommendation: optional - # 0 issues - - prefer_final_in_for_each - - # Prefer final for variable declaration if reference is not reassigned. - # http://dart-lang.github.io/linter/lints/prefer_final_locals.html - # recommendation: optional - # reason: Generates a lot of lint since people use var a lot for local variables. - # 0 issues - - prefer_final_locals - - # Use `forEach` to only apply a function to all the elements. - # http://dart-lang.github.io/linter/lints/prefer_foreach.html - # recommendation: optional - # 0 issues - - prefer_foreach - - # Use a function declaration to bind a function to a name. - # http://dart-lang.github.io/linter/lints/prefer_function_declarations_over_variables.html - # recommendation: recommended - # 0 issues - - prefer_function_declarations_over_variables - - # Prefer generic function type aliases. - # http://dart-lang.github.io/linter/lints/prefer_generic_function_type_aliases.html - # recommendation: optional - # 0 issues - - prefer_generic_function_type_aliases - - # Use initializing formals when possible. - # http://dart-lang.github.io/linter/lints/prefer_initializing_formals.html - # recommendation: recommended - # 0 issues - - prefer_initializing_formals - - # Prefer int literals over double literals. - # http://dart-lang.github.io/linter/lints/prefer_int_literals.html - # recommendation: optional - # 0 issues - - prefer_int_literals - - # Use interpolation to compose strings and values. - # http://dart-lang.github.io/linter/lints/prefer_interpolation_to_compose_strings.html - # recommendation: optional - # 0 issues - - prefer_interpolation_to_compose_strings - - # Use `isEmpty` for Iterables and Maps. - # http://dart-lang.github.io/linter/lints/prefer_is_empty.html - # recommendation: required - # 0 issues - - prefer_is_empty - - # Use `isNotEmpty` for Iterables and Maps. - # http://dart-lang.github.io/linter/lints/prefer_is_not_empty.html - # recommendation: required - # 0 issues - - prefer_is_not_empty - - # Prefer to use whereType on iterable. - # http://dart-lang.github.io/linter/lints/prefer_iterable_whereType.html - # recommendation: optional - # reason: Optional for now since it is only available in Dart 2 - # 0 issues - - prefer_iterable_whereType - - # Prefer using mixins. - # http://dart-lang.github.io/linter/lints/prefer_mixin.html - # recommendation: optional - # 0 issues - - prefer_mixin - - # Prefer using null aware operators. - # http://dart-lang.github.io/linter/lints/prefer_null_aware_operators.html - # recommendation: optional - # 0 issues - - prefer_null_aware_operators - # Prefer single quotes where they won't require escape sequences. # http://dart-lang.github.io/linter/lints/prefer_single_quotes.html # recommendation: recommended # 0 issues - prefer_single_quotes - - # Prefer typing uninitialized variables and fields. - # http://dart-lang.github.io/linter/lints/prefer_typing_uninitialized_variables.html - # recommendation: required - # 0 issues - - prefer_typing_uninitialized_variables - - # Don't use the Null type, unless you are positive that you don't want void. - # http://dart-lang.github.io/linter/lints/prefer_void_to_null.html - # recommendation: optional - # 0 issues - - prefer_void_to_null - - # Document all public members. - # http://dart-lang.github.io/linter/lints/public_member_api_docs.html - # recommendation: optional - # reason: Can get annoying for React component lifecycle methods, constructors. - # 0 issues - - public_member_api_docs - - # Property getter recursively returns itself. - # http://dart-lang.github.io/linter/lints/recursive_getters.html - # recommendation: optional - # 0 issues - - recursive_getters - - # Prefer using /// for doc comments. - # http://dart-lang.github.io/linter/lints/slash_for_doc_comments.html - # recommendation: recommended - # 0 issues - - slash_for_doc_comments - - # Sort constructor declarations before other members. - # http://dart-lang.github.io/linter/lints/sort_constructors_first.html - # recommendation: optional - # 0 issues - - sort_constructors_first - - # Sort pub dependencies. - # http://dart-lang.github.io/linter/lints/sort_pub_dependencies.html - # recommendation: optional - # 0 issues - - sort_pub_dependencies - - # Sort unnamed constructor declarations first. - # http://dart-lang.github.io/linter/lints/sort_unnamed_constructors_first.html - # recommendation: optional - # 0 issues - - sort_unnamed_constructors_first - - # Test type arguments in operator ==(Object other). - # http://dart-lang.github.io/linter/lints/test_types_in_equals.html - # recommendation: required - # 0 issues - - test_types_in_equals - - # Avoid `throw` in finally block. - # http://dart-lang.github.io/linter/lints/throw_in_finally.html - # recommendation: required - # 0 issues - - throw_in_finally - - # Type annotate public APIs. - # http://dart-lang.github.io/linter/lints/type_annotate_public_apis.html - # recommendation: recommended - # reason: React component render() method can return either ReactElement or false. Use overrides. - # 0 issues - - type_annotate_public_apis - - # Don't type annotate initializing formals. - # http://dart-lang.github.io/linter/lints/type_init_formals.html - # recommendation: optional - # 0 issues - - type_init_formals - - # `Future` results in `async` function bodies must be `await`ed or marked `unawaited` using `package:pedantic`. - # http://dart-lang.github.io/linter/lints/unawaited_futures.html - # recommendation: recommended - # 0 issues - - unawaited_futures - - # Unnecessary await keyword in return. - # http://dart-lang.github.io/linter/lints/unnecessary_await_in_return.html - # recommendation: optional - # 0 issues - - unnecessary_await_in_return - - # Avoid using braces in interpolation when not needed. - # http://dart-lang.github.io/linter/lints/unnecessary_brace_in_string_interps.html - # recommendation: optional - # 0 issues - - unnecessary_brace_in_string_interps - - # Avoid const keyword. - # http://dart-lang.github.io/linter/lints/unnecessary_const.html - # recommendation: optional - # 0 issues - - unnecessary_const - - # Avoid wrapping fields in getters and setters just to be "safe". - # http://dart-lang.github.io/linter/lints/unnecessary_getters_setters.html - # recommendation: optional - # 0 issues - - unnecessary_getters_setters - - # Don't create a lambda when a tear-off will do. - # http://dart-lang.github.io/linter/lints/unnecessary_lambdas.html - # recommendation: recommended - # 0 issues - - unnecessary_lambdas - - # Unnecessary new keyword. - # http://dart-lang.github.io/linter/lints/unnecessary_new.html - # recommendation: optional - # 0 issues - - unnecessary_new - - # Avoid null in null-aware assignment. - # http://dart-lang.github.io/linter/lints/unnecessary_null_aware_assignments.html - # recommendation: required - # 0 issues - - unnecessary_null_aware_assignments - - # Avoid using `null` in `if null` operators. - # http://dart-lang.github.io/linter/lints/unnecessary_null_in_if_null_operators.html - # recommendation: required - # 0 issues - - unnecessary_null_in_if_null_operators - - # Don't override a method to do a super method invocation with the same parameters. - # http://dart-lang.github.io/linter/lints/unnecessary_overrides.html - # recommendation: optional - # 0 issues - - unnecessary_overrides - - # Unnecessary parenthesis can be removed. - # http://dart-lang.github.io/linter/lints/unnecessary_parenthesis.html - # recommendation: optional - # 0 issues - - unnecessary_parenthesis - - # Avoid using unnecessary statements. - # http://dart-lang.github.io/linter/lints/unnecessary_statements.html - # recommendation: required - # 0 issues - - unnecessary_statements - - # Don't access members with `this` unless avoiding shadowing. - # http://dart-lang.github.io/linter/lints/unnecessary_this.html - # recommendation: recommended - # 0 issues - - unnecessary_this - - # Equality operator `==` invocation with references of unrelated types. - # http://dart-lang.github.io/linter/lints/unrelated_type_equality_checks.html - # recommendation: required - # reason: Comparing references of a type where neither is a subtype of the other most likely will return false and might not reflect programmer's intent. - # 0 issues - - unrelated_type_equality_checks - - # Prefer an 8-digit hexadecimal integer(0xFFFFFFFF) to instantiate Color. - # http://dart-lang.github.io/linter/lints/use_full_hex_values_for_flutter_colors.html - # recommendation: optional - # 0 issues - - use_full_hex_values_for_flutter_colors - - # Use generic function type syntax for parameters. - # http://dart-lang.github.io/linter/lints/use_function_type_syntax_for_parameters.html - # recommendation: optional - # 0 issues - - use_function_type_syntax_for_parameters - - # Use rethrow to rethrow a caught exception. - # http://dart-lang.github.io/linter/lints/use_rethrow_when_possible.html - # recommendation: recommended - # 0 issues - - use_rethrow_when_possible - - # Use a setter for operations that conceptually change a property. - # http://dart-lang.github.io/linter/lints/use_setters_to_change_properties.html - # recommendation: optional - # 0 issues - - use_setters_to_change_properties - - # Use string buffer to compose strings. - # http://dart-lang.github.io/linter/lints/use_string_buffers.html - # recommendation: optional - # 0 issues - - use_string_buffers - - # Start the name of the method with to/_to or as/_as if applicable. - # http://dart-lang.github.io/linter/lints/use_to_and_as_if_applicable.html - # recommendation: optional - # 0 issues - - use_to_and_as_if_applicable - - # Use valid regular expression syntax. - # http://dart-lang.github.io/linter/lints/valid_regexps.html - # recommendation: required - # 0 issues - - valid_regexps - - # Don't assign to void. - # http://dart-lang.github.io/linter/lints/void_checks.html - # recommendation: required - # reason: Trying to assigning a value to void is an error. - # 0 issues - - void_checks diff --git a/example/markdown.html b/example/markdown.html index 7155db44..add1371b 100644 --- a/example/markdown.html +++ b/example/markdown.html @@ -16,19 +16,21 @@ ''', treeSanitizer: NodeTreeSanitizer.trusted); - final Element rel = releasesDiv.querySelector('#release-${release.id}'); + final rel = releasesDiv.querySelector('#release-${release.id}'); void append(String key, String value) { if (value == null) { return; diff --git a/example/repos.dart b/example/repos.dart index bc4718f9..829eaee4 100644 --- a/example/repos.dart +++ b/example/repos.dart @@ -42,7 +42,7 @@ List _reposCache; void updateRepos( List repos, [ - int compare(Repository a, Repository b), + int Function(Repository a, Repository b) compare, ]) { document.querySelector('#repos').children.clear(); repos.sort(compare); @@ -69,7 +69,7 @@ void updateRepos( } } -void loadRepos([int compare(Repository a, Repository b)]) { +void loadRepos([int Function(Repository a, Repository b) compare]) { final title = querySelector('#title'); if (title.text.contains('(')) { title.replaceWith(HeadingElement.h2() @@ -90,9 +90,7 @@ void loadRepos([int compare(Repository a, Repository b)]) { } } - if (compare == null) { - compare = (a, b) => a.name.compareTo(b.name); - } + compare ??= (a, b) => a.name.compareTo(b.name); github.repositories.listUserRepositories(user).toList().then((repos) { _reposCache = repos; diff --git a/example/search.dart b/example/search.dart index 60f223ca..116581c5 100644 --- a/example/search.dart +++ b/example/search.dart @@ -9,7 +9,7 @@ Future main() async { } Future search(_) async { - final Stream resultsStream = github.search.code( + final resultsStream = github.search.code( val('query'), language: val('language'), filename: val('filename'), @@ -28,13 +28,13 @@ Future search(_) async { final DivElement resultsDiv = querySelector('#results'); resultsDiv.innerHtml = ''; - int count = 0; + var count = 0; await for (final results in resultsStream) { count += results.items.length; querySelector('#nresults').text = '${results.totalCount} result${results.totalCount == 1 ? "" : "s"} (showing $count)'; - for (final CodeSearchItem item in results.items) { + for (final item in results.items) { final url = item.htmlUrl; final path = item.path; resultsDiv.append(DivElement() diff --git a/example/users.dart b/example/users.dart index 691509d5..40e22077 100644 --- a/example/users.dart +++ b/example/users.dart @@ -18,7 +18,7 @@ void loadUsers() { github.users.getUser(baseUser.login).then((user) { final userDiv = DivElement(); - for (int i = 1; i <= 2; i++) { + for (var i = 1; i <= 2; i++) { userDiv.append(BRElement()); } diff --git a/example/zen.dart b/example/zen.dart index 560f914f..b152e262 100644 --- a/example/zen.dart +++ b/example/zen.dart @@ -3,6 +3,6 @@ import 'common.dart'; Future main() async { await initViewSourceButton('zen.dart'); - final String msg = await github.misc.getZen(); + final msg = await github.misc.getZen(); querySelector('#zen').text = msg; } diff --git a/lib/browser_helper.dart b/lib/browser_helper.dart index 39e8800b..4c8485e3 100644 --- a/lib/browser_helper.dart +++ b/lib/browser_helper.dart @@ -9,11 +9,11 @@ import 'package:github/src/common.dart'; /// [selector] is the selector to use to find markdown elements. /// [indent] is the indent that needs to be stripped out. void renderMarkdown(GitHub github, String selector, {int indent = 4}) { - final ElementList elements = document.querySelectorAll(selector); + final elements = document.querySelectorAll(selector); elements.removeWhere((Element it) => it.attributes.containsKey('rendered')); - for (final Element e in elements) { + for (final e in elements) { final txt = e.text; final md = txt.split('\n').map((it) { diff --git a/lib/src/browser/xplat_browser.dart b/lib/src/browser/xplat_browser.dart index c7074a58..a5ba5d19 100644 --- a/lib/src/browser/xplat_browser.dart +++ b/lib/src/browser/xplat_browser.dart @@ -10,9 +10,7 @@ import 'package:github/src/common/xplat_common.dart' Authentication findAuthenticationFromEnvironment() { // search the query string parameters first var auth = findAuthenticationInMap(_parseQuery(window.location.href)); - if (auth == null) { - auth = findAuthenticationInMap(window.sessionStorage); - } + auth ??= findAuthenticationInMap(window.sessionStorage); return auth ?? Authentication.anonymous(); } diff --git a/lib/src/common/activity_service.dart b/lib/src/common/activity_service.dart index ef1a84e6..ceeb49eb 100644 --- a/lib/src/common/activity_service.dart +++ b/lib/src/common/activity_service.dart @@ -344,9 +344,7 @@ class EventPoller { _controller = StreamController(); void handleEvent(http.Response response) { - if (interval == null) { - interval = int.parse(response.headers['x-poll-interval']); - } + interval ??= int.parse(response.headers['x-poll-interval']); if (response.statusCode == 304) { return; @@ -374,17 +372,15 @@ class EventPoller { } } - if (_timer == null) { - _timer = Timer.periodic(Duration(seconds: interval), (timer) { - final headers = {}; + _timer ??= Timer.periodic(Duration(seconds: interval), (timer) { + final headers = {}; - if (_lastFetched != null) { - headers['If-None-Match'] = _lastFetched; - } + if (_lastFetched != null) { + headers['If-None-Match'] = _lastFetched; + } - github.request('GET', path, headers: headers).then(handleEvent); - }); - } + github.request('GET', path, headers: headers).then(handleEvent); + }); } final headers = {}; diff --git a/lib/src/common/git_service.dart b/lib/src/common/git_service.dart index d21aaa12..cdd0e708 100644 --- a/lib/src/common/git_service.dart +++ b/lib/src/common/git_service.dart @@ -61,7 +61,7 @@ class GitService extends Service { /// /// API docs: https://developer.github.com/v3/git/refs/#get-all-references Stream listReferences(RepositorySlug slug, {String type}) { - String path = '/repos/${slug.fullName}/git/refs'; + var path = '/repos/${slug.fullName}/git/refs'; if (type != null) { path += '/$type'; } @@ -93,7 +93,7 @@ class GitService extends Service { String sha, { bool force = false, }) { - final String body = jsonEncode({'sha': sha, 'force': force}); + final body = jsonEncode({'sha': sha, 'force': force}); // Somehow the reference updates PATCH request needs a valid content-length. final headers = {'content-length': body.length.toString()}; diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index 7fe90726..f0969d0b 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -80,10 +80,7 @@ class GitHub { /// Service for activity related methods of the GitHub API. ActivityService get activity { - if (_activity == null) { - _activity = ActivityService(this); - } - return _activity; + return _activity ??= ActivityService(this); } /// Service for autorizations related methods of the GitHub API. @@ -91,90 +88,57 @@ class GitHub { /// Note: You can only access this API via Basic Authentication using your /// username and password, not tokens. AuthorizationsService get authorizations { - if (_authorizations == null) { - _authorizations = AuthorizationsService(this); - } - return _authorizations; + return _authorizations ??= AuthorizationsService(this); } /// Service for gist related methods of the GitHub API. GistsService get gists { - if (_gists == null) { - _gists = GistsService(this); - } - return _gists; + return _gists ??= GistsService(this); } /// Service for git data related methods of the GitHub API. GitService get git { - if (_git == null) { - _git = GitService(this); - } - return _git; + return _git ??= GitService(this); } /// Service for issues related methods of the GitHub API. IssuesService get issues { - if (_issues == null) { - _issues = IssuesService(this); - } - return _issues; + return _issues ??= IssuesService(this); } /// Service for misc related methods of the GitHub API. MiscService get misc { - if (_misc == null) { - _misc = MiscService(this); - } - return _misc; + return _misc ??= MiscService(this); } /// Service for organization related methods of the GitHub API. OrganizationsService get organizations { - if (_organizations == null) { - _organizations = OrganizationsService(this); - } - return _organizations; + return _organizations ??= OrganizationsService(this); } /// Service for pull requests related methods of the GitHub API. PullRequestsService get pullRequests { - if (_pullRequests == null) { - _pullRequests = PullRequestsService(this); - } - return _pullRequests; + return _pullRequests ??= PullRequestsService(this); } /// Service for repository related methods of the GitHub API. RepositoriesService get repositories { - if (_repositories == null) { - _repositories = RepositoriesService(this); - } - return _repositories; + return _repositories ??= RepositoriesService(this); } /// Service for search related methods of the GitHub API. SearchService get search { - if (_search == null) { - _search = SearchService(this); - } - return _search; + return _search ??= SearchService(this); } /// Service to provide a handy method to access GitHub's url shortener. UrlShortenerService get urlShortener { - if (_urlShortener == null) { - _urlShortener = UrlShortenerService(this); - } - return _urlShortener; + return _urlShortener ??= UrlShortenerService(this); } /// Service for user related methods of the GitHub API. UsersService get users { - if (_users == null) { - _users = UsersService(this); - } - return _users; + return _users ??= UsersService(this); } /// Handles Get Requests that respond with JSON @@ -192,7 +156,7 @@ class GitHub { /// The default [convert] function returns the input object. Future getJSON(String path, {int statusCode, - void fail(http.Response response), + void Function(http.Response response) fail, Map headers, Map params, JSONConverter convert, @@ -228,7 +192,7 @@ class GitHub { Future postJSON( String path, { int statusCode, - void fail(http.Response response), + void Function(http.Response response) fail, Map headers, Map params, JSONConverter convert, @@ -251,7 +215,7 @@ class GitHub { String method, String path, { int statusCode, - void fail(http.Response response), + void Function(http.Response response) fail, Map headers, Map params, JSONConverter convert, @@ -304,7 +268,7 @@ class GitHub { Map params, dynamic body, int statusCode, - void fail(http.Response response), + void Function(http.Response response) fail, String preview, }) async { if (rateLimitRemaining != null && rateLimitRemaining <= 0) { @@ -314,7 +278,7 @@ class GitHub { await Future.delayed(waitTime); } - if (headers == null) headers = {}; + headers ??= {}; if (preview != null) { headers['Accept'] = preview; @@ -412,7 +376,7 @@ class GitHub { buff.writeln(' Message: $message'); if (errors != null) { buff.writeln(' Errors:'); - for (final Map error in errors) { + for (final error in errors) { final resource = error['resource']; final field = error['field']; final code = error['code']; diff --git a/lib/src/common/model/repos_contents.dart b/lib/src/common/model/repos_contents.dart index 3d1e9475..bee4f75f 100644 --- a/lib/src/common/model/repos_contents.dart +++ b/lib/src/common/model/repos_contents.dart @@ -57,10 +57,8 @@ class GitHubFile { /// The value in [content] Base-64 decoded. String get text { - if (_text == null) { - _text = utf8.decode(base64Decode(LineSplitter.split(content).join())); - } - return _text; + return _text ??= + utf8.decode(base64Decode(LineSplitter.split(content).join())); } String _text; diff --git a/lib/src/common/orgs_service.dart b/lib/src/common/orgs_service.dart index 011eacd3..a9b700ad 100644 --- a/lib/src/common/orgs_service.dart +++ b/lib/src/common/orgs_service.dart @@ -18,7 +18,7 @@ class OrganizationsService extends Service { /// /// API docs: : https://developer.github.com/v3/orgs/#list-user-organizations Stream list([String userName]) { - String requestPath = '/users/$userName/orgs'; + var requestPath = '/users/$userName/orgs'; if (userName == null) { requestPath = '/user/orgs'; } diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 75a9110a..97743eb9 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -149,7 +149,7 @@ class RepositoriesService extends Service { /// Fetches a list of repositories specified by [slugs]. Stream getRepositories(List slugs) async* { - for (final RepositorySlug slug in slugs) { + for (final slug in slugs) { final repo = await getRepository(slug); yield repo; } @@ -167,7 +167,7 @@ class RepositoriesService extends Service { bool hasWiki, bool hasDownloads}) async { ArgumentError.checkNotNull(slug); - final Map data = createNonNullMap({ + final data = createNonNullMap({ 'name': name, 'description': description, 'homepage': homepage, @@ -289,7 +289,7 @@ class RepositoriesService extends Service { Future isCollaborator(RepositorySlug slug, String user) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(user); - bool catchError = false; + var catchError = false; http.Response response; try { response = await github.request( @@ -380,7 +380,7 @@ class RepositoriesService extends Service { }) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(commit); - final Map data = createNonNullMap({ + final data = createNonNullMap({ 'body': body, 'path': path, 'position': position, @@ -513,7 +513,7 @@ class RepositoriesService extends Service { ArgumentError.checkNotNull(slug); final headers = {}; - String url = '/repos/${slug.fullName}/readme'; + var url = '/repos/${slug.fullName}/readme'; if (ref != null) { url += '?ref=$ref'; @@ -525,7 +525,7 @@ class RepositoriesService extends Service { throw NotFound(github, response.body); } }, convert: (Map input) { - GitHubFile file = GitHubFile.fromJson(input); + var file = GitHubFile.fromJson(input); if (file != null && slug != null) { file.sourceRepository = slug; } @@ -552,7 +552,7 @@ class RepositoriesService extends Service { {String ref}) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(path); - String url = '/repos/${slug.fullName}/contents/$path'; + var url = '/repos/${slug.fullName}/contents/$path'; if (ref != null) { url += '?ref=$ref'; @@ -587,7 +587,7 @@ class RepositoriesService extends Service { RepositorySlug slug, CreateFile file) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(file); - final http.Response response = await github.request( + final response = await github.request( 'PUT', '/repos/${slug.fullName}/contents/${file.path}', body: jsonEncode(file), @@ -604,13 +604,13 @@ class RepositoriesService extends Service { {String branch}) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(path); - final Map map = createNonNullMap({ + final map = createNonNullMap({ 'message': message, 'content': content, 'sha': sha, 'branch': branch, }); - final http.Response response = await github.request( + final response = await github.request( 'PUT', '/repos/${slug.fullName}/contents/$path', body: jsonEncode(map), @@ -626,9 +626,9 @@ class RepositoriesService extends Service { String message, String sha, String branch) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(path); - final Map map = + final map = createNonNullMap({'message': message, 'sha': sha, 'branch': branch}); - final http.Response response = await github.request( + final response = await github.request( 'DELETE', '/repos/${slug.fullName}/contents/$path', body: jsonEncode(map), @@ -646,7 +646,7 @@ class RepositoriesService extends Service { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(ref); ArgumentError.checkNotNull(format); - final http.Response response = await github.request( + final response = await github.request( 'GET', '/repos/${slug.fullName}/$format/$ref', statusCode: StatusCodes.FOUND, @@ -671,7 +671,7 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/forks/#create-a-fork Future createFork(RepositorySlug slug, [CreateFork fork]) async { ArgumentError.checkNotNull(slug); - if (fork == null) fork = CreateFork(); + fork ??= CreateFork(); return github.postJSON, Repository>( '/repos/${slug.fullName}/forks', body: jsonEncode(fork), @@ -966,8 +966,7 @@ class RepositoriesService extends Service { }) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(createRelease); - final Release release = - await github.postJSON, Release>( + final release = await github.postJSON, Release>( '/repos/${slug.fullName}/releases', convert: (i) => Release.fromJson(i), body: jsonEncode(createRelease.toJson()), @@ -1114,7 +1113,7 @@ class RepositoriesService extends Service { Release release, Iterable createReleaseAssets, ) async { - final List releaseAssets = []; + final releaseAssets = []; for (final createReleaseAsset in createReleaseAssets) { final headers = {'Content-Type': createReleaseAsset.contentType}; final releaseAsset = await github.postJSON( @@ -1140,8 +1139,8 @@ class RepositoriesService extends Service { RepositorySlug slug, ) async { ArgumentError.checkNotNull(slug); - final String path = '/repos/${slug.fullName}/stats/contributors'; - final http.Response response = await github.request('GET', path, + final path = '/repos/${slug.fullName}/stats/contributors'; + final response = await github.request('GET', path, headers: {'Accept': 'application/vnd.github.v3+json'}); if (response.statusCode == StatusCodes.OK) { diff --git a/lib/src/common/search_service.dart b/lib/src/common/search_service.dart index 3cb52e22..4418b6c6 100644 --- a/lib/src/common/search_service.dart +++ b/lib/src/common/search_service.dart @@ -23,7 +23,7 @@ class SearchService extends Service { final controller = StreamController(); - bool isFirst = true; + var isFirst = true; PaginationHelper(github) .fetchStreamed('GET', '/search/repositories', @@ -95,7 +95,7 @@ class SearchService extends Service { query += _searchQualifier('size', size); // build up the in: qualifier based on the 2 booleans - String _in = ''; + var _in = ''; if (inFile) { _in = 'file'; } diff --git a/lib/src/common/util/pagination.dart b/lib/src/common/util/pagination.dart index 53de656d..753a8457 100644 --- a/lib/src/common/util/pagination.dart +++ b/lib/src/common/util/pagination.dart @@ -17,10 +17,10 @@ class PaginationHelper { Map params, String body, int statusCode = 200}) async* { - int count = 0; - const Duration serverErrorBackOff = Duration(seconds: 10); - const int maxServerErrors = 10; - int serverErrors = 0; + var count = 0; + const serverErrorBackOff = Duration(seconds: 10); + const maxServerErrors = 10; + var serverErrors = 0; if (params == null) { params = {}; @@ -89,7 +89,7 @@ class PaginationHelper { int statusCode = 200, String preview, }) async* { - if (headers == null) headers = {}; + headers ??= {}; if (preview != null) { headers['Accept'] = preview; } @@ -137,9 +137,9 @@ Map parseLinkHeader(String input) { throw const FormatException('Invalid Link Header'); } final kv = part.split('; '); - String url = kv[0].substring(1); + var url = kv[0].substring(1); url = url.substring(0, url.length - 1); - String key = kv[1]; + var key = kv[1]; key = key.replaceAll('"', '').substring(4); out[key] = url; } diff --git a/lib/src/common/xplat_common.dart b/lib/src/common/xplat_common.dart index 91eda3d4..e251ba7f 100644 --- a/lib/src/common/xplat_common.dart +++ b/lib/src/common/xplat_common.dart @@ -4,7 +4,7 @@ Authentication findAuthenticationFromEnvironment() => Authentication.anonymous(); Authentication findAuthenticationInMap(Map map) { - for (final String key in COMMON_GITHUB_TOKEN_ENV_KEYS) { + for (final key in COMMON_GITHUB_TOKEN_ENV_KEYS) { if (map.containsKey(key)) { return Authentication.withToken(map[key]); } diff --git a/lib/src/server/xplat_server.dart b/lib/src/server/xplat_server.dart index 2093c75d..3bd6e100 100644 --- a/lib/src/server/xplat_server.dart +++ b/lib/src/server/xplat_server.dart @@ -15,12 +15,12 @@ Authentication findAuthenticationFromEnvironment() { 'security', const ['find-internet-password', '-g', '-s', 'github.com']); if (result.exitCode == 0) { - final String out = result.stdout.toString(); + final out = result.stdout.toString(); - String username = out.split('"acct"="')[1]; + var username = out.split('"acct"="')[1]; username = username.substring(0, username.indexOf('\n')); username = username.substring(0, username.length - 1); - String password = result.stderr.toString().split('password:')[1].trim(); + var password = result.stderr.toString().split('password:')[1].trim(); password = password.substring(1, password.length - 1); return Authentication.basic(username.trim(), password.trim()); } diff --git a/lib/src/util.dart b/lib/src/util.dart index 0f4d5ea3..9e21595d 100644 --- a/lib/src/util.dart +++ b/lib/src/util.dart @@ -7,7 +7,7 @@ String buildQueryString(Map params) { queryString.write('?'); } - int i = 0; + var i = 0; for (final key in params.keys) { i++; if (params[key] == null) { diff --git a/test/code_search_test.dart b/test/code_search_test.dart index 6187009d..06ade1aa 100644 --- a/test/code_search_test.dart +++ b/test/code_search_test.dart @@ -3,9 +3,9 @@ import 'package:github/github.dart'; Future main() async { print('Searching ...'); - final GitHub github = GitHub(); + final github = GitHub(); - final Stream resultsStream = github.search.code( + final resultsStream = github.search.code( 'github', repo: 'SpinlockLabs/github.dart', perPage: 5, @@ -13,7 +13,7 @@ Future main() async { ); final results = await resultsStream.first; print('${results.totalCount} results'); - int k = 1; + var k = 1; for (final i in results.items) { print('${k++} ${i.path}'); } diff --git a/test/experiment/limit_pager.dart b/test/experiment/limit_pager.dart index 28a9c33b..c8b14739 100755 --- a/test/experiment/limit_pager.dart +++ b/test/experiment/limit_pager.dart @@ -22,8 +22,8 @@ PaginationInformation solve(int limit) { return PaginationInformation(limit, limit ~/ MAX_PER_PAGE, MAX_PER_PAGE); } - const int itemsPerPage = 100; - final int pages = (limit / itemsPerPage).ceil(); + const itemsPerPage = 100; + final pages = (limit / itemsPerPage).ceil(); return PaginationInformation(limit, pages, itemsPerPage); } diff --git a/test/experiment/link_header.dart b/test/experiment/link_header.dart index b3856067..dd0230a0 100644 --- a/test/experiment/link_header.dart +++ b/test/experiment/link_header.dart @@ -1,7 +1,7 @@ import 'package:github/src/common/util/pagination.dart'; void main() { - final Map it = parseLinkHeader( + final it = parseLinkHeader( '; rel="next", ; rel="last"'); print(it); } diff --git a/test/experiment/polling.dart b/test/experiment/polling.dart index ddb3189b..b12b2ef6 100755 --- a/test/experiment/polling.dart +++ b/test/experiment/polling.dart @@ -3,7 +3,7 @@ import 'package:github/github.dart'; void main() { final github = GitHub(); - final EventPoller poller = github.activity.pollPublicEvents(); + final poller = github.activity.pollPublicEvents(); poller.start().listen((event) { print('New Event:'); diff --git a/test/git_test.dart b/test/git_test.dart index b11b759f..336c1a54 100644 --- a/test/git_test.dart +++ b/test/git_test.dart @@ -32,7 +32,7 @@ void main() { group('createBlob()', () { test('constructs correct path', () { - CreateGitBlob blob = CreateGitBlob('bbb', 'utf-8'); + var blob = CreateGitBlob('bbb', 'utf-8'); git.createBlob(repo, blob); verify(github.postJSON( @@ -44,7 +44,7 @@ void main() { }); test('creates valid JSON body', () { - CreateGitBlob blob = CreateGitBlob('bbb', 'utf-8'); + var blob = CreateGitBlob('bbb', 'utf-8'); git.createBlob(repo, blob); final body = captureSentBody(github); @@ -64,7 +64,7 @@ void main() { group('createCommit()', () { test('constructs correct path', () { - final CreateGitCommit commit = CreateGitCommit('aMessage', 'aTreeSha'); + final commit = CreateGitCommit('aMessage', 'aTreeSha'); git.createCommit(repo, commit); verify(github.postJSON( @@ -77,9 +77,9 @@ void main() { test('creates valid JSON body', () { // given - const String date = '2014-10-02T15:21:29Z'; + const date = '2014-10-02T15:21:29Z'; - final CreateGitCommit commit = CreateGitCommit('aMessage', 'aTreeSha') + final commit = CreateGitCommit('aMessage', 'aTreeSha') ..parents = ['parentSha1', 'parentSha2'] ..committer = GitCommitUser('cName', 'cEmail', parseDateTime(date)) ..author = GitCommitUser('aName', 'aEmail', parseDateTime(date)); @@ -134,7 +134,7 @@ void main() { group('editReference()', () { test('constructs correct path', () { // given - final http.Response expectedResponse = http.Response('{}', 200); + final expectedResponse = http.Response('{}', 200); when(github.request(any, any, body: any, headers: any)) .thenReturn(Future.value(expectedResponse)); @@ -149,7 +149,7 @@ void main() { test('creates valid JSON body', () { // given - final http.Response expectedResponse = http.Response('{}', 200); + final expectedResponse = http.Response('{}', 200); when(github.request(any, any, body: any, headers: any)) .thenReturn(Future.value(expectedResponse)); @@ -157,7 +157,7 @@ void main() { git.editReference(repo, 'heads/b', someSha, force: true); // then - final List captured = verify(github.request( + final captured = verify(github.request( any, any, body: captureAny, @@ -176,7 +176,7 @@ void main() { group('deleteReference()', () { test('constructs correct path', () { // given - final http.Response expectedResponse = http.Response('{}', 200); + final expectedResponse = http.Response('{}', 200); when(github.request(any, any)).thenReturn(Future.value(expectedResponse)); // when diff --git a/test/helper/http.dart b/test/helper/http.dart index 288462b7..566611d3 100644 --- a/test/helper/http.dart +++ b/test/helper/http.dart @@ -29,11 +29,10 @@ class MockResponse extends http.Response { : super(body, statusCode, headers: headers); factory MockResponse.fromAsset(String name) { - final Map responseData = + final responseData = jsonDecode(asset('responses/$name.json').readAsStringSync()) as Map; - final Map headers = - responseData['headers'] as Map; + final headers = responseData['headers'] as Map; final dynamic body = responseData['body']; final int statusCode = responseData['statusCode']; String actualBody; diff --git a/tool/language_color_generator.dart b/tool/language_color_generator.dart index b2a1cd83..3bed2d0b 100644 --- a/tool/language_color_generator.dart +++ b/tool/language_color_generator.dart @@ -21,7 +21,7 @@ Future main() async { final map = yaml.value as YamlMap; final languages = map.keys.cast().toList(growable: false)..sort(); - for (String language in languages) { + for (var language in languages) { final color = map[language]['color']?.toString()?.toUpperCase() ?? '#000000'; From bfeee33a798ca4cafb4c87694a62f5208948d05a Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Tue, 28 Jan 2020 21:13:15 -0700 Subject: [PATCH 125/390] Prep 6.0.6 --- CHANGELOG.md | 3 +++ pubspec.yaml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b1f1c82d..f39369b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## 6.0.6 + - Clean up lints https://github.com/SpinlockLabs/github.dart/pull/202 + ## 6.0.5 - Fix null errors issue https://github.com/SpinlockLabs/github.dart/issues/199 diff --git a/pubspec.yaml b/pubspec.yaml index 9015de78..341f2800 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 6.0.5 +version: 6.0.6 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From acdffb712408a4ae7aa996447560425748f559e6 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Tue, 28 Jan 2020 15:37:21 -0800 Subject: [PATCH 126/390] Centralize definition of v3 API mime type --- lib/src/common/github.dart | 2 +- lib/src/common/repos_service.dart | 4 ++-- lib/src/common/util/pagination.dart | 3 ++- lib/src/util.dart | 2 ++ 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index f0969d0b..6495bf23 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -229,7 +229,7 @@ class GitHub { headers['Accept'] = preview; } - headers.putIfAbsent('Accept', () => 'application/vnd.github.v3+json'); + headers.putIfAbsent('Accept', () => v3ApiMimeType); final response = await request( method, diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 97743eb9..7b86817e 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -1140,8 +1140,8 @@ class RepositoriesService extends Service { ) async { ArgumentError.checkNotNull(slug); final path = '/repos/${slug.fullName}/stats/contributors'; - final response = await github.request('GET', path, - headers: {'Accept': 'application/vnd.github.v3+json'}); + final response = + await github.request('GET', path, headers: {'Accept': v3ApiMimeType}); if (response.statusCode == StatusCodes.OK) { return (jsonDecode(response.body) as List) diff --git a/lib/src/common/util/pagination.dart b/lib/src/common/util/pagination.dart index 753a8457..d6e367b8 100644 --- a/lib/src/common/util/pagination.dart +++ b/lib/src/common/util/pagination.dart @@ -4,6 +4,7 @@ import 'dart:convert' show jsonDecode; import 'package:http/http.dart' as http; import '../../common.dart'; +import '../../util.dart'; /// Internal Helper for dealing with GitHub Pagination. class PaginationHelper { @@ -93,7 +94,7 @@ class PaginationHelper { if (preview != null) { headers['Accept'] = preview; } - headers.putIfAbsent('Accept', () => 'application/vnd.github.v3+json'); + headers.putIfAbsent('Accept', () => v3ApiMimeType); await for (final response in fetchStreamed(method, path, pages: pages, diff --git a/lib/src/util.dart b/lib/src/util.dart index 9e21595d..0b9a3939 100644 --- a/lib/src/util.dart +++ b/lib/src/util.dart @@ -1,5 +1,7 @@ final RegExp githubDateRemoveRegExp = RegExp(r'\.\d*'); +const v3ApiMimeType = 'application/vnd.github.v3+json'; + String buildQueryString(Map params) { final queryString = StringBuffer(); From c6915efd971524ef038771f74a7fbbc18324e2d4 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Wed, 29 Jan 2020 08:10:09 -0800 Subject: [PATCH 127/390] Add IssueService.listReactions function --- CHANGELOG.md | 3 +++ lib/src/common.dart | 1 + lib/src/common/issues_service.dart | 14 +++++++++++++ lib/src/common/model/reaction.dart | 30 ++++++++++++++++++++++++++++ lib/src/common/model/reaction.g.dart | 29 +++++++++++++++++++++++++++ pubspec.yaml | 2 +- 6 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 lib/src/common/model/reaction.dart create mode 100644 lib/src/common/model/reaction.g.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index f39369b9..04edc94f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## 6.1.0 + - Add (experimental) `listReactions` method to `IssueService`. + ## 6.0.6 - Clean up lints https://github.com/SpinlockLabs/github.dart/pull/202 diff --git a/lib/src/common.dart b/lib/src/common.dart index 56bc0770..6aada6a0 100644 --- a/lib/src/common.dart +++ b/lib/src/common.dart @@ -17,6 +17,7 @@ export 'package:github/src/common/model/misc.dart'; export 'package:github/src/common/model/notifications.dart'; export 'package:github/src/common/model/orgs.dart'; export 'package:github/src/common/model/pulls.dart'; +export 'package:github/src/common/model/reaction.dart'; export 'package:github/src/common/model/repos.dart'; export 'package:github/src/common/model/repos_commits.dart'; export 'package:github/src/common/model/repos_contents.dart'; diff --git a/lib/src/common/issues_service.dart b/lib/src/common/issues_service.dart index ada759e5..7509b9ef 100644 --- a/lib/src/common/issues_service.dart +++ b/lib/src/common/issues_service.dart @@ -1,5 +1,6 @@ import 'dart:async'; import 'dart:convert'; + import 'package:github/src/common.dart'; import 'package:github/src/common/model/users.dart'; import 'package:github/src/common/util/pagination.dart'; @@ -129,6 +130,19 @@ class IssuesService extends Service { ); } + /// This API is currently in preview. It may break. + /// + /// See https://developer.github.com/v3/reactions/ + Stream listReactions(RepositorySlug slug, int issueNumber) => + PaginationHelper(github).objects( + 'GET', + '/repos/${slug.owner}/${slug.name}/issues/$issueNumber/reactions', + (i) => Reaction.fromJson(i), + headers: { + 'Accept': 'application/vnd.github.squirrel-girl-preview+json', + }, + ); + /// Edit an issue. /// /// API docs: https://developer.github.com/v3/issues/#edit-an-issue diff --git a/lib/src/common/model/reaction.dart b/lib/src/common/model/reaction.dart new file mode 100644 index 00000000..b95fe67e --- /dev/null +++ b/lib/src/common/model/reaction.dart @@ -0,0 +1,30 @@ +import 'package:github/src/common.dart'; +import 'package:github/src/common/model/users.dart'; +import 'package:json_annotation/json_annotation.dart'; + +part 'reaction.g.dart'; + +/// This API is currently in preview. It may break. +/// +/// See https://developer.github.com/v3/reactions/ +@JsonSerializable(fieldRename: FieldRename.snake) +class Reaction { + final int id; + final String nodeId; + final User user; + final String content; + final DateTime createdAt; + + Reaction({ + this.id, + this.nodeId, + this.user, + this.content, + this.createdAt, + }); + + factory Reaction.fromJson(Map json) => + _$ReactionFromJson(json); + + Map toJson() => _$ReactionToJson(this); +} diff --git a/lib/src/common/model/reaction.g.dart b/lib/src/common/model/reaction.g.dart new file mode 100644 index 00000000..632d7c7f --- /dev/null +++ b/lib/src/common/model/reaction.g.dart @@ -0,0 +1,29 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'reaction.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +Reaction _$ReactionFromJson(Map json) { + return Reaction( + id: json['id'] as int, + nodeId: json['node_id'] as String, + user: json['user'] == null + ? null + : User.fromJson(json['user'] as Map), + content: json['content'] as String, + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + ); +} + +Map _$ReactionToJson(Reaction instance) => { + 'id': instance.id, + 'node_id': instance.nodeId, + 'user': instance.user, + 'content': instance.content, + 'created_at': instance.createdAt?.toIso8601String(), + }; diff --git a/pubspec.yaml b/pubspec.yaml index 341f2800..754a8ab3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 6.0.6 +version: 6.1.0-dev description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From 699bb42e7719e14659a4453a3fe1341ee12c3b1a Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Fri, 31 Jan 2020 08:46:21 -0700 Subject: [PATCH 128/390] Add content param to listReactions for issues --- lib/src/common/github.dart | 8 +++++- lib/src/common/issues_service.dart | 21 ++++++++------- lib/src/common/model/reaction.dart | 43 ++++++++++++++++++++++++++++++ lib/src/util.dart | 3 ++- test/experiment/reactions.dart | 11 ++++++++ 5 files changed, 75 insertions(+), 11 deletions(-) create mode 100644 test/experiment/reactions.dart diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index 6495bf23..75784d2e 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -352,7 +352,13 @@ class GitHub { final json = jsonDecode(response.body); message = json['message']; if (json['errors'] != null) { - errors = List>.from(json['errors']); + try { + errors = List>.from(json['errors']); + } catch (_) { + errors = [ + {'code': json['errors'].toString()} + ]; + } } } switch (response.statusCode) { diff --git a/lib/src/common/issues_service.dart b/lib/src/common/issues_service.dart index 7509b9ef..d907a928 100644 --- a/lib/src/common/issues_service.dart +++ b/lib/src/common/issues_service.dart @@ -133,15 +133,18 @@ class IssuesService extends Service { /// This API is currently in preview. It may break. /// /// See https://developer.github.com/v3/reactions/ - Stream listReactions(RepositorySlug slug, int issueNumber) => - PaginationHelper(github).objects( - 'GET', - '/repos/${slug.owner}/${slug.name}/issues/$issueNumber/reactions', - (i) => Reaction.fromJson(i), - headers: { - 'Accept': 'application/vnd.github.squirrel-girl-preview+json', - }, - ); + Stream listReactions(RepositorySlug slug, int issueNumber, + {ReactionType content}) { + var query = content != null ? '?content=${content.content}' : ''; + return PaginationHelper(github).objects( + 'GET', + '/repos/${slug.owner}/${slug.name}/issues/$issueNumber/reactions$query', + (i) => Reaction.fromJson(i), + headers: { + 'Accept': 'application/vnd.github.squirrel-girl-preview+json', + }, + ); + } /// Edit an issue. /// diff --git a/lib/src/common/model/reaction.dart b/lib/src/common/model/reaction.dart index b95fe67e..4b1ad1c7 100644 --- a/lib/src/common/model/reaction.dart +++ b/lib/src/common/model/reaction.dart @@ -1,6 +1,7 @@ import 'package:github/src/common.dart'; import 'package:github/src/common/model/users.dart'; import 'package:json_annotation/json_annotation.dart'; +import 'package:meta/meta.dart'; part 'reaction.g.dart'; @@ -23,8 +24,50 @@ class Reaction { this.createdAt, }); + ReactionType get type => ReactionType.fromString(content); + factory Reaction.fromJson(Map json) => _$ReactionFromJson(json); Map toJson() => _$ReactionToJson(this); } + +@immutable +class ReactionType { + final String content; + final String emoji; + const ReactionType._(this.content, this.emoji); + + @override + String toString() => content; + + static const plusOne = ReactionType._('+1', '👍'); + static const minusOne = ReactionType._('-1', '👎'); + static const laugh = ReactionType._('laugh', '😄'); + static const confused = ReactionType._('confused', '😕'); + static const heart = ReactionType._('heart', '❤️'); + static const hooray = ReactionType._('hooray', '🎉'); + static const rocket = ReactionType._('rocket', '🚀'); + static const eyes = ReactionType._('eyes', '👀'); + + static final _types = { + '+1': plusOne, + '-1': minusOne, + 'laugh': laugh, + 'confused': confused, + 'heart': heart, + 'hooray': hooray, + 'rocket': rocket, + 'eyes': eyes, + ':+1:': plusOne, + ':-1:': minusOne, + ':laugh:': laugh, + ':confused:': confused, + ':heart:': heart, + ':hooray:': hooray, + ':rocket:': rocket, + ':eyes:': eyes, + }; + + static ReactionType fromString(String content) => _types[content]; +} diff --git a/lib/src/util.dart b/lib/src/util.dart index 0b9a3939..c271661b 100644 --- a/lib/src/util.dart +++ b/lib/src/util.dart @@ -15,7 +15,8 @@ String buildQueryString(Map params) { if (params[key] == null) { continue; } - queryString.write('$key=${Uri.encodeComponent(params[key].toString())}'); + queryString + .write('$key=${Uri.encodeQueryComponent(params[key].toString())}'); if (i != params.keys.length) { queryString.write('&'); } diff --git a/test/experiment/reactions.dart b/test/experiment/reactions.dart new file mode 100644 index 00000000..0b07d915 --- /dev/null +++ b/test/experiment/reactions.dart @@ -0,0 +1,11 @@ +import 'package:github/github.dart'; + +void main() { + final github = GitHub(auth: findAuthenticationFromEnvironment()); + github.issues + .listReactions(RepositorySlug('SpinlockLabs', 'github.dart'), 177, + content: ReactionType.plusOne) + .listen((Reaction r) { + print(ReactionType.fromString(r.content).emoji); + }); +} From 4a54ee30e24b4adc11dad87b16f4ddc0fe676f3c Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Fri, 31 Jan 2020 08:59:05 -0700 Subject: [PATCH 129/390] Add some doc comments --- lib/src/common/issues_service.dart | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/src/common/issues_service.dart b/lib/src/common/issues_service.dart index d907a928..7fbdb9bf 100644 --- a/lib/src/common/issues_service.dart +++ b/lib/src/common/issues_service.dart @@ -130,6 +130,13 @@ class IssuesService extends Service { ); } + /// Gets a stream of [Reaction]s for an issue. + /// The optional content param let's you filter the request for only reactions + /// of that type. + /// WARNING: ReactionType.plusOne and ReactionType.minusOne currently do not + /// work and will throw an exception is used. All others without + or - signs + /// work fine to filter. + /// /// This API is currently in preview. It may break. /// /// See https://developer.github.com/v3/reactions/ From 8f66a398e97dfaab01b24901e444f715687b4e8e Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Fri, 31 Jan 2020 09:00:01 -0700 Subject: [PATCH 130/390] format, remove change to utils.dart --- lib/src/common/issues_service.dart | 6 +++--- lib/src/util.dart | 3 +-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/lib/src/common/issues_service.dart b/lib/src/common/issues_service.dart index 7fbdb9bf..cd4a84d6 100644 --- a/lib/src/common/issues_service.dart +++ b/lib/src/common/issues_service.dart @@ -130,13 +130,13 @@ class IssuesService extends Service { ); } - /// Gets a stream of [Reaction]s for an issue. + /// Gets a stream of [Reaction]s for an issue. /// The optional content param let's you filter the request for only reactions - /// of that type. + /// of that type. /// WARNING: ReactionType.plusOne and ReactionType.minusOne currently do not /// work and will throw an exception is used. All others without + or - signs /// work fine to filter. - /// + /// /// This API is currently in preview. It may break. /// /// See https://developer.github.com/v3/reactions/ diff --git a/lib/src/util.dart b/lib/src/util.dart index c271661b..0b9a3939 100644 --- a/lib/src/util.dart +++ b/lib/src/util.dart @@ -15,8 +15,7 @@ String buildQueryString(Map params) { if (params[key] == null) { continue; } - queryString - .write('$key=${Uri.encodeQueryComponent(params[key].toString())}'); + queryString.write('$key=${Uri.encodeComponent(params[key].toString())}'); if (i != params.keys.length) { queryString.write('&'); } From 17b8fe0ae6d2a933cc97b34510b56ea3d057dbd4 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Fri, 31 Jan 2020 15:04:49 -0700 Subject: [PATCH 131/390] prep for 6.1.0 --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 754a8ab3..468adac6 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 6.1.0-dev +version: 6.1.0 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From 591a0330fb103fa6188d9b3cb85c88ac33988600 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Thu, 6 Feb 2020 19:17:01 -0700 Subject: [PATCH 132/390] use pedantic and fix a few lints --- analysis_options.yaml | 549 +-------------------------- lib/src/browser/xplat_browser.dart | 4 +- lib/src/common/activity_service.dart | 12 +- lib/src/common/repos_service.dart | 12 +- lib/src/util.dart | 4 +- 5 files changed, 27 insertions(+), 554 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index 41e58cae..603ea294 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1,940 +1,397 @@ -# Generated with ❤ by abide https://github.com/Workiva/abide -# Lint rules are based on the linter package version 0.1.93 -# To find the latest version of the linter package visit https://pub.dartlang.org/packages/linter -# -# analysis_options.yaml docs: https://www.dartlang.org/guides/language/analysis-options +include: package:pedantic/analysis_options.yaml + analyzer: - # Strong mode is required. Applies to the current project. strong-mode: - # When compiling to JS, both implicit options apply to the current - # project and all dependencies. They are useful to find possible - # Type fixes or areas for explicit typing. implicit-casts: true implicit-dynamic: true -# ALL lint rules are included. Unused lints should be commented -# out with a reason. An up to date list of all options is here -# http://dart-lang.github.io/linter/lints/options/options.html -# Descriptions of each rule is here http://dart-lang.github.io/linter/lints/ -# -# To ignore a lint rule on a case by case basic in code just add a comment -# above it or at the end of the line like: // ignore: -# example: // ignore: invalid_assignment, const_initialized_with_non_constant_value -# -# More info about configuring analysis_options.yaml files -# https://www.dartlang.org/guides/language/analysis-options#excluding-lines-within-a-file linter: rules: - # Declare method return types. - # http://dart-lang.github.io/linter/lints/always_declare_return_types.html - # recommendation: recommended - # reason: React component render() method can return either ReactElement or false - # 0 issues - - always_declare_return_types # Separate the control structure expression from its statement. # http://dart-lang.github.io/linter/lints/always_put_control_body_on_new_line.html - # recommendation: optional - # 0 issues - # - always_put_control_body_on_new_line + - always_put_control_body_on_new_line # Put @required named parameters first. # http://dart-lang.github.io/linter/lints/always_put_required_named_parameters_first.html - # recommendation: recommended - # 0 issues - always_put_required_named_parameters_first - # Use @required. - # http://dart-lang.github.io/linter/lints/always_require_non_null_named_parameters.html - # recommendation: recommended - # 0 issues - - always_require_non_null_named_parameters - - # Specify type annotations. - # http://dart-lang.github.io/linter/lints/always_specify_types.html - # recommendation: optional - # 0 issues - # - always_specify_types - - # Annotate overridden members. - # http://dart-lang.github.io/linter/lints/annotate_overrides.html - # recommendation: required - # 0 issues - - annotate_overrides - - # Avoid annotating with dynamic when not required. - # http://dart-lang.github.io/linter/lints/avoid_annotating_with_dynamic.html - # recommendation: optional - # 0 issues - # - avoid_annotating_with_dynamic - - # Avoid using `as`. - # http://dart-lang.github.io/linter/lints/avoid_as.html - # recommendation: optional - # 0 issues - # - avoid_as - # Avoid bool literals in conditional expressions. # http://dart-lang.github.io/linter/lints/avoid_bool_literals_in_conditional_expressions.html - # recommendation: optional - # 0 issues # - avoid_bool_literals_in_conditional_expressions - # Avoid catches without on clauses. - # http://dart-lang.github.io/linter/lints/avoid_catches_without_on_clauses.html - # recommendation: optional - # 0 issues - # - avoid_catches_without_on_clauses - # Don't explicitly catch Error or types that implement it. # http://dart-lang.github.io/linter/lints/avoid_catching_errors.html - # recommendation: optional - # 0 issues - avoid_catching_errors # Avoid defining a class that contains only static members. # http://dart-lang.github.io/linter/lints/avoid_classes_with_only_static_members.html - # recommendation: recommended - # 0 issues - avoid_classes_with_only_static_members # Avoid double and int checks. # http://dart-lang.github.io/linter/lints/avoid_double_and_int_checks.html - # recommendation: required - # 0 issues - avoid_double_and_int_checks - # Avoid empty else statements. - # http://dart-lang.github.io/linter/lints/avoid_empty_else.html - # recommendation: required - # 0 issues - - avoid_empty_else - # Avoid field initializers in const classes. # http://dart-lang.github.io/linter/lints/avoid_field_initializers_in_const_classes.html - # recommendation: optional - # 0 issues - avoid_field_initializers_in_const_classes # Avoid using `forEach` with a function literal. # http://dart-lang.github.io/linter/lints/avoid_function_literals_in_foreach_calls.html - # recommendation: recommended # reason: Use for (x in y) or forEach(someFunc) instead - # 0 issues # - avoid_function_literals_in_foreach_calls # Don't implement classes that override `==`. # http://dart-lang.github.io/linter/lints/avoid_implementing_value_types.html - # recommendation: optional - # 0 issues - avoid_implementing_value_types - # Don't explicitly initialize variables to null. - # http://dart-lang.github.io/linter/lints/avoid_init_to_null.html - # recommendation: recommended - # 0 issues - - avoid_init_to_null - # Avoid JavaScript rounded ints. # http://dart-lang.github.io/linter/lints/avoid_js_rounded_ints.html - # recommendation: optional - # 0 issues - avoid_js_rounded_ints - # Don't check for null in custom == operators. - # http://dart-lang.github.io/linter/lints/avoid_null_checks_in_equality_operators.html - # recommendation: recommended - # 0 issues - - avoid_null_checks_in_equality_operators - # Avoid positional boolean parameters. # http://dart-lang.github.io/linter/lints/avoid_positional_boolean_parameters.html - # recommendation: recommended - # 0 issues # - avoid_positional_boolean_parameters # Avoid `print` calls in production code. # http://dart-lang.github.io/linter/lints/avoid_print.html - # recommendation: optional - # 0 issues # - avoid_print # Avoid private typedef functions. # http://dart-lang.github.io/linter/lints/avoid_private_typedef_functions.html - # recommendation: optional - # 0 issues - avoid_private_typedef_functions - # Avoid relative imports for files in `lib/`. - # http://dart-lang.github.io/linter/lints/avoid_relative_lib_imports.html - # recommendation: recommended - # reason: JS compilation will be faster without relative imports. Use package imports. - # 0 issues - - avoid_relative_lib_imports - # Don't rename parameters of overridden methods. # http://dart-lang.github.io/linter/lints/avoid_renaming_method_parameters.html - # recommendation: recommended - # 0 issues # - avoid_renaming_method_parameters - # Avoid return types on setters. - # http://dart-lang.github.io/linter/lints/avoid_return_types_on_setters.html - # recommendation: required - # 0 issues - - avoid_return_types_on_setters - # Avoid returning null from members whose return type is bool, double, int, or num. # http://dart-lang.github.io/linter/lints/avoid_returning_null.html - # recommendation: recommended - # 0 issues - avoid_returning_null # Avoid returning null for Future. # http://dart-lang.github.io/linter/lints/avoid_returning_null_for_future.html - # recommendation: optional - # 0 issues - avoid_returning_null_for_future # Avoid returning null for void. # http://dart-lang.github.io/linter/lints/avoid_returning_null_for_void.html - # recommendation: optional - # 0 issues - avoid_returning_null_for_void # Avoid returning this from methods just to enable a fluent interface. # http://dart-lang.github.io/linter/lints/avoid_returning_this.html - # recommendation: recommended - # 0 issues - avoid_returning_this # Avoid setters without getters. # http://dart-lang.github.io/linter/lints/avoid_setters_without_getters.html - # recommendation: recommended - # 0 issues - avoid_setters_without_getters - # Avoid shadowing type parameters. - # http://dart-lang.github.io/linter/lints/avoid_shadowing_type_parameters.html - # recommendation: optional - # 0 issues - - avoid_shadowing_type_parameters - # Avoid single cascade in expression statements. # http://dart-lang.github.io/linter/lints/avoid_single_cascade_in_expression_statements.html - # recommendation: optional - # 0 issues - avoid_single_cascade_in_expression_statements # Avoid slow async `dart:io` methods. # http://dart-lang.github.io/linter/lints/avoid_slow_async_io.html - # recommendation: recommended - # 0 issues - avoid_slow_async_io - # Avoid types as parameter names. - # http://dart-lang.github.io/linter/lints/avoid_types_as_parameter_names.html - # recommendation: required - # 0 issues - - avoid_types_as_parameter_names - - # Avoid annotating types for function expression parameters. - # http://dart-lang.github.io/linter/lints/avoid_types_on_closure_parameters.html - # recommendation: optional - # 0 issues - # - avoid_types_on_closure_parameters - # Avoid defining unused parameters in constructors. # http://dart-lang.github.io/linter/lints/avoid_unused_constructor_parameters.html - # recommendation: recommended - # 0 issues - avoid_unused_constructor_parameters # Avoid async functions that return void. # http://dart-lang.github.io/linter/lints/avoid_void_async.html - # recommendation: optional - # 0 issues - avoid_void_async # Await only futures. # http://dart-lang.github.io/linter/lints/await_only_futures.html - # recommendation: required - # 0 issues - await_only_futures # Name types using UpperCamelCase. # http://dart-lang.github.io/linter/lints/camel_case_types.html - # recommendation: required - # 0 issues - camel_case_types # Cancel instances of dart.async.StreamSubscription. # http://dart-lang.github.io/linter/lints/cancel_subscriptions.html - # recommendation: required - # 0 issues - cancel_subscriptions # Cascade consecutive method invocations on the same reference. # http://dart-lang.github.io/linter/lints/cascade_invocations.html - # recommendation: optional - # 0 issues # - cascade_invocations # Close instances of `dart.core.Sink`. # http://dart-lang.github.io/linter/lints/close_sinks.html - # recommendation: required - # 0 issues - close_sinks # Only reference in scope identifiers in doc comments. # http://dart-lang.github.io/linter/lints/comment_references.html - # recommendation: recommended - # 0 issues - comment_references - # Prefer using lowerCamelCase for constant names. - # http://dart-lang.github.io/linter/lints/constant_identifier_names.html - # recommendation: optional - # 0 issues - # - constant_identifier_names - # Avoid control flow in finally blocks. # http://dart-lang.github.io/linter/lints/control_flow_in_finally.html - # recommendation: required - # 0 issues - control_flow_in_finally - # DO use curly braces for all flow control structures. - # http://dart-lang.github.io/linter/lints/curly_braces_in_flow_control_structures.html - # recommendation: optional - # 0 issues - - curly_braces_in_flow_control_structures - # DO reference all public properties in debug methods. # http://dart-lang.github.io/linter/lints/diagnostic_describe_all_properties.html - # recommendation: optional - # 0 issues - diagnostic_describe_all_properties # Adhere to Effective Dart Guide directives sorting conventions. # http://dart-lang.github.io/linter/lints/directives_ordering.html - # recommendation: recommended - # 0 issues - directives_ordering - # Avoid empty catch blocks. - # http://dart-lang.github.io/linter/lints/empty_catches.html - # recommendation: required - # 0 issues - - empty_catches - - # Use `;` instead of `{}` for empty constructor bodies. - # http://dart-lang.github.io/linter/lints/empty_constructor_bodies.html - # recommendation: recommended - # 0 issues - - empty_constructor_bodies - # Avoid empty statements. # http://dart-lang.github.io/linter/lints/empty_statements.html - # recommendation: required - # 0 issues - empty_statements # Name source files using `lowercase_with_underscores`. # http://dart-lang.github.io/linter/lints/file_names.html - # recommendation: optional - # 0 issues - file_names # Use Flutter TODO format: // TODO(username): message, https://URL-to-issue. # http://dart-lang.github.io/linter/lints/flutter_style_todos.html - # recommendation: optional - # 0 issues # - flutter_style_todos # Always override `hashCode` if overriding `==`. # http://dart-lang.github.io/linter/lints/hash_and_equals.html - # recommendation: required - # 0 issues - hash_and_equals # Don't import implementation files from another package. # http://dart-lang.github.io/linter/lints/implementation_imports.html - # recommendation: required - # 0 issues - implementation_imports # Conditions should not unconditionally evaluate to `true` or to `false`. # http://dart-lang.github.io/linter/lints/invariant_booleans.html - # recommendation: optional # reason: There are several outstanding bugs with this lint that cause a good deal of noise - # 0 issues - invariant_booleans # Invocation of Iterable.contains with references of unrelated types. # http://dart-lang.github.io/linter/lints/iterable_contains_unrelated_type.html - # recommendation: required - # 0 issues - iterable_contains_unrelated_type # Join return statement with assignment when possible. # http://dart-lang.github.io/linter/lints/join_return_with_assignment.html - # recommendation: optional - # 0 issues - join_return_with_assignment - # Name libraries using `lowercase_with_underscores`. - # http://dart-lang.github.io/linter/lints/library_names.html - # recommendation: recommended - # 0 issues - - library_names - - # Use `lowercase_with_underscores` when specifying a library prefix. - # http://dart-lang.github.io/linter/lints/library_prefixes.html - # recommendation: recommended - # 0 issues - - library_prefixes # AVOID lines longer than 80 characters. # http://dart-lang.github.io/linter/lints/lines_longer_than_80_chars.html - # recommendation: optional - # 0 issues # - lines_longer_than_80_chars # Invocation of `remove` with references of unrelated types. # http://dart-lang.github.io/linter/lints/list_remove_unrelated_type.html - # recommendation: required - # 0 issues - list_remove_unrelated_type # Boolean expression composed only with literals. # http://dart-lang.github.io/linter/lints/literal_only_boolean_expressions.html - # recommendation: required - # 0 issues - literal_only_boolean_expressions # Don't use adjacent strings in list. # http://dart-lang.github.io/linter/lints/no_adjacent_strings_in_list.html - # recommendation: required - # 0 issues - no_adjacent_strings_in_list - # Don't use more than one case with same value. - # http://dart-lang.github.io/linter/lints/no_duplicate_case_values.html - # recommendation: required - # 0 issues - - no_duplicate_case_values # Name non-constant identifiers using lowerCamelCase. # http://dart-lang.github.io/linter/lints/non_constant_identifier_names.html - # recommendation: recommended - # 0 issues - non_constant_identifier_names - # Do not pass `null` as an argument where a closure is expected. - # http://dart-lang.github.io/linter/lints/null_closures.html - # recommendation: optional - # 0 issues - - null_closures - - # Omit type annotations for local variables. - # http://dart-lang.github.io/linter/lints/omit_local_variable_types.html - # recommendation: optional - # reason: Conflicts with always_specify_types. Recommend commenting this one out. - # 0 issues - # - omit_local_variable_types - # Avoid defining a one-member abstract class when a simple function will do. # http://dart-lang.github.io/linter/lints/one_member_abstracts.html - # recommendation: optional - # 0 issues - one_member_abstracts # Only throw instances of classes extending either Exception or Error. # http://dart-lang.github.io/linter/lints/only_throw_errors.html - # recommendation: required - # 0 issues - only_throw_errors # Don't override fields. # http://dart-lang.github.io/linter/lints/overridden_fields.html - # recommendation: optional - # 0 issues - overridden_fields # Provide doc comments for all public APIs. # http://dart-lang.github.io/linter/lints/package_api_docs.html - # recommendation: optional - # 0 issues - package_api_docs # Use `lowercase_with_underscores` for package names. # http://dart-lang.github.io/linter/lints/package_names.html - # recommendation: recommended - # 0 issues - package_names # Prefix library names with the package name and a dot-separated path. # http://dart-lang.github.io/linter/lints/package_prefixed_library_names.html - # recommendation: recommended - # 0 issues - package_prefixed_library_names # Don't reassign references to parameters of functions or methods. # http://dart-lang.github.io/linter/lints/parameter_assignments.html - # recommendation: optional - # 0 issues # - parameter_assignments - # Use adjacent strings to concatenate string literals. - # http://dart-lang.github.io/linter/lints/prefer_adjacent_string_concatenation.html - # recommendation: optional - # 0 issues - - prefer_adjacent_string_concatenation - # Prefer putting asserts in initializer list. # http://dart-lang.github.io/linter/lints/prefer_asserts_in_initializer_lists.html - # recommendation: optional - # 0 issues - prefer_asserts_in_initializer_lists # Prefer asserts with message. # http://dart-lang.github.io/linter/lints/prefer_asserts_with_message.html - # recommendation: optional - # 0 issues # - prefer_asserts_with_message # Prefer using a boolean as the assert condition. # http://dart-lang.github.io/linter/lints/prefer_bool_in_asserts.html - # recommendation: avoid # reason: This lint rule has been deprecated - # 0 issues # - prefer_bool_in_asserts - # Use collection literals when possible. - # http://dart-lang.github.io/linter/lints/prefer_collection_literals.html - # recommendation: recommended - # 0 issues - - prefer_collection_literals - # Prefer using `??=` over testing for null. # http://dart-lang.github.io/linter/lints/prefer_conditional_assignment.html - # recommendation: optional - # 0 issues # - prefer_conditional_assignment # Prefer const with constant constructors. # http://dart-lang.github.io/linter/lints/prefer_const_constructors.html - # recommendation: optional - # 0 issues - prefer_const_constructors # Prefer declare const constructors on `@immutable` classes. # http://dart-lang.github.io/linter/lints/prefer_const_constructors_in_immutables.html - # recommendation: optional - # 0 issues - prefer_const_constructors_in_immutables # Prefer const over final for declarations. # http://dart-lang.github.io/linter/lints/prefer_const_declarations.html - # recommendation: recommended - # 0 issues - prefer_const_declarations # Prefer const literals as parameters of constructors on @immutable classes. # http://dart-lang.github.io/linter/lints/prefer_const_literals_to_create_immutables.html - # recommendation: optional - # 0 issues - prefer_const_literals_to_create_immutables # Prefer defining constructors instead of static methods to create instances. # http://dart-lang.github.io/linter/lints/prefer_constructors_over_static_methods.html - # recommendation: optional - # 0 issues - prefer_constructors_over_static_methods - # Use contains for `List` and `String` instances. - # http://dart-lang.github.io/linter/lints/prefer_contains.html - # recommendation: recommended - # 0 issues - - prefer_contains - - # Prefer double quotes where they won't require escape sequences. - # http://dart-lang.github.io/linter/lints/prefer_double_quotes.html - # recommendation: avoid - # reason: Preference is for single quoted strings - # 0 issues - # - prefer_double_quotes - - # Use `=` to separate a named parameter from its default value. - # http://dart-lang.github.io/linter/lints/prefer_equal_for_default_values.html - # recommendation: optional - # 0 issues - - prefer_equal_for_default_values - - # Use => for short members whose body is a single return statement. - # http://dart-lang.github.io/linter/lints/prefer_expression_function_bodies.html - # recommendation: optional - # 0 issues - # - prefer_expression_function_bodies - - # Private field could be final. - # http://dart-lang.github.io/linter/lints/prefer_final_fields.html - # recommendation: optional - # 0 issues - # - prefer_final_fields - # Prefer final in for-each loop variable if reference is not reassigned. # http://dart-lang.github.io/linter/lints/prefer_final_in_for_each.html - # recommendation: optional - # 0 issues - prefer_final_in_for_each - # Prefer final for variable declarations if they are not reassigned. - # http://dart-lang.github.io/linter/lints/prefer_final_locals.html - # recommendation: optional - # reason: Generates a lot of lint since people use var a lot for local variables. - # 0 issues - # - prefer_final_locals - - # Prefer for elements when building maps from iterables. - # http://dart-lang.github.io/linter/lints/prefer_for_elements_to_map_fromIterable.html - # recommendation: optional - # 0 issues - - prefer_for_elements_to_map_fromIterable - # Use `forEach` to only apply a function to all the elements. # http://dart-lang.github.io/linter/lints/prefer_foreach.html - # recommendation: optional - # 0 issues - prefer_foreach # Use a function declaration to bind a function to a name. # http://dart-lang.github.io/linter/lints/prefer_function_declarations_over_variables.html - # recommendation: recommended - # 0 issues - prefer_function_declarations_over_variables - # Prefer generic function type aliases. - # http://dart-lang.github.io/linter/lints/prefer_generic_function_type_aliases.html - # recommendation: optional - # 0 issues - - prefer_generic_function_type_aliases - # Prefer if elements to conditional expressions where possible. # http://dart-lang.github.io/linter/lints/prefer_if_elements_to_conditional_expressions.html - # recommendation: optional - # 0 issues - prefer_if_elements_to_conditional_expressions - # Prefer using if null operators. - # http://dart-lang.github.io/linter/lints/prefer_if_null_operators.html - # recommendation: optional - # 0 issues - - prefer_if_null_operators - # Use initializing formals when possible. # http://dart-lang.github.io/linter/lints/prefer_initializing_formals.html - # recommendation: recommended - # 0 issues - prefer_initializing_formals # Inline list item declarations where possible. # http://dart-lang.github.io/linter/lints/prefer_inlined_adds.html - # recommendation: optional - # 0 issues - prefer_inlined_adds # Prefer int literals over double literals. # http://dart-lang.github.io/linter/lints/prefer_int_literals.html - # recommendation: optional - # 0 issues - prefer_int_literals - # Use interpolation to compose strings and values. - # http://dart-lang.github.io/linter/lints/prefer_interpolation_to_compose_strings.html - # recommendation: optional - # 0 issues - # - prefer_interpolation_to_compose_strings - - # Use `isEmpty` for Iterables and Maps. - # http://dart-lang.github.io/linter/lints/prefer_is_empty.html - # recommendation: required - # 0 issues - - prefer_is_empty - - # Use `isNotEmpty` for Iterables and Maps. - # http://dart-lang.github.io/linter/lints/prefer_is_not_empty.html - # recommendation: required - # 0 issues - - prefer_is_not_empty - - # Prefer to use whereType on iterable. - # http://dart-lang.github.io/linter/lints/prefer_iterable_whereType.html - # recommendation: optional - # reason: Optional for now since it is only available in Dart 2 - # 0 issues - - prefer_iterable_whereType - # Prefer using mixins. # http://dart-lang.github.io/linter/lints/prefer_mixin.html - # recommendation: optional - # 0 issues - prefer_mixin - # Prefer using null aware operators. - # http://dart-lang.github.io/linter/lints/prefer_null_aware_operators.html - # recommendation: optional - # 0 issues - # - prefer_null_aware_operators - - # Prefer single quotes where they won't require escape sequences. - # http://dart-lang.github.io/linter/lints/prefer_single_quotes.html - # recommendation: recommended - # 0 issues - - prefer_single_quotes - - # Use spread collections when possible. - # http://dart-lang.github.io/linter/lints/prefer_spread_collections.html - # recommendation: optional - # 0 issues - - prefer_spread_collections - # Prefer typing uninitialized variables and fields. # http://dart-lang.github.io/linter/lints/prefer_typing_uninitialized_variables.html - # recommendation: required - # 0 issues - prefer_typing_uninitialized_variables # Don't use the Null type, unless you are positive that you don't want void. # http://dart-lang.github.io/linter/lints/prefer_void_to_null.html - # recommendation: optional - # 0 issues - prefer_void_to_null # Provide a deprecation message, via @Deprecated("message"). # http://dart-lang.github.io/linter/lints/provide_deprecation_message.html - # recommendation: optional - # 0 issues - provide_deprecation_message # Document all public members. # http://dart-lang.github.io/linter/lints/public_member_api_docs.html - # recommendation: optional # reason: Can get annoying for React component lifecycle methods, constructors. - # 0 issues # - public_member_api_docs - # Property getter recursively returns itself. - # http://dart-lang.github.io/linter/lints/recursive_getters.html - # recommendation: optional - # 0 issues - - recursive_getters - - # Prefer using /// for doc comments. - # http://dart-lang.github.io/linter/lints/slash_for_doc_comments.html - # recommendation: recommended - # 0 issues - - slash_for_doc_comments - # Sort child properties last in widget instance creations. # http://dart-lang.github.io/linter/lints/sort_child_properties_last.html - # recommendation: optional - # 0 issues - sort_child_properties_last # Sort constructor declarations before other members. # http://dart-lang.github.io/linter/lints/sort_constructors_first.html - # recommendation: optional - # 0 issues # - sort_constructors_first # Sort pub dependencies. # http://dart-lang.github.io/linter/lints/sort_pub_dependencies.html - # recommendation: optional - # 0 issues - sort_pub_dependencies # Sort unnamed constructor declarations first. # http://dart-lang.github.io/linter/lints/sort_unnamed_constructors_first.html - # recommendation: optional - # 0 issues - sort_unnamed_constructors_first - # Place the `super` call last in a constructor initialization list. - # http://dart-lang.github.io/linter/lints/super_goes_last.html - # recommendation: avoid - # reason: This lint rule has been deprecated - # 0 issues - # - super_goes_last - # Test type arguments in operator ==(Object other). # http://dart-lang.github.io/linter/lints/test_types_in_equals.html - # recommendation: required - # 0 issues - test_types_in_equals # Avoid `throw` in finally block. # http://dart-lang.github.io/linter/lints/throw_in_finally.html - # recommendation: required - # 0 issues - throw_in_finally # Type annotate public APIs. # http://dart-lang.github.io/linter/lints/type_annotate_public_apis.html - # recommendation: recommended # reason: React component render() method can return either ReactElement or false. Use overrides. - # 0 issues - type_annotate_public_apis - # Don't type annotate initializing formals. - # http://dart-lang.github.io/linter/lints/type_init_formals.html - # recommendation: optional - # 0 issues - - type_init_formals - - # `Future` results in `async` function bodies must be `await`ed or marked `unawaited` using `package:pedantic`. - # http://dart-lang.github.io/linter/lints/unawaited_futures.html - # recommendation: recommended - # 0 issues - - unawaited_futures - # Unnecessary await keyword in return. # http://dart-lang.github.io/linter/lints/unnecessary_await_in_return.html - # recommendation: optional - # 0 issues - unnecessary_await_in_return # Avoid using braces in interpolation when not needed. # http://dart-lang.github.io/linter/lints/unnecessary_brace_in_string_interps.html - # recommendation: optional - # 0 issues - unnecessary_brace_in_string_interps - # Avoid const keyword. - # http://dart-lang.github.io/linter/lints/unnecessary_const.html - # recommendation: optional - # 0 issues - - unnecessary_const - # Avoid wrapping fields in getters and setters just to be "safe". # http://dart-lang.github.io/linter/lints/unnecessary_getters_setters.html - # recommendation: optional - # 0 issues - unnecessary_getters_setters # Don't create a lambda when a tear-off will do. # http://dart-lang.github.io/linter/lints/unnecessary_lambdas.html - # recommendation: recommended - # 0 issues - unnecessary_lambdas - # Unnecessary new keyword. - # http://dart-lang.github.io/linter/lints/unnecessary_new.html - # recommendation: optional - # 0 issues - - unnecessary_new - # Avoid null in null-aware assignment. # http://dart-lang.github.io/linter/lints/unnecessary_null_aware_assignments.html - # recommendation: required - # 0 issues - unnecessary_null_aware_assignments - # Avoid using `null` in `if null` operators. - # http://dart-lang.github.io/linter/lints/unnecessary_null_in_if_null_operators.html - # recommendation: required - # 0 issues - - unnecessary_null_in_if_null_operators - # Don't override a method to do a super method invocation with the same parameters. # http://dart-lang.github.io/linter/lints/unnecessary_overrides.html - # recommendation: optional - # 0 issues - unnecessary_overrides # Unnecessary parenthesis can be removed. # http://dart-lang.github.io/linter/lints/unnecessary_parenthesis.html - # recommendation: optional - # 0 issues - unnecessary_parenthesis # Avoid using unnecessary statements. # http://dart-lang.github.io/linter/lints/unnecessary_statements.html - # recommendation: required - # 0 issues - unnecessary_statements - # Don't access members with `this` unless avoiding shadowing. - # http://dart-lang.github.io/linter/lints/unnecessary_this.html - # recommendation: recommended - # 0 issues - - unnecessary_this - - # Equality operator `==` invocation with references of unrelated types. - # http://dart-lang.github.io/linter/lints/unrelated_type_equality_checks.html - # recommendation: required - # reason: Comparing references of a type where neither is a subtype of the other most likely will return false and might not reflect programmer's intent. - # 0 issues - - unrelated_type_equality_checks - # Avoid unsafe HTML APIs. # http://dart-lang.github.io/linter/lints/unsafe_html.html - # recommendation: optional - # 0 issues - unsafe_html # Prefer an 8-digit hexadecimal integer(0xFFFFFFFF) to instantiate Color. # http://dart-lang.github.io/linter/lints/use_full_hex_values_for_flutter_colors.html - # recommendation: optional - # 0 issues - use_full_hex_values_for_flutter_colors - # Use generic function type syntax for parameters. - # http://dart-lang.github.io/linter/lints/use_function_type_syntax_for_parameters.html - # recommendation: optional - # 0 issues - # - use_function_type_syntax_for_parameters - - # Use rethrow to rethrow a caught exception. - # http://dart-lang.github.io/linter/lints/use_rethrow_when_possible.html - # recommendation: recommended - # 0 issues - - use_rethrow_when_possible - # Use a setter for operations that conceptually change a property. # http://dart-lang.github.io/linter/lints/use_setters_to_change_properties.html - # recommendation: optional - # 0 issues - use_setters_to_change_properties # Use string buffers to compose strings. # http://dart-lang.github.io/linter/lints/use_string_buffers.html - # recommendation: optional - # 0 issues - use_string_buffers # Start the name of the method with to/_to or as/_as if applicable. # http://dart-lang.github.io/linter/lints/use_to_and_as_if_applicable.html - # recommendation: optional - # 0 issues - use_to_and_as_if_applicable - # Use valid regular expression syntax. - # http://dart-lang.github.io/linter/lints/valid_regexps.html - # recommendation: required - # 0 issues - - valid_regexps - # Don't assign to void. # http://dart-lang.github.io/linter/lints/void_checks.html - # recommendation: required # reason: Trying to assigning a value to void is an error. - # 0 issues - void_checks - - camel_case_extensions - omit_local_variable_types - - prefer_conditional_assignment - prefer_final_fields - use_function_type_syntax_for_parameters diff --git a/lib/src/browser/xplat_browser.dart b/lib/src/browser/xplat_browser.dart index a5ba5d19..79aeeb17 100644 --- a/lib/src/browser/xplat_browser.dart +++ b/lib/src/browser/xplat_browser.dart @@ -17,7 +17,9 @@ Authentication findAuthenticationFromEnvironment() { /// Parse the query string to a parameter `Map` Map _parseQuery(String path) { final params = {}; - if (!path.contains('?')) return params; + if (!path.contains('?')) { + return params; + } final queryStr = path.substring(path.indexOf('?') + 1); queryStr.split('&').forEach((String keyValPair) { final keyVal = _parseKeyVal(keyValPair); diff --git a/lib/src/common/activity_service.dart b/lib/src/common/activity_service.dart index ceeb49eb..1a51a0cd 100644 --- a/lib/src/common/activity_service.dart +++ b/lib/src/common/activity_service.dart @@ -153,7 +153,9 @@ class ActivityService extends Service { Future markNotificationsRead({DateTime lastRead}) { final data = {}; - if (lastRead != null) data['last_read_at'] = lastRead.toIso8601String(); + if (lastRead != null) { + data['last_read_at'] = lastRead.toIso8601String(); + } return github .request('PUT', '/notifications', body: jsonEncode(data)) @@ -172,7 +174,9 @@ class ActivityService extends Service { }) { final data = {}; - if (lastRead != null) data['last_read_at'] = lastRead.toIso8601String(); + if (lastRead != null) { + data['last_read_at'] = lastRead.toIso8601String(); + } return github .request('PUT', '/repos/${slug.fullName}/notifications', @@ -339,7 +343,9 @@ class EventPoller { throw Exception('Polling already started.'); } - if (after != null) after = after.toUtc(); + if (after != null) { + after = after.toUtc(); + } _controller = StreamController(); diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 7b86817e..2d8472ab 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -297,12 +297,18 @@ class RepositoriesService extends Service { '/repos/${slug.fullName}/collaborators/$user', statusCode: StatusCodes.NO_CONTENT, fail: (response) { - if (response.statusCode == StatusCodes.NOT_FOUND) catchError = true; + if (response.statusCode == StatusCodes.NOT_FOUND) { + catchError = true; + } }, ); - if (response.statusCode == StatusCodes.NO_CONTENT) return true; + if (response.statusCode == StatusCodes.NO_CONTENT) { + return true; + } } catch (e) { - if (!catchError) rethrow; + if (!catchError) { + rethrow; + } } return false; } diff --git a/lib/src/util.dart b/lib/src/util.dart index 0b9a3939..60aa420a 100644 --- a/lib/src/util.dart +++ b/lib/src/util.dart @@ -78,7 +78,9 @@ Map createNonNullMap(Map input) { // TODO: only used in test – delete? int parseFancyNumber(String input) { input = input.trim(); - if (input.contains(',')) input = input.replaceAll(',', ''); + if (input.contains(',')) { + input = input.replaceAll(',', ''); + } const multipliers = {'h': 100, 'k': 1000, 'ht': 100000, 'm': 1000000}; int value; From d16f6d74d4856dfb5aaddbcd8ea45ac3e7c6048d Mon Sep 17 00:00:00 2001 From: Rongjian Zhang Date: Fri, 7 Feb 2020 21:26:10 +0800 Subject: [PATCH 133/390] Add missing download url for repos contents --- lib/src/common/model/repos_contents.dart | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/src/common/model/repos_contents.dart b/lib/src/common/model/repos_contents.dart index bee4f75f..6ecc335b 100644 --- a/lib/src/common/model/repos_contents.dart +++ b/lib/src/common/model/repos_contents.dart @@ -18,6 +18,7 @@ class GitHubFile { this.sha, this.htmlUrl, this.gitUrl, + this.downloadUrl, this.links, this.sourceRepository, }); @@ -51,6 +52,10 @@ class GitHubFile { @JsonKey(name: 'git_url') String gitUrl; + /// Download Url + @JsonKey(name: 'download_url') + String downloadUrl; + /// Links @JsonKey(name: '_links') Links links; From de3fdcae17d10226c63b5eb3300d0d79da2e53f9 Mon Sep 17 00:00:00 2001 From: Rongjian Zhang Date: Fri, 7 Feb 2020 21:39:16 +0800 Subject: [PATCH 134/390] Run build_runner --- lib/src/common/model/repos_contents.g.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/src/common/model/repos_contents.g.dart b/lib/src/common/model/repos_contents.g.dart index 88cdf9bb..afa3a385 100644 --- a/lib/src/common/model/repos_contents.g.dart +++ b/lib/src/common/model/repos_contents.g.dart @@ -17,6 +17,7 @@ GitHubFile _$GitHubFileFromJson(Map json) { sha: json['sha'] as String, htmlUrl: json['html_url'] as String, gitUrl: json['git_url'] as String, + downloadUrl: json['download_url'] as String, links: json['_links'] == null ? null : Links.fromJson(json['_links'] as Map), @@ -38,6 +39,7 @@ Map _$GitHubFileToJson(GitHubFile instance) => 'sha': instance.sha, 'html_url': instance.htmlUrl, 'git_url': instance.gitUrl, + 'download_url': instance.downloadUrl, '_links': instance.links, 'sourceRepository': instance.sourceRepository, }; From 2f23c439d76cc9feb96320c131bbd676bc20b3c0 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Fri, 7 Feb 2020 10:01:44 -0700 Subject: [PATCH 135/390] prep for 6.1.1 --- CHANGELOG.md | 4 ++++ pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 04edc94f..33b05bf0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 6.1.1 + - Use pedantic and address some lint https://github.com/SpinlockLabs/github.dart/pull/205 + - Add missing download url for repos contents https://github.com/SpinlockLabs/github.dart/pull/206 + ## 6.1.0 - Add (experimental) `listReactions` method to `IssueService`. diff --git a/pubspec.yaml b/pubspec.yaml index 468adac6..13ff78f6 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 6.1.0 +version: 6.1.1 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From 83390ab2fbf7486a5bd49da5be0511b6a1209a95 Mon Sep 17 00:00:00 2001 From: Rongjian Zhang Date: Sat, 8 Feb 2020 14:11:56 +0800 Subject: [PATCH 136/390] Update default language color --- tool/language_color_generator.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tool/language_color_generator.dart b/tool/language_color_generator.dart index 3bed2d0b..98ef9849 100644 --- a/tool/language_color_generator.dart +++ b/tool/language_color_generator.dart @@ -23,7 +23,7 @@ Future main() async { for (var language in languages) { final color = - map[language]['color']?.toString()?.toUpperCase() ?? '#000000'; + map[language]['color']?.toString()?.toUpperCase() ?? '#ededed'; language = language.replaceAll("'", "\\'"); From 5350e8111b25e6868099d38cde765eb6509b712b Mon Sep 17 00:00:00 2001 From: Rongjian Zhang Date: Sat, 8 Feb 2020 14:12:19 +0800 Subject: [PATCH 137/390] Run language color generator --- lib/src/const/language_color.dart | 580 ++++++++++++++++-------------- 1 file changed, 305 insertions(+), 275 deletions(-) diff --git a/lib/src/const/language_color.dart b/lib/src/const/language_color.dart index 87469a98..716be8b9 100644 --- a/lib/src/const/language_color.dart +++ b/lib/src/const/language_color.dart @@ -1,123 +1,126 @@ // GENERATED CODE - DO NOT MODIFY BY HAND -// VERSION OF 2019-07-09T09:46:59.065183 +// VERSION OF 2020-02-08T14:10:08.685302 const languagesColor = { '1C Enterprise': '#814CCC', + '4D': '#ededed', 'ABAP': '#E8274B', - 'ABNF': '#000000', + 'ABNF': '#ededed', 'AGS Script': '#B9D9FF', 'AMPL': '#E6EFBB', 'ANTLR': '#9DC3FF', 'API Blueprint': '#2ACCA8', 'APL': '#5A8164', - 'ASN.1': '#000000', + 'ASN.1': '#ededed', 'ASP': '#6A40FD', 'ATS': '#1AC620', 'ActionScript': '#882B0F', 'Ada': '#02F88C', - 'Adobe Font Metrics': '#000000', + 'Adobe Font Metrics': '#ededed', 'Agda': '#315665', 'Alloy': '#64C800', - 'Alpine Abuild': '#000000', - 'Altium Designer': '#000000', + 'Alpine Abuild': '#ededed', + 'Altium Designer': '#ededed', 'AngelScript': '#C7D7DC', - 'Ant Build System': '#000000', - 'ApacheConf': '#000000', - 'Apex': '#000000', - 'Apollo Guidance Computer': '#000000', + 'Ant Build System': '#ededed', + 'ApacheConf': '#ededed', + 'Apex': '#ededed', + 'Apollo Guidance Computer': '#ededed', 'AppleScript': '#101F1F', 'Arc': '#AA2AFE', - 'AsciiDoc': '#000000', + 'AsciiDoc': '#ededed', 'AspectJ': '#A957B0', 'Assembly': '#6E4C13', 'Asymptote': '#4A0C0C', - 'Augeas': '#000000', + 'Augeas': '#ededed', 'AutoHotkey': '#6594B9', 'AutoIt': '#1C3552', - 'Awk': '#000000', + 'Awk': '#ededed', 'Ballerina': '#FF5000', 'Batchfile': '#C1F12E', - 'Befunge': '#000000', - 'Bison': '#000000', - 'BitBake': '#000000', - 'Blade': '#000000', - 'BlitzBasic': '#000000', + 'Befunge': '#ededed', + 'BibTeX': '#ededed', + 'Bison': '#ededed', + 'BitBake': '#ededed', + 'Blade': '#ededed', + 'BlitzBasic': '#ededed', 'BlitzMax': '#CD6400', - 'Bluespec': '#000000', + 'Bluespec': '#ededed', 'Boo': '#D4BEC1', 'Brainfuck': '#2F2530', - 'Brightscript': '#000000', + 'Brightscript': '#ededed', 'C': '#555555', 'C#': '#178600', 'C++': '#F34B7D', - 'C-ObjDump': '#000000', - 'C2hs Haskell': '#000000', - 'CLIPS': '#000000', - 'CMake': '#000000', - 'COBOL': '#000000', - 'COLLADA': '#000000', - 'CSON': '#000000', + 'C-ObjDump': '#ededed', + 'C2hs Haskell': '#ededed', + 'CLIPS': '#ededed', + 'CMake': '#ededed', + 'COBOL': '#ededed', + 'COLLADA': '#ededed', + 'CSON': '#ededed', 'CSS': '#563D7C', - 'CSV': '#000000', - 'CWeb': '#000000', - 'Cabal Config': '#000000', - 'Cap\'n Proto': '#000000', - 'CartoCSS': '#000000', + 'CSV': '#ededed', + 'CWeb': '#ededed', + 'Cabal Config': '#ededed', + 'Cap\'n Proto': '#ededed', + 'CartoCSS': '#ededed', 'Ceylon': '#DFA535', 'Chapel': '#8DC63F', - 'Charity': '#000000', - 'ChucK': '#000000', + 'Charity': '#ededed', + 'ChucK': '#ededed', 'Cirru': '#CCCCFF', 'Clarion': '#DB901E', 'Clean': '#3F85AF', 'Click': '#E4E6F3', 'Clojure': '#DB5855', - 'Closure Templates': '#000000', - 'Cloud Firestore Security Rules': '#000000', - 'CoNLL-U': '#000000', + 'Closure Templates': '#ededed', + 'Cloud Firestore Security Rules': '#ededed', + 'CoNLL-U': '#ededed', 'CoffeeScript': '#244776', 'ColdFusion': '#ED2CD6', - 'ColdFusion CFC': '#000000', + 'ColdFusion CFC': '#ededed', 'Common Lisp': '#3FB68B', 'Common Workflow Language': '#B5314C', 'Component Pascal': '#B0CE4E', - 'Cool': '#000000', - 'Coq': '#000000', - 'Cpp-ObjDump': '#000000', - 'Creole': '#000000', + 'Cool': '#ededed', + 'Coq': '#ededed', + 'Cpp-ObjDump': '#ededed', + 'Creole': '#ededed', 'Crystal': '#000100', - 'Csound': '#000000', - 'Csound Document': '#000000', - 'Csound Score': '#000000', + 'Csound': '#ededed', + 'Csound Document': '#ededed', + 'Csound Score': '#ededed', 'Cuda': '#3A4E3A', - 'Cycript': '#000000', - 'Cython': '#000000', + 'Cycript': '#ededed', + 'Cython': '#ededed', 'D': '#BA595E', - 'D-ObjDump': '#000000', - 'DIGITAL Command Language': '#000000', + 'D-ObjDump': '#ededed', + 'DIGITAL Command Language': '#ededed', 'DM': '#447265', - 'DNS Zone': '#000000', - 'DTrace': '#000000', - 'Darcs Patch': '#000000', + 'DNS Zone': '#ededed', + 'DTrace': '#ededed', + 'Darcs Patch': '#ededed', 'Dart': '#00B4AB', 'DataWeave': '#003A52', 'Dhall': '#DFAFFF', - 'Diff': '#000000', + 'Diff': '#ededed', + 'DirectX 3D File': '#ededed', 'Dockerfile': '#384D54', 'Dogescript': '#CCA760', 'Dylan': '#6C616E', 'E': '#CCCE35', - 'EBNF': '#000000', + 'EBNF': '#ededed', 'ECL': '#8A1267', - 'ECLiPSe': '#000000', - 'EJS': '#000000', - 'EML': '#000000', + 'ECLiPSe': '#ededed', + 'EJS': '#ededed', + 'EML': '#ededed', 'EQ': '#A78649', - 'Eagle': '#000000', - 'Easybuild': '#000000', - 'Ecere Projects': '#000000', - 'EditorConfig': '#000000', - 'Edje Data Collection': '#000000', + 'Eagle': '#ededed', + 'Easybuild': '#ededed', + 'Ecere Projects': '#ededed', + 'EditorConfig': '#ededed', + 'Edje Data Collection': '#ededed', 'Eiffel': '#946D57', 'Elixir': '#6E4A7E', 'Elm': '#60B5CC', @@ -126,170 +129,176 @@ const languagesColor = { 'Erlang': '#B83998', 'F#': '#B845FC', 'F*': '#572E30', - 'FIGlet Font': '#000000', + 'FIGlet Font': '#ededed', 'FLUX': '#88CCFF', 'Factor': '#636746', 'Fancy': '#7B9DB4', 'Fantom': '#14253C', - 'Filebench WML': '#000000', - 'Filterscript': '#000000', - 'Formatted': '#000000', + 'Faust': '#C37240', + 'Filebench WML': '#ededed', + 'Filterscript': '#ededed', + 'Formatted': '#ededed', 'Forth': '#341708', 'Fortran': '#4D41B1', 'FreeMarker': '#0050B2', 'Frege': '#00CAFE', 'G-code': '#D08CF2', - 'GAMS': '#000000', - 'GAP': '#000000', - 'GCC Machine Description': '#000000', - 'GDB': '#000000', + 'GAML': '#FFC766', + 'GAMS': '#ededed', + 'GAP': '#ededed', + 'GCC Machine Description': '#ededed', + 'GDB': '#ededed', 'GDScript': '#355570', - 'GLSL': '#000000', - 'GN': '#000000', + 'GLSL': '#ededed', + 'GN': '#ededed', 'Game Maker Language': '#71B417', 'Genie': '#FB855D', - 'Genshi': '#000000', - 'Gentoo Ebuild': '#000000', - 'Gentoo Eclass': '#000000', - 'Gerber Image': '#000000', - 'Gettext Catalog': '#000000', + 'Genshi': '#ededed', + 'Gentoo Ebuild': '#ededed', + 'Gentoo Eclass': '#ededed', + 'Gerber Image': '#ededed', + 'Gettext Catalog': '#ededed', 'Gherkin': '#5B2063', - 'Git Attributes': '#000000', - 'Git Config': '#000000', + 'Git Attributes': '#ededed', + 'Git Config': '#ededed', 'Glyph': '#C1AC7F', - 'Glyph Bitmap Distribution Format': '#000000', + 'Glyph Bitmap Distribution Format': '#ededed', 'Gnuplot': '#F0A9F0', 'Go': '#00ADD8', 'Golo': '#88562A', 'Gosu': '#82937F', - 'Grace': '#000000', - 'Gradle': '#000000', + 'Grace': '#ededed', + 'Gradle': '#ededed', 'Grammatical Framework': '#79AA7A', - 'Graph Modeling Language': '#000000', - 'GraphQL': '#000000', - 'Graphviz (DOT)': '#000000', + 'Graph Modeling Language': '#ededed', + 'GraphQL': '#ededed', + 'Graphviz (DOT)': '#ededed', 'Groovy': '#E69F56', - 'Groovy Server Pages': '#000000', - 'HAProxy': '#000000', - 'HCL': '#000000', - 'HLSL': '#000000', + 'Groovy Server Pages': '#ededed', + 'HAProxy': '#ededed', + 'HCL': '#ededed', + 'HLSL': '#ededed', 'HTML': '#E34C26', - 'HTML+Django': '#000000', - 'HTML+ECR': '#000000', - 'HTML+EEX': '#000000', - 'HTML+ERB': '#000000', - 'HTML+PHP': '#000000', - 'HTML+Razor': '#000000', - 'HTTP': '#000000', - 'HXML': '#000000', + 'HTML+Django': '#ededed', + 'HTML+ECR': '#ededed', + 'HTML+EEX': '#ededed', + 'HTML+ERB': '#ededed', + 'HTML+PHP': '#ededed', + 'HTML+Razor': '#ededed', + 'HTTP': '#ededed', + 'HXML': '#ededed', 'Hack': '#878787', - 'Haml': '#000000', - 'Handlebars': '#000000', + 'Haml': '#ededed', + 'Handlebars': '#ededed', 'Harbour': '#0E60E3', 'Haskell': '#5E5086', 'Haxe': '#DF7900', 'HiveQL': '#DCE200', 'HolyC': '#FFEFAF', 'Hy': '#7790B2', - 'HyPhy': '#000000', + 'HyPhy': '#ededed', 'IDL': '#A3522F', - 'IGOR Pro': '#000000', - 'INI': '#000000', - 'IRC log': '#000000', + 'IGOR Pro': '#0000CC', + 'INI': '#ededed', + 'IRC log': '#ededed', 'Idris': '#B30000', - 'Ignore List': '#000000', - 'Inform 7': '#000000', - 'Inno Setup': '#000000', + 'Ignore List': '#ededed', + 'Inform 7': '#ededed', + 'Inno Setup': '#ededed', 'Io': '#A9188D', 'Ioke': '#078193', 'Isabelle': '#FEFE00', - 'Isabelle ROOT': '#000000', + 'Isabelle ROOT': '#ededed', 'J': '#9EEDFF', - 'JFlex': '#000000', - 'JSON': '#000000', - 'JSON with Comments': '#000000', - 'JSON5': '#000000', - 'JSONLD': '#000000', + 'JFlex': '#ededed', + 'JSON': '#ededed', + 'JSON with Comments': '#ededed', + 'JSON5': '#ededed', + 'JSONLD': '#ededed', 'JSONiq': '#40D47E', - 'JSX': '#000000', - 'Jasmin': '#000000', + 'JSX': '#ededed', + 'Jasmin': '#ededed', 'Java': '#B07219', - 'Java Properties': '#000000', - 'Java Server Pages': '#000000', + 'Java Properties': '#ededed', + 'Java Server Pages': '#ededed', 'JavaScript': '#F1E05A', - 'JavaScript+ERB': '#000000', - 'Jison': '#000000', - 'Jison Lex': '#000000', + 'JavaScript+ERB': '#ededed', + 'Jison': '#ededed', + 'Jison Lex': '#ededed', 'Jolie': '#843179', 'Jsonnet': '#0064BD', 'Julia': '#A270BA', 'Jupyter Notebook': '#DA5B0B', 'KRL': '#28430A', - 'KiCad Layout': '#000000', - 'KiCad Legacy Layout': '#000000', - 'KiCad Schematic': '#000000', - 'Kit': '#000000', + 'KiCad Layout': '#ededed', + 'KiCad Legacy Layout': '#ededed', + 'KiCad Schematic': '#ededed', + 'Kit': '#ededed', 'Kotlin': '#F18E33', 'LFE': '#4C3023', 'LLVM': '#185619', 'LOLCODE': '#CC9900', 'LSL': '#3D9970', - 'LTspice Symbol': '#000000', - 'LabVIEW': '#000000', + 'LTspice Symbol': '#ededed', + 'LabVIEW': '#ededed', 'Lasso': '#999999', - 'Latte': '#000000', - 'Lean': '#000000', - 'Less': '#000000', + 'Latte': '#ededed', + 'Lean': '#ededed', + 'Less': '#ededed', 'Lex': '#DBCA00', - 'LilyPond': '#000000', - 'Limbo': '#000000', - 'Linker Script': '#000000', - 'Linux Kernel Module': '#000000', - 'Liquid': '#000000', - 'Literate Agda': '#000000', - 'Literate CoffeeScript': '#000000', - 'Literate Haskell': '#000000', + 'LilyPond': '#ededed', + 'Limbo': '#ededed', + 'Linker Script': '#ededed', + 'Linux Kernel Module': '#ededed', + 'Liquid': '#ededed', + 'Literate Agda': '#ededed', + 'Literate CoffeeScript': '#ededed', + 'Literate Haskell': '#ededed', 'LiveScript': '#499886', - 'Logos': '#000000', - 'Logtalk': '#000000', + 'Logos': '#ededed', + 'Logtalk': '#ededed', 'LookML': '#652B81', - 'LoomScript': '#000000', + 'LoomScript': '#ededed', 'Lua': '#000080', - 'M': '#000000', - 'M4': '#000000', - 'M4Sugar': '#000000', + 'M': '#ededed', + 'M4': '#ededed', + 'M4Sugar': '#ededed', 'MATLAB': '#E16737', 'MAXScript': '#00A6A6', + 'MLIR': '#5EC8DB', 'MQL4': '#62A8D6', 'MQL5': '#4A76B8', 'MTML': '#B7E1F4', - 'MUF': '#000000', + 'MUF': '#ededed', 'Makefile': '#427819', - 'Mako': '#000000', - 'Markdown': '#000000', - 'Marko': '#000000', + 'Mako': '#ededed', + 'Markdown': '#ededed', + 'Marko': '#ededed', 'Mask': '#F97732', - 'Mathematica': '#000000', - 'Maven POM': '#000000', + 'Mathematica': '#ededed', + 'Maven POM': '#ededed', 'Max': '#C4A79C', - 'MediaWiki': '#000000', + 'MediaWiki': '#ededed', 'Mercury': '#FF2B2B', 'Meson': '#007800', 'Metal': '#8F14E9', - 'MiniD': '#000000', + 'Microsoft Developer Studio Project': '#ededed', + 'MiniD': '#ededed', 'Mirah': '#C7A938', - 'Modelica': '#000000', - 'Modula-2': '#000000', + 'Modelica': '#ededed', + 'Modula-2': '#ededed', 'Modula-3': '#223388', - 'Module Management System': '#000000', - 'Monkey': '#000000', - 'Moocode': '#000000', - 'MoonScript': '#000000', - 'Motorola 68K Assembly': '#000000', - 'Myghty': '#000000', + 'Module Management System': '#ededed', + 'Monkey': '#ededed', + 'Moocode': '#ededed', + 'MoonScript': '#ededed', + 'Motorola 68K Assembly': '#ededed', + 'Muse': '#ededed', + 'Myghty': '#ededed', 'NCL': '#28431F', - 'NL': '#000000', - 'NSIS': '#000000', + 'NL': '#ededed', + 'NPM Config': '#ededed', + 'NSIS': '#ededed', 'Nearley': '#990000', 'Nemerle': '#3D3C6E', 'NetLinx': '#0AA0FF', @@ -297,226 +306,247 @@ const languagesColor = { 'NetLogo': '#FF6375', 'NewLisp': '#87AED7', 'Nextflow': '#3AC486', - 'Nginx': '#000000', + 'Nginx': '#ededed', 'Nim': '#37775B', - 'Ninja': '#000000', + 'Ninja': '#ededed', 'Nit': '#009917', 'Nix': '#7E7EFF', 'Nu': '#C9DF40', - 'NumPy': '#000000', + 'NumPy': '#ededed', 'OCaml': '#3BE133', - 'ObjDump': '#000000', + 'ObjDump': '#ededed', + 'Object Data Instance Notation': '#ededed', 'ObjectScript': '#424893', 'Objective-C': '#438EFF', 'Objective-C++': '#6866FB', 'Objective-J': '#FF0C5A', + 'Odin': '#60AFFE', 'Omgrofl': '#CABBFF', - 'Opa': '#000000', + 'Opa': '#ededed', 'Opal': '#F7EDE0', - 'OpenCL': '#000000', - 'OpenEdge ABL': '#000000', - 'OpenRC runscript': '#000000', - 'OpenSCAD': '#000000', - 'OpenType Feature File': '#000000', - 'Org': '#000000', - 'Ox': '#000000', + 'Open Policy Agent': '#ededed', + 'OpenCL': '#ededed', + 'OpenEdge ABL': '#ededed', + 'OpenRC runscript': '#ededed', + 'OpenSCAD': '#ededed', + 'OpenStep Property List': '#ededed', + 'OpenType Feature File': '#ededed', + 'Org': '#ededed', + 'Ox': '#ededed', 'Oxygene': '#CDD0E3', 'Oz': '#FAB738', 'P4': '#7055B5', 'PHP': '#4F5D95', 'PLSQL': '#DAD8D8', - 'PLpgSQL': '#000000', - 'POV-Ray SDL': '#000000', + 'PLpgSQL': '#ededed', + 'POV-Ray SDL': '#ededed', 'Pan': '#CC0000', 'Papyrus': '#6600CC', 'Parrot': '#F3CA0A', - 'Parrot Assembly': '#000000', - 'Parrot Internal Representation': '#000000', + 'Parrot Assembly': '#ededed', + 'Parrot Internal Representation': '#ededed', 'Pascal': '#E3F171', 'Pawn': '#DBB284', 'Pep8': '#C76F5B', 'Perl': '#0298C3', - 'Perl 6': '#0000FB', - 'Pic': '#000000', - 'Pickle': '#000000', - 'PicoLisp': '#000000', + 'Pic': '#ededed', + 'Pickle': '#ededed', + 'PicoLisp': '#ededed', 'PigLatin': '#FCD7DE', 'Pike': '#005390', - 'Pod': '#000000', - 'Pod 6': '#000000', + 'Pod': '#ededed', + 'Pod 6': '#ededed', 'PogoScript': '#D80074', - 'Pony': '#000000', - 'PostCSS': '#000000', + 'Pony': '#ededed', + 'PostCSS': '#ededed', 'PostScript': '#DA291C', 'PowerBuilder': '#8F0F8D', 'PowerShell': '#012456', + 'Prisma': '#ededed', 'Processing': '#0096D8', + 'Proguard': '#ededed', 'Prolog': '#74283C', 'Propeller Spin': '#7FA2A7', - 'Protocol Buffer': '#000000', - 'Public Key': '#000000', - 'Pug': '#000000', + 'Protocol Buffer': '#ededed', + 'Public Key': '#ededed', + 'Pug': '#ededed', 'Puppet': '#302B6D', - 'Pure Data': '#000000', + 'Pure Data': '#ededed', 'PureBasic': '#5A6986', 'PureScript': '#1D222D', 'Python': '#3572A5', - 'Python console': '#000000', - 'Python traceback': '#000000', + 'Python console': '#ededed', + 'Python traceback': '#ededed', 'QML': '#44A51C', - 'QMake': '#000000', + 'QMake': '#ededed', 'Quake': '#882233', 'R': '#198CE7', 'RAML': '#77D9FB', - 'RDoc': '#000000', - 'REALbasic': '#000000', - 'REXX': '#000000', - 'RHTML': '#000000', - 'RMarkdown': '#000000', - 'RPC': '#000000', - 'RPM Spec': '#000000', + 'RDoc': '#ededed', + 'REALbasic': '#ededed', + 'REXX': '#ededed', + 'RHTML': '#ededed', + 'RMarkdown': '#ededed', + 'RPC': '#ededed', + 'RPM Spec': '#ededed', 'RUNOFF': '#665A4E', 'Racket': '#3C5CAA', 'Ragel': '#9D5200', + 'Raku': '#0000FB', 'Rascal': '#FFFAA0', - 'Raw token data': '#000000', - 'Reason': '#000000', + 'Raw token data': '#ededed', + 'Readline Config': '#ededed', + 'Reason': '#FF5847', 'Rebol': '#358A5B', 'Red': '#F50000', - 'Redcode': '#000000', - 'Regular Expression': '#000000', + 'Redcode': '#ededed', + 'Regular Expression': '#ededed', 'Ren\'Py': '#FF7F7F', - 'RenderScript': '#000000', - 'Rich Text Format': '#000000', + 'RenderScript': '#ededed', + 'Rich Text Format': '#ededed', 'Ring': '#2D54CB', - 'RobotFramework': '#000000', + 'Riot': '#A71E49', + 'RobotFramework': '#ededed', 'Roff': '#ECDEBE', - 'Roff Manpage': '#000000', + 'Roff Manpage': '#ededed', 'Rouge': '#CC0088', 'Ruby': '#701516', 'Rust': '#DEA584', 'SAS': '#B34936', - 'SCSS': '#000000', - 'SMT': '#000000', - 'SPARQL': '#000000', + 'SCSS': '#ededed', + 'SMT': '#ededed', + 'SPARQL': '#ededed', 'SQF': '#3F3F3F', - 'SQL': '#000000', - 'SQLPL': '#000000', + 'SQL': '#ededed', + 'SQLPL': '#ededed', 'SRecode Template': '#348A34', - 'SSH Config': '#000000', - 'STON': '#000000', - 'SVG': '#000000', - 'Sage': '#000000', + 'SSH Config': '#ededed', + 'STON': '#ededed', + 'SVG': '#ededed', + 'SWIG': '#ededed', + 'Sage': '#ededed', 'SaltStack': '#646464', - 'Sass': '#000000', + 'Sass': '#ededed', 'Scala': '#C22D40', - 'Scaml': '#000000', + 'Scaml': '#ededed', 'Scheme': '#1E4AEC', - 'Scilab': '#000000', + 'Scilab': '#ededed', 'Self': '#0579AA', - 'ShaderLab': '#000000', + 'ShaderLab': '#ededed', 'Shell': '#89E051', - 'ShellSession': '#000000', + 'ShellSession': '#ededed', 'Shen': '#120F14', 'Slash': '#007EFF', 'Slice': '#003FA2', - 'Slim': '#000000', - 'Smali': '#000000', + 'Slim': '#ededed', + 'SmPL': '#C94949', + 'Smali': '#ededed', 'Smalltalk': '#596706', - 'Smarty': '#000000', + 'Smarty': '#ededed', 'Solidity': '#AA6746', 'SourcePawn': '#5C7611', - 'Spline Font Database': '#000000', + 'Spline Font Database': '#ededed', 'Squirrel': '#800000', 'Stan': '#B2011D', 'Standard ML': '#DC566D', - 'Stata': '#000000', - 'Stylus': '#000000', - 'SubRip Text': '#000000', - 'SugarSS': '#000000', + 'Starlark': '#76D275', + 'Stata': '#ededed', + 'Stylus': '#ededed', + 'SubRip Text': '#ededed', + 'SugarSS': '#ededed', 'SuperCollider': '#46390B', - 'Svelte': '#000000', + 'Svelte': '#ededed', 'Swift': '#FFAC45', 'SystemVerilog': '#DAE1C2', 'TI Program': '#A0AA87', - 'TLA': '#000000', - 'TOML': '#000000', - 'TSQL': '#000000', - 'TSX': '#000000', - 'TXL': '#000000', + 'TLA': '#ededed', + 'TOML': '#ededed', + 'TSQL': '#ededed', + 'TSX': '#ededed', + 'TXL': '#ededed', 'Tcl': '#E4CC98', - 'Tcsh': '#000000', + 'Tcsh': '#ededed', 'TeX': '#3D6117', - 'Tea': '#000000', + 'Tea': '#ededed', 'Terra': '#00004C', - 'Text': '#000000', - 'Textile': '#000000', - 'Thrift': '#000000', + 'Texinfo': '#ededed', + 'Text': '#ededed', + 'Textile': '#ededed', + 'Thrift': '#ededed', 'Turing': '#CF142B', - 'Turtle': '#000000', - 'Twig': '#000000', - 'Type Language': '#000000', + 'Turtle': '#ededed', + 'Twig': '#ededed', + 'Type Language': '#ededed', 'TypeScript': '#2B7489', - 'Unified Parallel C': '#000000', - 'Unity3D Asset': '#000000', - 'Unix Assembly': '#000000', - 'Uno': '#000000', + 'Unified Parallel C': '#ededed', + 'Unity3D Asset': '#ededed', + 'Unix Assembly': '#ededed', + 'Uno': '#ededed', 'UnrealScript': '#A54C4D', - 'UrWeb': '#000000', + 'UrWeb': '#ededed', + 'V': '#5D87BD', + 'VBA': '#867DB1', + 'VBScript': '#15DCDC', 'VCL': '#148AA8', 'VHDL': '#ADB2CB', 'Vala': '#FBE5CD', 'Verilog': '#B2B7F8', + 'Vim Snippet': '#ededed', 'Vim script': '#199F4B', - 'Visual Basic': '#945DB7', + 'Visual Basic .NET': '#945DB7', 'Volt': '#1F1F1F', 'Vue': '#2C3E50', - 'Wavefront Material': '#000000', - 'Wavefront Object': '#000000', - 'Web Ontology Language': '#000000', + 'Wavefront Material': '#ededed', + 'Wavefront Object': '#ededed', + 'Web Ontology Language': '#ededed', 'WebAssembly': '#04133B', - 'WebIDL': '#000000', - 'WebVTT': '#000000', - 'Windows Registry Entries': '#000000', + 'WebIDL': '#ededed', + 'WebVTT': '#ededed', + 'Wget Config': '#ededed', + 'Windows Registry Entries': '#ededed', 'Wollok': '#A23738', - 'World of Warcraft Addon Data': '#000000', - 'X BitMap': '#000000', - 'X Font Directory Index': '#000000', - 'X PixMap': '#000000', + 'World of Warcraft Addon Data': '#ededed', + 'X BitMap': '#ededed', + 'X Font Directory Index': '#ededed', + 'X PixMap': '#ededed', 'X10': '#4B6BEF', 'XC': '#99DA07', - 'XCompose': '#000000', - 'XML': '#000000', - 'XPages': '#000000', - 'XProc': '#000000', + 'XCompose': '#ededed', + 'XML': '#ededed', + 'XML Property List': '#ededed', + 'XPages': '#ededed', + 'XProc': '#ededed', 'XQuery': '#5232E7', - 'XS': '#000000', + 'XS': '#ededed', 'XSLT': '#EB8CEB', - 'Xojo': '#000000', - 'Xtend': '#000000', - 'YAML': '#000000', - 'YANG': '#000000', + 'Xojo': '#ededed', + 'Xtend': '#ededed', + 'YAML': '#ededed', + 'YANG': '#ededed', 'YARA': '#220000', 'YASnippet': '#32AB90', 'Yacc': '#4B6C4B', 'ZAP': '#0D665E', 'ZIL': '#DC75E5', - 'Zeek': '#000000', + 'Zeek': '#ededed', 'ZenScript': '#00BCD1', 'Zephir': '#118F9E', 'Zig': '#EC915C', - 'Zimpl': '#000000', - 'desktop': '#000000', + 'Zimpl': '#ededed', + 'cURL Config': '#ededed', + 'desktop': '#ededed', + 'dircolors': '#ededed', 'eC': '#913960', - 'edn': '#000000', - 'fish': '#000000', + 'edn': '#ededed', + 'fish': '#ededed', + 'mIRC Script': '#926059', 'mcfunction': '#E22837', - 'mupad': '#000000', - 'nanorc': '#000000', + 'mupad': '#ededed', + 'nanorc': '#ededed', 'nesC': '#94B0C7', 'ooc': '#B0B77E', 'q': '#0040CD', - 'reStructuredText': '#000000', + 'reStructuredText': '#ededed', 'sed': '#64B970', 'wdl': '#42F1F4', 'wisp': '#7582D1', From d464385767e5eb58a57e31e3cbd4e83d40e4af1c Mon Sep 17 00:00:00 2001 From: Rongjian Zhang Date: Sat, 8 Feb 2020 14:24:41 +0800 Subject: [PATCH 138/390] Make hex color upper case --- lib/src/const/language_color.dart | 580 ++++++++++++++--------------- tool/language_color_generator.dart | 2 +- 2 files changed, 291 insertions(+), 291 deletions(-) diff --git a/lib/src/const/language_color.dart b/lib/src/const/language_color.dart index 716be8b9..9a3fd526 100644 --- a/lib/src/const/language_color.dart +++ b/lib/src/const/language_color.dart @@ -1,126 +1,126 @@ // GENERATED CODE - DO NOT MODIFY BY HAND -// VERSION OF 2020-02-08T14:10:08.685302 +// VERSION OF 2020-02-08T14:23:59.127442 const languagesColor = { '1C Enterprise': '#814CCC', - '4D': '#ededed', + '4D': '#EDEDED', 'ABAP': '#E8274B', - 'ABNF': '#ededed', + 'ABNF': '#EDEDED', 'AGS Script': '#B9D9FF', 'AMPL': '#E6EFBB', 'ANTLR': '#9DC3FF', 'API Blueprint': '#2ACCA8', 'APL': '#5A8164', - 'ASN.1': '#ededed', + 'ASN.1': '#EDEDED', 'ASP': '#6A40FD', 'ATS': '#1AC620', 'ActionScript': '#882B0F', 'Ada': '#02F88C', - 'Adobe Font Metrics': '#ededed', + 'Adobe Font Metrics': '#EDEDED', 'Agda': '#315665', 'Alloy': '#64C800', - 'Alpine Abuild': '#ededed', - 'Altium Designer': '#ededed', + 'Alpine Abuild': '#EDEDED', + 'Altium Designer': '#EDEDED', 'AngelScript': '#C7D7DC', - 'Ant Build System': '#ededed', - 'ApacheConf': '#ededed', - 'Apex': '#ededed', - 'Apollo Guidance Computer': '#ededed', + 'Ant Build System': '#EDEDED', + 'ApacheConf': '#EDEDED', + 'Apex': '#EDEDED', + 'Apollo Guidance Computer': '#EDEDED', 'AppleScript': '#101F1F', 'Arc': '#AA2AFE', - 'AsciiDoc': '#ededed', + 'AsciiDoc': '#EDEDED', 'AspectJ': '#A957B0', 'Assembly': '#6E4C13', 'Asymptote': '#4A0C0C', - 'Augeas': '#ededed', + 'Augeas': '#EDEDED', 'AutoHotkey': '#6594B9', 'AutoIt': '#1C3552', - 'Awk': '#ededed', + 'Awk': '#EDEDED', 'Ballerina': '#FF5000', 'Batchfile': '#C1F12E', - 'Befunge': '#ededed', - 'BibTeX': '#ededed', - 'Bison': '#ededed', - 'BitBake': '#ededed', - 'Blade': '#ededed', - 'BlitzBasic': '#ededed', + 'Befunge': '#EDEDED', + 'BibTeX': '#EDEDED', + 'Bison': '#EDEDED', + 'BitBake': '#EDEDED', + 'Blade': '#EDEDED', + 'BlitzBasic': '#EDEDED', 'BlitzMax': '#CD6400', - 'Bluespec': '#ededed', + 'Bluespec': '#EDEDED', 'Boo': '#D4BEC1', 'Brainfuck': '#2F2530', - 'Brightscript': '#ededed', + 'Brightscript': '#EDEDED', 'C': '#555555', 'C#': '#178600', 'C++': '#F34B7D', - 'C-ObjDump': '#ededed', - 'C2hs Haskell': '#ededed', - 'CLIPS': '#ededed', - 'CMake': '#ededed', - 'COBOL': '#ededed', - 'COLLADA': '#ededed', - 'CSON': '#ededed', + 'C-ObjDump': '#EDEDED', + 'C2hs Haskell': '#EDEDED', + 'CLIPS': '#EDEDED', + 'CMake': '#EDEDED', + 'COBOL': '#EDEDED', + 'COLLADA': '#EDEDED', + 'CSON': '#EDEDED', 'CSS': '#563D7C', - 'CSV': '#ededed', - 'CWeb': '#ededed', - 'Cabal Config': '#ededed', - 'Cap\'n Proto': '#ededed', - 'CartoCSS': '#ededed', + 'CSV': '#EDEDED', + 'CWeb': '#EDEDED', + 'Cabal Config': '#EDEDED', + 'Cap\'n Proto': '#EDEDED', + 'CartoCSS': '#EDEDED', 'Ceylon': '#DFA535', 'Chapel': '#8DC63F', - 'Charity': '#ededed', - 'ChucK': '#ededed', + 'Charity': '#EDEDED', + 'ChucK': '#EDEDED', 'Cirru': '#CCCCFF', 'Clarion': '#DB901E', 'Clean': '#3F85AF', 'Click': '#E4E6F3', 'Clojure': '#DB5855', - 'Closure Templates': '#ededed', - 'Cloud Firestore Security Rules': '#ededed', - 'CoNLL-U': '#ededed', + 'Closure Templates': '#EDEDED', + 'Cloud Firestore Security Rules': '#EDEDED', + 'CoNLL-U': '#EDEDED', 'CoffeeScript': '#244776', 'ColdFusion': '#ED2CD6', - 'ColdFusion CFC': '#ededed', + 'ColdFusion CFC': '#EDEDED', 'Common Lisp': '#3FB68B', 'Common Workflow Language': '#B5314C', 'Component Pascal': '#B0CE4E', - 'Cool': '#ededed', - 'Coq': '#ededed', - 'Cpp-ObjDump': '#ededed', - 'Creole': '#ededed', + 'Cool': '#EDEDED', + 'Coq': '#EDEDED', + 'Cpp-ObjDump': '#EDEDED', + 'Creole': '#EDEDED', 'Crystal': '#000100', - 'Csound': '#ededed', - 'Csound Document': '#ededed', - 'Csound Score': '#ededed', + 'Csound': '#EDEDED', + 'Csound Document': '#EDEDED', + 'Csound Score': '#EDEDED', 'Cuda': '#3A4E3A', - 'Cycript': '#ededed', - 'Cython': '#ededed', + 'Cycript': '#EDEDED', + 'Cython': '#EDEDED', 'D': '#BA595E', - 'D-ObjDump': '#ededed', - 'DIGITAL Command Language': '#ededed', + 'D-ObjDump': '#EDEDED', + 'DIGITAL Command Language': '#EDEDED', 'DM': '#447265', - 'DNS Zone': '#ededed', - 'DTrace': '#ededed', - 'Darcs Patch': '#ededed', + 'DNS Zone': '#EDEDED', + 'DTrace': '#EDEDED', + 'Darcs Patch': '#EDEDED', 'Dart': '#00B4AB', 'DataWeave': '#003A52', 'Dhall': '#DFAFFF', - 'Diff': '#ededed', - 'DirectX 3D File': '#ededed', + 'Diff': '#EDEDED', + 'DirectX 3D File': '#EDEDED', 'Dockerfile': '#384D54', 'Dogescript': '#CCA760', 'Dylan': '#6C616E', 'E': '#CCCE35', - 'EBNF': '#ededed', + 'EBNF': '#EDEDED', 'ECL': '#8A1267', - 'ECLiPSe': '#ededed', - 'EJS': '#ededed', - 'EML': '#ededed', + 'ECLiPSe': '#EDEDED', + 'EJS': '#EDEDED', + 'EML': '#EDEDED', 'EQ': '#A78649', - 'Eagle': '#ededed', - 'Easybuild': '#ededed', - 'Ecere Projects': '#ededed', - 'EditorConfig': '#ededed', - 'Edje Data Collection': '#ededed', + 'Eagle': '#EDEDED', + 'Easybuild': '#EDEDED', + 'Ecere Projects': '#EDEDED', + 'EditorConfig': '#EDEDED', + 'Edje Data Collection': '#EDEDED', 'Eiffel': '#946D57', 'Elixir': '#6E4A7E', 'Elm': '#60B5CC', @@ -129,176 +129,176 @@ const languagesColor = { 'Erlang': '#B83998', 'F#': '#B845FC', 'F*': '#572E30', - 'FIGlet Font': '#ededed', + 'FIGlet Font': '#EDEDED', 'FLUX': '#88CCFF', 'Factor': '#636746', 'Fancy': '#7B9DB4', 'Fantom': '#14253C', 'Faust': '#C37240', - 'Filebench WML': '#ededed', - 'Filterscript': '#ededed', - 'Formatted': '#ededed', + 'Filebench WML': '#EDEDED', + 'Filterscript': '#EDEDED', + 'Formatted': '#EDEDED', 'Forth': '#341708', 'Fortran': '#4D41B1', 'FreeMarker': '#0050B2', 'Frege': '#00CAFE', 'G-code': '#D08CF2', 'GAML': '#FFC766', - 'GAMS': '#ededed', - 'GAP': '#ededed', - 'GCC Machine Description': '#ededed', - 'GDB': '#ededed', + 'GAMS': '#EDEDED', + 'GAP': '#EDEDED', + 'GCC Machine Description': '#EDEDED', + 'GDB': '#EDEDED', 'GDScript': '#355570', - 'GLSL': '#ededed', - 'GN': '#ededed', + 'GLSL': '#EDEDED', + 'GN': '#EDEDED', 'Game Maker Language': '#71B417', 'Genie': '#FB855D', - 'Genshi': '#ededed', - 'Gentoo Ebuild': '#ededed', - 'Gentoo Eclass': '#ededed', - 'Gerber Image': '#ededed', - 'Gettext Catalog': '#ededed', + 'Genshi': '#EDEDED', + 'Gentoo Ebuild': '#EDEDED', + 'Gentoo Eclass': '#EDEDED', + 'Gerber Image': '#EDEDED', + 'Gettext Catalog': '#EDEDED', 'Gherkin': '#5B2063', - 'Git Attributes': '#ededed', - 'Git Config': '#ededed', + 'Git Attributes': '#EDEDED', + 'Git Config': '#EDEDED', 'Glyph': '#C1AC7F', - 'Glyph Bitmap Distribution Format': '#ededed', + 'Glyph Bitmap Distribution Format': '#EDEDED', 'Gnuplot': '#F0A9F0', 'Go': '#00ADD8', 'Golo': '#88562A', 'Gosu': '#82937F', - 'Grace': '#ededed', - 'Gradle': '#ededed', + 'Grace': '#EDEDED', + 'Gradle': '#EDEDED', 'Grammatical Framework': '#79AA7A', - 'Graph Modeling Language': '#ededed', - 'GraphQL': '#ededed', - 'Graphviz (DOT)': '#ededed', + 'Graph Modeling Language': '#EDEDED', + 'GraphQL': '#EDEDED', + 'Graphviz (DOT)': '#EDEDED', 'Groovy': '#E69F56', - 'Groovy Server Pages': '#ededed', - 'HAProxy': '#ededed', - 'HCL': '#ededed', - 'HLSL': '#ededed', + 'Groovy Server Pages': '#EDEDED', + 'HAProxy': '#EDEDED', + 'HCL': '#EDEDED', + 'HLSL': '#EDEDED', 'HTML': '#E34C26', - 'HTML+Django': '#ededed', - 'HTML+ECR': '#ededed', - 'HTML+EEX': '#ededed', - 'HTML+ERB': '#ededed', - 'HTML+PHP': '#ededed', - 'HTML+Razor': '#ededed', - 'HTTP': '#ededed', - 'HXML': '#ededed', + 'HTML+Django': '#EDEDED', + 'HTML+ECR': '#EDEDED', + 'HTML+EEX': '#EDEDED', + 'HTML+ERB': '#EDEDED', + 'HTML+PHP': '#EDEDED', + 'HTML+Razor': '#EDEDED', + 'HTTP': '#EDEDED', + 'HXML': '#EDEDED', 'Hack': '#878787', - 'Haml': '#ededed', - 'Handlebars': '#ededed', + 'Haml': '#EDEDED', + 'Handlebars': '#EDEDED', 'Harbour': '#0E60E3', 'Haskell': '#5E5086', 'Haxe': '#DF7900', 'HiveQL': '#DCE200', 'HolyC': '#FFEFAF', 'Hy': '#7790B2', - 'HyPhy': '#ededed', + 'HyPhy': '#EDEDED', 'IDL': '#A3522F', 'IGOR Pro': '#0000CC', - 'INI': '#ededed', - 'IRC log': '#ededed', + 'INI': '#EDEDED', + 'IRC log': '#EDEDED', 'Idris': '#B30000', - 'Ignore List': '#ededed', - 'Inform 7': '#ededed', - 'Inno Setup': '#ededed', + 'Ignore List': '#EDEDED', + 'Inform 7': '#EDEDED', + 'Inno Setup': '#EDEDED', 'Io': '#A9188D', 'Ioke': '#078193', 'Isabelle': '#FEFE00', - 'Isabelle ROOT': '#ededed', + 'Isabelle ROOT': '#EDEDED', 'J': '#9EEDFF', - 'JFlex': '#ededed', - 'JSON': '#ededed', - 'JSON with Comments': '#ededed', - 'JSON5': '#ededed', - 'JSONLD': '#ededed', + 'JFlex': '#EDEDED', + 'JSON': '#EDEDED', + 'JSON with Comments': '#EDEDED', + 'JSON5': '#EDEDED', + 'JSONLD': '#EDEDED', 'JSONiq': '#40D47E', - 'JSX': '#ededed', - 'Jasmin': '#ededed', + 'JSX': '#EDEDED', + 'Jasmin': '#EDEDED', 'Java': '#B07219', - 'Java Properties': '#ededed', - 'Java Server Pages': '#ededed', + 'Java Properties': '#EDEDED', + 'Java Server Pages': '#EDEDED', 'JavaScript': '#F1E05A', - 'JavaScript+ERB': '#ededed', - 'Jison': '#ededed', - 'Jison Lex': '#ededed', + 'JavaScript+ERB': '#EDEDED', + 'Jison': '#EDEDED', + 'Jison Lex': '#EDEDED', 'Jolie': '#843179', 'Jsonnet': '#0064BD', 'Julia': '#A270BA', 'Jupyter Notebook': '#DA5B0B', 'KRL': '#28430A', - 'KiCad Layout': '#ededed', - 'KiCad Legacy Layout': '#ededed', - 'KiCad Schematic': '#ededed', - 'Kit': '#ededed', + 'KiCad Layout': '#EDEDED', + 'KiCad Legacy Layout': '#EDEDED', + 'KiCad Schematic': '#EDEDED', + 'Kit': '#EDEDED', 'Kotlin': '#F18E33', 'LFE': '#4C3023', 'LLVM': '#185619', 'LOLCODE': '#CC9900', 'LSL': '#3D9970', - 'LTspice Symbol': '#ededed', - 'LabVIEW': '#ededed', + 'LTspice Symbol': '#EDEDED', + 'LabVIEW': '#EDEDED', 'Lasso': '#999999', - 'Latte': '#ededed', - 'Lean': '#ededed', - 'Less': '#ededed', + 'Latte': '#EDEDED', + 'Lean': '#EDEDED', + 'Less': '#EDEDED', 'Lex': '#DBCA00', - 'LilyPond': '#ededed', - 'Limbo': '#ededed', - 'Linker Script': '#ededed', - 'Linux Kernel Module': '#ededed', - 'Liquid': '#ededed', - 'Literate Agda': '#ededed', - 'Literate CoffeeScript': '#ededed', - 'Literate Haskell': '#ededed', + 'LilyPond': '#EDEDED', + 'Limbo': '#EDEDED', + 'Linker Script': '#EDEDED', + 'Linux Kernel Module': '#EDEDED', + 'Liquid': '#EDEDED', + 'Literate Agda': '#EDEDED', + 'Literate CoffeeScript': '#EDEDED', + 'Literate Haskell': '#EDEDED', 'LiveScript': '#499886', - 'Logos': '#ededed', - 'Logtalk': '#ededed', + 'Logos': '#EDEDED', + 'Logtalk': '#EDEDED', 'LookML': '#652B81', - 'LoomScript': '#ededed', + 'LoomScript': '#EDEDED', 'Lua': '#000080', - 'M': '#ededed', - 'M4': '#ededed', - 'M4Sugar': '#ededed', + 'M': '#EDEDED', + 'M4': '#EDEDED', + 'M4Sugar': '#EDEDED', 'MATLAB': '#E16737', 'MAXScript': '#00A6A6', 'MLIR': '#5EC8DB', 'MQL4': '#62A8D6', 'MQL5': '#4A76B8', 'MTML': '#B7E1F4', - 'MUF': '#ededed', + 'MUF': '#EDEDED', 'Makefile': '#427819', - 'Mako': '#ededed', - 'Markdown': '#ededed', - 'Marko': '#ededed', + 'Mako': '#EDEDED', + 'Markdown': '#EDEDED', + 'Marko': '#EDEDED', 'Mask': '#F97732', - 'Mathematica': '#ededed', - 'Maven POM': '#ededed', + 'Mathematica': '#EDEDED', + 'Maven POM': '#EDEDED', 'Max': '#C4A79C', - 'MediaWiki': '#ededed', + 'MediaWiki': '#EDEDED', 'Mercury': '#FF2B2B', 'Meson': '#007800', 'Metal': '#8F14E9', - 'Microsoft Developer Studio Project': '#ededed', - 'MiniD': '#ededed', + 'Microsoft Developer Studio Project': '#EDEDED', + 'MiniD': '#EDEDED', 'Mirah': '#C7A938', - 'Modelica': '#ededed', - 'Modula-2': '#ededed', + 'Modelica': '#EDEDED', + 'Modula-2': '#EDEDED', 'Modula-3': '#223388', - 'Module Management System': '#ededed', - 'Monkey': '#ededed', - 'Moocode': '#ededed', - 'MoonScript': '#ededed', - 'Motorola 68K Assembly': '#ededed', - 'Muse': '#ededed', - 'Myghty': '#ededed', + 'Module Management System': '#EDEDED', + 'Monkey': '#EDEDED', + 'Moocode': '#EDEDED', + 'MoonScript': '#EDEDED', + 'Motorola 68K Assembly': '#EDEDED', + 'Muse': '#EDEDED', + 'Myghty': '#EDEDED', 'NCL': '#28431F', - 'NL': '#ededed', - 'NPM Config': '#ededed', - 'NSIS': '#ededed', + 'NL': '#EDEDED', + 'NPM Config': '#EDEDED', + 'NSIS': '#EDEDED', 'Nearley': '#990000', 'Nemerle': '#3D3C6E', 'NetLinx': '#0AA0FF', @@ -306,184 +306,184 @@ const languagesColor = { 'NetLogo': '#FF6375', 'NewLisp': '#87AED7', 'Nextflow': '#3AC486', - 'Nginx': '#ededed', + 'Nginx': '#EDEDED', 'Nim': '#37775B', - 'Ninja': '#ededed', + 'Ninja': '#EDEDED', 'Nit': '#009917', 'Nix': '#7E7EFF', 'Nu': '#C9DF40', - 'NumPy': '#ededed', + 'NumPy': '#EDEDED', 'OCaml': '#3BE133', - 'ObjDump': '#ededed', - 'Object Data Instance Notation': '#ededed', + 'ObjDump': '#EDEDED', + 'Object Data Instance Notation': '#EDEDED', 'ObjectScript': '#424893', 'Objective-C': '#438EFF', 'Objective-C++': '#6866FB', 'Objective-J': '#FF0C5A', 'Odin': '#60AFFE', 'Omgrofl': '#CABBFF', - 'Opa': '#ededed', + 'Opa': '#EDEDED', 'Opal': '#F7EDE0', - 'Open Policy Agent': '#ededed', - 'OpenCL': '#ededed', - 'OpenEdge ABL': '#ededed', - 'OpenRC runscript': '#ededed', - 'OpenSCAD': '#ededed', - 'OpenStep Property List': '#ededed', - 'OpenType Feature File': '#ededed', - 'Org': '#ededed', - 'Ox': '#ededed', + 'Open Policy Agent': '#EDEDED', + 'OpenCL': '#EDEDED', + 'OpenEdge ABL': '#EDEDED', + 'OpenRC runscript': '#EDEDED', + 'OpenSCAD': '#EDEDED', + 'OpenStep Property List': '#EDEDED', + 'OpenType Feature File': '#EDEDED', + 'Org': '#EDEDED', + 'Ox': '#EDEDED', 'Oxygene': '#CDD0E3', 'Oz': '#FAB738', 'P4': '#7055B5', 'PHP': '#4F5D95', 'PLSQL': '#DAD8D8', - 'PLpgSQL': '#ededed', - 'POV-Ray SDL': '#ededed', + 'PLpgSQL': '#EDEDED', + 'POV-Ray SDL': '#EDEDED', 'Pan': '#CC0000', 'Papyrus': '#6600CC', 'Parrot': '#F3CA0A', - 'Parrot Assembly': '#ededed', - 'Parrot Internal Representation': '#ededed', + 'Parrot Assembly': '#EDEDED', + 'Parrot Internal Representation': '#EDEDED', 'Pascal': '#E3F171', 'Pawn': '#DBB284', 'Pep8': '#C76F5B', 'Perl': '#0298C3', - 'Pic': '#ededed', - 'Pickle': '#ededed', - 'PicoLisp': '#ededed', + 'Pic': '#EDEDED', + 'Pickle': '#EDEDED', + 'PicoLisp': '#EDEDED', 'PigLatin': '#FCD7DE', 'Pike': '#005390', - 'Pod': '#ededed', - 'Pod 6': '#ededed', + 'Pod': '#EDEDED', + 'Pod 6': '#EDEDED', 'PogoScript': '#D80074', - 'Pony': '#ededed', - 'PostCSS': '#ededed', + 'Pony': '#EDEDED', + 'PostCSS': '#EDEDED', 'PostScript': '#DA291C', 'PowerBuilder': '#8F0F8D', 'PowerShell': '#012456', - 'Prisma': '#ededed', + 'Prisma': '#EDEDED', 'Processing': '#0096D8', - 'Proguard': '#ededed', + 'Proguard': '#EDEDED', 'Prolog': '#74283C', 'Propeller Spin': '#7FA2A7', - 'Protocol Buffer': '#ededed', - 'Public Key': '#ededed', - 'Pug': '#ededed', + 'Protocol Buffer': '#EDEDED', + 'Public Key': '#EDEDED', + 'Pug': '#EDEDED', 'Puppet': '#302B6D', - 'Pure Data': '#ededed', + 'Pure Data': '#EDEDED', 'PureBasic': '#5A6986', 'PureScript': '#1D222D', 'Python': '#3572A5', - 'Python console': '#ededed', - 'Python traceback': '#ededed', + 'Python console': '#EDEDED', + 'Python traceback': '#EDEDED', 'QML': '#44A51C', - 'QMake': '#ededed', + 'QMake': '#EDEDED', 'Quake': '#882233', 'R': '#198CE7', 'RAML': '#77D9FB', - 'RDoc': '#ededed', - 'REALbasic': '#ededed', - 'REXX': '#ededed', - 'RHTML': '#ededed', - 'RMarkdown': '#ededed', - 'RPC': '#ededed', - 'RPM Spec': '#ededed', + 'RDoc': '#EDEDED', + 'REALbasic': '#EDEDED', + 'REXX': '#EDEDED', + 'RHTML': '#EDEDED', + 'RMarkdown': '#EDEDED', + 'RPC': '#EDEDED', + 'RPM Spec': '#EDEDED', 'RUNOFF': '#665A4E', 'Racket': '#3C5CAA', 'Ragel': '#9D5200', 'Raku': '#0000FB', 'Rascal': '#FFFAA0', - 'Raw token data': '#ededed', - 'Readline Config': '#ededed', + 'Raw token data': '#EDEDED', + 'Readline Config': '#EDEDED', 'Reason': '#FF5847', 'Rebol': '#358A5B', 'Red': '#F50000', - 'Redcode': '#ededed', - 'Regular Expression': '#ededed', + 'Redcode': '#EDEDED', + 'Regular Expression': '#EDEDED', 'Ren\'Py': '#FF7F7F', - 'RenderScript': '#ededed', - 'Rich Text Format': '#ededed', + 'RenderScript': '#EDEDED', + 'Rich Text Format': '#EDEDED', 'Ring': '#2D54CB', 'Riot': '#A71E49', - 'RobotFramework': '#ededed', + 'RobotFramework': '#EDEDED', 'Roff': '#ECDEBE', - 'Roff Manpage': '#ededed', + 'Roff Manpage': '#EDEDED', 'Rouge': '#CC0088', 'Ruby': '#701516', 'Rust': '#DEA584', 'SAS': '#B34936', - 'SCSS': '#ededed', - 'SMT': '#ededed', - 'SPARQL': '#ededed', + 'SCSS': '#EDEDED', + 'SMT': '#EDEDED', + 'SPARQL': '#EDEDED', 'SQF': '#3F3F3F', - 'SQL': '#ededed', - 'SQLPL': '#ededed', + 'SQL': '#EDEDED', + 'SQLPL': '#EDEDED', 'SRecode Template': '#348A34', - 'SSH Config': '#ededed', - 'STON': '#ededed', - 'SVG': '#ededed', - 'SWIG': '#ededed', - 'Sage': '#ededed', + 'SSH Config': '#EDEDED', + 'STON': '#EDEDED', + 'SVG': '#EDEDED', + 'SWIG': '#EDEDED', + 'Sage': '#EDEDED', 'SaltStack': '#646464', - 'Sass': '#ededed', + 'Sass': '#EDEDED', 'Scala': '#C22D40', - 'Scaml': '#ededed', + 'Scaml': '#EDEDED', 'Scheme': '#1E4AEC', - 'Scilab': '#ededed', + 'Scilab': '#EDEDED', 'Self': '#0579AA', - 'ShaderLab': '#ededed', + 'ShaderLab': '#EDEDED', 'Shell': '#89E051', - 'ShellSession': '#ededed', + 'ShellSession': '#EDEDED', 'Shen': '#120F14', 'Slash': '#007EFF', 'Slice': '#003FA2', - 'Slim': '#ededed', + 'Slim': '#EDEDED', 'SmPL': '#C94949', - 'Smali': '#ededed', + 'Smali': '#EDEDED', 'Smalltalk': '#596706', - 'Smarty': '#ededed', + 'Smarty': '#EDEDED', 'Solidity': '#AA6746', 'SourcePawn': '#5C7611', - 'Spline Font Database': '#ededed', + 'Spline Font Database': '#EDEDED', 'Squirrel': '#800000', 'Stan': '#B2011D', 'Standard ML': '#DC566D', 'Starlark': '#76D275', - 'Stata': '#ededed', - 'Stylus': '#ededed', - 'SubRip Text': '#ededed', - 'SugarSS': '#ededed', + 'Stata': '#EDEDED', + 'Stylus': '#EDEDED', + 'SubRip Text': '#EDEDED', + 'SugarSS': '#EDEDED', 'SuperCollider': '#46390B', - 'Svelte': '#ededed', + 'Svelte': '#EDEDED', 'Swift': '#FFAC45', 'SystemVerilog': '#DAE1C2', 'TI Program': '#A0AA87', - 'TLA': '#ededed', - 'TOML': '#ededed', - 'TSQL': '#ededed', - 'TSX': '#ededed', - 'TXL': '#ededed', + 'TLA': '#EDEDED', + 'TOML': '#EDEDED', + 'TSQL': '#EDEDED', + 'TSX': '#EDEDED', + 'TXL': '#EDEDED', 'Tcl': '#E4CC98', - 'Tcsh': '#ededed', + 'Tcsh': '#EDEDED', 'TeX': '#3D6117', - 'Tea': '#ededed', + 'Tea': '#EDEDED', 'Terra': '#00004C', - 'Texinfo': '#ededed', - 'Text': '#ededed', - 'Textile': '#ededed', - 'Thrift': '#ededed', + 'Texinfo': '#EDEDED', + 'Text': '#EDEDED', + 'Textile': '#EDEDED', + 'Thrift': '#EDEDED', 'Turing': '#CF142B', - 'Turtle': '#ededed', - 'Twig': '#ededed', - 'Type Language': '#ededed', + 'Turtle': '#EDEDED', + 'Twig': '#EDEDED', + 'Type Language': '#EDEDED', 'TypeScript': '#2B7489', - 'Unified Parallel C': '#ededed', - 'Unity3D Asset': '#ededed', - 'Unix Assembly': '#ededed', - 'Uno': '#ededed', + 'Unified Parallel C': '#EDEDED', + 'Unity3D Asset': '#EDEDED', + 'Unix Assembly': '#EDEDED', + 'Uno': '#EDEDED', 'UnrealScript': '#A54C4D', - 'UrWeb': '#ededed', + 'UrWeb': '#EDEDED', 'V': '#5D87BD', 'VBA': '#867DB1', 'VBScript': '#15DCDC', @@ -491,62 +491,62 @@ const languagesColor = { 'VHDL': '#ADB2CB', 'Vala': '#FBE5CD', 'Verilog': '#B2B7F8', - 'Vim Snippet': '#ededed', + 'Vim Snippet': '#EDEDED', 'Vim script': '#199F4B', 'Visual Basic .NET': '#945DB7', 'Volt': '#1F1F1F', 'Vue': '#2C3E50', - 'Wavefront Material': '#ededed', - 'Wavefront Object': '#ededed', - 'Web Ontology Language': '#ededed', + 'Wavefront Material': '#EDEDED', + 'Wavefront Object': '#EDEDED', + 'Web Ontology Language': '#EDEDED', 'WebAssembly': '#04133B', - 'WebIDL': '#ededed', - 'WebVTT': '#ededed', - 'Wget Config': '#ededed', - 'Windows Registry Entries': '#ededed', + 'WebIDL': '#EDEDED', + 'WebVTT': '#EDEDED', + 'Wget Config': '#EDEDED', + 'Windows Registry Entries': '#EDEDED', 'Wollok': '#A23738', - 'World of Warcraft Addon Data': '#ededed', - 'X BitMap': '#ededed', - 'X Font Directory Index': '#ededed', - 'X PixMap': '#ededed', + 'World of Warcraft Addon Data': '#EDEDED', + 'X BitMap': '#EDEDED', + 'X Font Directory Index': '#EDEDED', + 'X PixMap': '#EDEDED', 'X10': '#4B6BEF', 'XC': '#99DA07', - 'XCompose': '#ededed', - 'XML': '#ededed', - 'XML Property List': '#ededed', - 'XPages': '#ededed', - 'XProc': '#ededed', + 'XCompose': '#EDEDED', + 'XML': '#EDEDED', + 'XML Property List': '#EDEDED', + 'XPages': '#EDEDED', + 'XProc': '#EDEDED', 'XQuery': '#5232E7', - 'XS': '#ededed', + 'XS': '#EDEDED', 'XSLT': '#EB8CEB', - 'Xojo': '#ededed', - 'Xtend': '#ededed', - 'YAML': '#ededed', - 'YANG': '#ededed', + 'Xojo': '#EDEDED', + 'Xtend': '#EDEDED', + 'YAML': '#EDEDED', + 'YANG': '#EDEDED', 'YARA': '#220000', 'YASnippet': '#32AB90', 'Yacc': '#4B6C4B', 'ZAP': '#0D665E', 'ZIL': '#DC75E5', - 'Zeek': '#ededed', + 'Zeek': '#EDEDED', 'ZenScript': '#00BCD1', 'Zephir': '#118F9E', 'Zig': '#EC915C', - 'Zimpl': '#ededed', - 'cURL Config': '#ededed', - 'desktop': '#ededed', - 'dircolors': '#ededed', + 'Zimpl': '#EDEDED', + 'cURL Config': '#EDEDED', + 'desktop': '#EDEDED', + 'dircolors': '#EDEDED', 'eC': '#913960', - 'edn': '#ededed', - 'fish': '#ededed', + 'edn': '#EDEDED', + 'fish': '#EDEDED', 'mIRC Script': '#926059', 'mcfunction': '#E22837', - 'mupad': '#ededed', - 'nanorc': '#ededed', + 'mupad': '#EDEDED', + 'nanorc': '#EDEDED', 'nesC': '#94B0C7', 'ooc': '#B0B77E', 'q': '#0040CD', - 'reStructuredText': '#ededed', + 'reStructuredText': '#EDEDED', 'sed': '#64B970', 'wdl': '#42F1F4', 'wisp': '#7582D1', diff --git a/tool/language_color_generator.dart b/tool/language_color_generator.dart index 98ef9849..67afc165 100644 --- a/tool/language_color_generator.dart +++ b/tool/language_color_generator.dart @@ -23,7 +23,7 @@ Future main() async { for (var language in languages) { final color = - map[language]['color']?.toString()?.toUpperCase() ?? '#ededed'; + map[language]['color']?.toString()?.toUpperCase() ?? '#EDEDED'; language = language.replaceAll("'", "\\'"); From c1e298c879f692610b0eebb7d5d9adf84511a5c5 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sat, 8 Feb 2020 21:20:04 -0700 Subject: [PATCH 139/390] prep 6.1.2 --- CHANGELOG.md | 3 +++ pubspec.yaml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 33b05bf0..46a6dd73 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## 6.1.2 + - Update default language color to match github https://github.com/SpinlockLabs/github.dart/pull/208 + ## 6.1.1 - Use pedantic and address some lint https://github.com/SpinlockLabs/github.dart/pull/205 - Add missing download url for repos contents https://github.com/SpinlockLabs/github.dart/pull/206 diff --git a/pubspec.yaml b/pubspec.yaml index 13ff78f6..cb205cda 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 6.1.1 +version: 6.1.2 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From 25b7d671d5c44afc4ac525e2af54fdec3289a677 Mon Sep 17 00:00:00 2001 From: Rongjian Zhang Date: Wed, 19 Feb 2020 01:23:29 +0800 Subject: [PATCH 140/390] Add missing fields for Notification --- lib/src/common/model/notifications.dart | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/src/common/model/notifications.dart b/lib/src/common/model/notifications.dart index 8bebac43..85ae6af0 100644 --- a/lib/src/common/model/notifications.dart +++ b/lib/src/common/model/notifications.dart @@ -14,6 +14,8 @@ class Notification { this.unread, this.updatedAt, this.lastReadAt, + this.url, + this.subscriptionUrl, }); final String id; final Repository repository; @@ -27,6 +29,11 @@ class Notification { @JsonKey(name: 'last_read_at') final DateTime lastReadAt; + final String url; + + @JsonKey(name: 'subscription_url') + final String subscriptionUrl; + factory Notification.fromJson(Map input) => _$NotificationFromJson(input); } @@ -34,9 +41,13 @@ class Notification { /// Model class for a notification subject. @JsonSerializable(createToJson: false) class NotificationSubject { - NotificationSubject({this.title, this.type}); + NotificationSubject({this.title, this.type, this.url, this.latestCommentUrl}); final String title; final String type; + final String url; + + @JsonKey(name: 'latest_comment_url') + final String latestCommentUrl; factory NotificationSubject.fromJson(Map input) => _$NotificationSubjectFromJson(input); From d787a0aed60c1c92855c872c3c477eb0da7d27fa Mon Sep 17 00:00:00 2001 From: Rongjian Zhang Date: Wed, 19 Feb 2020 01:23:50 +0800 Subject: [PATCH 141/390] Run build_runner --- lib/src/common/model/notifications.g.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/src/common/model/notifications.g.dart b/lib/src/common/model/notifications.g.dart index 4564ca2a..b6fbf6fd 100644 --- a/lib/src/common/model/notifications.g.dart +++ b/lib/src/common/model/notifications.g.dart @@ -23,6 +23,8 @@ Notification _$NotificationFromJson(Map json) { lastReadAt: json['last_read_at'] == null ? null : DateTime.parse(json['last_read_at'] as String), + url: json['url'] as String, + subscriptionUrl: json['subscription_url'] as String, ); } @@ -30,5 +32,7 @@ NotificationSubject _$NotificationSubjectFromJson(Map json) { return NotificationSubject( title: json['title'] as String, type: json['type'] as String, + url: json['url'] as String, + latestCommentUrl: json['latest_comment_url'] as String, ); } From af73df4009fc7700be25320482bd3fb6bd1a5fc1 Mon Sep 17 00:00:00 2001 From: Aaron Lademann Date: Thu, 5 Mar 2020 09:32:24 -0700 Subject: [PATCH 142/390] Add support for creating draft PRs --- lib/src/common/model/pulls.dart | 12 +++++++++++- lib/src/common/model/pulls.g.dart | 2 ++ lib/src/common/pulls_service.dart | 10 ++++++++-- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/lib/src/common/model/pulls.dart b/lib/src/common/model/pulls.dart index 84117e64..2ea0365d 100644 --- a/lib/src/common/model/pulls.dart +++ b/lib/src/common/model/pulls.dart @@ -1,6 +1,7 @@ import 'package:github/src/common.dart'; import 'package:github/src/common/model/users.dart'; import 'package:json_annotation/json_annotation.dart'; +import 'package:meta/meta.dart'; part 'pulls.g.dart'; @@ -159,11 +160,20 @@ class PullRequestHead { /// Model class for a pull request to be created. @JsonSerializable(fieldRename: FieldRename.snake) class CreatePullRequest { - CreatePullRequest(this.title, this.head, this.base, {this.body}); + CreatePullRequest(this.title, this.head, this.base, + {this.draft = false, this.body}); final String title; final String head; final String base; + + /// Whether a draft PR should be created. + /// + /// This is currently experimental functionality since the way draft PRs are + /// created through Github's REST API is in developer preview only - and could change at any time. + @experimental + final bool draft; + String body; factory CreatePullRequest.fromJson(Map input) => diff --git a/lib/src/common/model/pulls.g.dart b/lib/src/common/model/pulls.g.dart index 77a75e49..bc9b1293 100644 --- a/lib/src/common/model/pulls.g.dart +++ b/lib/src/common/model/pulls.g.dart @@ -129,6 +129,7 @@ CreatePullRequest _$CreatePullRequestFromJson(Map json) { json['title'] as String, json['head'] as String, json['base'] as String, + draft: json['draft'] as bool, body: json['body'] as String, ); } @@ -138,6 +139,7 @@ Map _$CreatePullRequestToJson(CreatePullRequest instance) => 'title': instance.title, 'head': instance.head, 'base': instance.base, + 'draft': instance.draft, 'body': instance.body, }; diff --git a/lib/src/common/pulls_service.dart b/lib/src/common/pulls_service.dart index cf1dcd07..5fceb175 100644 --- a/lib/src/common/pulls_service.dart +++ b/lib/src/common/pulls_service.dart @@ -49,8 +49,14 @@ class PullRequestsService extends Service { /// /// API docs: https://developer.github.com/v3/pulls/#create-a-pull-request Future create(RepositorySlug slug, CreatePullRequest request) { - return github.postJSON('/repos/${slug.fullName}/pulls', - convert: (i) => PullRequest.fromJson(i), body: jsonEncode(request)); + return github.postJSON( + '/repos/${slug.fullName}/pulls', + convert: (i) => PullRequest.fromJson(i), + body: jsonEncode(request), + preview: request.draft + ? 'application/vnd.github.shadow-cat-preview+json' + : null, + ); } /// Edit a pull request. From 8dc7fd9ab28e1316d52ffdb5d32616ad3cb0bf6f Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Thu, 5 Mar 2020 10:14:54 -0700 Subject: [PATCH 143/390] prep 6.1.3 --- CHANGELOG.md | 4 ++++ pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 46a6dd73..1c2bfb1d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 6.1.3 + - Add missing fields for Notification https://github.com/SpinlockLabs/github.dart/pull/210 + - Can now create draft PRs https://github.com/SpinlockLabs/github.dart/pull/212 + ## 6.1.2 - Update default language color to match github https://github.com/SpinlockLabs/github.dart/pull/208 diff --git a/pubspec.yaml b/pubspec.yaml index cb205cda..23222056 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 6.1.2 +version: 6.1.3 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From 360433b89f8de72d3dcf5b6f70353dd02223eafe Mon Sep 17 00:00:00 2001 From: Axel Ogereau-Peltier <49279289+axel-op@users.noreply.github.com> Date: Mon, 9 Mar 2020 19:15:27 +0100 Subject: [PATCH 144/390] Add top-level GitHubJson class --- lib/src/common/activity_service.dart | 7 +++--- lib/src/common/gists_service.dart | 8 ++++--- lib/src/common/git_service.dart | 13 ++++++----- lib/src/common/issues_service.dart | 18 +++++++------- lib/src/common/misc_service.dart | 4 +++- lib/src/common/orgs_service.dart | 9 +++---- lib/src/common/pulls_service.dart | 9 +++---- lib/src/common/repos_service.dart | 35 ++++++++++++++-------------- lib/src/common/users_service.dart | 10 ++++---- lib/src/common/util/oauth2.dart | 3 ++- lib/src/json.dart | 23 ++++++++++++++++++ lib/src/server/hooks.dart | 3 ++- lib/src/util.dart | 4 ++-- test/data_object_test.dart | 3 ++- test/experiment/error_handling.dart | 4 ++-- test/git_test.dart | 13 ++++++----- 16 files changed, 102 insertions(+), 64 deletions(-) create mode 100644 lib/src/json.dart diff --git a/lib/src/common/activity_service.dart b/lib/src/common/activity_service.dart index 1a51a0cd..4bc15cbc 100644 --- a/lib/src/common/activity_service.dart +++ b/lib/src/common/activity_service.dart @@ -3,6 +3,7 @@ import 'dart:convert'; import 'package:github/src/common.dart'; import 'package:github/src/common/model/users.dart'; import 'package:github/src/common/util/pagination.dart'; +import 'package:github/src/json.dart'; import 'package:github/src/util.dart'; import 'package:http/http.dart' as http; @@ -158,7 +159,7 @@ class ActivityService extends Service { } return github - .request('PUT', '/notifications', body: jsonEncode(data)) + .request('PUT', '/notifications', body: GitHubJson.encode(data)) .then((response) { return response.statusCode == 205; }); @@ -180,7 +181,7 @@ class ActivityService extends Service { return github .request('PUT', '/repos/${slug.fullName}/notifications', - body: jsonEncode(data)) + body: GitHubJson.encode(data)) .then((response) { return response.statusCode == 205; }); @@ -311,7 +312,7 @@ class ActivityService extends Service { '/repos/${slug.fullName}/subscription', statusCode: StatusCodes.OK, convert: (i) => RepositorySubscription.fromJson(i), - body: jsonEncode(map), + body: GitHubJson.encode(map), ); } diff --git a/lib/src/common/gists_service.dart b/lib/src/common/gists_service.dart index 29d6d3bb..f8ff171a 100644 --- a/lib/src/common/gists_service.dart +++ b/lib/src/common/gists_service.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:convert'; import 'package:github/src/common.dart'; import 'package:github/src/common/util/pagination.dart'; +import 'package:github/src/json.dart'; /// The [GistsService] handles communication with gist /// methods of the GitHub API. @@ -76,7 +77,7 @@ class GistsService extends Service { return github.postJSON( '/gists', statusCode: 201, - body: jsonEncode(map), + body: GitHubJson.encode(map), convert: (i) => Gist.fromJson(i), ); } @@ -115,7 +116,7 @@ class GistsService extends Service { return github.postJSON( '/gists/$id', statusCode: 200, - body: jsonEncode(map), + body: GitHubJson.encode(map), convert: (i) => Gist.fromJson(i), ); } @@ -177,7 +178,8 @@ class GistsService extends Service { /// API docs: https://developer.github.com/v3/gists/comments/#create-a-comment Future createComment(String gistId, CreateGistComment request) { return github.postJSON('/gists/$gistId/comments', - body: jsonEncode(request), convert: (i) => GistComment.fromJson(i)); + body: GitHubJson.encode(request), + convert: (i) => GistComment.fromJson(i)); } // TODO: Implement editComment: https://developer.github.com/v3/gists/comments/#edit-a-comment diff --git a/lib/src/common/git_service.dart b/lib/src/common/git_service.dart index cdd0e708..83addf16 100644 --- a/lib/src/common/git_service.dart +++ b/lib/src/common/git_service.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:convert'; import 'package:github/src/common.dart'; import 'package:github/src/common/util/pagination.dart'; +import 'package:github/src/json.dart'; /// The [GitService] handles communication with git related methods of the /// GitHub API. @@ -24,7 +25,7 @@ class GitService extends Service { return github.postJSON('/repos/${slug.fullName}/git/blobs', convert: (i) => GitBlob.fromJson(i), statusCode: StatusCodes.CREATED, - body: jsonEncode(blob)); + body: GitHubJson.encode(blob)); } /// Fetches a commit from [slug] for a given [sha]. @@ -41,7 +42,7 @@ class GitService extends Service { return github.postJSON('/repos/${slug.fullName}/git/commits', convert: (i) => GitCommit.fromJson(i), statusCode: StatusCodes.CREATED, - body: jsonEncode(commit)); + body: GitHubJson.encode(commit)); } /// Fetches a reference from a repository for the given [ref]. @@ -81,7 +82,7 @@ class GitService extends Service { return github.postJSON('/repos/${slug.fullName}/git/refs', convert: (i) => GitReference.fromJson(i), statusCode: StatusCodes.CREATED, - body: jsonEncode({'ref': ref, 'sha': sha})); + body: GitHubJson.encode({'ref': ref, 'sha': sha})); } /// Updates a reference in a repository. @@ -93,7 +94,7 @@ class GitService extends Service { String sha, { bool force = false, }) { - final body = jsonEncode({'sha': sha, 'force': force}); + final body = GitHubJson.encode({'sha': sha, 'force': force}); // Somehow the reference updates PATCH request needs a valid content-length. final headers = {'content-length': body.length.toString()}; @@ -129,7 +130,7 @@ class GitService extends Service { github.postJSON('/repos/${slug.fullName}/git/tags', convert: (i) => GitTag.fromJson(i), statusCode: StatusCodes.CREATED, - body: jsonEncode(tag)); + body: GitHubJson.encode(tag)); /// Fetches a tree from a repository for the given ref [sha]. /// @@ -155,6 +156,6 @@ class GitService extends Service { return github.postJSON('/repos/${slug.fullName}/git/trees', convert: (j) => GitTree.fromJson(j), statusCode: StatusCodes.CREATED, - body: jsonEncode(tree)); + body: GitHubJson.encode(tree)); } } diff --git a/lib/src/common/issues_service.dart b/lib/src/common/issues_service.dart index cd4a84d6..af967ed5 100644 --- a/lib/src/common/issues_service.dart +++ b/lib/src/common/issues_service.dart @@ -4,6 +4,7 @@ import 'dart:convert'; import 'package:github/src/common.dart'; import 'package:github/src/common/model/users.dart'; import 'package:github/src/common/util/pagination.dart'; +import 'package:github/src/json.dart'; /// The [IssuesService] handles communication with issues related methods of the /// GitHub API. @@ -160,7 +161,7 @@ class IssuesService extends Service { RepositorySlug slug, int issueNumber, IssueRequest issue) async { return github .request('PATCH', '/repos/${slug.fullName}/issues/$issueNumber', - body: jsonEncode(issue)) + body: GitHubJson.encode(issue)) .then((response) { return Issue.fromJson(jsonDecode(response.body) as Map); }); @@ -180,7 +181,7 @@ class IssuesService extends Service { final response = await github.request( 'POST', '/repos/${slug.fullName}/issues', - body: jsonEncode(issue), + body: GitHubJson.encode(issue), ); if (StatusCodes.isClientError(response.statusCode)) { @@ -242,7 +243,7 @@ class IssuesService extends Service { /// API docs: https://developer.github.com/v3/issues/comments/#create-a-comment Future createComment( RepositorySlug slug, int issueNumber, String body) { - final it = jsonEncode({'body': body}); + final it = GitHubJson.encode({'body': body}); return github.postJSON( '/repos/${slug.fullName}/issues/$issueNumber/comments', body: it, @@ -285,7 +286,7 @@ class IssuesService extends Service { Future createLabel( RepositorySlug slug, String name, String color) { return github.postJSON('/repos/${slug.fullName}/labels', - body: jsonEncode({'name': name, 'color': color}), + body: GitHubJson.encode({'name': name, 'color': color}), convert: (i) => IssueLabel.fromJson(i)); } @@ -294,7 +295,7 @@ class IssuesService extends Service { /// API docs: https://developer.github.com/v3/issues/labels/#update-a-label Future editLabel(RepositorySlug slug, String name, String color) { return github.postJSON('/repos/${slug.fullName}/labels/$name', - body: jsonEncode({'name': name, 'color': color}), + body: GitHubJson.encode({'name': name, 'color': color}), convert: (i) => IssueLabel.fromJson(i)); } @@ -325,7 +326,7 @@ class IssuesService extends Service { RepositorySlug slug, int issueNumber, List labels) { return github.postJSON, List>( '/repos/${slug.fullName}/issues/$issueNumber/labels', - body: jsonEncode(labels), + body: GitHubJson.encode(labels), convert: (input) => input .cast>() .map((i) => IssueLabel.fromJson(i)) @@ -340,7 +341,7 @@ class IssuesService extends Service { RepositorySlug slug, int issueNumber, List labels) { return github .request('PUT', '/repos/${slug.fullName}/issues/$issueNumber/labels', - body: jsonEncode(labels)) + body: GitHubJson.encode(labels)) .then((response) { return jsonDecode(response.body) .map((Map it) => IssueLabel.fromJson(it)); @@ -385,7 +386,8 @@ class IssuesService extends Service { Future createMilestone( RepositorySlug slug, CreateMilestone request) { return github.postJSON('/repos/${slug.fullName}/milestones', - body: jsonEncode(request), convert: (i) => Milestone.fromJson(i)); + body: GitHubJson.encode(request), + convert: (i) => Milestone.fromJson(i)); } // TODO: Implement editMilestone: https://developer.github.com/v3/issues/milestones/#update-a-milestone diff --git a/lib/src/common/misc_service.dart b/lib/src/common/misc_service.dart index 754e3cc7..29abbab1 100644 --- a/lib/src/common/misc_service.dart +++ b/lib/src/common/misc_service.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'dart:convert'; import 'package:github/src/common.dart'; +import 'package:github/src/json.dart'; /// The [MiscService] handles communication with misc related methods of the /// GitHub API. @@ -47,7 +48,8 @@ class MiscService extends Service { {String mode = 'markdown', String context}) { return github .request('POST', '/markdown', - body: jsonEncode({'text': input, 'mode': mode, 'context': context})) + body: GitHubJson.encode( + {'text': input, 'mode': mode, 'context': context})) .then((response) { return response.body; }); diff --git a/lib/src/common/orgs_service.dart b/lib/src/common/orgs_service.dart index a9b700ad..f6a89ce8 100644 --- a/lib/src/common/orgs_service.dart +++ b/lib/src/common/orgs_service.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:convert'; import 'package:github/src/common.dart'; import 'package:github/src/common/util/pagination.dart'; +import 'package:github/src/json.dart'; import 'package:github/src/util.dart'; import 'package:http/http.dart' as http; @@ -68,7 +69,7 @@ class OrganizationsService extends Service { return github.postJSON('/orgs/$org', statusCode: 200, convert: (i) => Organization.fromJson(i), - body: jsonEncode(map)); + body: GitHubJson.encode(map)); } /// Lists all of the teams for the specified organization. @@ -103,7 +104,7 @@ class OrganizationsService extends Service { return github.postJSON('/orgs/$org/teams', statusCode: 201, convert: (i) => Team.fromJson(i), - body: jsonEncode(map)); + body: GitHubJson.encode(map)); } /// Edits a Team. @@ -121,7 +122,7 @@ class OrganizationsService extends Service { '/teams/$teamId', statusCode: 200, convert: (i) => Team.fromJson(i), - body: jsonEncode(map), + body: GitHubJson.encode(map), ); } @@ -259,7 +260,7 @@ class OrganizationsService extends Service { Future createHook(String org, CreateHook hook) { return github.postJSON('/orgs/$org/hooks', convert: (Map i) => Hook.fromJson(i)..repoName = org, - body: jsonEncode(hook)); + body: GitHubJson.encode(hook)); } // TODO: Implement editHook: https://developer.github.com/v3/orgs/hooks/#edit-a-hook diff --git a/lib/src/common/pulls_service.dart b/lib/src/common/pulls_service.dart index 5fceb175..ae39a004 100644 --- a/lib/src/common/pulls_service.dart +++ b/lib/src/common/pulls_service.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:convert'; import 'package:github/src/common.dart'; import 'package:github/src/common/util/pagination.dart'; +import 'package:github/src/json.dart'; import 'package:github/src/util.dart'; /// The [PullRequestsService] handles communication with pull request @@ -52,7 +53,7 @@ class PullRequestsService extends Service { return github.postJSON( '/repos/${slug.fullName}/pulls', convert: (i) => PullRequest.fromJson(i), - body: jsonEncode(request), + body: GitHubJson.encode(request), preview: request.draft ? 'application/vnd.github.shadow-cat-preview+json' : null, @@ -72,7 +73,7 @@ class PullRequestsService extends Service { return github .request('POST', '/repos/${slug.fullName}/pulls/$number', - body: jsonEncode(map)) + body: GitHubJson.encode(map)) .then((response) { return PullRequest.fromJson( jsonDecode(response.body) as Map); @@ -123,7 +124,7 @@ class PullRequestsService extends Service { return github .request('PUT', '/repos/${slug.fullName}/pulls/$number/merge', - body: jsonEncode(json)) + body: GitHubJson.encode(json)) .then((response) { return PullRequestMerge.fromJson( jsonDecode(response.body) as Map); @@ -157,7 +158,7 @@ class PullRequestsService extends Service { Future createComment( RepositorySlug slug, int number, CreatePullRequestComment comment) { return github.postJSON('/repos/${slug.fullName}/pulls/$number/comments', - body: jsonEncode(comment.toJson()), + body: GitHubJson.encode(comment.toJson()), convert: (i) => PullRequestComment.fromJson(i), statusCode: 201) as Future; } diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 2d8472ab..084c1fb8 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -4,6 +4,7 @@ import 'package:github/src/common.dart'; import 'package:github/src/common/model/repos_releases.dart'; import 'package:github/src/common/model/users.dart'; import 'package:github/src/common/util/pagination.dart'; +import 'package:github/src/json.dart'; import 'package:github/src/util.dart'; import 'package:http/http.dart' as http; import 'package:meta/meta.dart'; @@ -110,13 +111,13 @@ class RepositoriesService extends Service { if (org != null) { return github.postJSON, TeamRepository>( '/orgs/$org/repos', - body: jsonEncode(repository), + body: GitHubJson.encode(repository), convert: (i) => TeamRepository.fromJson(i), ); } else { return github.postJSON, Repository>( '/user/repos', - body: jsonEncode(repository), + body: GitHubJson.encode(repository), convert: (i) => Repository.fromJson(i), ); } @@ -179,7 +180,7 @@ class RepositoriesService extends Service { }); return github.postJSON( '/repos/${slug.fullName}', - body: jsonEncode(data), + body: GitHubJson.encode(data), statusCode: 200, ); } @@ -394,7 +395,7 @@ class RepositoriesService extends Service { }); return github.postJSON, CommitComment>( '/repos/${slug.fullName}/commits/${commit.sha}/comments', - body: jsonEncode(data), + body: GitHubJson.encode(data), statusCode: StatusCodes.CREATED, convert: (i) => CommitComment.fromJson(i), ); @@ -428,7 +429,7 @@ class RepositoriesService extends Service { ArgumentError.checkNotNull(body); return github.postJSON, CommitComment>( '/repos/${slug.fullName}/comments/$id', - body: jsonEncode(createNonNullMap({'body': body})), + body: GitHubJson.encode(createNonNullMap({'body': body})), statusCode: StatusCodes.OK, convert: (i) => CommitComment.fromJson(i), ); @@ -596,7 +597,7 @@ class RepositoriesService extends Service { final response = await github.request( 'PUT', '/repos/${slug.fullName}/contents/${file.path}', - body: jsonEncode(file), + body: GitHubJson.encode(file), ); return ContentCreation.fromJson( jsonDecode(response.body) as Map); @@ -619,7 +620,7 @@ class RepositoriesService extends Service { final response = await github.request( 'PUT', '/repos/${slug.fullName}/contents/$path', - body: jsonEncode(map), + body: GitHubJson.encode(map), ); return ContentCreation.fromJson( jsonDecode(response.body) as Map); @@ -637,7 +638,7 @@ class RepositoriesService extends Service { final response = await github.request( 'DELETE', '/repos/${slug.fullName}/contents/$path', - body: jsonEncode(map), + body: GitHubJson.encode(map), statusCode: StatusCodes.OK, ); return ContentCreation.fromJson( @@ -680,7 +681,7 @@ class RepositoriesService extends Service { fork ??= CreateFork(); return github.postJSON, Repository>( '/repos/${slug.fullName}/forks', - body: jsonEncode(fork), + body: GitHubJson.encode(fork), convert: (i) => Repository.fromJson(i), ); } @@ -718,7 +719,7 @@ class RepositoriesService extends Service { return github.postJSON, Hook>( '/repos/${slug.fullName}/hooks', convert: (i) => Hook.fromJson(i)..repoName = slug.fullName, - body: jsonEncode(hook), + body: GitHubJson.encode(hook), ); } @@ -758,7 +759,7 @@ class RepositoriesService extends Service { '/repos/${slug.fullName}/hooks/${hookToEdit.id.toString()}', statusCode: StatusCodes.OK, convert: (i) => Hook.fromJson(i)..repoName = slug.fullName, - body: jsonEncode(createNonNullMap({ + body: GitHubJson.encode(createNonNullMap({ 'active': active ?? hookToEdit.active, 'events': events ?? hookToEdit.events, 'add_events': addEvents, @@ -854,7 +855,7 @@ class RepositoriesService extends Service { ArgumentError.checkNotNull(key); return github.postJSON, PublicKey>( '/repos/${slug.fullName}/keys', - body: jsonEncode(key), + body: GitHubJson.encode(key), statusCode: StatusCodes.CREATED, convert: (i) => PublicKey.fromJson(i), ); @@ -884,7 +885,7 @@ class RepositoriesService extends Service { ArgumentError.checkNotNull(merge); return github.postJSON, RepositoryCommit>( '/repos/${slug.fullName}/merges', - body: jsonEncode(merge), + body: GitHubJson.encode(merge), convert: (i) => RepositoryCommit.fromJson(i), statusCode: StatusCodes.CREATED, ); @@ -975,7 +976,7 @@ class RepositoriesService extends Service { final release = await github.postJSON, Release>( '/repos/${slug.fullName}/releases', convert: (i) => Release.fromJson(i), - body: jsonEncode(createRelease.toJson()), + body: GitHubJson.encode(createRelease.toJson()), ); if (release.hasErrors) { final alreadyExistsErrorCode = release.errors.firstWhere( @@ -1020,7 +1021,7 @@ class RepositoriesService extends Service { ArgumentError.checkNotNull(releaseToEdit); return github.postJSON, Release>( '/repos/${slug.fullName}/releases/${releaseToEdit.id.toString()}', - body: jsonEncode(createNonNullMap({ + body: GitHubJson.encode(createNonNullMap({ 'tag_name': tagName ?? releaseToEdit.tagName, 'target_commitish': targetCommitish ?? releaseToEdit.targetCommitish, 'name': name ?? releaseToEdit.name, @@ -1092,7 +1093,7 @@ class RepositoriesService extends Service { '/repos/${slug.fullName}/releases/assets/${assetToEdit.id}', statusCode: StatusCodes.OK, convert: (i) => ReleaseAsset.fromJson(i), - body: jsonEncode(createNonNullMap({ + body: GitHubJson.encode(createNonNullMap({ 'name': name ?? assetToEdit.name, 'label': label ?? assetToEdit.label, })), @@ -1236,7 +1237,7 @@ class RepositoriesService extends Service { ArgumentError.checkNotNull(request); return github.postJSON, RepositoryStatus>( '/repos/${slug.fullName}/statuses/$ref', - body: jsonEncode(request), + body: GitHubJson.encode(request), convert: (i) => RepositoryStatus.fromJson(i), ); } diff --git a/lib/src/common/users_service.dart b/lib/src/common/users_service.dart index 238affd4..a7c3aef6 100644 --- a/lib/src/common/users_service.dart +++ b/lib/src/common/users_service.dart @@ -1,8 +1,8 @@ import 'dart:async'; -import 'dart:convert'; import 'package:github/src/common.dart'; import 'package:github/src/common/model/users.dart'; import 'package:github/src/common/util/pagination.dart'; +import 'package:github/src/json.dart'; import 'package:github/src/util.dart'; import 'package:http/http.dart' as http; @@ -42,7 +42,7 @@ class UsersService extends Service { return github.postJSON( '/user', - body: jsonEncode(map), + body: GitHubJson.encode(map), statusCode: 200, convert: (i) => CurrentUser.fromJson(i), ); @@ -95,14 +95,14 @@ class UsersService extends Service { /// API docs: https://developer.github.com/v3/users/emails/#add-email-addresses Stream addEmails(List emails) => PaginationHelper(github) .objects('POST', '/user/emails', (i) => UserEmail.fromJson(i), - statusCode: 201, body: jsonEncode(emails)); + statusCode: 201, body: GitHubJson.encode(emails)); /// Delete Emails /// /// API docs: https://developer.github.com/v3/users/emails/#delete-email-addresses Future deleteEmails(List emails) => github .request('DELETE', '/user/emails', - body: jsonEncode(emails), statusCode: 204) + body: GitHubJson.encode(emails), statusCode: 204) .then((x) => x.statusCode == 204); /// List user followers. @@ -166,7 +166,7 @@ class UsersService extends Service { /// /// API docs: https://developer.github.com/v3/users/keys/#create-a-public-key Future createPublicKey(CreatePublicKey key) { - return github.postJSON('/user/keys', body: jsonEncode(key)) + return github.postJSON('/user/keys', body: GitHubJson.encode(key)) as Future; } diff --git a/lib/src/common/util/oauth2.dart b/lib/src/common/util/oauth2.dart index 48864720..829ffad2 100644 --- a/lib/src/common/util/oauth2.dart +++ b/lib/src/common/util/oauth2.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'dart:convert'; import 'package:github/src/common.dart'; +import 'package:github/src/json.dart'; import 'package:github/src/util.dart'; import 'package:http/http.dart' as http; @@ -76,7 +77,7 @@ class OAuth2Flow { headers['Origin'] = origin; } - final body = jsonEncode({ + final body = GitHubJson.encode({ 'client_id': clientId, 'client_secret': clientSecret, 'code': code, diff --git a/lib/src/json.dart b/lib/src/json.dart new file mode 100644 index 00000000..fb072d00 --- /dev/null +++ b/lib/src/json.dart @@ -0,0 +1,23 @@ +import 'dart:convert'; + +import 'package:github/src/common/util/utils.dart'; +import 'package:github/src/util.dart'; + +class GitHubJson { + GitHubJson._(); + + static dynamic _toEncodable(dynamic object) { + if (object is DateTime) { + return dateToGitHubIso8601(object); + } + return object.toJson(); + } + + static String encode(Object object, {String indent}) { + final encoder = JsonEncoder.withIndent(indent, _toEncodable); + if (object is Map) { + object = createNonNullMap(object); + } + return encoder.convert(object); + } +} diff --git a/lib/src/server/hooks.dart b/lib/src/server/hooks.dart index f72ef7e8..e49f8f3d 100644 --- a/lib/src/server/hooks.dart +++ b/lib/src/server/hooks.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'dart:convert'; import 'dart:io'; +import 'package:github/src/json.dart'; import 'package:json_annotation/json_annotation.dart'; import '../common.dart'; @@ -32,7 +33,7 @@ class HookMiddleware { request.headers.value('X-GitHub-Event'), jsonDecode(content) as Map)); request.response - ..write(jsonEncode({'handled': _eventController.hasListener})) + ..write(GitHubJson.encode({'handled': _eventController.hasListener})) ..close(); }); } diff --git a/lib/src/util.dart b/lib/src/util.dart index 60aa420a..d9553ead 100644 --- a/lib/src/util.dart +++ b/lib/src/util.dart @@ -65,8 +65,8 @@ DateTime parseDateTime(String input) { return DateTime.parse(input); } -Map createNonNullMap(Map input) { - final map = {}; +Map createNonNullMap(Map input) { + final map = {}; for (final key in input.keys) { if (input[key] != null) { map[key] = input[key]; diff --git a/test/data_object_test.dart b/test/data_object_test.dart index 80b2a492..c80029d9 100644 --- a/test/data_object_test.dart +++ b/test/data_object_test.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:github/src/json.dart'; import 'package:test/test.dart'; import 'package:github/github.dart'; @@ -41,4 +42,4 @@ void main() { }); } -String _prettyEncode(obj) => const JsonEncoder.withIndent(' ').convert(obj); +String _prettyEncode(obj) => GitHubJson.encode(obj, indent: ' '); diff --git a/test/experiment/error_handling.dart b/test/experiment/error_handling.dart index e2b9c91e..76d29d20 100644 --- a/test/experiment/error_handling.dart +++ b/test/experiment/error_handling.dart @@ -1,14 +1,14 @@ -import 'dart:convert'; import 'dart:io'; import 'package:github/github.dart'; +import 'package:github/src/json.dart'; import '../helper/http.dart'; void main() { final github = GitHub(); final response = MockResponse( - jsonEncode({ + GitHubJson.encode({ 'message': 'Invalid Entity', 'errors': [ { diff --git a/test/git_test.dart b/test/git_test.dart index 336c1a54..0f191757 100644 --- a/test/git_test.dart +++ b/test/git_test.dart @@ -1,7 +1,8 @@ import 'dart:async'; -import 'dart:convert' show jsonEncode, jsonDecode; +import 'dart:convert'; import 'package:github/src/common.dart'; +import 'package:github/src/json.dart'; import 'package:github/src/util.dart'; import 'package:http/http.dart' as http; import 'package:mockito/mockito.dart'; @@ -39,7 +40,7 @@ void main() { '/repos/o/n/git/blobs', convert: (i) => GitBlob.fromJson(i), statusCode: StatusCodes.CREATED, - body: jsonEncode(blob), + body: GitHubJson.encode(blob), )); }); @@ -71,7 +72,7 @@ void main() { '/repos/o/n/git/commits', convert: (i) => GitCommit.fromJson(i), statusCode: StatusCodes.CREATED, - body: jsonEncode(commit), + body: GitHubJson.encode(commit), )); }); @@ -119,7 +120,7 @@ void main() { verify(github.postJSON('/repos/o/n/git/refs', convert: (i) => GitReference.fromJson(i), statusCode: StatusCodes.CREATED, - body: jsonEncode({'ref': someRef, 'sha': someSha}))); + body: GitHubJson.encode({'ref': someRef, 'sha': someSha}))); }); test('creates valid JSON body', () { @@ -206,7 +207,7 @@ void main() { verify(github.postJSON('/repos/o/n/git/tags', convert: (i) => GitTag.fromJson(i), statusCode: StatusCodes.CREATED, - body: jsonEncode(createGitTag))); + body: GitHubJson.encode(createGitTag))); }); test('creates valid JSON body', () { @@ -247,7 +248,7 @@ void main() { verify(github.postJSON('/repos/o/n/git/trees', convert: (j) => GitTree.fromJson(j), statusCode: StatusCodes.CREATED, - body: jsonEncode(createGitTree))); + body: GitHubJson.encode(createGitTree))); }); test('with sha creates valid JSON body', () { From ab649987eacd4084551852dce1f803a082f4ead2 Mon Sep 17 00:00:00 2001 From: Axel Ogereau-Peltier <49279289+axel-op@users.noreply.github.com> Date: Mon, 9 Mar 2020 21:37:37 +0100 Subject: [PATCH 145/390] Add recursivity for createNonNullMap --- lib/src/util.dart | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/src/util.dart b/lib/src/util.dart index d9553ead..0256da46 100644 --- a/lib/src/util.dart +++ b/lib/src/util.dart @@ -65,11 +65,16 @@ DateTime parseDateTime(String input) { return DateTime.parse(input); } -Map createNonNullMap(Map input) { +/// Returns a new map containing only the entries of [input] whose value is not null. +/// +/// If [recursive] is true, nested maps are also filtered. +Map createNonNullMap(Map input, {bool recursive = true}) { final map = {}; - for (final key in input.keys) { - if (input[key] != null) { - map[key] = input[key]; + for (final entry in input.entries) { + if (entry.value != null) { + map[entry.key] = recursive && entry.value is Map + ? createNonNullMap(entry.value as Map, recursive: recursive) + : entry.value; } } return map; From 71cd57f9fd5b8549b95e4a4af66ea704e7c27d05 Mon Sep 17 00:00:00 2001 From: Axel Ogereau-Peltier <49279289+axel-op@users.noreply.github.com> Date: Tue, 10 Mar 2020 13:52:26 +0100 Subject: [PATCH 146/390] Encode maps in lists as non-null maps --- lib/src/common/misc_service.dart | 1 - lib/src/json.dart | 7 ++++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/src/common/misc_service.dart b/lib/src/common/misc_service.dart index 29abbab1..0a60b8da 100644 --- a/lib/src/common/misc_service.dart +++ b/lib/src/common/misc_service.dart @@ -1,5 +1,4 @@ import 'dart:async'; -import 'dart:convert'; import 'package:github/src/common.dart'; import 'package:github/src/json.dart'; diff --git a/lib/src/json.dart b/lib/src/json.dart index fb072d00..8b43a4cb 100644 --- a/lib/src/json.dart +++ b/lib/src/json.dart @@ -16,7 +16,12 @@ class GitHubJson { static String encode(Object object, {String indent}) { final encoder = JsonEncoder.withIndent(indent, _toEncodable); if (object is Map) { - object = createNonNullMap(object); + object = createNonNullMap(object as Map, recursive: true); + } + if (object is List) { + object = (object as List) + .map((e) => e is Map ? createNonNullMap(e, recursive: true) : e) + .toList(); } return encoder.convert(object); } From 72ed027785328b619dedac0fd6b601c161a989fc Mon Sep 17 00:00:00 2001 From: Axel Ogereau-Peltier <49279289+axel-op@users.noreply.github.com> Date: Tue, 10 Mar 2020 14:00:23 +0100 Subject: [PATCH 147/390] Checks maps in nested lists --- lib/src/json.dart | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/lib/src/json.dart b/lib/src/json.dart index 8b43a4cb..21521b65 100644 --- a/lib/src/json.dart +++ b/lib/src/json.dart @@ -19,10 +19,22 @@ class GitHubJson { object = createNonNullMap(object as Map, recursive: true); } if (object is List) { - object = (object as List) - .map((e) => e is Map ? createNonNullMap(e, recursive: true) : e) - .toList(); + object = _parseList(object as List); } return encoder.convert(object); } + + /// Maps maps in input to non-null maps. + /// Also checks nested lists. + static List _parseList(List input) { + return input.map((e) { + if (e is Map) { + return createNonNullMap(e, recursive: true); + } + if (e is List) { + return _parseList(e); + } + return e; + }).toList(); + } } From 3befab802bd78dde63cf0ea2b85a4cca1a6f317e Mon Sep 17 00:00:00 2001 From: Axel Ogereau-Peltier <49279289+axel-op@users.noreply.github.com> Date: Wed, 11 Mar 2020 01:30:51 +0100 Subject: [PATCH 148/390] Check object after calling toJson --- lib/src/json.dart | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/lib/src/json.dart b/lib/src/json.dart index 21521b65..193bf495 100644 --- a/lib/src/json.dart +++ b/lib/src/json.dart @@ -10,31 +10,21 @@ class GitHubJson { if (object is DateTime) { return dateToGitHubIso8601(object); } - return object.toJson(); + return _checkObject(object.toJson()); } static String encode(Object object, {String indent}) { final encoder = JsonEncoder.withIndent(indent, _toEncodable); + return encoder.convert(_checkObject(object)); + } + + static dynamic _checkObject(dynamic object) { if (object is Map) { - object = createNonNullMap(object as Map, recursive: true); + return createNonNullMap(object, recursive: true); } if (object is List) { - object = _parseList(object as List); + return object.map(_checkObject).toList(); } - return encoder.convert(object); - } - - /// Maps maps in input to non-null maps. - /// Also checks nested lists. - static List _parseList(List input) { - return input.map((e) { - if (e is Map) { - return createNonNullMap(e, recursive: true); - } - if (e is List) { - return _parseList(e); - } - return e; - }).toList(); + return object; } } From b73f214eecb14710e4aeb0025b6a99ffbf3d9afc Mon Sep 17 00:00:00 2001 From: Axel Ogereau-Peltier <49279289+axel-op@users.noreply.github.com> Date: Wed, 11 Mar 2020 23:41:18 +0100 Subject: [PATCH 149/390] Add documentation for GitHubJson --- lib/src/json.dart | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/lib/src/json.dart b/lib/src/json.dart index 193bf495..6dcc28be 100644 --- a/lib/src/json.dart +++ b/lib/src/json.dart @@ -1,23 +1,47 @@ import 'dart:convert'; import 'package:github/src/common/util/utils.dart'; -import 'package:github/src/util.dart'; +/// Internal class for Json encoding +/// that should be used instead of `dart:convert`. +/// +/// It contains methods that ensures that converted Json +/// will work with the GitHub API. class GitHubJson { - GitHubJson._(); + const GitHubJson._(); + /// Called only if an object is of a non primitive type. + /// + /// If [object] is a [DateTime], it converts it to a String whose format is compatible with the API. + /// Else, it uses the default behavior of [JsonEncoder] which is to call `toJson` method onto [object]. + /// + /// If [object] is not a [DateTime] and don't have a `toJson` method, an exception will be thrown + /// but handled by [JsonEncoder]. + /// Do not catch it. static dynamic _toEncodable(dynamic object) { if (object is DateTime) { return dateToGitHubIso8601(object); } + // `toJson` could return a [Map] or a [List], + // so we have to delete null values in them. return _checkObject(object.toJson()); } + /// Encodes [object] to a Json String compatible with the GitHub API. + /// It should be used instead of `jsonEncode`. + /// + /// Equivalent to `jsonEncode` except that + /// it converts [DateTime] to a proper String for the GitHub API, + /// and it also deletes keys associated with null values in maps before converting them. + /// + /// The obtained String can be decoded using `jsonDecode`. static String encode(Object object, {String indent}) { final encoder = JsonEncoder.withIndent(indent, _toEncodable); return encoder.convert(_checkObject(object)); } + /// Deletes keys associated with null values + /// in every map contained in [object]. static dynamic _checkObject(dynamic object) { if (object is Map) { return createNonNullMap(object, recursive: true); From 9fe5a311c238ee4576cb387bad3b09a6b1f7f1f6 Mon Sep 17 00:00:00 2001 From: Axel Ogereau-Peltier <49279289+axel-op@users.noreply.github.com> Date: Thu, 12 Mar 2020 00:03:04 +0100 Subject: [PATCH 150/390] Delete MapEntry class that conflicts with native libraries --- lib/src/util.dart | 7 ------- 1 file changed, 7 deletions(-) diff --git a/lib/src/util.dart b/lib/src/util.dart index 0256da46..633f9d02 100644 --- a/lib/src/util.dart +++ b/lib/src/util.dart @@ -49,13 +49,6 @@ List> mapToList(Map input) { return out; } -class MapEntry { - final K key; - final V value; - - MapEntry(this.key, this.value); -} - /// Internal method to handle null for parsing dates. DateTime parseDateTime(String input) { if (input == null) { From 1513308a7c1de8bab23624dfa698a2343c16c28d Mon Sep 17 00:00:00 2001 From: Axel Ogereau-Peltier <49279289+axel-op@users.noreply.github.com> Date: Thu, 12 Mar 2020 00:03:52 +0100 Subject: [PATCH 151/390] Use own logic in GitHubJson to parse maps in lists in maps --- lib/src/json.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/src/json.dart b/lib/src/json.dart index 6dcc28be..e0d021dd 100644 --- a/lib/src/json.dart +++ b/lib/src/json.dart @@ -44,7 +44,9 @@ class GitHubJson { /// in every map contained in [object]. static dynamic _checkObject(dynamic object) { if (object is Map) { - return createNonNullMap(object, recursive: true); + return Map.fromEntries(object.entries + .where((e) => e.value != null) + .map((e) => MapEntry(e.key, _checkObject(e.value)))); } if (object is List) { return object.map(_checkObject).toList(); From 2df0962b7b4f20951cc785789c831a7b694be798 Mon Sep 17 00:00:00 2001 From: Rongjian Zhang Date: Mon, 6 Apr 2020 12:12:54 +0800 Subject: [PATCH 152/390] Fix follow user: POST -> PUT --- lib/src/common/users_service.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/src/common/users_service.dart b/lib/src/common/users_service.dart index 238affd4..4d63addf 100644 --- a/lib/src/common/users_service.dart +++ b/lib/src/common/users_service.dart @@ -125,9 +125,11 @@ class UsersService extends Service { }); /// Follows a user. + /// + /// https://developer.github.com/v3/users/followers/#follow-a-user Future followUser(String user) { return github - .request('POST', '/user/following/$user', statusCode: 204) + .request('PUT', '/user/following/$user', statusCode: 204) .then((response) { return response.statusCode == 204; }); From ef4f95d09f2ecf9a5eedae0f144a0de126d75500 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sat, 11 Apr 2020 09:12:12 -0600 Subject: [PATCH 153/390] Fix clone Urls --- lib/src/common/model/repos.dart | 26 ++++++++++++++++++++------ lib/src/common/model/repos.g.dart | 12 ++++++++---- lib/src/common/repos_service.dart | 4 ++-- 3 files changed, 30 insertions(+), 12 deletions(-) diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart index 93c7e073..64f462ef 100644 --- a/lib/src/common/model/repos.dart +++ b/lib/src/common/model/repos.dart @@ -35,7 +35,7 @@ class GitHubComparison { } /// Model class for a repository. -@JsonSerializable() +@JsonSerializable(fieldRename: FieldRename.snake) class Repository { Repository({ this.name, @@ -46,7 +46,10 @@ class Repository { this.isFork, this.htmlUrl, this.description, - this.cloneUrls, + this.cloneUrl, + this.gitUrl, + this.sshUrl, + this.svnUrl, this.homepage, this.size, this.stargazersCount, @@ -75,7 +78,6 @@ class Repository { final int id; /// Full Repository Name - @JsonKey(name: 'full_name') final String fullName; /// Repository Owner @@ -90,15 +92,26 @@ class Repository { final bool isFork; /// Url to the GitHub Repository Page - @JsonKey(name: 'html_url') final String htmlUrl; /// Repository Description final String description; + // https clone URL + final String cloneUrl; + + final String sshUrl; + + final String svnUrl; + + final String gitUrl; + /// Repository Clone Urls - @JsonKey(name: 'clone_urls') - final CloneUrls cloneUrls; + CloneUrls _cloneUrls; + + CloneUrls get cloneUrls { + return _cloneUrls ??= CloneUrls(gitUrl, sshUrl, cloneUrl, svnUrl); + } /// Url to the Repository Homepage final String homepage; @@ -177,6 +190,7 @@ class Repository { } /// Repository Clone Urls +@Deprecated("These URLs are available on the Repository class") @JsonSerializable() class CloneUrls { /// Git Protocol diff --git a/lib/src/common/model/repos.g.dart b/lib/src/common/model/repos.g.dart index be70989b..4a147535 100644 --- a/lib/src/common/model/repos.g.dart +++ b/lib/src/common/model/repos.g.dart @@ -28,9 +28,10 @@ Repository _$RepositoryFromJson(Map json) { isFork: json['fork'] as bool, htmlUrl: json['html_url'] as String, description: json['description'] as String, - cloneUrls: json['clone_urls'] == null - ? null - : CloneUrls.fromJson(json['clone_urls'] as Map), + cloneUrl: json['clone_url'] as String, + gitUrl: json['git_url'] as String, + sshUrl: json['ssh_url'] as String, + svnUrl: json['svn_url'] as String, homepage: json['homepage'] as String, size: json['size'] as int, stargazersCount: json['stargazers_count'] as int, @@ -71,7 +72,10 @@ Map _$RepositoryToJson(Repository instance) => 'fork': instance.isFork, 'html_url': instance.htmlUrl, 'description': instance.description, - 'clone_urls': instance.cloneUrls, + 'clone_url': instance.cloneUrl, + 'ssh_url': instance.sshUrl, + 'svn_url': instance.svnUrl, + 'git_url': instance.gitUrl, 'homepage': instance.homepage, 'size': instance.size, 'stargazers_count': instance.stargazersCount, diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 2d8472ab..cb743d88 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -38,7 +38,7 @@ class RepositoriesService extends Service { /// Lists the repositories of the user specified by [user] in a streamed fashion. /// - /// API docs: https://developer.github.com/v3/repos/#list-user-repositories + /// API docs: https://developer.github.com/v3/repos/#list-repositories-for-a-user Stream listUserRepositories(String user, {String type = 'owner', String sort = 'full_name', @@ -60,7 +60,7 @@ class RepositoriesService extends Service { /// List repositories for the specified [org]. /// - /// API docs: https://developer.github.com/v3/repos/#list-user-repositories + /// API docs: https://developer.github.com/v3/repos/#list-organization-repositories Stream listOrganizationRepositories(String org, {String type = 'all'}) { ArgumentError.checkNotNull(org); From 5b5d7656ce9ce1cb06e15651da06e7e192bc19e1 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sat, 11 Apr 2020 13:06:24 -0600 Subject: [PATCH 154/390] Fix setRepositorySubscription to be a PUT instead of a POST --- lib/src/common/activity_service.dart | 2 +- lib/src/common/github.dart | 42 ++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/lib/src/common/activity_service.dart b/lib/src/common/activity_service.dart index 1a51a0cd..1b62a040 100644 --- a/lib/src/common/activity_service.dart +++ b/lib/src/common/activity_service.dart @@ -307,7 +307,7 @@ class ActivityService extends Service { final map = createNonNullMap({'subscribed': subscribed, 'ignored': ignored}); - return github.postJSON( + return github.putJSON( '/repos/${slug.fullName}/subscription', statusCode: StatusCodes.OK, convert: (i) => RepositorySubscription.fromJson(i), diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index 75784d2e..1151704c 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -211,6 +211,48 @@ class GitHub { preview: preview, ); + /// Handles PUT Requests that respond with JSON + /// + /// [path] can either be a path like '/repos' or a full url. + /// [statusCode] is the expected status code. If it is null, it is ignored. + /// If the status code that the response returns is not the status code you provide + /// then the [fail] function will be called with the HTTP Response. + /// + /// If you don't throw an error or break out somehow, it will go into some error checking + /// that throws exceptions when it finds a 404 or 401. If it doesn't find a general HTTP Status Code + /// for errors, it throws an Unknown Error. + /// + /// [headers] are HTTP Headers. If it doesn't exist, the 'Accept' and 'Authorization' headers are added. + /// [params] are query string parameters. + /// [convert] is a simple function that is passed this [GitHub] instance and a JSON object. + /// + /// The future will pass the object returned from this function to the then method. + /// The default [convert] function returns the input object. + /// [body] is the data to send to the server. Pass in a List if you want to post binary body data. Everything else will have .toString() called on it and set as text content + /// [S] represents the input type. + /// [T] represents the type return from this function after conversion + Future putJSON( + String path, { + int statusCode, + void Function(http.Response response) fail, + Map headers, + Map params, + JSONConverter convert, + dynamic body, + String preview, + }) => + _requestJson( + 'PUT', + path, + statusCode: statusCode, + fail: fail, + headers: headers, + params: params, + convert: convert, + body: body, + preview: preview, + ); + Future _requestJson( String method, String path, { From 16fb464c4d977e0266943f94a931c32b23f2f181 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sat, 11 Apr 2020 14:15:35 -0600 Subject: [PATCH 155/390] Consolidate 2 json.dart files into 1. make new GithubJson part of common. --- CHANGELOG.md | 5 +++ lib/src/common/activity_service.dart | 1 - lib/src/common/gists_service.dart | 1 - lib/src/common/git_service.dart | 1 - lib/src/common/issues_service.dart | 1 - lib/src/common/misc_service.dart | 1 - lib/src/common/model/repos.dart | 2 +- lib/src/common/orgs_service.dart | 1 - lib/src/common/pulls_service.dart | 1 - lib/src/common/repos_service.dart | 1 - lib/src/common/users_service.dart | 1 - lib/src/common/util/json.dart | 59 ++++++++++++++++++++++++++++ lib/src/common/util/oauth2.dart | 1 - lib/src/json.dart | 56 -------------------------- lib/src/server/hooks.dart | 1 - test/data_object_test.dart | 1 - test/experiment/error_handling.dart | 1 - test/git_test.dart | 1 - 18 files changed, 65 insertions(+), 71 deletions(-) delete mode 100644 lib/src/json.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index 1c2bfb1d..39125c1b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## 6.2.0 + - Bug fix: Fix setRepositorySubscription to be a PUT instead of a POST https://github.com/SpinlockLabs/github.dart/commit/5b5d7656ce9ce1cb06e15651da06e7e192bc19e1 + - Bug fix: Repository clone URLs were null. DEPRECATED `Repository.cloneUrls` use `cloneUrl`,`gitUrl`,`sshUrl`, or `svnUrl` instead. + - Bug fix: Use a shared json encoder util to remove nulls from maps and lists, encode all dates for github. https://github.com/SpinlockLabs/github.dart/pull/182 + ## 6.1.3 - Add missing fields for Notification https://github.com/SpinlockLabs/github.dart/pull/210 - Can now create draft PRs https://github.com/SpinlockLabs/github.dart/pull/212 diff --git a/lib/src/common/activity_service.dart b/lib/src/common/activity_service.dart index 746df3a3..537234ef 100644 --- a/lib/src/common/activity_service.dart +++ b/lib/src/common/activity_service.dart @@ -3,7 +3,6 @@ import 'dart:convert'; import 'package:github/src/common.dart'; import 'package:github/src/common/model/users.dart'; import 'package:github/src/common/util/pagination.dart'; -import 'package:github/src/json.dart'; import 'package:github/src/util.dart'; import 'package:http/http.dart' as http; diff --git a/lib/src/common/gists_service.dart b/lib/src/common/gists_service.dart index f8ff171a..89b266bf 100644 --- a/lib/src/common/gists_service.dart +++ b/lib/src/common/gists_service.dart @@ -2,7 +2,6 @@ import 'dart:async'; import 'dart:convert'; import 'package:github/src/common.dart'; import 'package:github/src/common/util/pagination.dart'; -import 'package:github/src/json.dart'; /// The [GistsService] handles communication with gist /// methods of the GitHub API. diff --git a/lib/src/common/git_service.dart b/lib/src/common/git_service.dart index 83addf16..a6d9e98c 100644 --- a/lib/src/common/git_service.dart +++ b/lib/src/common/git_service.dart @@ -2,7 +2,6 @@ import 'dart:async'; import 'dart:convert'; import 'package:github/src/common.dart'; import 'package:github/src/common/util/pagination.dart'; -import 'package:github/src/json.dart'; /// The [GitService] handles communication with git related methods of the /// GitHub API. diff --git a/lib/src/common/issues_service.dart b/lib/src/common/issues_service.dart index af967ed5..db412d17 100644 --- a/lib/src/common/issues_service.dart +++ b/lib/src/common/issues_service.dart @@ -4,7 +4,6 @@ import 'dart:convert'; import 'package:github/src/common.dart'; import 'package:github/src/common/model/users.dart'; import 'package:github/src/common/util/pagination.dart'; -import 'package:github/src/json.dart'; /// The [IssuesService] handles communication with issues related methods of the /// GitHub API. diff --git a/lib/src/common/misc_service.dart b/lib/src/common/misc_service.dart index 0a60b8da..9ccc289b 100644 --- a/lib/src/common/misc_service.dart +++ b/lib/src/common/misc_service.dart @@ -1,6 +1,5 @@ import 'dart:async'; import 'package:github/src/common.dart'; -import 'package:github/src/json.dart'; /// The [MiscService] handles communication with misc related methods of the /// GitHub API. diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart index 64f462ef..59b2e27d 100644 --- a/lib/src/common/model/repos.dart +++ b/lib/src/common/model/repos.dart @@ -190,7 +190,7 @@ class Repository { } /// Repository Clone Urls -@Deprecated("These URLs are available on the Repository class") +@Deprecated('These URLs are available on the Repository class') @JsonSerializable() class CloneUrls { /// Git Protocol diff --git a/lib/src/common/orgs_service.dart b/lib/src/common/orgs_service.dart index f6a89ce8..273ac510 100644 --- a/lib/src/common/orgs_service.dart +++ b/lib/src/common/orgs_service.dart @@ -2,7 +2,6 @@ import 'dart:async'; import 'dart:convert'; import 'package:github/src/common.dart'; import 'package:github/src/common/util/pagination.dart'; -import 'package:github/src/json.dart'; import 'package:github/src/util.dart'; import 'package:http/http.dart' as http; diff --git a/lib/src/common/pulls_service.dart b/lib/src/common/pulls_service.dart index ae39a004..b8350338 100644 --- a/lib/src/common/pulls_service.dart +++ b/lib/src/common/pulls_service.dart @@ -2,7 +2,6 @@ import 'dart:async'; import 'dart:convert'; import 'package:github/src/common.dart'; import 'package:github/src/common/util/pagination.dart'; -import 'package:github/src/json.dart'; import 'package:github/src/util.dart'; /// The [PullRequestsService] handles communication with pull request diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index ecfecde8..670fb905 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -4,7 +4,6 @@ import 'package:github/src/common.dart'; import 'package:github/src/common/model/repos_releases.dart'; import 'package:github/src/common/model/users.dart'; import 'package:github/src/common/util/pagination.dart'; -import 'package:github/src/json.dart'; import 'package:github/src/util.dart'; import 'package:http/http.dart' as http; import 'package:meta/meta.dart'; diff --git a/lib/src/common/users_service.dart b/lib/src/common/users_service.dart index ac01b00b..a0136869 100644 --- a/lib/src/common/users_service.dart +++ b/lib/src/common/users_service.dart @@ -2,7 +2,6 @@ import 'dart:async'; import 'package:github/src/common.dart'; import 'package:github/src/common/model/users.dart'; import 'package:github/src/common/util/pagination.dart'; -import 'package:github/src/json.dart'; import 'package:github/src/util.dart'; import 'package:http/http.dart' as http; diff --git a/lib/src/common/util/json.dart b/lib/src/common/util/json.dart index 8b133826..95cf444a 100644 --- a/lib/src/common/util/json.dart +++ b/lib/src/common/util/json.dart @@ -1,2 +1,61 @@ +import 'dart:convert'; + +import 'package:github/src/common/util/utils.dart'; + + /// Creates a Model Object from the JSON [input] typedef JSONConverter = T Function(S input); + + +/// Internal class for Json encoding +/// that should be used instead of `dart:convert`. +/// +/// It contains methods that ensures that converted Json +/// will work with the GitHub API. +class GitHubJson { + const GitHubJson._(); + + /// Called only if an object is of a non primitive type. + /// + /// If [object] is a [DateTime], it converts it to a String whose format is compatible with the API. + /// Else, it uses the default behavior of [JsonEncoder] which is to call `toJson` method onto [object]. + /// + /// If [object] is not a [DateTime] and don't have a `toJson` method, an exception will be thrown + /// but handled by [JsonEncoder]. + /// Do not catch it. + static dynamic _toEncodable(dynamic object) { + if (object is DateTime) { + return dateToGitHubIso8601(object); + } + // `toJson` could return a [Map] or a [List], + // so we have to delete null values in them. + return _checkObject(object.toJson()); + } + + /// Encodes [object] to a Json String compatible with the GitHub API. + /// It should be used instead of `jsonEncode`. + /// + /// Equivalent to `jsonEncode` except that + /// it converts [DateTime] to a proper String for the GitHub API, + /// and it also deletes keys associated with null values in maps before converting them. + /// + /// The obtained String can be decoded using `jsonDecode`. + static String encode(Object object, {String indent}) { + final encoder = JsonEncoder.withIndent(indent, _toEncodable); + return encoder.convert(_checkObject(object)); + } + + /// Deletes keys associated with null values + /// in every map contained in [object]. + static dynamic _checkObject(dynamic object) { + if (object is Map) { + return Map.fromEntries(object.entries + .where((e) => e.value != null) + .map((e) => MapEntry(e.key, _checkObject(e.value)))); + } + if (object is List) { + return object.map(_checkObject).toList(); + } + return object; + } +} diff --git a/lib/src/common/util/oauth2.dart b/lib/src/common/util/oauth2.dart index 829ffad2..d6dc9c9a 100644 --- a/lib/src/common/util/oauth2.dart +++ b/lib/src/common/util/oauth2.dart @@ -1,7 +1,6 @@ import 'dart:async'; import 'dart:convert'; import 'package:github/src/common.dart'; -import 'package:github/src/json.dart'; import 'package:github/src/util.dart'; import 'package:http/http.dart' as http; diff --git a/lib/src/json.dart b/lib/src/json.dart deleted file mode 100644 index e0d021dd..00000000 --- a/lib/src/json.dart +++ /dev/null @@ -1,56 +0,0 @@ -import 'dart:convert'; - -import 'package:github/src/common/util/utils.dart'; - -/// Internal class for Json encoding -/// that should be used instead of `dart:convert`. -/// -/// It contains methods that ensures that converted Json -/// will work with the GitHub API. -class GitHubJson { - const GitHubJson._(); - - /// Called only if an object is of a non primitive type. - /// - /// If [object] is a [DateTime], it converts it to a String whose format is compatible with the API. - /// Else, it uses the default behavior of [JsonEncoder] which is to call `toJson` method onto [object]. - /// - /// If [object] is not a [DateTime] and don't have a `toJson` method, an exception will be thrown - /// but handled by [JsonEncoder]. - /// Do not catch it. - static dynamic _toEncodable(dynamic object) { - if (object is DateTime) { - return dateToGitHubIso8601(object); - } - // `toJson` could return a [Map] or a [List], - // so we have to delete null values in them. - return _checkObject(object.toJson()); - } - - /// Encodes [object] to a Json String compatible with the GitHub API. - /// It should be used instead of `jsonEncode`. - /// - /// Equivalent to `jsonEncode` except that - /// it converts [DateTime] to a proper String for the GitHub API, - /// and it also deletes keys associated with null values in maps before converting them. - /// - /// The obtained String can be decoded using `jsonDecode`. - static String encode(Object object, {String indent}) { - final encoder = JsonEncoder.withIndent(indent, _toEncodable); - return encoder.convert(_checkObject(object)); - } - - /// Deletes keys associated with null values - /// in every map contained in [object]. - static dynamic _checkObject(dynamic object) { - if (object is Map) { - return Map.fromEntries(object.entries - .where((e) => e.value != null) - .map((e) => MapEntry(e.key, _checkObject(e.value)))); - } - if (object is List) { - return object.map(_checkObject).toList(); - } - return object; - } -} diff --git a/lib/src/server/hooks.dart b/lib/src/server/hooks.dart index e49f8f3d..bb3c1018 100644 --- a/lib/src/server/hooks.dart +++ b/lib/src/server/hooks.dart @@ -1,7 +1,6 @@ import 'dart:async'; import 'dart:convert'; import 'dart:io'; -import 'package:github/src/json.dart'; import 'package:json_annotation/json_annotation.dart'; import '../common.dart'; diff --git a/test/data_object_test.dart b/test/data_object_test.dart index c80029d9..2f2012a7 100644 --- a/test/data_object_test.dart +++ b/test/data_object_test.dart @@ -1,6 +1,5 @@ import 'dart:convert'; -import 'package:github/src/json.dart'; import 'package:test/test.dart'; import 'package:github/github.dart'; diff --git a/test/experiment/error_handling.dart b/test/experiment/error_handling.dart index 76d29d20..5456b237 100644 --- a/test/experiment/error_handling.dart +++ b/test/experiment/error_handling.dart @@ -1,7 +1,6 @@ import 'dart:io'; import 'package:github/github.dart'; -import 'package:github/src/json.dart'; import '../helper/http.dart'; diff --git a/test/git_test.dart b/test/git_test.dart index 0f191757..5dc4e98d 100644 --- a/test/git_test.dart +++ b/test/git_test.dart @@ -2,7 +2,6 @@ import 'dart:async'; import 'dart:convert'; import 'package:github/src/common.dart'; -import 'package:github/src/json.dart'; import 'package:github/src/util.dart'; import 'package:http/http.dart' as http; import 'package:mockito/mockito.dart'; From 4424854fd4c7de6d1e37111170762a206db36a78 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sat, 11 Apr 2020 14:16:04 -0600 Subject: [PATCH 156/390] allow params values to be any object not just string --- lib/src/common/github.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index 1151704c..b045e436 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -158,7 +158,7 @@ class GitHub { {int statusCode, void Function(http.Response response) fail, Map headers, - Map params, + Map params, JSONConverter convert, String preview}) => _requestJson('GET', path, @@ -194,7 +194,7 @@ class GitHub { int statusCode, void Function(http.Response response) fail, Map headers, - Map params, + Map params, JSONConverter convert, dynamic body, String preview, @@ -236,7 +236,7 @@ class GitHub { int statusCode, void Function(http.Response response) fail, Map headers, - Map params, + Map params, JSONConverter convert, dynamic body, String preview, @@ -259,7 +259,7 @@ class GitHub { int statusCode, void Function(http.Response response) fail, Map headers, - Map params, + Map params, JSONConverter convert, dynamic body, String preview, From 119f4023474552928eb8982154400df095c94e04 Mon Sep 17 00:00:00 2001 From: axel-op <49279289+axel-op@users.noreply.github.com> Date: Thu, 17 Oct 2019 22:04:10 +0200 Subject: [PATCH 157/390] Implement Check Runs methods Add operators to CheckRunAnnotationLevel class --- lib/src/common.dart | 2 + lib/src/common/checks_service.dart | 232 +++++++++++++++++++ lib/src/common/github.dart | 98 ++++---- lib/src/common/model/checks.dart | 339 ++++++++++++++++++++++++++++ lib/src/common/repos_service.dart | 2 +- lib/src/common/util/pagination.dart | 59 +++-- lib/src/common/util/utils.dart | 1 + 7 files changed, 657 insertions(+), 76 deletions(-) create mode 100644 lib/src/common/checks_service.dart create mode 100644 lib/src/common/model/checks.dart diff --git a/lib/src/common.dart b/lib/src/common.dart index 6aada6a0..f0313746 100644 --- a/lib/src/common.dart +++ b/lib/src/common.dart @@ -2,6 +2,7 @@ /// Contains the Models and other GitHub stuff. export 'package:github/src/common/activity_service.dart'; export 'package:github/src/common/authorizations_service.dart'; +export 'package:github/src/common/checks_service.dart'; export 'package:github/src/common/gists_service.dart'; export 'package:github/src/common/git_service.dart'; export 'package:github/src/common/github.dart'; @@ -9,6 +10,7 @@ export 'package:github/src/common/issues_service.dart'; export 'package:github/src/common/misc_service.dart'; export 'package:github/src/common/model/activity.dart'; export 'package:github/src/common/model/authorizations.dart'; +export 'package:github/src/common/model/checks.dart'; export 'package:github/src/common/model/gists.dart'; export 'package:github/src/common/model/git.dart'; export 'package:github/src/common/model/issues.dart'; diff --git a/lib/src/common/checks_service.dart b/lib/src/common/checks_service.dart new file mode 100644 index 00000000..049480ee --- /dev/null +++ b/lib/src/common/checks_service.dart @@ -0,0 +1,232 @@ +import 'dart:convert'; + +import 'package:github/github.dart'; +import 'package:github/src/util.dart'; +import 'package:meta/meta.dart'; + +const _previewHeader = 'application/vnd.github.antiope-preview+json'; + +/// Contains methods to interact with the Checks API. +/// +/// API docs: https://developer.github.com/v3/checks/ +class ChecksService extends Service { + /// Methods to interact with Check Runs. + /// + /// API docs: https://developer.github.com/v3/checks/runs/ + final CheckRunsService checkRuns; + ChecksService(GitHub github) + : checkRuns = CheckRunsService._(github), + super(github); + + // TODO: implement Check Suites methods https://developer.github.com/v3/checks/suites/ +} + +class CheckRunsService extends Service { + CheckRunsService._(GitHub github) : super(github); + + /// Creates a new check run for a specific commit in a repository. + /// Your GitHub App must have the `checks:write` permission to create check runs. + /// * [name]: The name of the check. For example, "code-coverage". + /// * [headSha]: The SHA of the commit. + /// * [detailsUrl]: The URL of the integrator's site that has the full details of the check. + /// * [externalId]: A reference for the run on the integrator's system. + /// * [status]: The current status. Can be one of queued, in_progress, or completed. Default: queued. + /// * [startedAt]: The time that the check run began. + /// * [conclusion]: **Required if you provide completed_at or a status of completed.** The final conclusion of the check. + /// When the conclusion is action_required, additional details should be provided on the site specified by details_url. **Note**: Providing conclusion will automatically set the status parameter to completed. + /// * [completedAt]: The time the check completed. + /// * [output]: Check runs can accept a variety of data in the output object, including a title and summary and can optionally provide descriptive details about the run. + /// * [actions]: Displays a button on GitHub that can be clicked to alert your app to do additional tasks. + /// For example, a code linting app can display a button that automatically fixes detected errors. + /// The button created in this object is displayed after the check run completes. + /// When a user clicks the button, GitHub sends the check_run.requested_action webhook to your app. + /// A maximum of three actions are accepted. + /// + /// API docs: https://developer.github.com/v3/checks/runs/#create-a-check-run + Future createCheckRun( + RepositorySlug slug, { + @required String name, + @required String headSha, + String detailsUrl, + String externalId, + CheckRunStatus status = CheckRunStatus.queued, + DateTime startedAt, + CheckRunConclusion conclusion, + DateTime completedAt, + CheckRunOutput output, + List actions, + }) async { + assert(conclusion != null || + (completedAt == null && status != CheckRunStatus.completed)); + assert(actions == null || actions.length <= 3); + return github.postJSON, CheckRun>( + '/repos/${slug.fullName}/check-runs', + statusCode: StatusCodes.CREATED, + preview: _previewHeader, + body: jsonEncode(createNonNullMap({ + 'name': name, + 'head_sha': headSha, + 'details_url': detailsUrl, + 'external_id': externalId, + 'status': status, + 'started_at': dateToGitHubIso8601(startedAt), + 'conclusion': conclusion, + 'completed_at': dateToGitHubIso8601(completedAt), + 'output': output, + 'actions': actions, + })), + convert: (i) => CheckRun.fromJson(i), + ); + } + + /// Updates a check run for a specific commit in a repository. + /// Your GitHub App must have the `checks:write` permission to edit check runs. + /// + /// * [name]: The name of the check. For example, "code-coverage". + /// * [detailsUrl]: The URL of the integrator's site that has the full details of the check. + /// * [externalId]: A reference for the run on the integrator's system. + /// * [status]: The current status. Can be one of queued, in_progress, or completed. Default: queued. + /// * [startedAt]: The time that the check run began. + /// * [conclusion]: **Required if you provide completed_at or a status of completed.** The final conclusion of the check. + /// When the conclusion is action_required, additional details should be provided on the site specified by details_url. **Note**: Providing conclusion will automatically set the status parameter to completed. + /// * [completedAt]: The time the check completed. + /// * [output]: Check runs can accept a variety of data in the output object, including a title and summary and can optionally provide descriptive details about the run. + /// * [actions]: Possible further actions the integrator can perform, which a user may trigger. Each action includes a label, identifier and description. A maximum of three actions are accepted. + /// + /// API docs: https://developer.github.com/v3/checks/runs/#update-a-check-run + Future updateCheckRun( + RepositorySlug slug, + CheckRun checkRunToUpdate, { + String name, + String detailsUrl, + String externalId, + DateTime startedAt, + CheckRunStatus status = CheckRunStatus.queued, + CheckRunConclusion conclusion, + DateTime completedAt, + CheckRunOutput output, + List actions, + }) async { + assert(conclusion != null || + (completedAt == null && status != CheckRunStatus.completed)); + assert(actions == null || actions.length <= 3); + return github.requestJson, CheckRun>( + 'PATCH', + '/repos/${slug.fullName}/check-runs/${checkRunToUpdate.id}', + statusCode: StatusCodes.OK, + preview: _previewHeader, + body: jsonEncode(createNonNullMap({ + 'name': name, + 'details_url': detailsUrl, + 'external_id': externalId, + 'started_at': dateToGitHubIso8601(startedAt), + 'status': status, + 'conclusion': conclusion, + 'completed_at': dateToGitHubIso8601(completedAt), + 'output': output, + 'actions': actions, + })), + convert: (i) => CheckRun.fromJson(i), + ); + } + + /// Lists check runs for a commit [ref]. + /// The `[ref]` can be a SHA, branch name, or a tag name. + /// GitHub Apps must have the `checks:read` permission on a private repository or pull access to a public repository to get check runs. + /// OAuth Apps and authenticated users must have the `repo` scope to get check runs in a private repository. + /// * [checkName]: returns check runs with the specified name. + /// * [status]: returns check runs with the specified status. + /// * [filter]: filters check runs by their completed_at timestamp. Can be one of latest (returning the most recent check runs) or all. Default: latest. + /// + /// API docs: https://developer.github.com/v3/checks/runs/#list-check-runs-for-a-specific-ref + Stream listCheckRunsForRef( + RepositorySlug slug, { + @required String ref, + String checkName, + CheckRunStatus status, + CheckRunFilter filter, + }) { + ArgumentError.checkNotNull(ref); + return PaginationHelper(github).objects, CheckRun>( + 'GET', + 'repos/$slug/commits/$ref/check-runs', + (input) => CheckRun.fromJson(input), + statusCode: StatusCodes.OK, + preview: _previewHeader, + params: createNonNullMap({ + 'check_name': checkName, + 'filter': filter, + 'status': status, + }), + arrayKey: 'check_runs', + ); + } + + /// Lists check runs for a check suite using its [checkSuiteId]. + /// GitHub Apps must have the `checks:read` permission on a private repository or pull access to a public repository to get check runs. + /// OAuth Apps and authenticated users must have the `repo` scope to get check runs in a private repository. + /// * [checkName]: returns check runs with the specified name. + /// * [status]: returns check runs with the specified status. + /// * [filter]: filters check runs by their completed_at timestamp. Can be one of latest (returning the most recent check runs) or all. Default: latest. + /// + /// API docs: https://developer.github.com/v3/checks/runs/#list-check-runs-in-a-check-suite + Stream listCheckRunsInSuite( + RepositorySlug slug, { + @required int checkSuiteId, + String checkName, + CheckRunStatus status, + CheckRunFilter filter, + }) { + ArgumentError.checkNotNull(checkSuiteId); + return PaginationHelper(github).objects, CheckRun>( + 'GET', + 'repos/$slug/check-suites/$checkSuiteId/check-runs', + (input) => CheckRun.fromJson(input), + statusCode: StatusCodes.OK, + preview: _previewHeader, + params: createNonNullMap({ + 'check_name': checkName, + 'status': status, + 'filter': filter, + }), + arrayKey: 'check_runs', + ); + } + + /// Gets a single check run using its [checkRunId]. + /// GitHub Apps must have the `checks:read` permission on a private repository or pull access to a public repository to get check runs. + /// OAuth Apps and authenticated users must have the `repo` scope to get check runs in a private repository. + /// + /// API docs: https://developer.github.com/v3/checks/runs/#get-a-single-check-run + Future getCheckRun( + RepositorySlug slug, { + @required int checkRunId, + }) { + ArgumentError.checkNotNull(checkRunId); + return github.getJSON, CheckRun>( + 'repos/${slug.fullName}/check-runs/$checkRunId', + preview: _previewHeader, + statusCode: StatusCodes.OK, + convert: (i) => CheckRun.fromJson(i), + ); + } + + /// Lists annotations for a check run. + /// GitHub Apps must have the `checks:read` permission on a private repository or pull access to a public repository to get annotations for a check run. + /// OAuth Apps and authenticated users must have the `repo` scope to get annotations for a check run in a private repository. + /// + /// API docs: https://developer.github.com/v3/checks/runs/#list-annotations-for-a-check-run + Stream listAnnotationsInCheckRun( + RepositorySlug slug, { + @required CheckRun checkRun, + }) { + return PaginationHelper(github) + .objects, CheckRunAnnotation>( + 'GET', + '/repos/${slug.fullName}/check-runs/${checkRun.id}/annotations', + (i) => CheckRunAnnotation.fromJSON(i), + statusCode: StatusCodes.OK, + preview: _previewHeader, + ); + } +} diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index b045e436..221aa35f 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -50,6 +50,7 @@ class GitHub { SearchService _search; UrlShortenerService _urlShortener; UsersService _users; + ChecksService _checks; /// The maximum number of requests that the consumer is permitted to make per /// hour. @@ -79,67 +80,53 @@ class GitHub { int _rateLimitReset, _rateLimitLimit, _rateLimitRemaining; /// Service for activity related methods of the GitHub API. - ActivityService get activity { - return _activity ??= ActivityService(this); - } + ActivityService get activity => _activity ??= ActivityService(this); /// Service for autorizations related methods of the GitHub API. /// /// Note: You can only access this API via Basic Authentication using your /// username and password, not tokens. - AuthorizationsService get authorizations { - return _authorizations ??= AuthorizationsService(this); - } + AuthorizationsService get authorizations => + _authorizations ??= AuthorizationsService(this); /// Service for gist related methods of the GitHub API. - GistsService get gists { - return _gists ??= GistsService(this); - } + GistsService get gists => _gists ??= GistsService(this); /// Service for git data related methods of the GitHub API. - GitService get git { - return _git ??= GitService(this); - } + GitService get git => _git ??= GitService(this); /// Service for issues related methods of the GitHub API. - IssuesService get issues { - return _issues ??= IssuesService(this); - } + IssuesService get issues => _issues ??= IssuesService(this); /// Service for misc related methods of the GitHub API. - MiscService get misc { - return _misc ??= MiscService(this); - } + MiscService get misc => _misc ??= MiscService(this); /// Service for organization related methods of the GitHub API. - OrganizationsService get organizations { - return _organizations ??= OrganizationsService(this); - } + OrganizationsService get organizations => + _organizations ??= OrganizationsService(this); /// Service for pull requests related methods of the GitHub API. - PullRequestsService get pullRequests { - return _pullRequests ??= PullRequestsService(this); - } + PullRequestsService get pullRequests => + _pullRequests ??= PullRequestsService(this); /// Service for repository related methods of the GitHub API. - RepositoriesService get repositories { - return _repositories ??= RepositoriesService(this); - } + RepositoriesService get repositories => + _repositories ??= RepositoriesService(this); /// Service for search related methods of the GitHub API. - SearchService get search { - return _search ??= SearchService(this); - } + SearchService get search => _search ??= SearchService(this); /// Service to provide a handy method to access GitHub's url shortener. - UrlShortenerService get urlShortener { - return _urlShortener ??= UrlShortenerService(this); - } + UrlShortenerService get urlShortener => + _urlShortener ??= UrlShortenerService(this); /// Service for user related methods of the GitHub API. - UsersService get users { - return _users ??= UsersService(this); - } + UsersService get users => _users ??= UsersService(this); + + /// Service containing methods to interact with the Checks API. + /// + /// See https://developer.github.com/v3/checks/ + ChecksService get checks => _checks ??= ChecksService(this); /// Handles Get Requests that respond with JSON /// [path] can either be a path like '/repos' or a full url. @@ -154,20 +141,25 @@ class GitHub { /// [convert] is a simple function that is passed this [GitHub] instance and a JSON object. /// The future will pass the object returned from this function to the then method. /// The default [convert] function returns the input object. - Future getJSON(String path, - {int statusCode, - void Function(http.Response response) fail, - Map headers, - Map params, - JSONConverter convert, - String preview}) => - _requestJson('GET', path, - statusCode: statusCode, - fail: fail, - headers: headers, - params: params, - convert: convert, - preview: preview); + Future getJSON( + String path, { + int statusCode, + void Function(http.Response response) fail, + Map headers, + Map params, + JSONConverter convert, + String preview, + }) => + requestJson( + 'GET', + path, + statusCode: statusCode, + fail: fail, + headers: headers, + params: params, + convert: convert, + preview: preview, + ); /// Handles Post Requests that respond with JSON /// @@ -199,7 +191,7 @@ class GitHub { dynamic body, String preview, }) => - _requestJson( + requestJson( 'POST', path, statusCode: statusCode, @@ -241,7 +233,7 @@ class GitHub { dynamic body, String preview, }) => - _requestJson( + requestJson( 'PUT', path, statusCode: statusCode, @@ -253,7 +245,7 @@ class GitHub { preview: preview, ); - Future _requestJson( + Future requestJson( String method, String path, { int statusCode, diff --git a/lib/src/common/model/checks.dart b/lib/src/common/model/checks.dart new file mode 100644 index 00000000..85494768 --- /dev/null +++ b/lib/src/common/model/checks.dart @@ -0,0 +1,339 @@ +import 'package:github/src/util.dart'; +import 'package:meta/meta.dart'; + +@immutable +abstract class _EnumWithValue { + final String _jsonValue; + const _EnumWithValue._(this._jsonValue); + + @override + String toString() => _jsonValue; + + String toJson() => _jsonValue; + + @override + bool operator ==(dynamic other) => + other is _EnumWithValue && _jsonValue == other._jsonValue; + + @override + int get hashCode => _jsonValue.hashCode; +} + +class CheckRunAnnotationLevel extends _EnumWithValue { + static const notice = CheckRunAnnotationLevel._('notice'); + static const warning = CheckRunAnnotationLevel._('warning'); + static const failure = CheckRunAnnotationLevel._('failure'); + + const CheckRunAnnotationLevel._(String value) : super._(value); + + factory CheckRunAnnotationLevel._fromValue(String value) { + switch (value) { + case 'notice': + return notice; + case 'warning': + return warning; + case 'failure': + return failure; + default: + throw Exception( + 'This level of check run annotation is unimplemented: $value.'); + } + } + + bool operator <(CheckRunAnnotationLevel other) { + if (this == failure) { + return false; + } + if (this == notice) { + return other != notice; + } + return other == failure; + } + + bool operator <=(CheckRunAnnotationLevel other) => + this == other || this < other; + bool operator >(CheckRunAnnotationLevel other) => !(this <= other); + bool operator >=(CheckRunAnnotationLevel other) => !(this < other); +} + +class CheckRunConclusion extends _EnumWithValue { + static const success = CheckRunConclusion._('success'); + static const failure = CheckRunConclusion._('failure'); + static const neutral = CheckRunConclusion._('neutral'); + static const cancelled = CheckRunConclusion._('cancelled'); + static const timedOut = CheckRunConclusion._('timed_out'); + static const actionRequired = CheckRunConclusion._('action_required'); + const CheckRunConclusion._(String value) : super._(value); +} + +class CheckRunStatus extends _EnumWithValue { + static const queued = CheckRunStatus._('queued'); + static const inProgress = CheckRunStatus._('in_progress'); + static const completed = CheckRunStatus._('completed'); + const CheckRunStatus._(String value) : super._(value); +} + +class CheckRunFilter extends _EnumWithValue { + static const all = CheckRunFilter._('all'); + static const latest = CheckRunFilter._('latest'); + const CheckRunFilter._(String value) : super._(value); +} + +@immutable +class CheckRun { + final String name; + final int id; + final String externalId; + final String headSha; + final CheckRunStatus status; + final int checkSuiteId; + final String detailsUrl; + final DateTime startedAt; + + const CheckRun._({ + @required this.id, + @required this.externalId, + @required this.headSha, + @required this.status, + @required this.checkSuiteId, + @required this.name, + @required this.detailsUrl, + @required this.startedAt, + }); + + factory CheckRun.fromJson(Map input) { + CheckRunStatus status; + for (final s in const [ + CheckRunStatus.completed, + CheckRunStatus.inProgress, + CheckRunStatus.queued + ]) { + if (s.toString() == input['status']) { + status = s; + break; + } + } + return CheckRun._( + name: input['name'], + id: input['id'], + externalId: input['external_id'], + status: status, + headSha: input['head_sha'], + checkSuiteId: input['check_suite']['id'], + detailsUrl: input['details_url'], + startedAt: DateTime.parse(input['started_at']), + ); + } +} + +@immutable +class CheckRunOutput { + /// The title of the check run. + final String title; + + /// The summary of the check run. This parameter supports Markdown. + final String summary; + + /// The details of the check run. This parameter supports Markdown. + final String text; + + /// Adds information from your analysis to specific lines of code. + /// Annotations are visible on GitHub in the Checks and Files changed tab of the pull request. + /// The Checks API limits the number of annotations to a maximum of 50 per API request. + /// To create more than 50 annotations, you have to make multiple requests to the Update a check run endpoint. + /// Each time you update the check run, annotations are appended to the list of annotations that already exist for the check run. + final List annotations; + + /// Adds images to the output displayed in the GitHub pull request UI. + final List images; + + const CheckRunOutput({ + @required this.title, + @required this.summary, + this.text, + this.annotations, + this.images, + }) : assert(title != null), + assert(summary != null); + + Map toJson() { + return createNonNullMap({ + 'title': title, + 'summary': summary, + 'text': text, + 'annotations': annotations?.map((a) => a.toJson())?.toList(), + 'images': images?.map((i) => i.toJson())?.toList(), + }); + } +} + +@immutable +class CheckRunAnnotation { + /// The path of the file to add an annotation to. For example, assets/css/main.css. + final String path; + + /// The start line of the annotation. + final int startLine; + + /// The end line of the annotation. + final int endLine; + + /// The start column of the annotation. + /// Annotations only support start_column and end_column on the same line. + /// Omit this parameter if start_line and end_line have different values. + final int startColumn; + + /// The end column of the annotation. + /// Annotations only support start_column and end_column on the same line. + /// Omit this parameter if start_line and end_line have different values. + final int endColumn; + + /// The level of the annotation. + /// Can be one of notice, warning, or failure. + final CheckRunAnnotationLevel annotationLevel; + + /// A short description of the feedback for these lines of code. + /// The maximum size is 64 KB. + final String message; + + /// The title that represents the annotation. + /// The maximum size is 255 characters. + final String title; + + /// Details about this annotation. + /// The maximum size is 64 KB. + final String rawDetails; + + const CheckRunAnnotation({ + @required this.annotationLevel, + @required this.endLine, + @required this.message, + @required this.path, + @required this.startLine, + this.startColumn, + this.endColumn, + this.title, + this.rawDetails, + }) : assert(path != null), + assert(startLine != null), + assert(endLine != null), + assert(annotationLevel != null), + assert(message != null), + assert(startColumn == null || startLine == endLine, + 'Annotations only support start_column and end_column on the same line.'), + assert(endColumn == null || startLine == endLine, + 'Annotations only support start_column and end_column on the same line.'), + assert(title.length <= 255); + + @override + bool operator ==(dynamic other) { + if (other is CheckRunAnnotation) { + return other.annotationLevel == this.annotationLevel && + other.path == this.path && + other.startColumn == this.startColumn && + other.endColumn == this.endColumn && + other.startLine == this.startLine && + other.endLine == this.endLine && + other.title == this.title && + other.message == this.message && + other.rawDetails == this.rawDetails; + } + return false; + } + + @override + int get hashCode => path.hashCode; + + factory CheckRunAnnotation.fromJSON(Map input) { + if (input == null) { + return null; + } + return CheckRunAnnotation( + path: input['path'], + startLine: input['start_line'], + endLine: input['end_line'], + startColumn: input['start_column'], + endColumn: input['end_column'], + annotationLevel: + CheckRunAnnotationLevel._fromValue(input['annotation_level']), + title: input['title'], + message: input['message'], + rawDetails: input['raw_details'], + ); + } + + Map toJson() { + return createNonNullMap({ + 'path': path, + 'start_line': startLine, + 'end_line': endLine, + 'start_column': startColumn, + 'end_column': endColumn, + 'annotation_level': annotationLevel.toString(), + 'message': message, + 'title': title, + 'rax_details': rawDetails, + }); + } +} + +@immutable +class CheckRunImage { + /// The alternative text for the image. + final String alternativeText; + + /// The full URL of the image. + final String imageUrl; + + /// A short image description. + final String caption; + + const CheckRunImage({ + @required this.alternativeText, + @required this.imageUrl, + this.caption, + }) : assert(alternativeText != null), + assert(imageUrl != null); + + Map toJson() { + return createNonNullMap({ + 'alt': alternativeText, + 'image_url': imageUrl, + 'caption': caption, + }); + } +} + +@immutable +class CheckRunAction { + /// The text to be displayed on a button in the web UI. + /// The maximum size is 20 characters. + final String label; + + /// A short explanation of what this action would do. + /// The maximum size is 40 characters. + final String description; + + /// A reference for the action on the integrator's system. + /// The maximum size is 20 characters. + final String identifier; + + const CheckRunAction({ + @required this.label, + @required this.description, + @required this.identifier, + }) : assert(label != null), + assert(description != null), + assert(identifier != null), + assert(label.length <= 20), + assert(description.length <= 40), + assert(identifier.length <= 20); + + Map toJson() { + return createNonNullMap({ + 'label': label, + 'description': description, + 'identifier': identifier, + }); + } +} diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 670fb905..4abd580d 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -279,7 +279,7 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/collaborators/#list Stream listCollaborators(RepositorySlug slug) { ArgumentError.checkNotNull(slug); - return PaginationHelper(github).objects( + return PaginationHelper(github).objects, Collaborator>( 'GET', '/repos/${slug.fullName}/collaborators', (json) => Collaborator.fromJson(json), diff --git a/lib/src/common/util/pagination.dart b/lib/src/common/util/pagination.dart index d6e367b8..4a5f5381 100644 --- a/lib/src/common/util/pagination.dart +++ b/lib/src/common/util/pagination.dart @@ -89,6 +89,7 @@ class PaginationHelper { String body, int statusCode = 200, String preview, + String arrayKey, }) async* { headers ??= {}; if (preview != null) { @@ -96,13 +97,18 @@ class PaginationHelper { } headers.putIfAbsent('Accept', () => v3ApiMimeType); - await for (final response in fetchStreamed(method, path, - pages: pages, - headers: headers, - params: params, - body: body, - statusCode: statusCode)) { - final json = jsonDecode(response.body) as List; + await for (final response in fetchStreamed( + method, + path, + pages: pages, + headers: headers, + params: params, + body: body, + statusCode: statusCode, + )) { + final json = arrayKey == null + ? jsonDecode(response.body) as List + : (jsonDecode(response.body) as Map)[arrayKey]; for (final item in json) { yield item as T; @@ -110,22 +116,31 @@ class PaginationHelper { } } + /// If the response body is a JSONObject (and not a JSONArray), + /// use [arrayKey] to specify the key under which the array is stored. Stream objects( - String method, String path, JSONConverter converter, - {int pages, - Map headers, - Map params, - String body, - int statusCode = 200, - String preview}) { - return jsonObjects(method, path, - pages: pages, - headers: headers, - params: params, - body: body, - statusCode: statusCode, - preview: preview) - .map(converter); + String method, + String path, + JSONConverter converter, { + int pages, + Map headers, + Map params, + String body, + int statusCode = 200, + String preview, + String arrayKey, + }) { + return jsonObjects( + method, + path, + pages: pages, + headers: headers, + params: params, + body: body, + statusCode: statusCode, + preview: preview, + arrayKey: arrayKey, + ).map(converter); } } diff --git a/lib/src/common/util/utils.dart b/lib/src/common/util/utils.dart index 9e1bef0a..25fef49f 100644 --- a/lib/src/common/util/utils.dart +++ b/lib/src/common/util/utils.dart @@ -21,6 +21,7 @@ class OnlyWhen { /// /// The format is "YYYY-MM-DDTHH:mm:ssZ" String dateToGitHubIso8601(DateTime date) { + if (date == null) return null; // Regex removes the milliseconds. return date.toUtc().toIso8601String().replaceAll(githubDateRemoveRegExp, ''); } From d77611f941e989d91b044f043fcf5745e8a11c00 Mon Sep 17 00:00:00 2001 From: Axel Ogereau-Peltier <49279289+axel-op@users.noreply.github.com> Date: Mon, 9 Mar 2020 03:33:33 +0100 Subject: [PATCH 158/390] Implement Check Suites methods Edit API link for updatePreferencesForCheckSuites and send the request with a body --- lib/src/common/checks_service.dart | 133 +++++++++++++++++++++++++++-- lib/src/common/model/checks.dart | 68 +++++++++++++++ 2 files changed, 195 insertions(+), 6 deletions(-) diff --git a/lib/src/common/checks_service.dart b/lib/src/common/checks_service.dart index 049480ee..29e60609 100644 --- a/lib/src/common/checks_service.dart +++ b/lib/src/common/checks_service.dart @@ -13,16 +13,21 @@ class ChecksService extends Service { /// Methods to interact with Check Runs. /// /// API docs: https://developer.github.com/v3/checks/runs/ - final CheckRunsService checkRuns; + final _CheckRunsService checkRuns; + + /// Methods to interact with Check Suites. + /// + /// API docs: https://developer.github.com/v3/checks/suites/ + final _CheckSuitesService checkSuites; + ChecksService(GitHub github) - : checkRuns = CheckRunsService._(github), + : checkRuns = _CheckRunsService._(github), + checkSuites = _CheckSuitesService._(github), super(github); - - // TODO: implement Check Suites methods https://developer.github.com/v3/checks/suites/ } -class CheckRunsService extends Service { - CheckRunsService._(GitHub github) : super(github); +class _CheckRunsService extends Service { + _CheckRunsService._(GitHub github) : super(github); /// Creates a new check run for a specific commit in a repository. /// Your GitHub App must have the `checks:write` permission to create check runs. @@ -230,3 +235,119 @@ class CheckRunsService extends Service { ); } } + +class _CheckSuitesService extends Service { + _CheckSuitesService._(GitHub github) : super(github); + + /// Gets a single check suite using its `id`. + /// GitHub Apps must have the `checks:read` permission on a private repository or pull access to a public repository to get check suites. + /// OAuth Apps and authenticated users must have the `repo` scope to get check suites in a private repository. + /// + /// API docs: https://developer.github.com/v3/checks/suites/#get-a-single-check-suite + Future getCheckSuite( + RepositorySlug slug, { + @required int checkSuiteId, + }) async { + ArgumentError.checkNotNull(checkSuiteId); + return github.requestJson( + 'GET', + 'repos/$slug/check-suites/$checkSuiteId', + convert: (input) => CheckSuite.fromJson(input), + preview: _previewHeader, + statusCode: StatusCodes.OK, + ); + } + + /// Lists check suites for a commit `[ref]`. + /// The `[ref]` can be a SHA, branch name, or a tag name. + /// GitHub Apps must have the `checks:read` permission on a private repository or pull access to a public repository to list check suites. + /// OAuth Apps and authenticated users must have the `repo` scope to get check suites in a private repository. + /// * [appId]: Filters check suites by GitHub App id. + /// * [checkName]: Filters checks suites by the name of the check run. + /// + /// API docs: https://developer.github.com/v3/checks/suites/#list-check-suites-for-a-specific-ref + Stream listCheckSuitesForRef( + RepositorySlug slug, { + @required String ref, + int appId, + String checkName, + }) { + ArgumentError.checkNotNull(ref); + return PaginationHelper(github).objects, CheckSuite>( + 'GET', + 'repos/$slug/commits/$ref/check-suites', + (input) => CheckSuite.fromJson(input), + preview: _previewHeader, + params: createNonNullMap({ + 'app_id': appId, + 'check_name': checkName, + }), + statusCode: StatusCodes.OK, + arrayKey: 'check_suites', + ); + } + + /// Changes the default automatic flow when creating check suites. + /// By default, the CheckSuiteEvent is automatically created each time code is pushed to a repository. + /// When you disable the automatic creation of check suites, you can manually [Create a check suite](https://developer.github.com/v3/checks/suites/#create-a-check-suite). + /// You must have admin permissions in the repository to set preferences for check suites. + /// * [autoTriggerChecks]: Enables or disables automatic creation of CheckSuite events upon pushes to the repository. Enabled by default. + /// + /// API docs: https://developer.github.com/v3/checks/suites/#update-repository-preferences-for-check-suites + Future> updatePreferencesForCheckSuites( + RepositorySlug slug, { + @required List autoTriggerChecks, + }) { + ArgumentError.checkNotNull(autoTriggerChecks); + return github.requestJson, List>( + 'PATCH', + 'repos/$slug/check-suites/preferences', + statusCode: StatusCodes.OK, + preview: _previewHeader, + body: {'auto_trigger_checks': autoTriggerChecks}, + convert: (input) => (input['preferences']['auto_trigger_checks'] as List) + .map((e) => AutoTriggerChecks.fromJson(e)) + .toList(), + ); + } + + /// By default, check suites are automatically created when you create a [check run](https://developer.github.com/v3/checks/runs/). + /// You only need to use this endpoint for manually creating check suites when you've disabled automatic creation using "[Set preferences for check suites on a repository](https://developer.github.com/v3/checks/suites/#set-preferences-for-check-suites-on-a-repository)". + /// Your GitHub App must have the `checks:write` permission to create check suites. + /// * [headSha]: The sha of the head commit. + /// + /// API docs: https://developer.github.com/v3/checks/suites/#create-a-check-suite + Future createCheckSuite( + RepositorySlug slug, { + @required String headSha, + }) { + ArgumentError.checkNotNull(headSha); + return github.requestJson, CheckSuite>( + 'POST', + 'repos/$slug/check-suites', + statusCode: StatusCodes.CREATED, + preview: _previewHeader, + params: {'head_sha': headSha}, + convert: (input) => CheckSuite.fromJson(input), + ); + } + + /// Triggers GitHub to rerequest an existing check suite, without pushing new code to a repository. + /// This endpoint will trigger the [`check_suite` webhook](https://developer.github.com/v3/activity/events/types/#checksuiteevent) event with the action rerequested. + /// When a check suite is `rerequested`, its `status` is reset to `queued` and the `conclusion` is cleared. + /// To rerequest a check suite, your GitHub App must have the `checks:read` permission on a private repository or pull access to a public repository. + /// + /// API docs: https://developer.github.com/v3/checks/suites/#rerequest-check-suite + Future reRequestCheckSuite( + RepositorySlug slug, { + @required int checkSuiteId, + }) { + ArgumentError.checkNotNull(checkSuiteId); + return github.request( + 'POST', + 'repos/$slug/check-suites/$checkSuiteId/rerequest', + statusCode: StatusCodes.CREATED, + preview: _previewHeader, + ); + } +} diff --git a/lib/src/common/model/checks.dart b/lib/src/common/model/checks.dart index 85494768..9ce054e0 100644 --- a/lib/src/common/model/checks.dart +++ b/lib/src/common/model/checks.dart @@ -63,7 +63,25 @@ class CheckRunConclusion extends _EnumWithValue { static const cancelled = CheckRunConclusion._('cancelled'); static const timedOut = CheckRunConclusion._('timed_out'); static const actionRequired = CheckRunConclusion._('action_required'); + const CheckRunConclusion._(String value) : super._(value); + + factory CheckRunConclusion._fromValue(String value) { + for (final level in const [ + success, + failure, + neutral, + cancelled, + timedOut, + actionRequired + ]) { + if (level._jsonValue == value) { + return level; + } + } + throw Exception( + 'This level of check run conclusion is unimplemented: $value.'); + } } class CheckRunStatus extends _EnumWithValue { @@ -337,3 +355,53 @@ class CheckRunAction { }); } } + +@immutable +class CheckSuite { + final int id; + final String headSha; + final CheckRunConclusion conclusion; + + const CheckSuite({ + @required this.conclusion, + @required this.headSha, + @required this.id, + }); + + factory CheckSuite.fromJson(Map input) { + if (input == null) { + return null; + } + return CheckSuite( + conclusion: CheckRunConclusion._fromValue(input['conclusion']), + headSha: input['head_sha'], + id: input['id'], + ); + } +} + +@immutable +class AutoTriggerChecks { + /// The id of the GitHub App. + final int appId; + + /// Set to true to enable automatic creation of CheckSuite events upon pushes to the repository, or false to disable them. + final bool setting; + + const AutoTriggerChecks({ + @required this.appId, + this.setting = true, + }) : assert(appId != null); + + factory AutoTriggerChecks.fromJson(Map input) { + if (input == null) { + return null; + } + return AutoTriggerChecks( + appId: input['app_id'], + setting: input['setting'], + ); + } + + Map toJson() => {'app_id': appId, 'setting': setting}; +} From bf6d317062dc1ae4ed92194e84ae078fe526bd13 Mon Sep 17 00:00:00 2001 From: Axel Ogereau-Peltier <49279289+axel-op@users.noreply.github.com> Date: Sun, 12 Apr 2020 06:10:30 +0200 Subject: [PATCH 159/390] Make public the class EnumWithValue --- lib/src/common/model/checks.dart | 37 +++++++++----------------------- lib/src/common/util/utils.dart | 30 +++++++++++++++++++++++++- 2 files changed, 39 insertions(+), 28 deletions(-) diff --git a/lib/src/common/model/checks.dart b/lib/src/common/model/checks.dart index 9ce054e0..39b18231 100644 --- a/lib/src/common/model/checks.dart +++ b/lib/src/common/model/checks.dart @@ -1,30 +1,13 @@ +import 'package:github/src/common/util/utils.dart'; import 'package:github/src/util.dart'; import 'package:meta/meta.dart'; -@immutable -abstract class _EnumWithValue { - final String _jsonValue; - const _EnumWithValue._(this._jsonValue); - - @override - String toString() => _jsonValue; - - String toJson() => _jsonValue; - - @override - bool operator ==(dynamic other) => - other is _EnumWithValue && _jsonValue == other._jsonValue; - - @override - int get hashCode => _jsonValue.hashCode; -} - -class CheckRunAnnotationLevel extends _EnumWithValue { +class CheckRunAnnotationLevel extends EnumWithValue { static const notice = CheckRunAnnotationLevel._('notice'); static const warning = CheckRunAnnotationLevel._('warning'); static const failure = CheckRunAnnotationLevel._('failure'); - const CheckRunAnnotationLevel._(String value) : super._(value); + const CheckRunAnnotationLevel._(String value) : super(value); factory CheckRunAnnotationLevel._fromValue(String value) { switch (value) { @@ -56,7 +39,7 @@ class CheckRunAnnotationLevel extends _EnumWithValue { bool operator >=(CheckRunAnnotationLevel other) => !(this < other); } -class CheckRunConclusion extends _EnumWithValue { +class CheckRunConclusion extends EnumWithValue { static const success = CheckRunConclusion._('success'); static const failure = CheckRunConclusion._('failure'); static const neutral = CheckRunConclusion._('neutral'); @@ -64,7 +47,7 @@ class CheckRunConclusion extends _EnumWithValue { static const timedOut = CheckRunConclusion._('timed_out'); static const actionRequired = CheckRunConclusion._('action_required'); - const CheckRunConclusion._(String value) : super._(value); + const CheckRunConclusion._(String value) : super(value); factory CheckRunConclusion._fromValue(String value) { for (final level in const [ @@ -75,7 +58,7 @@ class CheckRunConclusion extends _EnumWithValue { timedOut, actionRequired ]) { - if (level._jsonValue == value) { + if (level.value == value) { return level; } } @@ -84,17 +67,17 @@ class CheckRunConclusion extends _EnumWithValue { } } -class CheckRunStatus extends _EnumWithValue { +class CheckRunStatus extends EnumWithValue { static const queued = CheckRunStatus._('queued'); static const inProgress = CheckRunStatus._('in_progress'); static const completed = CheckRunStatus._('completed'); - const CheckRunStatus._(String value) : super._(value); + const CheckRunStatus._(String value) : super(value); } -class CheckRunFilter extends _EnumWithValue { +class CheckRunFilter extends EnumWithValue { static const all = CheckRunFilter._('all'); static const latest = CheckRunFilter._('latest'); - const CheckRunFilter._(String value) : super._(value); + const CheckRunFilter._(String value) : super(value); } @immutable diff --git a/lib/src/common/util/utils.dart b/lib/src/common/util/utils.dart index 25fef49f..7385bc25 100644 --- a/lib/src/common/util/utils.dart +++ b/lib/src/common/util/utils.dart @@ -1,5 +1,31 @@ import 'package:github/src/common.dart'; import 'package:github/src/util.dart'; +import 'package:meta/meta.dart'; + +/// A Json encodable class that mimics an enum, +/// but with a String value that is used for serialization. +@immutable +abstract class EnumWithValue { + final String value; + + /// The value will be used when [toJson] or [toString] will be called. + /// It will also be used to check if two [EnumWithValue] are equal. + const EnumWithValue(this.value); + + @override + String toString() => value; + + /// Returns the String value of this. + String toJson() => value; + + /// True iff [other] is an [EnumWithValue] with the same value as this object. + @override + bool operator ==(dynamic other) => + other is EnumWithValue && value == other.value; + + @override + int get hashCode => value.hashCode; +} /// Marks something as not being ready or complete. class NotReadyYet { @@ -21,7 +47,9 @@ class OnlyWhen { /// /// The format is "YYYY-MM-DDTHH:mm:ssZ" String dateToGitHubIso8601(DateTime date) { - if (date == null) return null; + if (date == null) { + return null; + } // Regex removes the milliseconds. return date.toUtc().toIso8601String().replaceAll(githubDateRemoveRegExp, ''); } From e418f23c0a132c0ff72931327ae426fb3b3cd9c6 Mon Sep 17 00:00:00 2001 From: Axel Ogereau-Peltier <49279289+axel-op@users.noreply.github.com> Date: Sun, 12 Apr 2020 06:10:42 +0200 Subject: [PATCH 160/390] Format json.dart --- lib/src/common/util/json.dart | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/src/common/util/json.dart b/lib/src/common/util/json.dart index 95cf444a..5912bfe9 100644 --- a/lib/src/common/util/json.dart +++ b/lib/src/common/util/json.dart @@ -2,11 +2,9 @@ import 'dart:convert'; import 'package:github/src/common/util/utils.dart'; - /// Creates a Model Object from the JSON [input] typedef JSONConverter = T Function(S input); - /// Internal class for Json encoding /// that should be used instead of `dart:convert`. /// From 3d31ecfe18c53ef1e486c6ea0306e89c56fdc486 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Wed, 15 Apr 2020 20:50:06 -0600 Subject: [PATCH 161/390] fix lints --- lib/src/common/model/checks.dart | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/src/common/model/checks.dart b/lib/src/common/model/checks.dart index 39b18231..969c9287 100644 --- a/lib/src/common/model/checks.dart +++ b/lib/src/common/model/checks.dart @@ -229,15 +229,15 @@ class CheckRunAnnotation { @override bool operator ==(dynamic other) { if (other is CheckRunAnnotation) { - return other.annotationLevel == this.annotationLevel && - other.path == this.path && - other.startColumn == this.startColumn && - other.endColumn == this.endColumn && - other.startLine == this.startLine && - other.endLine == this.endLine && - other.title == this.title && - other.message == this.message && - other.rawDetails == this.rawDetails; + return other.annotationLevel == annotationLevel && + other.path == path && + other.startColumn == startColumn && + other.endColumn == endColumn && + other.startLine == startLine && + other.endLine == endLine && + other.title == title && + other.message == message && + other.rawDetails == rawDetails; } return false; } From e578e1f3a8135895fd649f8382692403e9e548f1 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Wed, 15 Apr 2020 21:02:59 -0600 Subject: [PATCH 162/390] prep 6.2.0 --- CHANGELOG.md | 1 + pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 39125c1b..88233c33 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,5 @@ ## 6.2.0 + - Added Checks API https://github.com/SpinlockLabs/github.dart/pull/182 - Bug fix: Fix setRepositorySubscription to be a PUT instead of a POST https://github.com/SpinlockLabs/github.dart/commit/5b5d7656ce9ce1cb06e15651da06e7e192bc19e1 - Bug fix: Repository clone URLs were null. DEPRECATED `Repository.cloneUrls` use `cloneUrl`,`gitUrl`,`sshUrl`, or `svnUrl` instead. - Bug fix: Use a shared json encoder util to remove nulls from maps and lists, encode all dates for github. https://github.com/SpinlockLabs/github.dart/pull/182 diff --git a/pubspec.yaml b/pubspec.yaml index 23222056..85b26c72 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 6.1.3 +version: 6.2.0 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From 8c33a5ba70e70de0dd58f70240d5a482912c8e7c Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Mon, 20 Apr 2020 16:46:38 -0600 Subject: [PATCH 163/390] Consolidated utils from src/util.dart into src/common/utils/utils.dart --- CHANGELOG.md | 3 + lib/src/common/activity_service.dart | 2 +- lib/src/common/checks_service.dart | 2 +- lib/src/common/github.dart | 2 +- lib/src/common/model/checks.dart | 1 - lib/src/common/model/repos.dart | 1 - lib/src/common/orgs_service.dart | 2 +- lib/src/common/pulls_service.dart | 2 +- lib/src/common/repos_service.dart | 2 +- lib/src/common/users_service.dart | 2 +- lib/src/common/util/oauth2.dart | 1 - lib/src/common/util/pagination.dart | 1 - lib/src/common/util/utils.dart | 97 +++++++++++++++++++++++++++- lib/src/util.dart | 95 --------------------------- test/experiment/fancy_numbers.dart | 2 +- test/git_test.dart | 1 - 16 files changed, 107 insertions(+), 109 deletions(-) delete mode 100644 lib/src/util.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index 88233c33..c2f90ae2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## 6.2.1 + - Consolidated utils from src/util.dart into src/common/utils/utils.dart + ## 6.2.0 - Added Checks API https://github.com/SpinlockLabs/github.dart/pull/182 - Bug fix: Fix setRepositorySubscription to be a PUT instead of a POST https://github.com/SpinlockLabs/github.dart/commit/5b5d7656ce9ce1cb06e15651da06e7e192bc19e1 diff --git a/lib/src/common/activity_service.dart b/lib/src/common/activity_service.dart index 537234ef..6fc03bb7 100644 --- a/lib/src/common/activity_service.dart +++ b/lib/src/common/activity_service.dart @@ -3,7 +3,7 @@ import 'dart:convert'; import 'package:github/src/common.dart'; import 'package:github/src/common/model/users.dart'; import 'package:github/src/common/util/pagination.dart'; -import 'package:github/src/util.dart'; +import 'package:github/src/common/util/utils.dart'; import 'package:http/http.dart' as http; /// The [ActivityService] handles communication with activity related methods diff --git a/lib/src/common/checks_service.dart b/lib/src/common/checks_service.dart index 29e60609..f25ee2c6 100644 --- a/lib/src/common/checks_service.dart +++ b/lib/src/common/checks_service.dart @@ -1,7 +1,7 @@ import 'dart:convert'; import 'package:github/github.dart'; -import 'package:github/src/util.dart'; +import 'package:github/src/common/util/utils.dart'; import 'package:meta/meta.dart'; const _previewHeader = 'application/vnd.github.antiope-preview+json'; diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index 221aa35f..27e36c5e 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -1,7 +1,7 @@ import 'dart:async'; import 'dart:convert'; import 'package:github/src/common.dart'; -import 'package:github/src/util.dart'; +import 'package:github/src/common/util/utils.dart'; import 'package:http/http.dart' as http; import 'package:http_parser/http_parser.dart' as http_parser; import 'package:meta/meta.dart'; diff --git a/lib/src/common/model/checks.dart b/lib/src/common/model/checks.dart index 969c9287..83d6c9c3 100644 --- a/lib/src/common/model/checks.dart +++ b/lib/src/common/model/checks.dart @@ -1,5 +1,4 @@ import 'package:github/src/common/util/utils.dart'; -import 'package:github/src/util.dart'; import 'package:meta/meta.dart'; class CheckRunAnnotationLevel extends EnumWithValue { diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart index 59b2e27d..b8a51950 100644 --- a/lib/src/common/model/repos.dart +++ b/lib/src/common/model/repos.dart @@ -1,5 +1,4 @@ import 'package:github/src/common.dart'; -import 'package:github/src/util.dart'; import 'package:json_annotation/json_annotation.dart'; part 'repos.g.dart'; diff --git a/lib/src/common/orgs_service.dart b/lib/src/common/orgs_service.dart index 273ac510..3f3dfa6c 100644 --- a/lib/src/common/orgs_service.dart +++ b/lib/src/common/orgs_service.dart @@ -2,7 +2,7 @@ import 'dart:async'; import 'dart:convert'; import 'package:github/src/common.dart'; import 'package:github/src/common/util/pagination.dart'; -import 'package:github/src/util.dart'; +import 'package:github/src/common/util/utils.dart'; import 'package:http/http.dart' as http; /// The [OrganizationsService] handles communication with organization diff --git a/lib/src/common/pulls_service.dart b/lib/src/common/pulls_service.dart index b8350338..ddc51b22 100644 --- a/lib/src/common/pulls_service.dart +++ b/lib/src/common/pulls_service.dart @@ -2,7 +2,7 @@ import 'dart:async'; import 'dart:convert'; import 'package:github/src/common.dart'; import 'package:github/src/common/util/pagination.dart'; -import 'package:github/src/util.dart'; +import 'package:github/src/common/util/utils.dart'; /// The [PullRequestsService] handles communication with pull request /// methods of the GitHub API. diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 4abd580d..3245e456 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -4,7 +4,7 @@ import 'package:github/src/common.dart'; import 'package:github/src/common/model/repos_releases.dart'; import 'package:github/src/common/model/users.dart'; import 'package:github/src/common/util/pagination.dart'; -import 'package:github/src/util.dart'; +import 'package:github/src/common/util/utils.dart'; import 'package:http/http.dart' as http; import 'package:meta/meta.dart'; diff --git a/lib/src/common/users_service.dart b/lib/src/common/users_service.dart index a0136869..ad59d9ea 100644 --- a/lib/src/common/users_service.dart +++ b/lib/src/common/users_service.dart @@ -2,7 +2,7 @@ import 'dart:async'; import 'package:github/src/common.dart'; import 'package:github/src/common/model/users.dart'; import 'package:github/src/common/util/pagination.dart'; -import 'package:github/src/util.dart'; +import 'package:github/src/common/util/utils.dart'; import 'package:http/http.dart' as http; /// The [UsersService] handles communication with user related methods of the diff --git a/lib/src/common/util/oauth2.dart b/lib/src/common/util/oauth2.dart index d6dc9c9a..54788d1c 100644 --- a/lib/src/common/util/oauth2.dart +++ b/lib/src/common/util/oauth2.dart @@ -1,7 +1,6 @@ import 'dart:async'; import 'dart:convert'; import 'package:github/src/common.dart'; -import 'package:github/src/util.dart'; import 'package:http/http.dart' as http; /// OAuth2 Flow Helper diff --git a/lib/src/common/util/pagination.dart b/lib/src/common/util/pagination.dart index 4a5f5381..2e371835 100644 --- a/lib/src/common/util/pagination.dart +++ b/lib/src/common/util/pagination.dart @@ -4,7 +4,6 @@ import 'dart:convert' show jsonDecode; import 'package:http/http.dart' as http; import '../../common.dart'; -import '../../util.dart'; /// Internal Helper for dealing with GitHub Pagination. class PaginationHelper { diff --git a/lib/src/common/util/utils.dart b/lib/src/common/util/utils.dart index 7385bc25..92fdb7a2 100644 --- a/lib/src/common/util/utils.dart +++ b/lib/src/common/util/utils.dart @@ -1,5 +1,4 @@ import 'package:github/src/common.dart'; -import 'package:github/src/util.dart'; import 'package:meta/meta.dart'; /// A Json encodable class that mimics an enum, @@ -92,3 +91,99 @@ abstract class StatusCodes { static bool isClientError(int code) => code > 400 && code < 500; } + +final RegExp githubDateRemoveRegExp = RegExp(r'\.\d*'); + +const v3ApiMimeType = 'application/vnd.github.v3+json'; + +String buildQueryString(Map params) { + final queryString = StringBuffer(); + + if (params.isNotEmpty && !params.values.every((value) => value == null)) { + queryString.write('?'); + } + + var i = 0; + for (final key in params.keys) { + i++; + if (params[key] == null) { + continue; + } + queryString.write('$key=${Uri.encodeComponent(params[key].toString())}'); + if (i != params.keys.length) { + queryString.write('&'); + } + } + return queryString.toString(); +} + +dynamic copyOf(dynamic input) { + if (input is Iterable) { + return List.from(input); + } else if (input is Map) { + return Map.from(input); + } else { + throw Exception('type could not be copied'); + } +} + +/// Puts a [name] and [value] into the [map] if [value] is not null. If [value] +/// is null, nothing is added. +void putValue(String name, dynamic value, Map map) { + if (value != null) { + map[name] = value; + } +} + +List> mapToList(Map input) { + final out = >[]; + for (final key in input.keys) { + out.add(MapEntry(key, input[key])); + } + return out; +} + +/// Internal method to handle null for parsing dates. +DateTime parseDateTime(String input) { + if (input == null) { + return null; + } + + return DateTime.parse(input); +} + +/// Returns a new map containing only the entries of [input] whose value is not null. +/// +/// If [recursive] is true, nested maps are also filtered. +Map createNonNullMap(Map input, {bool recursive = true}) { + final map = {}; + for (final entry in input.entries) { + if (entry.value != null) { + map[entry.key] = recursive && entry.value is Map + ? createNonNullMap(entry.value as Map, recursive: recursive) + : entry.value; + } + } + return map; +} + +// TODO: only used in test – delete? +int parseFancyNumber(String input) { + input = input.trim(); + if (input.contains(',')) { + input = input.replaceAll(',', ''); + } + + const multipliers = {'h': 100, 'k': 1000, 'ht': 100000, 'm': 1000000}; + int value; + + if (!multipliers.keys.any((m) => input.endsWith(m))) { + value = int.parse(input); + } else { + final m = multipliers.keys.firstWhere((m) => input.endsWith(m)); + input = input.substring(0, input.length - m.length); + value = num.parse(input) * multipliers[m]; + } + + return value; +} diff --git a/lib/src/util.dart b/lib/src/util.dart deleted file mode 100644 index 633f9d02..00000000 --- a/lib/src/util.dart +++ /dev/null @@ -1,95 +0,0 @@ -final RegExp githubDateRemoveRegExp = RegExp(r'\.\d*'); - -const v3ApiMimeType = 'application/vnd.github.v3+json'; - -String buildQueryString(Map params) { - final queryString = StringBuffer(); - - if (params.isNotEmpty && !params.values.every((value) => value == null)) { - queryString.write('?'); - } - - var i = 0; - for (final key in params.keys) { - i++; - if (params[key] == null) { - continue; - } - queryString.write('$key=${Uri.encodeComponent(params[key].toString())}'); - if (i != params.keys.length) { - queryString.write('&'); - } - } - return queryString.toString(); -} - -dynamic copyOf(dynamic input) { - if (input is Iterable) { - return List.from(input); - } else if (input is Map) { - return Map.from(input); - } else { - throw Exception('type could not be copied'); - } -} - -/// Puts a [name] and [value] into the [map] if [value] is not null. If [value] -/// is null, nothing is added. -void putValue(String name, dynamic value, Map map) { - if (value != null) { - map[name] = value; - } -} - -List> mapToList(Map input) { - final out = >[]; - for (final key in input.keys) { - out.add(MapEntry(key, input[key])); - } - return out; -} - -/// Internal method to handle null for parsing dates. -DateTime parseDateTime(String input) { - if (input == null) { - return null; - } - - return DateTime.parse(input); -} - -/// Returns a new map containing only the entries of [input] whose value is not null. -/// -/// If [recursive] is true, nested maps are also filtered. -Map createNonNullMap(Map input, {bool recursive = true}) { - final map = {}; - for (final entry in input.entries) { - if (entry.value != null) { - map[entry.key] = recursive && entry.value is Map - ? createNonNullMap(entry.value as Map, recursive: recursive) - : entry.value; - } - } - return map; -} - -// TODO: only used in test – delete? -int parseFancyNumber(String input) { - input = input.trim(); - if (input.contains(',')) { - input = input.replaceAll(',', ''); - } - - const multipliers = {'h': 100, 'k': 1000, 'ht': 100000, 'm': 1000000}; - int value; - - if (!multipliers.keys.any((m) => input.endsWith(m))) { - value = int.parse(input); - } else { - final m = multipliers.keys.firstWhere((m) => input.endsWith(m)); - input = input.substring(0, input.length - m.length); - value = num.parse(input) * multipliers[m]; - } - - return value; -} diff --git a/test/experiment/fancy_numbers.dart b/test/experiment/fancy_numbers.dart index 5b9bd237..693936eb 100644 --- a/test/experiment/fancy_numbers.dart +++ b/test/experiment/fancy_numbers.dart @@ -1,4 +1,4 @@ -import 'package:github/src/util.dart'; +import 'package:github/src/common/util/utils.dart'; void main() { test('1k', 1000); diff --git a/test/git_test.dart b/test/git_test.dart index 5dc4e98d..813f5946 100644 --- a/test/git_test.dart +++ b/test/git_test.dart @@ -2,7 +2,6 @@ import 'dart:async'; import 'dart:convert'; import 'package:github/src/common.dart'; -import 'package:github/src/util.dart'; import 'package:http/http.dart' as http; import 'package:mockito/mockito.dart'; import 'package:test/test.dart'; From 49338d9e71e97b297c2c737497cbb2ef37e10163 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Tue, 21 Apr 2020 08:00:12 -0600 Subject: [PATCH 164/390] Added a new top level entry point: hooks.dart improve dartdocs and IDE usability when writing hooks --- CHANGELOG.md | 1 + lib/hooks.dart | 11 +++++++++++ lib/src/common/xplat_common.dart | 13 +++++++++++++ 3 files changed, 25 insertions(+) create mode 100644 lib/hooks.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index c2f90ae2..01393899 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ ## 6.2.1 - Consolidated utils from src/util.dart into src/common/utils/utils.dart + - Added a new top level entry point `hooks.dart` to improve dartdocs and IDE usability when writing hooks ## 6.2.0 - Added Checks API https://github.com/SpinlockLabs/github.dart/pull/182 diff --git a/lib/hooks.dart b/lib/hooks.dart new file mode 100644 index 00000000..f60a4cd0 --- /dev/null +++ b/lib/hooks.dart @@ -0,0 +1,11 @@ +/// This entrypoint is here so that dartdoc will generate documentation for +/// files under lib/src/server. This is only necessary because conditional +/// import/export isn't well supported in the Dart ecosystem. +/// +/// Add this import if you are in a non-web environment and writing something +/// that uses github hooks. For more information, see github hooks documentation +/// https://developer.github.com/v3/repos/hooks/ +/// `import 'pacakge:github/hooks.dart';` +library hooks; + +export 'src/server/xplat_server.dart'; \ No newline at end of file diff --git a/lib/src/common/xplat_common.dart b/lib/src/common/xplat_common.dart index e251ba7f..190099c8 100644 --- a/lib/src/common/xplat_common.dart +++ b/lib/src/common/xplat_common.dart @@ -1,8 +1,21 @@ import 'package:github/src/common.dart'; +/// Looks for GitHub Authentication information from the current environment. +/// +/// If in a browser context, it will look through query string parameters first +/// and then sessionStorage. +/// +/// If in a server, command line or Flutter context it will use the system environment variables. +/// +/// In both contexts it delegates to [findAuthenticationInMap] to find the +/// github token or username and password. Authentication findAuthenticationFromEnvironment() => Authentication.anonymous(); +/// Checks the passed in map for keys in [COMMON_GITHUB_TOKEN_ENV_KEYS]. +/// The first one that exists is used as the github token to call [Authentication.withToken] with. +/// If the above fails, the GITHUB_USERNAME and GITHUB_PASSWORD keys will be checked. +/// If those keys both exist, then [Authentication.basic] will be used. Authentication findAuthenticationInMap(Map map) { for (final key in COMMON_GITHUB_TOKEN_ENV_KEYS) { if (map.containsKey(key)) { From 3a22708adaad5a5a28985c2fc0afc3501202736b Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Tue, 21 Apr 2020 08:03:34 -0600 Subject: [PATCH 165/390] prep 6.2.1 and dart format (comment whitespace :facepalm:) --- lib/hooks.dart | 8 ++++---- lib/src/common/xplat_common.dart | 8 ++++---- pubspec.yaml | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/hooks.dart b/lib/hooks.dart index f60a4cd0..28cefed6 100644 --- a/lib/hooks.dart +++ b/lib/hooks.dart @@ -1,11 +1,11 @@ /// This entrypoint is here so that dartdoc will generate documentation for -/// files under lib/src/server. This is only necessary because conditional +/// files under lib/src/server. This is only necessary because conditional /// import/export isn't well supported in the Dart ecosystem. -/// +/// /// Add this import if you are in a non-web environment and writing something -/// that uses github hooks. For more information, see github hooks documentation +/// that uses github hooks. For more information, see github hooks documentation /// https://developer.github.com/v3/repos/hooks/ /// `import 'pacakge:github/hooks.dart';` library hooks; -export 'src/server/xplat_server.dart'; \ No newline at end of file +export 'src/server/xplat_server.dart'; diff --git a/lib/src/common/xplat_common.dart b/lib/src/common/xplat_common.dart index 190099c8..5d7e7226 100644 --- a/lib/src/common/xplat_common.dart +++ b/lib/src/common/xplat_common.dart @@ -1,10 +1,10 @@ import 'package:github/src/common.dart'; /// Looks for GitHub Authentication information from the current environment. -/// +/// /// If in a browser context, it will look through query string parameters first -/// and then sessionStorage. -/// +/// and then sessionStorage. +/// /// If in a server, command line or Flutter context it will use the system environment variables. /// /// In both contexts it delegates to [findAuthenticationInMap] to find the @@ -12,7 +12,7 @@ import 'package:github/src/common.dart'; Authentication findAuthenticationFromEnvironment() => Authentication.anonymous(); -/// Checks the passed in map for keys in [COMMON_GITHUB_TOKEN_ENV_KEYS]. +/// Checks the passed in map for keys in [COMMON_GITHUB_TOKEN_ENV_KEYS]. /// The first one that exists is used as the github token to call [Authentication.withToken] with. /// If the above fails, the GITHUB_USERNAME and GITHUB_PASSWORD keys will be checked. /// If those keys both exist, then [Authentication.basic] will be used. diff --git a/pubspec.yaml b/pubspec.yaml index 85b26c72..2eb17ddd 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 6.2.0 +version: 6.2.1 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From dde81ece1f93994a05cc0720d8198baa1704b89e Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Tue, 21 Apr 2020 08:46:35 -0600 Subject: [PATCH 166/390] fix typo in documentation --- CHANGELOG.md | 3 +++ lib/hooks.dart | 4 +++- pubspec.yaml | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 01393899..2fcfa966 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## 6.2.2 + - Fixed typo in documentation + ## 6.2.1 - Consolidated utils from src/util.dart into src/common/utils/utils.dart - Added a new top level entry point `hooks.dart` to improve dartdocs and IDE usability when writing hooks diff --git a/lib/hooks.dart b/lib/hooks.dart index 28cefed6..1a336ed2 100644 --- a/lib/hooks.dart +++ b/lib/hooks.dart @@ -2,10 +2,12 @@ /// files under lib/src/server. This is only necessary because conditional /// import/export isn't well supported in the Dart ecosystem. /// +/// `import 'package:github/hooks.dart';` +/// /// Add this import if you are in a non-web environment and writing something /// that uses github hooks. For more information, see github hooks documentation /// https://developer.github.com/v3/repos/hooks/ -/// `import 'pacakge:github/hooks.dart';` + library hooks; export 'src/server/xplat_server.dart'; diff --git a/pubspec.yaml b/pubspec.yaml index 2eb17ddd..a96158a0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 6.2.1 +version: 6.2.2 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From 83bddf3193cddc360d14634d241f37cc4ef6f1fb Mon Sep 17 00:00:00 2001 From: Rongjian Zhang Date: Sat, 25 Apr 2020 15:07:35 +0800 Subject: [PATCH 167/390] Fix contributors response --- lib/src/common/model/users.dart | 39 +++++++++++++++++++++++++++++++ lib/src/common/model/users.g.dart | 23 ++++++++++++++++++ lib/src/common/repos_service.dart | 7 +++--- 3 files changed, 66 insertions(+), 3 deletions(-) diff --git a/lib/src/common/model/users.dart b/lib/src/common/model/users.dart index 70beb871..afdbb006 100644 --- a/lib/src/common/model/users.dart +++ b/lib/src/common/model/users.dart @@ -115,6 +115,45 @@ class Collaborator { _$CollaboratorFromJson(json); } +/// The response from listing contributors on a repo. +// https://developer.github.com/v3/repos/collaborators/#response +@JsonSerializable(fieldRename: FieldRename.snake) +class Contributor { + Contributor({ + this.id, + this.login, + this.avatarUrl, + this.htmlUrl, + this.type, + this.siteAdmin, + this.contributions, + }); + + /// User's Username + String login; + + /// User ID + int id; + + /// Avatar URL + String avatarUrl; + + /// Url to this user's profile. + String htmlUrl; + + String type; + + /// If the user is a site administrator + bool siteAdmin; + + /// Contributions count + int contributions; + + factory Contributor.fromJson(Map input) => + _$ContributorFromJson(input); + Map toJson() => _$ContributorToJson(this); +} + /// The Currently Authenticated User @JsonSerializable(fieldRename: FieldRename.snake) class CurrentUser extends User { diff --git a/lib/src/common/model/users.g.dart b/lib/src/common/model/users.g.dart index 19889104..b9d189a1 100644 --- a/lib/src/common/model/users.g.dart +++ b/lib/src/common/model/users.g.dart @@ -67,6 +67,29 @@ Collaborator _$CollaboratorFromJson(Map json) { ); } +Contributor _$ContributorFromJson(Map json) { + return Contributor( + id: json['id'] as int, + login: json['login'] as String, + avatarUrl: json['avatar_url'] as String, + htmlUrl: json['html_url'] as String, + type: json['type'] as String, + siteAdmin: json['site_admin'] as bool, + contributions: json['contributions'] as int, + ); +} + +Map _$ContributorToJson(Contributor instance) => + { + 'login': instance.login, + 'id': instance.id, + 'avatar_url': instance.avatarUrl, + 'html_url': instance.htmlUrl, + 'type': instance.type, + 'site_admin': instance.siteAdmin, + 'contributions': instance.contributions, + }; + CurrentUser _$CurrentUserFromJson(Map json) { return CurrentUser() ..login = json['login'] as String diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 3245e456..bb477027 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -203,13 +203,14 @@ class RepositoriesService extends Service { /// Lists the contributors of the specified repository. /// /// API docs: https://developer.github.com/v3/repos/#list-contributors - Stream listContributors(RepositorySlug slug, {bool anon = false}) { + Stream listContributors(RepositorySlug slug, + {bool anon = false}) { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(anon); - return PaginationHelper(github).objects, User>( + return PaginationHelper(github).objects, Contributor>( 'GET', '/repos/${slug.fullName}/contributors', - (i) => User.fromJson(i), + (i) => Contributor.fromJson(i), params: {'anon': anon.toString()}, ); } From 0670f6518b213b4f8339df01cfa22d7586bfb96c Mon Sep 17 00:00:00 2001 From: Rongjian Zhang Date: Sat, 25 Apr 2020 15:09:51 +0800 Subject: [PATCH 168/390] Update contributors response link --- lib/src/common/model/users.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/src/common/model/users.dart b/lib/src/common/model/users.dart index afdbb006..19757488 100644 --- a/lib/src/common/model/users.dart +++ b/lib/src/common/model/users.dart @@ -116,7 +116,8 @@ class Collaborator { } /// The response from listing contributors on a repo. -// https://developer.github.com/v3/repos/collaborators/#response +/// +/// https://developer.github.com/v3/repos/#response-if-repository-contains-content @JsonSerializable(fieldRename: FieldRename.snake) class Contributor { Contributor({ From 431ae3b17c6636246924d136da082ee426e956bf Mon Sep 17 00:00:00 2001 From: Daan van den Hoek <28300783+daanvandenhoek@users.noreply.github.com> Date: Sun, 21 Jun 2020 14:36:32 +0200 Subject: [PATCH 169/390] Added Latest Release --- lib/src/common/repos_service.dart | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index bb477027..3d64e1f1 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -942,6 +942,18 @@ class RepositoriesService extends Service { ); } + /// Lists the latest release for the specified repository. + /// + /// API docs: https://developer.github.com/v3/repos/releases/#get-the-latest-release + Stream getLatestRelease(RepositorySlug slug) { + ArgumentError.checkNotNull(slug); + return PaginationHelper(github).objects, Release>( + 'GET', + '/repos/${slug.fullName}/releases/latest', + (i) => Release.fromJson(i), + ); + } + /// Fetches a single release by the release ID. /// /// API docs: https://developer.github.com/v3/repos/releases/#get-a-single-release From 2fd3cfdfa3658660e02fd20ffb2dcaa52792f2ab Mon Sep 17 00:00:00 2001 From: Daan van den Hoek <28300783+daanvandenhoek@users.noreply.github.com> Date: Sun, 21 Jun 2020 14:40:17 +0200 Subject: [PATCH 170/390] Update repos_service.dart --- lib/src/common/repos_service.dart | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 3d64e1f1..9f495865 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -945,12 +945,11 @@ class RepositoriesService extends Service { /// Lists the latest release for the specified repository. /// /// API docs: https://developer.github.com/v3/repos/releases/#get-the-latest-release - Stream getLatestRelease(RepositorySlug slug) { + Future getLatestRelease(RepositorySlug slug) { ArgumentError.checkNotNull(slug); - return PaginationHelper(github).objects, Release>( - 'GET', + return github.getJSON, Release>( '/repos/${slug.fullName}/releases/latest', - (i) => Release.fromJson(i), + convert: (i) => Release.fromJson(i), ); } From 8f2e5d65b5ba021f81e920abb392a78ec2cf9e91 Mon Sep 17 00:00:00 2001 From: Daan van den Hoek <28300783+daanvandenhoek@users.noreply.github.com> Date: Thu, 2 Jul 2020 22:29:31 +0200 Subject: [PATCH 171/390] Update lib/src/common/repos_service.dart Co-authored-by: Axel Ogereau-Peltier <49279289+axel-op@users.noreply.github.com> --- lib/src/common/repos_service.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 9f495865..1a2a2a7e 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -950,6 +950,7 @@ class RepositoriesService extends Service { return github.getJSON, Release>( '/repos/${slug.fullName}/releases/latest', convert: (i) => Release.fromJson(i), + statusCode: StatusCodes.OK, ); } From e0d4375d69cfc4811395565fd79a653b21282f74 Mon Sep 17 00:00:00 2001 From: Pascal Welsch Date: Wed, 29 Jul 2020 13:06:32 +0200 Subject: [PATCH 172/390] Add User#twitter_username property --- lib/src/common/model/users.dart | 4 ++++ lib/src/common/model/users.g.dart | 5 ++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/src/common/model/users.dart b/lib/src/common/model/users.dart index 19757488..d2a8ea6c 100644 --- a/lib/src/common/model/users.dart +++ b/lib/src/common/model/users.dart @@ -87,6 +87,10 @@ class User { /// Last time this [User] was updated. DateTime updatedAt; + /// The username of the twitter account (without leading @) + @JsonKey(name: 'twitter_username') + String twitterUsername; + factory User.fromJson(Map input) => _$UserFromJson(input); Map toJson() => _$UserToJson(this); } diff --git a/lib/src/common/model/users.g.dart b/lib/src/common/model/users.g.dart index b9d189a1..57a69716 100644 --- a/lib/src/common/model/users.g.dart +++ b/lib/src/common/model/users.g.dart @@ -30,7 +30,7 @@ User _$UserFromJson(Map json) { updatedAt: json['updated_at'] == null ? null : DateTime.parse(json['updated_at'] as String), - ); + )..twitterUsername = json['twitter_username'] as String; } Map _$UserToJson(User instance) => { @@ -52,6 +52,7 @@ Map _$UserToJson(User instance) => { 'following': instance.followingCount, 'created_at': instance.createdAt?.toIso8601String(), 'updated_at': instance.updatedAt?.toIso8601String(), + 'twitter_username': instance.twitterUsername, }; Collaborator _$CollaboratorFromJson(Map json) { @@ -114,6 +115,7 @@ CurrentUser _$CurrentUserFromJson(Map json) { ..updatedAt = json['updated_at'] == null ? null : DateTime.parse(json['updated_at'] as String) + ..twitterUsername = json['twitter_username'] as String ..privateReposCount = json['total_private_repos'] as int ..ownedPrivateReposCount = json['owned_private_repos'] as int ..diskUsage = json['disk_usage'] as int @@ -142,6 +144,7 @@ Map _$CurrentUserToJson(CurrentUser instance) => 'following': instance.followingCount, 'created_at': instance.createdAt?.toIso8601String(), 'updated_at': instance.updatedAt?.toIso8601String(), + 'twitter_username': instance.twitterUsername, 'total_private_repos': instance.privateReposCount, 'owned_private_repos': instance.ownedPrivateReposCount, 'disk_usage': instance.diskUsage, From b27056a6542b75d0ed66c12294cafc0ca4253f2b Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Thu, 30 Jul 2020 09:45:37 -0600 Subject: [PATCH 173/390] Update lib/src/common/model/users.dart --- lib/src/common/model/users.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/src/common/model/users.dart b/lib/src/common/model/users.dart index d2a8ea6c..b616bd3b 100644 --- a/lib/src/common/model/users.dart +++ b/lib/src/common/model/users.dart @@ -88,7 +88,6 @@ class User { DateTime updatedAt; /// The username of the twitter account (without leading @) - @JsonKey(name: 'twitter_username') String twitterUsername; factory User.fromJson(Map input) => _$UserFromJson(input); From 6d37508a85e8a413103efda3b2038e2b819deb66 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Thu, 30 Jul 2020 10:04:12 -0600 Subject: [PATCH 174/390] improve pub.dev score --- CHANGELOG.md | 4 ++++ README.md | 55 +++-------------------------------------------- example/readme.md | 52 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 52 deletions(-) create mode 100644 example/readme.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 2fcfa966..6f5610ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 6.2.3 + - Add twitter username to User class https://github.com/SpinlockLabs/github.dart/pull/228 + - Improve pub.dev score + ## 6.2.2 - Fixed typo in documentation diff --git a/README.md b/README.md index 46c3ff99..f6f55a12 100644 --- a/README.md +++ b/README.md @@ -19,63 +19,14 @@ Please submit issues and pull requests, help out, or just give encouragement. ## Links -- [Library Demos](http://github.directcode.org/demos/) +- [Library Demos](https://github.directcode.org/demos/) - [Pub Package](https://pub.dartlang.org/packages/github) - [Wiki](https://github.com/SpinlockLabs/github.dart/wiki) - [Latest API reference](https://pub.dev/documentation/github/latest/) -## Getting Started +## Examples -First, add the following to your pubspec.yaml: - -```yaml -dependencies: - github: ^6.0.0 -``` - -Then import the library - -```dart -import 'package:github/github.dart'; -``` - -and then use it: - -### Example - -```dart -import 'package:github/github.dart'; - -Future main() async { - /* Create a GitHub Client, with anonymous authentication by default */ - var github = GitHub(); - - /* - or Create a GitHub Client and have it try to find your token or credentials automatically - In Flutter and in server environments this will search environment variables in this order - GITHUB_ADMIN_TOKEN - GITHUB_DART_TOKEN - GITHUB_API_TOKEN - GITHUB_TOKEN - HOMEBREW_GITHUB_API_TOKEN - MACHINE_GITHUB_API_TOKEN - and then GITHUB_USERNAME and GITHUB_PASSWORD - - In a browser it will search keys in the same order first through the query string parameters - and then in window sessionStorage - */ - var github = GitHub(auth: findAuthenticationFromEnvironment()); - - /* or Create a GitHub Client using an auth token */ - var github = GitHub(auth: Authentication.withToken('YourTokenHere')); - - /* or Create a GitHub Client using a username and password */ - var github = GitHub(auth: Authentication.basic('username', 'password')); - - Repository repo = await github.repositories.getRepository(RepositorySlug('user_or_org', 'repo_name')); - /* Do Something with repo */ -} -``` +See the examples in the example directory to learn how to use some of the features! ## Contacting Us diff --git a/example/readme.md b/example/readme.md new file mode 100644 index 00000000..0781c2ba --- /dev/null +++ b/example/readme.md @@ -0,0 +1,52 @@ +## Getting Started + +First, add the following to your pubspec.yaml: + +```yaml +dependencies: + github: ^6.0.0 +``` + +Then import the library + +```dart +import 'package:github/github.dart'; +``` + +and then use it: + +### Example + +```dart +import 'package:github/github.dart'; + +Future main() async { + /* Create a GitHub Client, with anonymous authentication by default */ + var github = GitHub(); + + /* + or Create a GitHub Client and have it try to find your token or credentials automatically + In Flutter and in server environments this will search environment variables in this order + GITHUB_ADMIN_TOKEN + GITHUB_DART_TOKEN + GITHUB_API_TOKEN + GITHUB_TOKEN + HOMEBREW_GITHUB_API_TOKEN + MACHINE_GITHUB_API_TOKEN + and then GITHUB_USERNAME and GITHUB_PASSWORD + + In a browser it will search keys in the same order first through the query string parameters + and then in window sessionStorage + */ + var github = GitHub(auth: findAuthenticationFromEnvironment()); + + /* or Create a GitHub Client using an auth token */ + var github = GitHub(auth: Authentication.withToken('YourTokenHere')); + + /* or Create a GitHub Client using a username and password */ + var github = GitHub(auth: Authentication.basic('username', 'password')); + + Repository repo = await github.repositories.getRepository(RepositorySlug('user_or_org', 'repo_name')); + /* Do Something with repo */ +} +``` From fb4e570327b97c1d96b0964ee9af2ccd36ef6611 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Thu, 30 Jul 2020 10:04:48 -0600 Subject: [PATCH 175/390] bump to 6.2.3 --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index a96158a0..73299b5e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 6.2.2 +version: 6.2.3 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From 7fe128b2eb1c71ddeb06e7f747ac21dc57ebed37 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Thu, 30 Jul 2020 11:26:11 -0600 Subject: [PATCH 176/390] prep 7.0.0 release, remove deprecations --- CHANGELOG.md | 3 +++ LICENSE.md => LICENSE | 0 lib/src/common/model/repos.dart | 7 ------- pubspec.yaml | 2 +- 4 files changed, 4 insertions(+), 8 deletions(-) rename LICENSE.md => LICENSE (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f5610ae..41cd650f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## 7.0.0 + - Removed deprecated CloneUrls property on Repository class + ## 6.2.3 - Add twitter username to User class https://github.com/SpinlockLabs/github.dart/pull/228 - Improve pub.dev score diff --git a/LICENSE.md b/LICENSE similarity index 100% rename from LICENSE.md rename to LICENSE diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart index b8a51950..aa95eab7 100644 --- a/lib/src/common/model/repos.dart +++ b/lib/src/common/model/repos.dart @@ -105,13 +105,6 @@ class Repository { final String gitUrl; - /// Repository Clone Urls - CloneUrls _cloneUrls; - - CloneUrls get cloneUrls { - return _cloneUrls ??= CloneUrls(gitUrl, sshUrl, cloneUrl, svnUrl); - } - /// Url to the Repository Homepage final String homepage; diff --git a/pubspec.yaml b/pubspec.yaml index 73299b5e..a74fa327 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 6.2.3 +version: 7.0.0 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From 4c5d3c9251892e06b77a31332d141485f7406f85 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Thu, 30 Jul 2020 12:24:28 -0600 Subject: [PATCH 177/390] fully remove CloneUrls --- lib/src/common/model/repos.dart | 31 ------------------------------- lib/src/common/model/repos.g.dart | 16 ---------------- 2 files changed, 47 deletions(-) diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart index aa95eab7..04641e4f 100644 --- a/lib/src/common/model/repos.dart +++ b/lib/src/common/model/repos.dart @@ -181,37 +181,6 @@ class Repository { String toString() => 'Repository: ${owner.login}/$name'; } -/// Repository Clone Urls -@Deprecated('These URLs are available on the Repository class') -@JsonSerializable() -class CloneUrls { - /// Git Protocol - /// - /// git://github.com/user/repo.git - final String git; - - /// SSH Protocol - /// - /// git@github.com:user/repo.git - final String ssh; - - /// HTTPS Protocol - /// - /// https://github.com/user/repo.git - final String https; - - /// Subversion Protocol - /// - /// https://github.com/user/repo - final String svn; - - CloneUrls(this.git, this.ssh, this.https, this.svn); - - factory CloneUrls.fromJson(Map input) => - _$CloneUrlsFromJson(input); - Map toJson() => _$CloneUrlsToJson(this); -} - @JsonSerializable(createToJson: false) class Tag { final String name; diff --git a/lib/src/common/model/repos.g.dart b/lib/src/common/model/repos.g.dart index 4a147535..615d58f0 100644 --- a/lib/src/common/model/repos.g.dart +++ b/lib/src/common/model/repos.g.dart @@ -97,22 +97,6 @@ Map _$RepositoryToJson(Repository instance) => 'disabled': instance.disabled, }; -CloneUrls _$CloneUrlsFromJson(Map json) { - return CloneUrls( - json['git'] as String, - json['ssh'] as String, - json['https'] as String, - json['svn'] as String, - ); -} - -Map _$CloneUrlsToJson(CloneUrls instance) => { - 'git': instance.git, - 'ssh': instance.ssh, - 'https': instance.https, - 'svn': instance.svn, - }; - Tag _$TagFromJson(Map json) { return Tag( json['name'] as String, From 4196991a2db701fc6ef7618af61589e83cc63ae9 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Thu, 30 Jul 2020 12:26:03 -0600 Subject: [PATCH 178/390] comment out lint rule unsafe_html --- analysis_options.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index 603ea294..442b7c0c 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -369,7 +369,7 @@ linter: # Avoid unsafe HTML APIs. # http://dart-lang.github.io/linter/lints/unsafe_html.html - - unsafe_html + # - unsafe_html # Prefer an 8-digit hexadecimal integer(0xFFFFFFFF) to instantiate Color. # http://dart-lang.github.io/linter/lints/use_full_hex_values_for_flutter_colors.html From 3c88457815f3013fcbf54032567dca3815f3953e Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Thu, 30 Jul 2020 23:43:11 -0600 Subject: [PATCH 179/390] 7.0.1 merge outstanding PRs - Add `getLatestRelease()` to RepositoriesService - Add `listCurrentUserFollowing()` function to `UsersService` --- CHANGELOG.md | 4 ++++ lib/src/common/users_service.dart | 7 +++++++ pubspec.yaml | 2 +- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 41cd650f..f4ba41ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 7.0.1 + - Add `getLatestRelease()` to RepositoriesService + - Add `listCurrentUserFollowing()` function to `UsersService` + ## 7.0.0 - Removed deprecated CloneUrls property on Repository class diff --git a/lib/src/common/users_service.dart b/lib/src/common/users_service.dart index ad59d9ea..e6e3b829 100644 --- a/lib/src/common/users_service.dart +++ b/lib/src/common/users_service.dart @@ -150,6 +150,13 @@ class UsersService extends Service { 'GET', '/user/followers', (i) => User.fromJson(i), statusCode: 200); + /// List current user following + /// + /// API docs: https://developer.github.com/v3/users/followers/#list-users-followed-by-the-authenticated-user + Stream listCurrentUserFollowing() => PaginationHelper(github).objects( + 'GET', '/user/following', (i) => User.fromJson(i), + statusCode: 200); + /// Lists the verified public keys for a [userLogin]. If no [userLogin] is specified, /// the public keys for the authenticated user are fetched. /// diff --git a/pubspec.yaml b/pubspec.yaml index a74fa327..0e3c36e3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 7.0.0 +version: 7.0.1 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From 34439bf0a3364bfb986f4d03db20a2b3993ac448 Mon Sep 17 00:00:00 2001 From: Brett Sutton Date: Thu, 13 Aug 2020 23:33:04 +1000 Subject: [PATCH 180/390] Added the required status code StatusCodes.CREATED for the createRelease to work. --- lib/src/common/repos_service.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 1a2a2a7e..b8931624 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -986,10 +986,10 @@ class RepositoriesService extends Service { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(createRelease); final release = await github.postJSON, Release>( - '/repos/${slug.fullName}/releases', - convert: (i) => Release.fromJson(i), - body: GitHubJson.encode(createRelease.toJson()), - ); + '/repos/${slug.fullName}/releases', + convert: (i) => Release.fromJson(i), + body: GitHubJson.encode(createRelease.toJson()), + statusCode: StatusCodes.CREATED); if (release.hasErrors) { final alreadyExistsErrorCode = release.errors.firstWhere( (error) => error['code'] == 'already_exists', From 5d41ad092daa6fde3a7763d9c8a9f8ea068ec283 Mon Sep 17 00:00:00 2001 From: Brett Sutton Date: Thu, 13 Aug 2020 23:40:39 +1000 Subject: [PATCH 181/390] null bool was returned when errors was null which was causing an assertion in createRelease. Now correctly returns false if no errors were returned. --- lib/src/common/model/repos_releases.dart | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/lib/src/common/model/repos_releases.dart b/lib/src/common/model/repos_releases.dart index b29a67ae..c6d5500f 100644 --- a/lib/src/common/model/repos_releases.dart +++ b/lib/src/common/model/repos_releases.dart @@ -89,14 +89,13 @@ class Release { List errors; - factory Release.fromJson(Map input) => - _$ReleaseFromJson(input); + factory Release.fromJson(Map input) => _$ReleaseFromJson(input); Map toJson() => _$ReleaseToJson(this); String getUploadUrlFor(String name, [String label]) => "${uploadUrl.substring(0, uploadUrl.indexOf('{'))}?name=$name${label != null ? ",$label" : ""}"; - bool get hasErrors => errors?.isNotEmpty; + bool get hasErrors => errors == null ? false : errors.isNotEmpty; } /// Model class for a release asset. @@ -145,8 +144,7 @@ class ReleaseAsset { /// Time the asset was last updated DateTime updatedAt; - factory ReleaseAsset.fromJson(Map input) => - _$ReleaseAssetFromJson(input); + factory ReleaseAsset.fromJson(Map input) => _$ReleaseAssetFromJson(input); Map toJson() => _$ReleaseAssetToJson(this); } @@ -206,8 +204,7 @@ class CreateRelease { isDraft.hashCode ^ isPrerelease.hashCode; - factory CreateRelease.fromJson(Map input) => - _$CreateReleaseFromJson(input); + factory CreateRelease.fromJson(Map input) => _$CreateReleaseFromJson(input); Map toJson() => _$CreateReleaseToJson(this); } From 5700cda75e02952296103bca2134d9c58880586d Mon Sep 17 00:00:00 2001 From: Brett Sutton Date: Thu, 13 Aug 2020 23:41:42 +1000 Subject: [PATCH 182/390] fixed formatting. --- lib/src/common/model/repos_releases.dart | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/src/common/model/repos_releases.dart b/lib/src/common/model/repos_releases.dart index c6d5500f..59085fe3 100644 --- a/lib/src/common/model/repos_releases.dart +++ b/lib/src/common/model/repos_releases.dart @@ -89,7 +89,8 @@ class Release { List errors; - factory Release.fromJson(Map input) => _$ReleaseFromJson(input); + factory Release.fromJson(Map input) => + _$ReleaseFromJson(input); Map toJson() => _$ReleaseToJson(this); String getUploadUrlFor(String name, [String label]) => @@ -144,7 +145,8 @@ class ReleaseAsset { /// Time the asset was last updated DateTime updatedAt; - factory ReleaseAsset.fromJson(Map input) => _$ReleaseAssetFromJson(input); + factory ReleaseAsset.fromJson(Map input) => + _$ReleaseAssetFromJson(input); Map toJson() => _$ReleaseAssetToJson(this); } @@ -204,7 +206,8 @@ class CreateRelease { isDraft.hashCode ^ isPrerelease.hashCode; - factory CreateRelease.fromJson(Map input) => _$CreateReleaseFromJson(input); + factory CreateRelease.fromJson(Map input) => + _$CreateReleaseFromJson(input); Map toJson() => _$CreateReleaseToJson(this); } From 7ba76293fee112ff14798d8d5a55b03492339e35 Mon Sep 17 00:00:00 2001 From: Brett Sutton Date: Mon, 24 Aug 2020 11:04:36 +1000 Subject: [PATCH 183/390] Added log to handle a 404 which occurs if the tag doesn't exist. --- lib/src/common/repos_service.dart | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index b8931624..14abc8be 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -968,10 +968,31 @@ class RepositoriesService extends Service { /// Fetches a single release by the release tag name. /// + /// Returns null if the release doesn't exist. + /// /// API docs: https://developer.github.com/v3/repos/releases/#get-a-release-by-tag-name - Future getReleaseByTagName(RepositorySlug slug, String tagName) => - github.getJSON('/repos/${slug.fullName}/releases/tags/$tagName', - convert: (i) => Release.fromJson(i)); + Future getReleaseByTagName( + RepositorySlug slug, String tagName) async { + // github.getJSON('/repos/${slug.fullName}/releases/tags/$tagName', convert: (i) => Release.fromJson(i)); + + Release release; + try { + release = await github.getJSON( + '/repos/${slug.fullName}/releases/tags/$tagName', + convert: (i) => Release.fromJson(i), + statusCode: StatusCodes.OK, + fail: (http.Response response) { + if (response.statusCode == 404) { + // we just return null if the tag can't be found. + throw ReleaseNotFound.fromTagName(github, tagName); + } + }, + ); + } on ReleaseNotFound catch (e) { + release = null; + } + return release; + } /// Creates a Release based on the specified [createRelease]. /// From 16bfe55d96a8f9c6bcd1be72ad7db1f2184f74e8 Mon Sep 17 00:00:00 2001 From: Brett Sutton Date: Mon, 24 Aug 2020 11:05:04 +1000 Subject: [PATCH 184/390] Added asserts to ensure that each argument to RepositorySlug is non-null --- lib/src/common/model/repos.dart | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart index 04641e4f..dbf8ea7c 100644 --- a/lib/src/common/model/repos.dart +++ b/lib/src/common/model/repos.dart @@ -274,7 +274,10 @@ class RepositorySlug { /// Repository Name String name; - RepositorySlug(this.owner, this.name); + RepositorySlug(this.owner, this.name) { + ArgumentError.checkNotNull(owner, 'owner'); + ArgumentError.checkNotNull(name, 'name'); + } /// Creates a Repository Slug from a full name. factory RepositorySlug.full(String f) { From dfe06d7d0d9bc55e3b26ada0a4522f29594db2d4 Mon Sep 17 00:00:00 2001 From: Brett Sutton Date: Mon, 24 Aug 2020 11:05:18 +1000 Subject: [PATCH 185/390] Added new Exception for ReleaseNotFound. --- lib/src/common/util/errors.dart | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/src/common/util/errors.dart b/lib/src/common/util/errors.dart index 330f9534..a140f583 100644 --- a/lib/src/common/util/errors.dart +++ b/lib/src/common/util/errors.dart @@ -41,6 +41,12 @@ class RepositoryNotFound extends NotFound { : super(github, 'Repository Not Found: $repo'); } +/// Release not found +class ReleaseNotFound extends NotFound { + const ReleaseNotFound.fromTagName(GitHub github, String tagName) + : super(github, 'Release for tagName $tagName Not Found.'); +} + /// GitHub User was not found class UserNotFound extends NotFound { const UserNotFound(GitHub github, String user) From 6caf3ed0250d4e77f1f849feafe19aedc486451c Mon Sep 17 00:00:00 2001 From: Brett Sutton Date: Tue, 15 Sep 2020 17:53:18 +1000 Subject: [PATCH 186/390] Modified getReleaseByTagName to thrown an exception if the release can't be found. --- lib/src/common/repos_service.dart | 32 ++++++++++++------------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 14abc8be..ee2860b5 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -968,30 +968,22 @@ class RepositoriesService extends Service { /// Fetches a single release by the release tag name. /// - /// Returns null if the release doesn't exist. + /// Throws a [ReleaseNotFound] exception if the release + /// doesn't exist. /// /// API docs: https://developer.github.com/v3/repos/releases/#get-a-release-by-tag-name Future getReleaseByTagName( RepositorySlug slug, String tagName) async { - // github.getJSON('/repos/${slug.fullName}/releases/tags/$tagName', convert: (i) => Release.fromJson(i)); - - Release release; - try { - release = await github.getJSON( - '/repos/${slug.fullName}/releases/tags/$tagName', - convert: (i) => Release.fromJson(i), - statusCode: StatusCodes.OK, - fail: (http.Response response) { - if (response.statusCode == 404) { - // we just return null if the tag can't be found. - throw ReleaseNotFound.fromTagName(github, tagName); - } - }, - ); - } on ReleaseNotFound catch (e) { - release = null; - } - return release; + return github.getJSON( + '/repos/${slug.fullName}/releases/tags/$tagName', + convert: (i) => Release.fromJson(i), + statusCode: StatusCodes.OK, + fail: (http.Response response) { + if (response.statusCode == 404) { + throw ReleaseNotFound.fromTagName(github, tagName); + } + }, + ); } /// Creates a Release based on the specified [createRelease]. From 5dcdab5532c3265b08a679364b49ff581cbba377 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Tue, 15 Sep 2020 16:21:19 -0600 Subject: [PATCH 187/390] Prep 7.0.2 release --- CHANGELOG.md | 3 +++ pubspec.yaml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f4ba41ca..44636eb3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## 7.0.2 + - https://github.com/SpinlockLabs/github.dart/pull/231 + ## 7.0.1 - Add `getLatestRelease()` to RepositoriesService - Add `listCurrentUserFollowing()` function to `UsersService` diff --git a/pubspec.yaml b/pubspec.yaml index 0e3c36e3..0ca8f0d0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 7.0.1 +version: 7.0.2 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From 941729c137ca0cd9cd6cdec1da7dbe2eee71f99e Mon Sep 17 00:00:00 2001 From: LefebvreIlyas Date: Tue, 22 Sep 2020 00:35:04 +0200 Subject: [PATCH 188/390] rename languagesColor to kGitHubLanguageColors export 'package:github/src/const/language_color.dart'; run language_color_generator.dart --- tool/language_color_generator.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tool/language_color_generator.dart b/tool/language_color_generator.dart index 67afc165..a0d8f720 100644 --- a/tool/language_color_generator.dart +++ b/tool/language_color_generator.dart @@ -8,17 +8,19 @@ const _path = './lib/src/const/language_color.dart'; const _url = 'https://raw.githubusercontent.com/' 'github/linguist/master/lib/linguist/languages.yml'; -Future main() async { +Future main() async { final response = await http.Client().get(_url); final yaml = loadYaml(response.body) as YamlMap; + final stringBuffer = StringBuffer() ..writeln('// GENERATED CODE - DO NOT MODIFY BY HAND') ..writeln('// VERSION OF ${DateTime.now().toIso8601String()}') ..writeln() - ..writeln('const languagesColor = {'); + ..writeln('const kGitHubLanguageColors = {'); final map = yaml.value as YamlMap; + final languages = map.keys.cast().toList(growable: false)..sort(); for (var language in languages) { From 55729a5feefda2aa5301834a9330d1e80a2f478e Mon Sep 17 00:00:00 2001 From: LefebvreIlyas Date: Tue, 22 Sep 2020 00:36:15 +0200 Subject: [PATCH 189/390] rename languagesColor to kGitHubLanguageColors export 'package:github/src/const/language_color.dart'; run language_color_generator.dart --- lib/src/common.dart | 1 + lib/src/const/language_color.dart | 82 +++++++++++++++++++------------ 2 files changed, 52 insertions(+), 31 deletions(-) diff --git a/lib/src/common.dart b/lib/src/common.dart index f0313746..f8be345c 100644 --- a/lib/src/common.dart +++ b/lib/src/common.dart @@ -46,4 +46,5 @@ export 'package:github/src/common/util/oauth2.dart'; export 'package:github/src/common/util/pagination.dart'; export 'package:github/src/common/util/service.dart'; export 'package:github/src/common/util/utils.dart'; +export 'package:github/src/const/language_color.dart'; export 'package:github/src/const/token_env_keys.dart'; diff --git a/lib/src/const/language_color.dart b/lib/src/const/language_color.dart index 9a3fd526..7dd23124 100644 --- a/lib/src/const/language_color.dart +++ b/lib/src/const/language_color.dart @@ -1,18 +1,20 @@ // GENERATED CODE - DO NOT MODIFY BY HAND -// VERSION OF 2020-02-08T14:23:59.127442 +// VERSION OF 2020-09-22T00:31:27.140510 -const languagesColor = { +const kGitHubLanguageColors = { '1C Enterprise': '#814CCC', '4D': '#EDEDED', 'ABAP': '#E8274B', 'ABNF': '#EDEDED', 'AGS Script': '#B9D9FF', + 'AL Code': '#3AA2B5', 'AMPL': '#E6EFBB', 'ANTLR': '#9DC3FF', 'API Blueprint': '#2ACCA8', 'APL': '#5A8164', + 'ASL': '#EDEDED', 'ASN.1': '#EDEDED', - 'ASP': '#6A40FD', + 'ASP.NET': '#9400FF', 'ATS': '#1AC620', 'ActionScript': '#882B0F', 'Ada': '#02F88C', @@ -24,17 +26,18 @@ const languagesColor = { 'AngelScript': '#C7D7DC', 'Ant Build System': '#EDEDED', 'ApacheConf': '#EDEDED', - 'Apex': '#EDEDED', + 'Apex': '#1797C0', 'Apollo Guidance Computer': '#EDEDED', 'AppleScript': '#101F1F', 'Arc': '#AA2AFE', 'AsciiDoc': '#EDEDED', 'AspectJ': '#A957B0', 'Assembly': '#6E4C13', - 'Asymptote': '#4A0C0C', + 'Asymptote': '#FF0000', 'Augeas': '#EDEDED', 'AutoHotkey': '#6594B9', 'AutoIt': '#1C3552', + 'Avro IDL': '#EDEDED', 'Awk': '#EDEDED', 'Ballerina': '#FF5000', 'Batchfile': '#C1F12E', @@ -42,7 +45,7 @@ const languagesColor = { 'BibTeX': '#EDEDED', 'Bison': '#EDEDED', 'BitBake': '#EDEDED', - 'Blade': '#EDEDED', + 'Blade': '#F7523F', 'BlitzBasic': '#EDEDED', 'BlitzMax': '#CD6400', 'Bluespec': '#EDEDED', @@ -58,7 +61,7 @@ const languagesColor = { 'CMake': '#EDEDED', 'COBOL': '#EDEDED', 'COLLADA': '#EDEDED', - 'CSON': '#EDEDED', + 'CSON': '#244776', 'CSS': '#563D7C', 'CSV': '#EDEDED', 'CWeb': '#EDEDED', @@ -71,12 +74,14 @@ const languagesColor = { 'ChucK': '#EDEDED', 'Cirru': '#CCCCFF', 'Clarion': '#DB901E', + 'Classic ASP': '#6A40FD', 'Clean': '#3F85AF', 'Click': '#E4E6F3', 'Clojure': '#DB5855', 'Closure Templates': '#EDEDED', 'Cloud Firestore Security Rules': '#EDEDED', 'CoNLL-U': '#EDEDED', + 'CodeQL': '#EDEDED', 'CoffeeScript': '#244776', 'ColdFusion': '#ED2CD6', 'ColdFusion CFC': '#EDEDED', @@ -100,6 +105,7 @@ const languagesColor = { 'DM': '#447265', 'DNS Zone': '#EDEDED', 'DTrace': '#EDEDED', + 'Dafny': '#FFEC25', 'Darcs Patch': '#EDEDED', 'Dart': '#00B4AB', 'DataWeave': '#003A52', @@ -121,7 +127,7 @@ const languagesColor = { 'Ecere Projects': '#EDEDED', 'EditorConfig': '#EDEDED', 'Edje Data Collection': '#EDEDED', - 'Eiffel': '#946D57', + 'Eiffel': '#4D6977', 'Elixir': '#6E4A7E', 'Elm': '#60B5CC', 'Emacs Lisp': '#C065DB', @@ -140,8 +146,10 @@ const languagesColor = { 'Formatted': '#EDEDED', 'Forth': '#341708', 'Fortran': '#4D41B1', + 'Fortran Free Form': '#EDEDED', 'FreeMarker': '#0050B2', 'Frege': '#00CAFE', + 'Futhark': '#5F021F', 'G-code': '#D08CF2', 'GAML': '#FFC766', 'GAMS': '#EDEDED', @@ -149,6 +157,7 @@ const languagesColor = { 'GCC Machine Description': '#EDEDED', 'GDB': '#EDEDED', 'GDScript': '#355570', + 'GEDCOM': '#EDEDED', 'GLSL': '#EDEDED', 'GN': '#EDEDED', 'Game Maker Language': '#71B417', @@ -169,7 +178,7 @@ const languagesColor = { 'Gosu': '#82937F', 'Grace': '#EDEDED', 'Gradle': '#EDEDED', - 'Grammatical Framework': '#79AA7A', + 'Grammatical Framework': '#FF0000', 'Graph Modeling Language': '#EDEDED', 'GraphQL': '#EDEDED', 'Graphviz (DOT)': '#EDEDED', @@ -188,8 +197,8 @@ const languagesColor = { 'HTTP': '#EDEDED', 'HXML': '#EDEDED', 'Hack': '#878787', - 'Haml': '#EDEDED', - 'Handlebars': '#EDEDED', + 'Haml': '#ECE2A9', + 'Handlebars': '#F7931E', 'Harbour': '#0E60E3', 'Haskell': '#5E5086', 'Haxe': '#DF7900', @@ -230,6 +239,7 @@ const languagesColor = { 'Julia': '#A270BA', 'Jupyter Notebook': '#DA5B0B', 'KRL': '#28430A', + 'Kaitai Struct': '#773B37', 'KiCad Layout': '#EDEDED', 'KiCad Legacy Layout': '#EDEDED', 'KiCad Schematic': '#EDEDED', @@ -242,9 +252,9 @@ const languagesColor = { 'LTspice Symbol': '#EDEDED', 'LabVIEW': '#EDEDED', 'Lasso': '#999999', - 'Latte': '#EDEDED', + 'Latte': '#F2A542', 'Lean': '#EDEDED', - 'Less': '#EDEDED', + 'Less': '#1D365D', 'Lex': '#DBCA00', 'LilyPond': '#EDEDED', 'Limbo': '#EDEDED', @@ -270,10 +280,11 @@ const languagesColor = { 'MQL5': '#4A76B8', 'MTML': '#B7E1F4', 'MUF': '#EDEDED', + 'Macaulay2': '#D8FFFF', 'Makefile': '#427819', 'Mako': '#EDEDED', - 'Markdown': '#EDEDED', - 'Marko': '#EDEDED', + 'Markdown': '#083FA1', + 'Marko': '#42BFF2', 'Mask': '#F97732', 'Mathematica': '#EDEDED', 'Maven POM': '#EDEDED', @@ -294,8 +305,11 @@ const languagesColor = { 'MoonScript': '#EDEDED', 'Motorola 68K Assembly': '#EDEDED', 'Muse': '#EDEDED', + 'Mustache': '#EDEDED', 'Myghty': '#EDEDED', + 'NASL': '#EDEDED', 'NCL': '#28431F', + 'NEON': '#EDEDED', 'NL': '#EDEDED', 'NPM Config': '#EDEDED', 'NSIS': '#EDEDED', @@ -307,7 +321,7 @@ const languagesColor = { 'NewLisp': '#87AED7', 'Nextflow': '#3AC486', 'Nginx': '#EDEDED', - 'Nim': '#37775B', + 'Nim': '#FFC200', 'Ninja': '#EDEDED', 'Nit': '#009917', 'Nix': '#7E7EFF', @@ -327,6 +341,7 @@ const languagesColor = { 'Open Policy Agent': '#EDEDED', 'OpenCL': '#EDEDED', 'OpenEdge ABL': '#EDEDED', + 'OpenQASM': '#AA70FF', 'OpenRC runscript': '#EDEDED', 'OpenSCAD': '#EDEDED', 'OpenStep Property List': '#EDEDED', @@ -354,6 +369,7 @@ const languagesColor = { 'PicoLisp': '#EDEDED', 'PigLatin': '#FCD7DE', 'Pike': '#005390', + 'PlantUML': '#EDEDED', 'Pod': '#EDEDED', 'Pod 6': '#EDEDED', 'PogoScript': '#D80074', @@ -362,14 +378,14 @@ const languagesColor = { 'PostScript': '#DA291C', 'PowerBuilder': '#8F0F8D', 'PowerShell': '#012456', - 'Prisma': '#EDEDED', + 'Prisma': '#0C344B', 'Processing': '#0096D8', 'Proguard': '#EDEDED', 'Prolog': '#74283C', 'Propeller Spin': '#7FA2A7', 'Protocol Buffer': '#EDEDED', 'Public Key': '#EDEDED', - 'Pug': '#EDEDED', + 'Pug': '#A86454', 'Puppet': '#302B6D', 'Pure Data': '#EDEDED', 'PureBasic': '#5A6986', @@ -377,15 +393,16 @@ const languagesColor = { 'Python': '#3572A5', 'Python console': '#EDEDED', 'Python traceback': '#EDEDED', + 'Q#': '#FED659', 'QML': '#44A51C', 'QMake': '#EDEDED', + 'Qt Script': '#00B841', 'Quake': '#882233', 'R': '#198CE7', 'RAML': '#77D9FB', 'RDoc': '#EDEDED', 'REALbasic': '#EDEDED', 'REXX': '#EDEDED', - 'RHTML': '#EDEDED', 'RMarkdown': '#EDEDED', 'RPC': '#EDEDED', 'RPM Spec': '#EDEDED', @@ -413,7 +430,7 @@ const languagesColor = { 'Ruby': '#701516', 'Rust': '#DEA584', 'SAS': '#B34936', - 'SCSS': '#EDEDED', + 'SCSS': '#C6538C', 'SMT': '#EDEDED', 'SPARQL': '#EDEDED', 'SQF': '#3F3F3F', @@ -422,11 +439,11 @@ const languagesColor = { 'SRecode Template': '#348A34', 'SSH Config': '#EDEDED', 'STON': '#EDEDED', - 'SVG': '#EDEDED', + 'SVG': '#FF9900', 'SWIG': '#EDEDED', 'Sage': '#EDEDED', 'SaltStack': '#646464', - 'Sass': '#EDEDED', + 'Sass': '#A53B70', 'Scala': '#C22D40', 'Scaml': '#EDEDED', 'Scheme': '#1E4AEC', @@ -436,32 +453,34 @@ const languagesColor = { 'Shell': '#89E051', 'ShellSession': '#EDEDED', 'Shen': '#120F14', + 'Sieve': '#EDEDED', 'Slash': '#007EFF', 'Slice': '#003FA2', - 'Slim': '#EDEDED', + 'Slim': '#2B2B2B', 'SmPL': '#C94949', 'Smali': '#EDEDED', 'Smalltalk': '#596706', 'Smarty': '#EDEDED', 'Solidity': '#AA6746', - 'SourcePawn': '#5C7611', + 'SourcePawn': '#F69E1D', 'Spline Font Database': '#EDEDED', 'Squirrel': '#800000', 'Stan': '#B2011D', 'Standard ML': '#DC566D', 'Starlark': '#76D275', 'Stata': '#EDEDED', - 'Stylus': '#EDEDED', + 'Stylus': '#FF6347', 'SubRip Text': '#EDEDED', 'SugarSS': '#EDEDED', 'SuperCollider': '#46390B', - 'Svelte': '#EDEDED', + 'Svelte': '#FF3E00', 'Swift': '#FFAC45', 'SystemVerilog': '#DAE1C2', 'TI Program': '#A0AA87', 'TLA': '#EDEDED', 'TOML': '#EDEDED', 'TSQL': '#EDEDED', + 'TSV': '#EDEDED', 'TSX': '#EDEDED', 'TXL': '#EDEDED', 'Tcl': '#E4CC98', @@ -475,22 +494,23 @@ const languagesColor = { 'Thrift': '#EDEDED', 'Turing': '#CF142B', 'Turtle': '#EDEDED', - 'Twig': '#EDEDED', + 'Twig': '#C1D026', 'Type Language': '#EDEDED', 'TypeScript': '#2B7489', 'Unified Parallel C': '#EDEDED', 'Unity3D Asset': '#EDEDED', 'Unix Assembly': '#EDEDED', - 'Uno': '#EDEDED', + 'Uno': '#9933CC', 'UnrealScript': '#A54C4D', 'UrWeb': '#EDEDED', - 'V': '#5D87BD', + 'V': '#4F87C4', 'VBA': '#867DB1', 'VBScript': '#15DCDC', 'VCL': '#148AA8', 'VHDL': '#ADB2CB', 'Vala': '#FBE5CD', 'Verilog': '#B2B7F8', + 'Vim Help File': '#EDEDED', 'Vim Snippet': '#EDEDED', 'Vim script': '#199F4B', 'Visual Basic .NET': '#945DB7', @@ -521,7 +541,7 @@ const languagesColor = { 'XSLT': '#EB8CEB', 'Xojo': '#EDEDED', 'Xtend': '#EDEDED', - 'YAML': '#EDEDED', + 'YAML': '#CB171E', 'YANG': '#EDEDED', 'YARA': '#220000', 'YASnippet': '#32AB90', @@ -539,7 +559,7 @@ const languagesColor = { 'eC': '#913960', 'edn': '#EDEDED', 'fish': '#EDEDED', - 'mIRC Script': '#926059', + 'mIRC Script': '#3D57C3', 'mcfunction': '#E22837', 'mupad': '#EDEDED', 'nanorc': '#EDEDED', From 375fcd676319a50cfde2e5d91ec5a90ee4b2a9d7 Mon Sep 17 00:00:00 2001 From: LefebvreIlyas Date: Sat, 3 Oct 2020 23:58:14 +0200 Subject: [PATCH 190/390] rename kGitHubLanguageColors to languageColors run language_color_generator.dart --- lib/src/const/language_color.dart | 22 +++++++++++----------- tool/language_color_generator.dart | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/src/const/language_color.dart b/lib/src/const/language_color.dart index 7dd23124..7c3d40d7 100644 --- a/lib/src/const/language_color.dart +++ b/lib/src/const/language_color.dart @@ -1,13 +1,13 @@ // GENERATED CODE - DO NOT MODIFY BY HAND -// VERSION OF 2020-09-22T00:31:27.140510 +// VERSION OF 2020-10-03T23:56:33.788466 -const kGitHubLanguageColors = { +const languageColors = { '1C Enterprise': '#814CCC', '4D': '#EDEDED', 'ABAP': '#E8274B', 'ABNF': '#EDEDED', 'AGS Script': '#B9D9FF', - 'AL Code': '#3AA2B5', + 'AL': '#3AA2B5', 'AMPL': '#E6EFBB', 'ANTLR': '#9DC3FF', 'API Blueprint': '#2ACCA8', @@ -27,7 +27,7 @@ const kGitHubLanguageColors = { 'Ant Build System': '#EDEDED', 'ApacheConf': '#EDEDED', 'Apex': '#1797C0', - 'Apollo Guidance Computer': '#EDEDED', + 'Apollo Guidance Computer': '#0B3D91', 'AppleScript': '#101F1F', 'Arc': '#AA2AFE', 'AsciiDoc': '#EDEDED', @@ -43,7 +43,7 @@ const kGitHubLanguageColors = { 'Batchfile': '#C1F12E', 'Befunge': '#EDEDED', 'BibTeX': '#EDEDED', - 'Bison': '#EDEDED', + 'Bison': '#6A463F', 'BitBake': '#EDEDED', 'Blade': '#F7523F', 'BlitzBasic': '#EDEDED', @@ -84,7 +84,7 @@ const kGitHubLanguageColors = { 'CodeQL': '#EDEDED', 'CoffeeScript': '#244776', 'ColdFusion': '#ED2CD6', - 'ColdFusion CFC': '#EDEDED', + 'ColdFusion CFC': '#ED2CD6', 'Common Lisp': '#3FB68B', 'Common Workflow Language': '#B5314C', 'Component Pascal': '#B0CE4E', @@ -119,7 +119,7 @@ const kGitHubLanguageColors = { 'EBNF': '#EDEDED', 'ECL': '#8A1267', 'ECLiPSe': '#EDEDED', - 'EJS': '#EDEDED', + 'EJS': '#A91E50', 'EML': '#EDEDED', 'EQ': '#A78649', 'Eagle': '#EDEDED', @@ -180,7 +180,7 @@ const kGitHubLanguageColors = { 'Gradle': '#EDEDED', 'Grammatical Framework': '#FF0000', 'Graph Modeling Language': '#EDEDED', - 'GraphQL': '#EDEDED', + 'GraphQL': '#E10098', 'Graphviz (DOT)': '#EDEDED', 'Groovy': '#E69F56', 'Groovy Server Pages': '#EDEDED', @@ -219,7 +219,7 @@ const kGitHubLanguageColors = { 'Isabelle': '#FEFE00', 'Isabelle ROOT': '#EDEDED', 'J': '#9EEDFF', - 'JFlex': '#EDEDED', + 'JFlex': '#DBCA00', 'JSON': '#EDEDED', 'JSON with Comments': '#EDEDED', 'JSON5': '#EDEDED', @@ -326,7 +326,7 @@ const kGitHubLanguageColors = { 'Nit': '#009917', 'Nix': '#7E7EFF', 'Nu': '#C9DF40', - 'NumPy': '#EDEDED', + 'NumPy': '#9C8AF9', 'OCaml': '#3BE133', 'ObjDump': '#EDEDED', 'Object Data Instance Notation': '#EDEDED', @@ -497,7 +497,7 @@ const kGitHubLanguageColors = { 'Twig': '#C1D026', 'Type Language': '#EDEDED', 'TypeScript': '#2B7489', - 'Unified Parallel C': '#EDEDED', + 'Unified Parallel C': '#4E3617', 'Unity3D Asset': '#EDEDED', 'Unix Assembly': '#EDEDED', 'Uno': '#9933CC', diff --git a/tool/language_color_generator.dart b/tool/language_color_generator.dart index a0d8f720..42fdcb66 100644 --- a/tool/language_color_generator.dart +++ b/tool/language_color_generator.dart @@ -17,7 +17,7 @@ Future main() async { ..writeln('// GENERATED CODE - DO NOT MODIFY BY HAND') ..writeln('// VERSION OF ${DateTime.now().toIso8601String()}') ..writeln() - ..writeln('const kGitHubLanguageColors = {'); + ..writeln('const languageColors = {'); final map = yaml.value as YamlMap; From aae28fcc23b1967141e6625264458522f9e20427 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Tue, 6 Oct 2020 20:04:11 -0600 Subject: [PATCH 191/390] Prep for 7.0.3 --- CHANGELOG.md | 3 +++ pubspec.yaml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 44636eb3..83c9d988 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## 7.0.3 + - Export `languageColors` as part of the library. This is the map of github languages to their colors https://github.com/SpinlockLabs/github.dart/pull/232 + ## 7.0.2 - https://github.com/SpinlockLabs/github.dart/pull/231 diff --git a/pubspec.yaml b/pubspec.yaml index 0ca8f0d0..e070bcf8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 7.0.2 +version: 7.0.3 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From feef97d5882eafbace83466947ae9a1e3aa00dd4 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Thu, 12 Nov 2020 18:09:15 -0700 Subject: [PATCH 192/390] Update triage.yml --- .github/workflows/triage.yml | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/.github/workflows/triage.yml b/.github/workflows/triage.yml index 1e25d91d..46249cf2 100644 --- a/.github/workflows/triage.yml +++ b/.github/workflows/triage.yml @@ -9,21 +9,25 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@master - - name: Assign Rob - uses: actions/github@v1.0.0 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - args: assign @robrbecker - name: Apply triage label - uses: actions/github@v1.0.0 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + uses: actions/github-script@v3 with: - args: label triage + github-token: ${{secrets.GITHUB_TOKEN}} + script: | + github.issues.addLabels({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + labels: ['triage'] + }) - name: Comment On New Issues - uses: actions/github@v1.0.0 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + uses: actions/github-script@v3 with: - args: comment "Thanks for submitting an issue! @robrbecker will take a look soon!" + github-token: ${{secrets.GITHUB_TOKEN}} + script: | + github.issues.createComment({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: '👋 Thanks for reporting! @robrbecker will take a look.' + }) From 66f543444f7f29aa7d958d80506dfd065bbc1810 Mon Sep 17 00:00:00 2001 From: newdividexd <75103080+newdividexd@users.noreply.github.com> Date: Fri, 18 Dec 2020 02:07:30 -0300 Subject: [PATCH 193/390] Add hasPages attribute to Repository --- lib/src/common/model/repos.dart | 5 +++++ lib/src/common/model/repos.g.dart | 2 ++ 2 files changed, 7 insertions(+) diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart index dbf8ea7c..c9b8b142 100644 --- a/lib/src/common/model/repos.dart +++ b/lib/src/common/model/repos.dart @@ -57,6 +57,7 @@ class Repository { this.hasIssues, this.hasWiki, this.hasDownloads, + this.hasPages, this.forksCount, this.openIssuesCount, this.defaultBranch, @@ -134,6 +135,10 @@ class Repository { @JsonKey(name: 'has_downloads') final bool hasDownloads; + /// If the Repository has any Github Pages + @JsonKey(name: 'has_pages') + final bool hasPages; + /// Number of Forks @JsonKey(name: 'forks_count') final int forksCount; diff --git a/lib/src/common/model/repos.g.dart b/lib/src/common/model/repos.g.dart index 615d58f0..9dfe30cc 100644 --- a/lib/src/common/model/repos.g.dart +++ b/lib/src/common/model/repos.g.dart @@ -40,6 +40,7 @@ Repository _$RepositoryFromJson(Map json) { hasIssues: json['has_issues'] as bool, hasWiki: json['has_wiki'] as bool, hasDownloads: json['has_downloads'] as bool, + hasPages: json['has_pages'] as bool, forksCount: json['forks_count'] as int, openIssuesCount: json['open_issues_count'] as int, defaultBranch: json['default_branch'] as String, @@ -84,6 +85,7 @@ Map _$RepositoryToJson(Repository instance) => 'has_issues': instance.hasIssues, 'has_wiki': instance.hasWiki, 'has_downloads': instance.hasDownloads, + 'has_pages': instance.hasPages, 'forks_count': instance.forksCount, 'open_issues_count': instance.openIssuesCount, 'default_branch': instance.defaultBranch, From bc09e0f77b2425936e23be8201355f443d36f383 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Fri, 18 Dec 2020 11:45:54 -0700 Subject: [PATCH 194/390] prep 7.0.4 --- CHANGELOG.md | 3 +++ pubspec.yaml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 83c9d988..1809a8fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## 7.0.4 + - Add hasPages attribute to Repository https://github.com/SpinlockLabs/github.dart/pull/238 + ## 7.0.3 - Export `languageColors` as part of the library. This is the map of github languages to their colors https://github.com/SpinlockLabs/github.dart/pull/232 diff --git a/pubspec.yaml b/pubspec.yaml index e070bcf8..f931e063 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 7.0.3 +version: 7.0.4 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From 61d4b1d51894cee2f73c62eb2e34f5ac939ee11e Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Fri, 15 Jan 2021 10:45:16 -0700 Subject: [PATCH 195/390] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f6f55a12..5e066425 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ This is a library for interacting with GitHub in Dart. It works on all platforms including web, server, and Flutter. Please submit issues and pull requests, help out, or just give encouragement. -**Notice**: We are looking for contributors. If you're interested or have questions, join the chat at https://gitter.im/SpinlockLabs/community +**Notice**: We are looking for contributors. If you're interested or have questions, head over to discussions https://github.com/SpinlockLabs/github.dart/discussions ## Features @@ -30,4 +30,4 @@ See the examples in the example directory to learn how to use some of the featur ## Contacting Us -Join our Gitter chat at https://gitter.im/SpinlockLabs/community +Post a question, idea, in the discussions group https://github.com/SpinlockLabs/github.dart/discussions From e20d71e153701ecae6867693a980fb9d9ebb5cfd Mon Sep 17 00:00:00 2001 From: Ian Hickson Date: Wed, 10 Feb 2021 15:05:09 -0800 Subject: [PATCH 196/390] Link to example/ directory from README That way the pub.dev front page will have a link to the source of the demos. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5e066425..2bcc18f6 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ Please submit issues and pull requests, help out, or just give encouragement. ## Links -- [Library Demos](https://github.directcode.org/demos/) +- [Library Demos](https://github.directcode.org/demos/) (based on the [sample code](https://github.com/SpinlockLabs/github.dart/tree/master/example)) - [Pub Package](https://pub.dartlang.org/packages/github) - [Wiki](https://github.com/SpinlockLabs/github.dart/wiki) - [Latest API reference](https://pub.dev/documentation/github/latest/) From e809b8af4f331d5177dc039754ab8dd065437a0f Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sun, 14 Feb 2021 13:32:02 -0700 Subject: [PATCH 197/390] nullsafe migration --- analysis_options.yaml | 8 +- example/common.dart | 4 +- example/emoji.dart | 16 +- example/index.dart | 8 +- example/languages.dart | 16 +- example/organization.dart | 28 ++-- example/readme.dart | 8 +- example/releases.dart | 13 +- example/repos.dart | 44 ++--- example/search.dart | 24 +-- example/stars.dart | 14 +- example/status.dart | 4 +- example/user_info.dart | 30 ++-- example/users.dart | 8 +- example/zen.dart | 2 +- lib/browser_helper.dart | 2 +- lib/src/common/activity_service.dart | 84 +++++----- lib/src/common/authorizations_service.dart | 4 +- lib/src/common/checks_service.dart | 71 ++++---- lib/src/common/gists_service.dart | 24 +-- lib/src/common/git_service.dart | 36 ++-- lib/src/common/github.dart | 147 ++++++++--------- lib/src/common/issues_service.dart | 102 ++++++------ lib/src/common/misc_service.dart | 16 +- lib/src/common/model/activity.dart | 22 +-- lib/src/common/model/activity.g.dart | 12 +- lib/src/common/model/authorizations.dart | 34 ++-- lib/src/common/model/authorizations.g.dart | 28 ++-- lib/src/common/model/checks.dart | 123 ++++++-------- lib/src/common/model/gists.dart | 70 ++++---- lib/src/common/model/gists.g.dart | 51 +++--- lib/src/common/model/git.dart | 114 ++++++------- lib/src/common/model/git.g.dart | 111 ++++++------- lib/src/common/model/issues.dart | 102 ++++++------ lib/src/common/model/issues.g.dart | 76 ++++----- lib/src/common/model/keys.dart | 10 +- lib/src/common/model/keys.g.dart | 10 +- lib/src/common/model/misc.dart | 24 +-- lib/src/common/model/misc.g.dart | 12 +- lib/src/common/model/notifications.dart | 26 +-- lib/src/common/model/notifications.g.dart | 18 +- lib/src/common/model/orgs.dart | 68 ++++---- lib/src/common/model/orgs.g.dart | 56 +++---- lib/src/common/model/pulls.dart | 134 +++++++-------- lib/src/common/model/pulls.g.dart | 111 +++++++------ lib/src/common/model/reaction.dart | 14 +- lib/src/common/model/reaction.g.dart | 6 +- lib/src/common/model/repos.dart | 182 ++++++++++----------- lib/src/common/model/repos.g.dart | 158 +++++++++--------- lib/src/common/model/repos_commits.dart | 62 +++---- lib/src/common/model/repos_commits.g.dart | 60 ++++--- lib/src/common/model/repos_contents.dart | 56 +++---- lib/src/common/model/repos_contents.g.dart | 39 +++-- lib/src/common/model/repos_forks.dart | 2 +- lib/src/common/model/repos_forks.g.dart | 2 +- lib/src/common/model/repos_hooks.dart | 34 ++-- lib/src/common/model/repos_hooks.g.dart | 26 +-- lib/src/common/model/repos_merging.dart | 6 +- lib/src/common/model/repos_merging.g.dart | 6 +- lib/src/common/model/repos_pages.dart | 36 ++-- lib/src/common/model/repos_pages.g.dart | 28 ++-- lib/src/common/model/repos_releases.dart | 97 ++++++----- lib/src/common/model/repos_releases.g.dart | 67 ++++---- lib/src/common/model/repos_stats.dart | 36 ++-- lib/src/common/model/repos_stats.g.dart | 41 +++-- lib/src/common/model/repos_statuses.dart | 30 ++-- lib/src/common/model/repos_statuses.g.dart | 30 ++-- lib/src/common/model/search.dart | 26 +-- lib/src/common/model/search.g.dart | 10 +- lib/src/common/model/users.dart | 88 +++++----- lib/src/common/model/users.g.dart | 114 ++++++------- lib/src/common/orgs_service.dart | 46 +++--- lib/src/common/pulls_service.dart | 28 ++-- lib/src/common/repos_service.dart | 132 ++++++++------- lib/src/common/search_service.dart | 32 ++-- lib/src/common/url_shortener_service.dart | 4 +- lib/src/common/users_service.dart | 42 ++--- lib/src/common/util/auth.dart | 6 +- lib/src/common/util/crawler.dart | 4 +- lib/src/common/util/errors.dart | 18 +- lib/src/common/util/json.dart | 2 +- lib/src/common/util/oauth2.dart | 18 +- lib/src/common/util/pagination.dart | 42 +++-- lib/src/common/util/utils.dart | 19 +-- lib/src/common/xplat_common.dart | 2 +- lib/src/const/language_color.dart | 23 ++- lib/src/server/hooks.dart | 56 +++---- lib/src/server/hooks.g.dart | 10 +- pubspec.yaml | 14 +- test/code_search_test.dart | 2 +- test/experiment/files.dart | 2 +- test/experiment/reactions.dart | 2 +- test/experiment/search.dart | 2 +- test/git_integration_test.dart | 32 ++-- test/git_test.dart | 60 +++---- test/helper/http.dart | 12 +- tool/language_color_generator.dart | 4 +- 97 files changed, 1883 insertions(+), 1912 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index 442b7c0c..c8f57997 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1,9 +1,9 @@ include: package:pedantic/analysis_options.yaml -analyzer: - strong-mode: - implicit-casts: true - implicit-dynamic: true +# analyzer: +# strong-mode: +# implicit-casts: true +# implicit-dynamic: true linter: rules: diff --git a/example/common.dart b/example/common.dart index 27a3c7f3..d8983093 100644 --- a/example/common.dart +++ b/example/common.dart @@ -12,9 +12,9 @@ export 'package:github/browser_helper.dart'; /// view source button, then you don't need to call this method Future initViewSourceButton(String script) async { // query the DOM for the view source button, handle clicks - document.querySelector('#view-source')?.onClick?.listen((_) { + document.querySelector('#view-source')?.onClick.listen((_) { final popup = window.open('view_source.html?script=$script', 'View Source'); - String code; + String? code; var fetched = false; var ready = false; diff --git a/example/emoji.dart b/example/emoji.dart index f2802c47..7604d461 100644 --- a/example/emoji.dart +++ b/example/emoji.dart @@ -3,7 +3,7 @@ import 'dart:html'; import 'common.dart'; -Element emojiDiv; +Element? emojiDiv; Future main() async { await initViewSourceButton('emoji.dart'); @@ -25,23 +25,23 @@ Future loadEmojis() async { h.append( ImageElement(src: url, width: 64, height: 64)..classes.add('emoji')); h.append(ParagraphElement()..text = ':$name:'); - emojiDiv.append(h); + emojiDiv!.append(h); }); } -String lastQuery; +String? lastQuery; -void filter(String query) { +void filter(String? query) { if (lastQuery != null && lastQuery == query) { return; } lastQuery = query; - final boxes = emojiDiv.children; + final boxes = emojiDiv!.children; for (final box in boxes) { - final boxName = box.querySelector('p'); - final t = boxName.text; + final boxName = box.querySelector('p')!; + final t = boxName.text!; final name = t.substring(1, t.length - 1); - if (name.contains(query)) { + if (name.contains(query!)) { box.style.display = 'inline'; } else { box.style.display = 'none'; diff --git a/example/index.dart b/example/index.dart index e1dec24a..3a0f10b2 100644 --- a/example/index.dart +++ b/example/index.dart @@ -2,10 +2,10 @@ import 'dart:html'; import 'common.dart'; void main() { - final InputElement tokenInput = querySelector('#token'); - tokenInput.value = github.auth.token ?? ''; - window.sessionStorage['GITHUB_TOKEN'] = tokenInput.value; + final tokenInput = querySelector('#token') as InputElement; + tokenInput.value = github.auth!.token ?? ''; + window.sessionStorage['GITHUB_TOKEN'] = tokenInput.value!; tokenInput.onKeyUp.listen((_) { - window.sessionStorage['GITHUB_TOKEN'] = tokenInput.value; + window.sessionStorage['GITHUB_TOKEN'] = tokenInput.value!; }); } diff --git a/example/languages.dart b/example/languages.dart index e8d657df..93b6827e 100644 --- a/example/languages.dart +++ b/example/languages.dart @@ -3,19 +3,19 @@ import 'dart:html'; import 'package:github/github.dart'; import 'common.dart'; -DivElement tableDiv; +DivElement? tableDiv; -LanguageBreakdown breakdown; +late LanguageBreakdown breakdown; Future main() async { await initViewSourceButton('languages.dart'); - tableDiv = querySelector('#table'); + tableDiv = querySelector('#table') as DivElement?; await loadRepository(); } Future loadRepository() async { - var user = 'dart-lang'; - var reponame = 'sdk'; + String? user = 'dart-lang'; + String? reponame = 'sdk'; final params = queryString; @@ -27,7 +27,7 @@ Future loadRepository() async { reponame = params['repo']; } - document.getElementById('name').setInnerHtml('$user/$reponame'); + document.getElementById('name')!.setInnerHtml('$user/$reponame'); final repo = RepositorySlug(user, reponame); breakdown = await github.repositories.listLanguages(repo); @@ -44,7 +44,7 @@ void reloadTable({int accuracy = 4}) { isReloadingTable = true; final md = generateMarkdown(accuracy); github.misc.renderMarkdown(md).then((html) { - tableDiv.setInnerHtml(html, treeSanitizer: NodeTreeSanitizer.trusted); + tableDiv!.setInnerHtml(html, treeSanitizer: NodeTreeSanitizer.trusted); isReloadingTable = false; }); } @@ -62,7 +62,7 @@ String generateMarkdown(int accuracy) { data.sort((a, b) => b[1].compareTo(a[1])); data.forEach((info) { - final String name = info[0]; + final String? name = info[0]; final int bytes = info[1]; final num percentage = (bytes / total) * 100; md += '|$name|$bytes|${percentage.toStringAsFixed(accuracy)}|\n'; diff --git a/example/organization.dart b/example/organization.dart index 178b2041..fdea07d3 100644 --- a/example/organization.dart +++ b/example/organization.dart @@ -4,25 +4,25 @@ import 'dart:html'; import 'package:github/github.dart'; import 'common.dart'; -DivElement $output; -InputElement $input; -ButtonElement $btn; +DivElement? $output; +InputElement? $input; +ButtonElement? $btn; Future main() async { await initViewSourceButton('organization.dart'); - $output = querySelector('#output'); - $input = querySelector('#input'); - $btn = querySelector('#submit'); - $input.onChange.listen((_) { - loadOrganization($input.value); + $output = querySelector('#output') as DivElement?; + $input = querySelector('#input') as InputElement?; + $btn = querySelector('#submit') as ButtonElement?; + $input!.onChange.listen((_) { + loadOrganization($input!.value); }); - $btn.onClick.listen((_) { - loadOrganization($input.value); + $btn!.onClick.listen((_) { + loadOrganization($input!.value); }); - $btn.click(); + $btn!.click(); } -Future loadOrganization(String orgToLoad) async { +Future loadOrganization(String? orgToLoad) async { try { final org = await github.organizations.get(orgToLoad); final html = ''' @@ -32,8 +32,8 @@ Future loadOrganization(String orgToLoad) async {
Followers: ${org.followersCount}
Following: ${org.followingCount} '''; - $output.innerHtml = html; + $output!.innerHtml = html; } on OrganizationNotFound { - $output.innerHtml = 'Not found.'; + $output!.innerHtml = 'Not found.'; } } diff --git a/example/readme.dart b/example/readme.dart index fa572b52..cee84df8 100644 --- a/example/readme.dart +++ b/example/readme.dart @@ -5,18 +5,18 @@ import 'package:github/github.dart'; import 'common.dart'; -DivElement readmeDiv; +DivElement? readmeDiv; Future main() async { await initViewSourceButton('readme.dart'); - readmeDiv = querySelector('#readme'); + readmeDiv = querySelector('#readme') as DivElement?; var repo = RepositorySlug('SpinlockLabs', 'github.dart'); final readme = await github.repositories.getReadme(repo); var markdown = readme.content; if (readme.encoding == 'base64') { - markdown = String.fromCharCodes(base64.decode(markdown)); + markdown = String.fromCharCodes(base64.decode(markdown!)); } print(markdown); final html = await github.misc.renderMarkdown(markdown); - readmeDiv.appendHtml(html, treeSanitizer: NodeTreeSanitizer.trusted); + readmeDiv!.appendHtml(html, treeSanitizer: NodeTreeSanitizer.trusted); } diff --git a/example/releases.dart b/example/releases.dart index 8b8b528b..e7d236a4 100644 --- a/example/releases.dart +++ b/example/releases.dart @@ -4,11 +4,11 @@ import 'package:github/github.dart'; import 'common.dart'; -DivElement releasesDiv; +DivElement? releasesDiv; Future main() async { await initViewSourceButton('releases.dart'); - releasesDiv = querySelector('#releases'); + releasesDiv = querySelector('#releases') as DivElement?; loadReleases(); } @@ -19,17 +19,14 @@ void loadReleases() { .toList() .then((releases) { for (final release in releases) { - releasesDiv.appendHtml(''' + releasesDiv!.appendHtml('''

${release.name}

''', treeSanitizer: NodeTreeSanitizer.trusted); - final rel = releasesDiv.querySelector('#release-${release.id}'); + final rel = releasesDiv!.querySelector('#release-${release.id}'); void append(String key, String value) { - if (value == null) { - return; - } - rel.appendHtml('
$key: $value', + rel!.appendHtml('
$key: $value', treeSanitizer: NodeTreeSanitizer.trusted); } diff --git a/example/repos.dart b/example/repos.dart index 829eaee4..277a181a 100644 --- a/example/repos.dart +++ b/example/repos.dart @@ -5,49 +5,49 @@ import 'package:github/github.dart'; import 'common.dart'; -DivElement repositoriesDiv; -List repos; +DivElement? repositoriesDiv; +List? repos; Map> sorts = { 'stars': (Repository a, Repository b) => - b.stargazersCount.compareTo(a.stargazersCount), - 'forks': (Repository a, Repository b) => b.forksCount.compareTo(a.forksCount), - 'created': (Repository a, Repository b) => b.createdAt.compareTo(a.createdAt), - 'pushed': (Repository a, Repository b) => b.pushedAt.compareTo(a.pushedAt), - 'size': (Repository a, Repository b) => b.size.compareTo(a.size) + b.stargazersCount!.compareTo(a.stargazersCount!), + 'forks': (Repository a, Repository b) => b.forksCount!.compareTo(a.forksCount!), + 'created': (Repository a, Repository b) => b.createdAt!.compareTo(a.createdAt!), + 'pushed': (Repository a, Repository b) => b.pushedAt!.compareTo(a.pushedAt!), + 'size': (Repository a, Repository b) => b.size!.compareTo(a.size!) }; Future main() async { await initViewSourceButton('repos.dart'); - repositoriesDiv = querySelector('#repos'); + repositoriesDiv = querySelector('#repos') as DivElement?; loadRepos(); - querySelector('#reload').onClick.listen((event) { + querySelector('#reload')!.onClick.listen((event) { loadRepos(); }); sorts.keys.forEach((name) { - querySelector('#sort-$name').onClick.listen((event) { + querySelector('#sort-$name')!.onClick.listen((event) { if (_reposCache == null) { loadRepos(sorts[name]); } - updateRepos(_reposCache, sorts[name]); + updateRepos(_reposCache!, sorts[name]); }); }); } -List _reposCache; +List? _reposCache; void updateRepos( List repos, [ - int Function(Repository a, Repository b) compare, + int Function(Repository a, Repository b)? compare, ]) { - document.querySelector('#repos').children.clear(); + document.querySelector('#repos')!.children.clear(); repos.sort(compare); for (final repo in repos) { - repositoriesDiv.appendHtml(''' + repositoriesDiv!.appendHtml('''

${repo.name}

@@ -69,15 +69,15 @@ void updateRepos( } } -void loadRepos([int Function(Repository a, Repository b) compare]) { - final title = querySelector('#title'); - if (title.text.contains('(')) { +void loadRepos([int Function(Repository a, Repository b)? compare]) { + final title = querySelector('#title')!; + if (title.text!.contains('(')) { title.replaceWith(HeadingElement.h2() ..text = 'GitHub for Dart - Repositories' ..id = 'title'); } - var user = 'SpinlockLabs'; + String? user = 'SpinlockLabs'; if (queryString.containsKey('user')) { user = queryString['user']; @@ -86,13 +86,13 @@ void loadRepos([int Function(Repository a, Repository b) compare]) { if (queryString.containsKey('sort') && compare == null) { final sorter = queryString['sort']; if (sorts.containsKey(sorter)) { - compare = sorts[sorter]; + compare = sorts[sorter!]; } } - compare ??= (a, b) => a.name.compareTo(b.name); + compare ??= (a, b) => a.name!.compareTo(b.name!); - github.repositories.listUserRepositories(user).toList().then((repos) { + github.repositories.listUserRepositories(user!).toList().then((repos) { _reposCache = repos; updateRepos(repos, compare); }); diff --git a/example/search.dart b/example/search.dart index 116581c5..9ca8b0ac 100644 --- a/example/search.dart +++ b/example/search.dart @@ -4,13 +4,13 @@ import 'common.dart'; Future main() async { await initViewSourceButton('search.dart'); - final searchBtn = querySelector('#submit'); + final searchBtn = querySelector('#submit')!; searchBtn.onClick.listen(search); } Future search(_) async { final resultsStream = github.search.code( - val('query'), + val('query')!, language: val('language'), filename: val('filename'), user: val('user'), @@ -20,21 +20,21 @@ Future search(_) async { fork: val('fork'), path: val('path'), size: val('size'), - inFile: isChecked('infile'), - inPath: isChecked('inpath'), - perPage: int.tryParse(val('perpage')), - pages: int.tryParse(val('pages')), + inFile: isChecked('infile')!, + inPath: isChecked('inpath')!, + perPage: int.tryParse(val('perpage')!), + pages: int.tryParse(val('pages')!), ); - final DivElement resultsDiv = querySelector('#results'); + final resultsDiv = querySelector('#results') as DivElement; resultsDiv.innerHtml = ''; var count = 0; await for (final results in resultsStream) { - count += results.items.length; - querySelector('#nresults').text = + count += results.items!.length; + querySelector('#nresults')!.text = '${results.totalCount} result${results.totalCount == 1 ? "" : "s"} (showing $count)'; - for (final item in results.items) { + for (final item in results.items!) { final url = item.htmlUrl; final path = item.path; resultsDiv.append(DivElement() @@ -45,6 +45,6 @@ Future search(_) async { } } -String val(String id) => (querySelector('#$id') as InputElement).value; -bool isChecked(String id) => +String? val(String id) => (querySelector('#$id') as InputElement).value; +bool? isChecked(String id) => (querySelector('#$id') as CheckboxInputElement).checked; diff --git a/example/stars.dart b/example/stars.dart index c4b65f31..2901ea08 100644 --- a/example/stars.dart +++ b/example/stars.dart @@ -3,17 +3,17 @@ import 'dart:html'; import 'package:github/github.dart'; import 'common.dart'; -DivElement $stars; +DivElement? $stars; Future main() async { await initViewSourceButton('stars.dart'); - $stars = querySelector('#stars'); + $stars = querySelector('#stars') as DivElement?; loadStars(); } void loadStars() { - var user = 'SpinlockLabs'; - var repo = 'github.dart'; + String? user = 'SpinlockLabs'; + String? repo = 'github.dart'; if (queryString.containsKey('user')) { user = queryString['user']; @@ -23,7 +23,7 @@ void loadStars() { repo = queryString['repo']; } - querySelector('#title').appendText(' for $user/$repo'); + querySelector('#title')!.appendText(' for $user/$repo'); github.activity .listStargazers(RepositorySlug(user, repo)) @@ -36,9 +36,9 @@ void loadStars() { ..classes.add('avatar')); h.append(AnchorElement(href: stargazer.htmlUrl) ..append(ParagraphElement()..text = stargazer.login)); - $stars.append(h); + $stars!.append(h); }).onDone(() { - querySelector('#total') + querySelector('#total')! .appendText(querySelectorAll('.user').length.toString() + ' stars'); }); } diff --git a/example/status.dart b/example/status.dart index a8036bd2..fa42333a 100644 --- a/example/status.dart +++ b/example/status.dart @@ -8,10 +8,10 @@ Future main() async { requestHeaders: {'Origin': window.location.origin}, ); - final text = request.responseText; + final text = request.responseText!; final map = json.decode(text); - querySelector('#status') + querySelector('#status')! ..appendText(map['status']) ..classes.add('status-${map["status"]}'); } diff --git a/example/user_info.dart b/example/user_info.dart index c4360cf0..074f645c 100644 --- a/example/user_info.dart +++ b/example/user_info.dart @@ -3,24 +3,24 @@ import 'dart:html'; import 'package:github/github.dart'; import 'common.dart'; -DivElement info; +DivElement? info; Future main() async { await initViewSourceButton('user_info.dart'); - info = document.getElementById('info'); + info = document.getElementById('info') as DivElement?; loadUser(); } -GitHub createClient(String token) { +GitHub createClient(String? token) { return GitHub(auth: Authentication.withToken(token)); } void loadUser() { - final localToken = document.getElementById('token') as InputElement; + final localToken = document.getElementById('token') as InputElement?; - final loadBtn = document.getElementById('load'); + final loadBtn = document.getElementById('load')!; loadBtn.onClick.listen((event) { - if (localToken.value == null || localToken.value.isEmpty) { + if (localToken!.value == null || localToken.value!.isEmpty) { window.alert('Please Enter a Token'); return; } @@ -28,15 +28,15 @@ void loadUser() { github = createClient(localToken.value); github.users.getCurrentUser().then((final CurrentUser user) { - info.children.clear(); - info.hidden = false; - info.appendHtml(''' + info!.children.clear(); + info!.hidden = false; + info!.appendHtml(''' Name: ${user.name} '''); void append(String name, dynamic value) { if (value != null) { - info.appendHtml(''' + info!.appendHtml('''
$name: ${value.toString()} '''); @@ -49,10 +49,10 @@ void loadUser() { append('Followers', user.followersCount); append('Following', user.followingCount); append('Disk Usage', user.diskUsage); - append('Plan Name', user.plan.name); + append('Plan Name', user.plan!.name); append('Created', user.createdAt); - document.getElementById('load').hidden = true; - document.getElementById('token').hidden = true; + document.getElementById('load')!.hidden = true; + document.getElementById('token')!.hidden = true; }).catchError((e) { if (e is AccessForbidden) { window.alert('Invalid Token'); @@ -60,8 +60,8 @@ void loadUser() { }); }); - if (github.auth.token != null) { - localToken.value = github.auth.token; + if (github.auth!.token != null) { + localToken!.value = github.auth!.token; loadBtn.click(); } } diff --git a/example/users.dart b/example/users.dart index 40e22077..7f9428c8 100644 --- a/example/users.dart +++ b/example/users.dart @@ -5,11 +5,11 @@ import 'package:github/github.dart'; import 'common.dart'; -DivElement usersDiv; +DivElement? usersDiv; Future main() async { await initViewSourceButton('users.dart'); - usersDiv = querySelector('#users'); + usersDiv = querySelector('#users') as DivElement?; loadUsers(); } @@ -31,7 +31,7 @@ void loadUsers() { ..writeln('Created: ${user.createdAt}') ..writeln('Updated: ${user.updatedAt}'); - if (user.company != null && user.company.isNotEmpty) { + if (user.company != null && user.company!.isNotEmpty) { buff.writeln('Company: ${user.company}'); } @@ -41,7 +41,7 @@ void loadUsers() { ..appendHtml(buff.toString().replaceAll('\n', '
'), treeSanitizer: NodeTreeSanitizer.trusted)); - usersDiv.append(userDiv); + usersDiv!.append(userDiv); }); }); } diff --git a/example/zen.dart b/example/zen.dart index b152e262..2e4d8b57 100644 --- a/example/zen.dart +++ b/example/zen.dart @@ -4,5 +4,5 @@ import 'common.dart'; Future main() async { await initViewSourceButton('zen.dart'); final msg = await github.misc.getZen(); - querySelector('#zen').text = msg; + querySelector('#zen')!.text = msg; } diff --git a/lib/browser_helper.dart b/lib/browser_helper.dart index 4c8485e3..2f610e77 100644 --- a/lib/browser_helper.dart +++ b/lib/browser_helper.dart @@ -14,7 +14,7 @@ void renderMarkdown(GitHub github, String selector, {int indent = 4}) { elements.removeWhere((Element it) => it.attributes.containsKey('rendered')); for (final e in elements) { - final txt = e.text; + final txt = e.text!; final md = txt.split('\n').map((it) { return it.length >= indent ? it.substring(indent) : it; diff --git a/lib/src/common/activity_service.dart b/lib/src/common/activity_service.dart index 6fc03bb7..faf86e22 100644 --- a/lib/src/common/activity_service.dart +++ b/lib/src/common/activity_service.dart @@ -18,7 +18,7 @@ class ActivityService extends Service { /// API docs: https://developer.github.com/v3/activity/events/#list-public-events Stream listPublicEvents({int pages = 2}) { return PaginationHelper(github) - .objects('GET', '/events', (i) => Event.fromJson(i), pages: pages); + .objects('GET', '/events', (dynamic i) => Event.fromJson(i), pages: pages); } /// Lists public events for a network of repositories. @@ -27,7 +27,7 @@ class ActivityService extends Service { Stream listRepositoryNetworkEvents(RepositorySlug slug, {int pages = 2}) { return PaginationHelper(github).objects( - 'GET', '/networks/${slug.fullName}/events', (i) => Event.fromJson(i), + 'GET', '/networks/${slug.fullName}/events', (dynamic i) => Event.fromJson(i), pages: pages); } @@ -46,9 +46,9 @@ class ActivityService extends Service { /// Lists repository issue events. /// /// API docs: https://developer.github.com/v3/activity/events/#list-repository-events - Stream listRepositoryIssueEvents(RepositorySlug slug, {int pages}) { + Stream listRepositoryIssueEvents(RepositorySlug slug, {int? pages}) { return PaginationHelper(github).objects('GET', - '/repos/${slug.fullName}/issues/events', (i) => Event.fromJson(i), + '/repos/${slug.fullName}/issues/events', (dynamic i) => Event.fromJson(i), pages: pages); } @@ -60,9 +60,9 @@ class ActivityService extends Service { /// Lists repository events. /// /// API docs: https://developer.github.com/v3/activity/events/#list-repository-events - Stream listRepositoryEvents(RepositorySlug slug, {int pages}) { + Stream listRepositoryEvents(RepositorySlug slug, {int? pages}) { return PaginationHelper(github).objects( - 'GET', '/repos/${slug.fullName}/events', (i) => Event.fromJson(i), + 'GET', '/repos/${slug.fullName}/events', (dynamic i) => Event.fromJson(i), pages: pages); } @@ -75,9 +75,9 @@ class ActivityService extends Service { /// Lists public events for an organization. /// /// API docs: https://developer.github.com/v3/activity/events/#list-public-events-for-an-organization - Stream listEventsForOrganization(String name, {int pages}) { + Stream listEventsForOrganization(String name, {int? pages}) { return PaginationHelper(github).objects( - 'GET', '/orgs/$name/events', (i) => Event.fromJson(i), + 'GET', '/orgs/$name/events', (dynamic i) => Event.fromJson(i), pages: pages); } @@ -102,18 +102,18 @@ class ActivityService extends Service { /// Lists the events performed by a user. /// /// API docs: https://developer.github.com/v3/activity/events/#list-events-performed-by-a-user - Stream listEventsPerformedByUser(String username, {int pages}) { + Stream listEventsPerformedByUser(String username, {int? pages}) { return PaginationHelper(github).objects( - 'GET', '/users/$username/events', (i) => Event.fromJson(i), + 'GET', '/users/$username/events', (dynamic i) => Event.fromJson(i), pages: pages); } /// Lists the public events performed by a user. /// /// API docs: https://developer.github.com/v3/activity/events/#list-public-events-performed-by-a-user - Stream listPublicEventsPerformedByUser(String username, {int pages}) { + Stream listPublicEventsPerformedByUser(String username, {int? pages}) { return PaginationHelper(github).objects( - 'GET', '/users/$username/events/public', (i) => Event.fromJson(i), + 'GET', '/users/$username/events/public', (dynamic i) => Event.fromJson(i), pages: pages); } @@ -131,7 +131,7 @@ class ActivityService extends Service { Stream listNotifications( {bool all = false, bool participating = false}) { return PaginationHelper(github).objects( - 'GET', '/notifications', (i) => Notification.fromJson(i), + 'GET', '/notifications', (dynamic i) => Notification.fromJson(i), params: {'all': all, 'participating': participating}); } @@ -143,14 +143,14 @@ class ActivityService extends Service { return PaginationHelper(github).objects( 'GET', '/repos/${repository.fullName}/notifications', - (i) => Notification.fromJson(i), + (dynamic i) => Notification.fromJson(i), params: {'all': all, 'participating': participating}); } /// Marks all notifications up to [lastRead] as read. /// /// API docs: https://developer.github.com/v3/activity/notifications/#mark-as-read - Future markNotificationsRead({DateTime lastRead}) { + Future markNotificationsRead({DateTime? lastRead}) { final data = {}; if (lastRead != null) { @@ -170,7 +170,7 @@ class ActivityService extends Service { /// API docs:https://developer.github.com/v3/activity/notifications/#mark-notifications-as-read-in-a-repository Future markRepositoryNotificationsRead( RepositorySlug slug, { - DateTime lastRead, + DateTime? lastRead, }) { final data = {}; @@ -191,7 +191,7 @@ class ActivityService extends Service { /// API docs: https://developer.github.com/v3/activity/notifications/#view-a-single-thread Future getThread(String threadId) => github.getJSON('/notification/threads/$threadId', - statusCode: StatusCodes.OK, convert: (i) => Notification.fromJson(i)); + statusCode: StatusCodes.OK, convert: (dynamic i) => Notification.fromJson(i)); /// Mark the specified notification thread as read. /// @@ -213,7 +213,7 @@ class ActivityService extends Service { /// API docs: https://developer.github.com/v3/activity/starring/#list-stargazers Stream listStargazers(RepositorySlug slug) { return PaginationHelper(github).objects( - 'GET', '/repos/${slug.fullName}/stargazers', (i) => User.fromJson(i)); + 'GET', '/repos/${slug.fullName}/stargazers', (dynamic i) => User.fromJson(i)); } /// Lists all the repos starred by a user. @@ -221,7 +221,7 @@ class ActivityService extends Service { /// API docs: https://developer.github.com/v3/activity/starring/#list-repositories-being-starred Stream listStarredByUser(String user) { return PaginationHelper(github) - .objects('GET', '/users/$user/starred', (i) => Repository.fromJson(i)); + .objects('GET', '/users/$user/starred', (dynamic i) => Repository.fromJson(i)); } /// Lists all the repos by the current user. @@ -229,7 +229,7 @@ class ActivityService extends Service { /// API docs: https://developer.github.com/v3/activity/starring/#list-repositories-being-starred Stream listStarred() { return PaginationHelper(github) - .objects('GET', '/user/starred', (i) => Repository.fromJson(i)); + .objects('GET', '/user/starred', (dynamic i) => Repository.fromJson(i)); } /// Checks if the currently authenticated user has starred the specified repository. @@ -268,7 +268,7 @@ class ActivityService extends Service { /// API docs: https://developer.github.com/v3/activity/watching/#list-watchers Stream listWatchers(RepositorySlug slug) { return PaginationHelper(github).objects( - 'GET', '/repos/${slug.fullName}/subscribers', (i) => User.fromJson(i)); + 'GET', '/repos/${slug.fullName}/subscribers', (dynamic i) => User.fromJson(i)); } /// Lists the repositories the specified user is watching. @@ -276,7 +276,7 @@ class ActivityService extends Service { /// API docs: https://developer.github.com/v3/activity/watching/#list-repositories-being-watched Stream listWatchedByUser(String user) { return PaginationHelper(github).objects( - 'GET', '/users/$user/subscriptions', (i) => Repository.fromJson(i)); + 'GET', '/users/$user/subscriptions', (dynamic i) => Repository.fromJson(i)); } /// Lists the repositories the current user is watching. @@ -284,7 +284,7 @@ class ActivityService extends Service { /// API docs: https://developer.github.com/v3/activity/watching/#list-repositories-being-watched Stream listWatched() { return PaginationHelper(github) - .objects('GET', '/user/subscriptions', (i) => Repository.fromJson(i)); + .objects('GET', '/user/subscriptions', (dynamic i) => Repository.fromJson(i)); } /// Fetches repository subscription information. @@ -294,23 +294,23 @@ class ActivityService extends Service { RepositorySlug slug) => github.getJSON('/repos/${slug.fullName}/subscription', statusCode: StatusCodes.OK, - convert: (i) => RepositorySubscription.fromJson(i)); + convert: (dynamic i) => RepositorySubscription.fromJson(i)); /// Sets the Repository Subscription Status /// /// API docs: https://developer.github.com/v3/activity/watching/#set-a-repository-subscription Future setRepositorySubscription( RepositorySlug slug, { - bool subscribed, - bool ignored, + bool? subscribed, + bool? ignored, }) { final map = - createNonNullMap({'subscribed': subscribed, 'ignored': ignored}); + createNonNullMap({'subscribed': subscribed!, 'ignored': ignored!}); return github.putJSON( '/repos/${slug.fullName}/subscription', statusCode: StatusCodes.OK, - convert: (i) => RepositorySubscription.fromJson(i), + convert: (dynamic i) => RepositorySubscription.fromJson(i), body: GitHubJson.encode(map), ); } @@ -329,16 +329,16 @@ class ActivityService extends Service { class EventPoller { final GitHub github; final String path; - final List handledEvents = []; + final List handledEvents = []; - Timer _timer; - StreamController _controller; + Timer? _timer; + StreamController? _controller; - String _lastFetched; + String? _lastFetched; EventPoller(this.github, this.path); - Stream start({bool onlyNew = false, int interval, DateTime after}) { + Stream start({bool onlyNew = false, int? interval, DateTime? after}) { if (_timer != null) { throw Exception('Polling already started.'); } @@ -350,7 +350,7 @@ class EventPoller { _controller = StreamController(); void handleEvent(http.Response response) { - interval ??= int.parse(response.headers['x-poll-interval']); + interval ??= int.parse(response.headers['x-poll-interval']!); if (response.statusCode == 304) { return; @@ -364,7 +364,7 @@ class EventPoller { for (final item in json) { final event = Event.fromJson(item); - if (after == null ? false : event.createdAt.toUtc().isBefore(after)) { + if (after == null ? false : event.createdAt!.toUtc().isBefore(after)) { continue; } @@ -374,12 +374,12 @@ class EventPoller { handledEvents.add(event.id); - _controller.add(event); + _controller!.add(event); } } - _timer ??= Timer.periodic(Duration(seconds: interval), (timer) { - final headers = {}; + _timer ??= Timer.periodic(Duration(seconds: interval!), (timer) { + final headers = {}; if (_lastFetched != null) { headers['If-None-Match'] = _lastFetched; @@ -389,7 +389,7 @@ class EventPoller { }); } - final headers = {}; + final headers = {}; if (_lastFetched != null) { headers['If-None-Match'] = _lastFetched; @@ -397,7 +397,7 @@ class EventPoller { github.request('GET', path, headers: headers).then(handleEvent); - return _controller.stream; + return _controller!.stream; } Future stop() { @@ -405,8 +405,8 @@ class EventPoller { throw Exception('Polling not started.'); } - _timer.cancel(); - final future = _controller.close(); + _timer!.cancel(); + final future = _controller!.close(); _timer = null; _controller = null; diff --git a/lib/src/common/authorizations_service.dart b/lib/src/common/authorizations_service.dart index 7a1e44f1..f7337e01 100644 --- a/lib/src/common/authorizations_service.dart +++ b/lib/src/common/authorizations_service.dart @@ -17,7 +17,7 @@ class AuthorizationsService extends Service { /// API docs: https://developer.github.com/v3/oauth_authorizations/#list-your-authorizations Stream listAuthorizations() { return PaginationHelper(github) - .objects('GET', '/authorizations', (i) => Authorization.fromJson(i)); + .objects('GET', '/authorizations', (dynamic i) => Authorization.fromJson(i)); } /// Fetches an authorization specified by [id]. @@ -25,7 +25,7 @@ class AuthorizationsService extends Service { /// API docs: https://developer.github.com/v3/oauth_authorizations/#get-a-single-authorization Future getAuthorization(int id) => github.getJSON('/authorizations/$id', - statusCode: 200, convert: (i) => Authorization.fromJson(i)); + statusCode: 200, convert: (dynamic i) => Authorization.fromJson(i)); // TODO: Implement remaining API methods of authorizations: // See https://developer.github.com/v3/oauth_authorizations/ diff --git a/lib/src/common/checks_service.dart b/lib/src/common/checks_service.dart index f25ee2c6..b0a269ee 100644 --- a/lib/src/common/checks_service.dart +++ b/lib/src/common/checks_service.dart @@ -2,7 +2,6 @@ import 'dart:convert'; import 'package:github/github.dart'; import 'package:github/src/common/util/utils.dart'; -import 'package:meta/meta.dart'; const _previewHeader = 'application/vnd.github.antiope-preview+json'; @@ -50,16 +49,16 @@ class _CheckRunsService extends Service { /// API docs: https://developer.github.com/v3/checks/runs/#create-a-check-run Future createCheckRun( RepositorySlug slug, { - @required String name, - @required String headSha, - String detailsUrl, - String externalId, + required String name, + required String headSha, + String? detailsUrl, + String? externalId, CheckRunStatus status = CheckRunStatus.queued, - DateTime startedAt, - CheckRunConclusion conclusion, - DateTime completedAt, - CheckRunOutput output, - List actions, + DateTime? startedAt, + CheckRunConclusion? conclusion, + DateTime? completedAt, + CheckRunOutput? output, + List? actions, }) async { assert(conclusion != null || (completedAt == null && status != CheckRunStatus.completed)); @@ -102,15 +101,15 @@ class _CheckRunsService extends Service { Future updateCheckRun( RepositorySlug slug, CheckRun checkRunToUpdate, { - String name, - String detailsUrl, - String externalId, - DateTime startedAt, + String? name, + String? detailsUrl, + String? externalId, + DateTime? startedAt, CheckRunStatus status = CheckRunStatus.queued, - CheckRunConclusion conclusion, - DateTime completedAt, - CheckRunOutput output, - List actions, + CheckRunConclusion? conclusion, + DateTime? completedAt, + CheckRunOutput? output, + List? actions, }) async { assert(conclusion != null || (completedAt == null && status != CheckRunStatus.completed)); @@ -146,10 +145,10 @@ class _CheckRunsService extends Service { /// API docs: https://developer.github.com/v3/checks/runs/#list-check-runs-for-a-specific-ref Stream listCheckRunsForRef( RepositorySlug slug, { - @required String ref, - String checkName, - CheckRunStatus status, - CheckRunFilter filter, + required String ref, + String? checkName, + CheckRunStatus? status, + CheckRunFilter? filter, }) { ArgumentError.checkNotNull(ref); return PaginationHelper(github).objects, CheckRun>( @@ -177,10 +176,10 @@ class _CheckRunsService extends Service { /// API docs: https://developer.github.com/v3/checks/runs/#list-check-runs-in-a-check-suite Stream listCheckRunsInSuite( RepositorySlug slug, { - @required int checkSuiteId, - String checkName, - CheckRunStatus status, - CheckRunFilter filter, + required int checkSuiteId, + String? checkName, + CheckRunStatus? status, + CheckRunFilter? filter, }) { ArgumentError.checkNotNull(checkSuiteId); return PaginationHelper(github).objects, CheckRun>( @@ -205,7 +204,7 @@ class _CheckRunsService extends Service { /// API docs: https://developer.github.com/v3/checks/runs/#get-a-single-check-run Future getCheckRun( RepositorySlug slug, { - @required int checkRunId, + required int checkRunId, }) { ArgumentError.checkNotNull(checkRunId); return github.getJSON, CheckRun>( @@ -223,7 +222,7 @@ class _CheckRunsService extends Service { /// API docs: https://developer.github.com/v3/checks/runs/#list-annotations-for-a-check-run Stream listAnnotationsInCheckRun( RepositorySlug slug, { - @required CheckRun checkRun, + required CheckRun checkRun, }) { return PaginationHelper(github) .objects, CheckRunAnnotation>( @@ -246,13 +245,13 @@ class _CheckSuitesService extends Service { /// API docs: https://developer.github.com/v3/checks/suites/#get-a-single-check-suite Future getCheckSuite( RepositorySlug slug, { - @required int checkSuiteId, + required int checkSuiteId, }) async { ArgumentError.checkNotNull(checkSuiteId); return github.requestJson( 'GET', 'repos/$slug/check-suites/$checkSuiteId', - convert: (input) => CheckSuite.fromJson(input), + convert: (dynamic input) => CheckSuite.fromJson(input), preview: _previewHeader, statusCode: StatusCodes.OK, ); @@ -268,9 +267,9 @@ class _CheckSuitesService extends Service { /// API docs: https://developer.github.com/v3/checks/suites/#list-check-suites-for-a-specific-ref Stream listCheckSuitesForRef( RepositorySlug slug, { - @required String ref, - int appId, - String checkName, + required String ref, + int? appId, + String? checkName, }) { ArgumentError.checkNotNull(ref); return PaginationHelper(github).objects, CheckSuite>( @@ -296,7 +295,7 @@ class _CheckSuitesService extends Service { /// API docs: https://developer.github.com/v3/checks/suites/#update-repository-preferences-for-check-suites Future> updatePreferencesForCheckSuites( RepositorySlug slug, { - @required List autoTriggerChecks, + required List autoTriggerChecks, }) { ArgumentError.checkNotNull(autoTriggerChecks); return github.requestJson, List>( @@ -319,7 +318,7 @@ class _CheckSuitesService extends Service { /// API docs: https://developer.github.com/v3/checks/suites/#create-a-check-suite Future createCheckSuite( RepositorySlug slug, { - @required String headSha, + required String headSha, }) { ArgumentError.checkNotNull(headSha); return github.requestJson, CheckSuite>( @@ -340,7 +339,7 @@ class _CheckSuitesService extends Service { /// API docs: https://developer.github.com/v3/checks/suites/#rerequest-check-suite Future reRequestCheckSuite( RepositorySlug slug, { - @required int checkSuiteId, + required int checkSuiteId, }) { ArgumentError.checkNotNull(checkSuiteId); return github.request( diff --git a/lib/src/common/gists_service.dart b/lib/src/common/gists_service.dart index 89b266bf..87c7f3f0 100644 --- a/lib/src/common/gists_service.dart +++ b/lib/src/common/gists_service.dart @@ -15,7 +15,7 @@ class GistsService extends Service { /// API docs: https://developer.github.com/v3/gists/#list-gists Stream listUserGists(String username) { return PaginationHelper(github) - .objects('GET', '/users/$username/gists', (i) => Gist.fromJson(i)); + .objects('GET', '/users/$username/gists', (dynamic i) => Gist.fromJson(i)); } /// Fetches the gists for the currently authenticated user. @@ -24,7 +24,7 @@ class GistsService extends Service { /// API docs: https://developer.github.com/v3/gists/#list-gists Stream listCurrentUserGists() { return PaginationHelper(github) - .objects('GET', '/gists', (i) => Gist.fromJson(i)); + .objects('GET', '/gists', (dynamic i) => Gist.fromJson(i)); } /// Fetches the currently authenticated user's public gists. @@ -32,7 +32,7 @@ class GistsService extends Service { /// API docs: https://developer.github.com/v3/gists/#list-gists Stream listCurrentUserPublicGists() { return PaginationHelper(github) - .objects('GET', '/gists/public', (i) => Gist.fromJson(i)); + .objects('GET', '/gists/public', (dynamic i) => Gist.fromJson(i)); } /// Fetches the currently authenticated user's starred gists. @@ -40,21 +40,21 @@ class GistsService extends Service { /// API docs: https://developer.github.com/v3/gists/#list-gists Stream listCurrentUserStarredGists() { return PaginationHelper(github) - .objects('GET', '/gists/starred', (i) => Gist.fromJson(i)); + .objects('GET', '/gists/starred', (dynamic i) => Gist.fromJson(i)); } /// Fetches a Gist by the specified [id]. /// /// API docs: https://developer.github.com/v3/gists/#get-a-single-gist Future getGist(String id) => github.getJSON('/gists/$id', - statusCode: StatusCodes.OK, convert: (i) => Gist.fromJson(i)); + statusCode: StatusCodes.OK, convert: (dynamic i) => Gist.fromJson(i)); /// Creates a Gist /// /// API docs: https://developer.github.com/v3/gists/#create-a-gist Future createGist( Map files, { - String description, + String? description, bool public = false, }) { final map = {'files': {}}; @@ -77,7 +77,7 @@ class GistsService extends Service { '/gists', statusCode: 201, body: GitHubJson.encode(map), - convert: (i) => Gist.fromJson(i), + convert: (dynamic i) => Gist.fromJson(i), ); } @@ -95,8 +95,8 @@ class GistsService extends Service { /// API docs: https://developer.github.com/v3/gists/#edit-a-gist Future editGist( String id, { - String description, - Map files, + String? description, + Map? files, }) { final map = {}; @@ -116,7 +116,7 @@ class GistsService extends Service { '/gists/$id', statusCode: 200, body: GitHubJson.encode(map), - convert: (i) => Gist.fromJson(i), + convert: (dynamic i) => Gist.fromJson(i), ); } @@ -167,7 +167,7 @@ class GistsService extends Service { /// API docs: https://developer.github.com/v3/gists/comments/#list-comments-on-a-gist Stream listComments(String gistId) { return PaginationHelper(github).objects( - 'GET', '/gists/$gistId/comments', (i) => GistComment.fromJson(i)); + 'GET', '/gists/$gistId/comments', (dynamic i) => GistComment.fromJson(i)); } // TODO: Implement getComment: https://developer.github.com/v3/gists/comments/#get-a-single-comment @@ -178,7 +178,7 @@ class GistsService extends Service { Future createComment(String gistId, CreateGistComment request) { return github.postJSON('/gists/$gistId/comments', body: GitHubJson.encode(request), - convert: (i) => GistComment.fromJson(i)); + convert: (dynamic i) => GistComment.fromJson(i)); } // TODO: Implement editComment: https://developer.github.com/v3/gists/comments/#edit-a-comment diff --git a/lib/src/common/git_service.dart b/lib/src/common/git_service.dart index a6d9e98c..9e358e5c 100644 --- a/lib/src/common/git_service.dart +++ b/lib/src/common/git_service.dart @@ -13,16 +13,16 @@ class GitService extends Service { /// Fetches a blob from [slug] for a given [sha]. /// /// API docs: https://developer.github.com/v3/git/blobs/#get-a-blob - Future getBlob(RepositorySlug slug, String sha) => + Future getBlob(RepositorySlug slug, String? sha) => github.getJSON('/repos/${slug.fullName}/git/blobs/$sha', - convert: (i) => GitBlob.fromJson(i), statusCode: StatusCodes.OK); + convert: (dynamic i) => GitBlob.fromJson(i), statusCode: StatusCodes.OK); /// Creates a blob with specified [blob] content. /// /// API docs: https://developer.github.com/v3/git/blobs/#create-a-blob Future createBlob(RepositorySlug slug, CreateGitBlob blob) { return github.postJSON('/repos/${slug.fullName}/git/blobs', - convert: (i) => GitBlob.fromJson(i), + convert: (dynamic i) => GitBlob.fromJson(i), statusCode: StatusCodes.CREATED, body: GitHubJson.encode(blob)); } @@ -30,16 +30,16 @@ class GitService extends Service { /// Fetches a commit from [slug] for a given [sha]. /// /// API docs: https://developer.github.com/v3/git/commits/#get-a-commit - Future getCommit(RepositorySlug slug, String sha) => + Future getCommit(RepositorySlug slug, String? sha) => github.getJSON('/repos/${slug.fullName}/git/commits/$sha', - convert: (i) => GitCommit.fromJson(i), statusCode: StatusCodes.OK); + convert: (dynamic i) => GitCommit.fromJson(i), statusCode: StatusCodes.OK); /// Creates a new commit in a repository. /// /// API docs: https://developer.github.com/v3/git/commits/#create-a-commit Future createCommit(RepositorySlug slug, CreateGitCommit commit) { return github.postJSON('/repos/${slug.fullName}/git/commits', - convert: (i) => GitCommit.fromJson(i), + convert: (dynamic i) => GitCommit.fromJson(i), statusCode: StatusCodes.CREATED, body: GitHubJson.encode(commit)); } @@ -51,7 +51,7 @@ class GitService extends Service { /// API docs: https://developer.github.com/v3/git/refs/#get-a-reference Future getReference(RepositorySlug slug, String ref) => github.getJSON('/repos/${slug.fullName}/git/refs/$ref', - convert: (i) => GitReference.fromJson(i), statusCode: StatusCodes.OK); + convert: (dynamic i) => GitReference.fromJson(i), statusCode: StatusCodes.OK); /// Lists the references in a repository. /// @@ -60,14 +60,14 @@ class GitService extends Service { /// by specifying a [type], the most common being "heads" and "tags". /// /// API docs: https://developer.github.com/v3/git/refs/#get-all-references - Stream listReferences(RepositorySlug slug, {String type}) { + Stream listReferences(RepositorySlug slug, {String? type}) { var path = '/repos/${slug.fullName}/git/refs'; if (type != null) { path += '/$type'; } return PaginationHelper(github) - .objects('GET', path, (i) => GitReference.fromJson(i)); + .objects('GET', path, (dynamic i) => GitReference.fromJson(i)); } /// Creates a new reference in a repository. @@ -77,9 +77,9 @@ class GitService extends Service { /// /// API docs: https://developer.github.com/v3/git/refs/#create-a-reference Future createReference( - RepositorySlug slug, String ref, String sha) { + RepositorySlug slug, String ref, String? sha) { return github.postJSON('/repos/${slug.fullName}/git/refs', - convert: (i) => GitReference.fromJson(i), + convert: (dynamic i) => GitReference.fromJson(i), statusCode: StatusCodes.CREATED, body: GitHubJson.encode({'ref': ref, 'sha': sha})); } @@ -90,7 +90,7 @@ class GitService extends Service { Future editReference( RepositorySlug slug, String ref, - String sha, { + String? sha, { bool force = false, }) { final body = GitHubJson.encode({'sha': sha, 'force': force}); @@ -118,16 +118,16 @@ class GitService extends Service { /// Fetches a tag from the repo given a SHA. /// /// API docs: https://developer.github.com/v3/git/tags/#get-a-tag - Future getTag(RepositorySlug slug, String sha) => + Future getTag(RepositorySlug slug, String? sha) => github.getJSON('/repos/${slug.fullName}/git/tags/$sha', - convert: (i) => GitTag.fromJson(i), statusCode: StatusCodes.OK); + convert: (dynamic i) => GitTag.fromJson(i), statusCode: StatusCodes.OK); /// Creates a new tag in a repository. /// /// API docs: https://developer.github.com/v3/git/tags/#create-a-tag-object Future createTag(RepositorySlug slug, CreateGitTag tag) => github.postJSON('/repos/${slug.fullName}/git/tags', - convert: (i) => GitTag.fromJson(i), + convert: (dynamic i) => GitTag.fromJson(i), statusCode: StatusCodes.CREATED, body: GitHubJson.encode(tag)); @@ -137,7 +137,7 @@ class GitService extends Service { /// /// API docs: https://developer.github.com/v3/git/trees/#get-a-tree /// and https://developer.github.com/v3/git/trees/#get-a-tree-recursively - Future getTree(RepositorySlug slug, String sha, + Future getTree(RepositorySlug slug, String? sha, {bool recursive = false}) { var path = '/repos/${slug.fullName}/git/trees/$sha'; if (recursive) { @@ -145,7 +145,7 @@ class GitService extends Service { } return github.getJSON(path, - convert: (j) => GitTree.fromJson(j), statusCode: StatusCodes.OK); + convert: (dynamic j) => GitTree.fromJson(j), statusCode: StatusCodes.OK); } /// Creates a new tree in a repository. @@ -153,7 +153,7 @@ class GitService extends Service { /// API docs: https://developer.github.com/v3/git/trees/#create-a-tree Future createTree(RepositorySlug slug, CreateGitTree tree) { return github.postJSON('/repos/${slug.fullName}/git/trees', - convert: (j) => GitTree.fromJson(j), + convert: (dynamic j) => GitTree.fromJson(j), statusCode: StatusCodes.CREATED, body: GitHubJson.encode(tree)); } diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index 27e36c5e..951a527a 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -19,9 +19,9 @@ class GitHub { /// [endpoint] is the api endpoint to use /// [auth] is the authentication information GitHub({ - Authentication auth, + Authentication? auth, this.endpoint = 'https://api.github.com', - http.Client client, + http.Client? client, }) : auth = auth ?? Authentication.anonymous(), client = client ?? http.Client(); @@ -30,7 +30,7 @@ class GitHub { static const _ratelimitRemainingHeader = 'x-ratelimit-remaining'; /// Authentication Information - Authentication auth; + Authentication? auth; /// API Endpoint final String endpoint; @@ -38,19 +38,19 @@ class GitHub { /// HTTP Client final http.Client client; - ActivityService _activity; - AuthorizationsService _authorizations; - GistsService _gists; - GitService _git; - IssuesService _issues; - MiscService _misc; - OrganizationsService _organizations; - PullRequestsService _pullRequests; - RepositoriesService _repositories; - SearchService _search; - UrlShortenerService _urlShortener; - UsersService _users; - ChecksService _checks; + ActivityService? _activity; + AuthorizationsService? _authorizations; + GistsService? _gists; + GitService? _git; + IssuesService? _issues; + MiscService? _misc; + OrganizationsService? _organizations; + PullRequestsService? _pullRequests; + RepositoriesService? _repositories; + SearchService? _search; + UrlShortenerService? _urlShortener; + UsersService? _users; + ChecksService? _checks; /// The maximum number of requests that the consumer is permitted to make per /// hour. @@ -58,26 +58,26 @@ class GitHub { /// Updated with every request. /// /// Will be `null` if no requests have been made yet. - int get rateLimitLimit => _rateLimitLimit; + int? get rateLimitLimit => _rateLimitLimit; /// The number of requests remaining in the current rate limit window. /// /// Updated with every request. /// /// Will be `null` if no requests have been made yet. - int get rateLimitRemaining => _rateLimitRemaining; + int? get rateLimitRemaining => _rateLimitRemaining; /// The time at which the current rate limit window resets. /// /// Updated with every request. /// /// Will be `null` if no requests have been made yet. - DateTime get rateLimitReset => _rateLimitReset == null + DateTime? get rateLimitReset => _rateLimitReset == null ? null - : DateTime.fromMillisecondsSinceEpoch(_rateLimitReset * 1000, + : DateTime.fromMillisecondsSinceEpoch(_rateLimitReset! * 1000, isUtc: true); - int _rateLimitReset, _rateLimitLimit, _rateLimitRemaining; + int? _rateLimitReset, _rateLimitLimit, _rateLimitRemaining; /// Service for activity related methods of the GitHub API. ActivityService get activity => _activity ??= ActivityService(this); @@ -143,12 +143,12 @@ class GitHub { /// The default [convert] function returns the input object. Future getJSON( String path, { - int statusCode, - void Function(http.Response response) fail, - Map headers, - Map params, - JSONConverter convert, - String preview, + int? statusCode, + void Function(http.Response response)? fail, + Map? headers, + Map? params, + JSONConverter? convert, + String? preview, }) => requestJson( 'GET', @@ -183,13 +183,13 @@ class GitHub { /// [T] represents the type return from this function after conversion Future postJSON( String path, { - int statusCode, - void Function(http.Response response) fail, - Map headers, - Map params, - JSONConverter convert, + int? statusCode, + void Function(http.Response response)? fail, + Map? headers, + Map? params, + JSONConverter? convert, dynamic body, - String preview, + String? preview, }) => requestJson( 'POST', @@ -225,13 +225,13 @@ class GitHub { /// [T] represents the type return from this function after conversion Future putJSON( String path, { - int statusCode, - void Function(http.Response response) fail, - Map headers, - Map params, - JSONConverter convert, + int? statusCode, + void Function(http.Response response)? fail, + Map? headers, + Map? params, + JSONConverter? convert, dynamic body, - String preview, + String? preview, }) => requestJson( 'PUT', @@ -248,15 +248,15 @@ class GitHub { Future requestJson( String method, String path, { - int statusCode, - void Function(http.Response response) fail, - Map headers, - Map params, - JSONConverter convert, + int? statusCode, + void Function(http.Response response)? fail, + Map? headers, + Map? params, + JSONConverter? convert, dynamic body, - String preview, + String? preview, }) async { - convert ??= (input) => input as T; + convert ??= (input) => input as T?; headers ??= {}; if (preview != null) { @@ -277,12 +277,7 @@ class GitHub { final json = jsonDecode(response.body); - if (convert == null) { - _applyExpandos(json, response); - return json; - } - - final returnValue = convert(json); + final T returnValue = convert(json)!; _applyExpandos(returnValue, response); return returnValue; } @@ -298,17 +293,17 @@ class GitHub { Future request( String method, String path, { - Map headers, - Map params, + Map? headers, + Map? params, dynamic body, - int statusCode, - void Function(http.Response response) fail, - String preview, + int? statusCode, + void Function(http.Response response)? fail, + String? preview, }) async { - if (rateLimitRemaining != null && rateLimitRemaining <= 0) { + if (rateLimitRemaining != null && rateLimitRemaining! <= 0) { assert(rateLimitReset != null); final now = DateTime.now(); - final waitTime = rateLimitReset.difference(now); + final waitTime = rateLimitReset!.difference(now); await Future.delayed(waitTime); } @@ -318,11 +313,11 @@ class GitHub { headers['Accept'] = preview; } - if (auth.isToken) { - headers.putIfAbsent('Authorization', () => 'token ${auth.token}'); - } else if (auth.isBasic) { + if (auth!.isToken) { + headers.putIfAbsent('Authorization', () => 'token ${auth!.token}'); + } else if (auth!.isBasic) { final userAndPass = - base64Encode(utf8.encode('${auth.username}:${auth.password}')); + base64Encode(utf8.encode('${auth!.username}:${auth!.password}')); headers.putIfAbsent('Authorization', () => 'basic $userAndPass'); } @@ -351,7 +346,7 @@ class GitHub { } final request = http.Request(method, Uri.parse(url.toString())); - request.headers.addAll(headers); + request.headers.addAll(headers as Map); if (body != null) { if (body is List) { request.bodyBytes = body; @@ -373,6 +368,8 @@ class GitHub { } else { return response; } + + throw UnknownError(this); } /// @@ -380,9 +377,9 @@ class GitHub { /// @alwaysThrows void handleStatusCode(http.Response response) { - String message; - List> errors; - if (response.headers['content-type'].contains('application/json')) { + String? message; + List>? errors; + if (response.headers['content-type']!.contains('application/json')) { final json = jsonDecode(response.body); message = json['message']; if (json['errors'] != null) { @@ -398,7 +395,6 @@ class GitHub { switch (response.statusCode) { case 404: throw NotFound(this, 'Requested Resource was Not Found'); - break; case 401: throw AccessForbidden(this); case 400: @@ -409,7 +405,6 @@ class GitHub { } else { throw BadRequest(this); } - break; case 422: final buff = StringBuffer(); buff.writeln(); @@ -448,22 +443,22 @@ class GitHub { void _updateRateLimit(Map headers) { if (headers.containsKey(_ratelimitLimitHeader)) { - _rateLimitLimit = int.parse(headers[_ratelimitLimitHeader]); - _rateLimitRemaining = int.parse(headers[_ratelimitRemainingHeader]); - _rateLimitReset = int.parse(headers[_ratelimitResetHeader]); + _rateLimitLimit = int.parse(headers[_ratelimitLimitHeader]!); + _rateLimitRemaining = int.parse(headers[_ratelimitRemainingHeader]!); + _rateLimitReset = int.parse(headers[_ratelimitResetHeader]!); } } } -void _applyExpandos(Object target, http.Response response) { +void _applyExpandos(dynamic target, http.Response response) { _etagExpando[target] = response.headers['etag']; if (response.headers['date'] != null) { - _dateExpando[target] = http_parser.parseHttpDate(response.headers['date']); + _dateExpando[target] = http_parser.parseHttpDate(response.headers['date']!); } } final _etagExpando = Expando('etag'); final _dateExpando = Expando('date'); -String getResponseEtag(Object obj) => _etagExpando[obj]; -DateTime getResponseDate(Object obj) => _dateExpando[obj]; +String? getResponseEtag(Object obj) => _etagExpando[obj]; +DateTime? getResponseDate(Object obj) => _dateExpando[obj]; diff --git a/lib/src/common/issues_service.dart b/lib/src/common/issues_service.dart index db412d17..ec94d887 100644 --- a/lib/src/common/issues_service.dart +++ b/lib/src/common/issues_service.dart @@ -17,13 +17,13 @@ class IssuesService extends Service { /// /// API docs: https://developer.github.com/v3/issues/#list-issues Stream listAll( - {int milestoneNumber, - String state, - String direction, - String sort, - DateTime since, - int perPage, - List labels}) { + {int? milestoneNumber, + String? state, + String? direction, + String? sort, + DateTime? since, + int? perPage, + List? labels}) { return _listIssues('/issues', milestoneNumber, state, direction, sort, since, perPage, labels); } @@ -33,13 +33,13 @@ class IssuesService extends Service { /// /// API docs: https://developer.github.com/v3/issues/#list-issues Stream listByUser( - {int milestoneNumber, - String state, - String direction, - String sort, - DateTime since, - int perPage, - List labels}) { + {int? milestoneNumber, + String? state, + String? direction, + String? sort, + DateTime? since, + int? perPage, + List? labels}) { return _listIssues('/user/issues', milestoneNumber, state, direction, sort, since, perPage, labels); } @@ -48,13 +48,13 @@ class IssuesService extends Service { /// /// API docs: https://developer.github.com/v3/issues/#list-issues Stream listByOrg(String org, - {int milestoneNumber, - String state, - String direction, - String sort, - DateTime since, - int perPage, - List labels}) { + {int? milestoneNumber, + String? state, + String? direction, + String? sort, + DateTime? since, + int? perPage, + List? labels}) { return _listIssues('/orgs/$org/issues', milestoneNumber, state, direction, sort, since, perPage, labels); } @@ -65,26 +65,26 @@ class IssuesService extends Service { /// /// API docs:https://developer.github.com/v3/issues/#list-issues-for-a-repository Stream listByRepo(RepositorySlug slug, - {int milestoneNumber, - String state, - String direction, - String sort, - DateTime since, - int perPage, - List labels}) { + {int? milestoneNumber, + String? state, + String? direction, + String? sort, + DateTime? since, + int? perPage, + List? labels}) { return _listIssues('/repos/${slug.fullName}/issues', milestoneNumber, state, direction, sort, since, perPage, labels); } Stream _listIssues( String pathSegment, - int milestoneNumber, - String state, - String direction, - String sort, - DateTime since, - int perPage, - List labels) { + int? milestoneNumber, + String? state, + String? direction, + String? sort, + DateTime? since, + int? perPage, + List? labels) { final params = {}; if (perPage != null) { @@ -125,7 +125,7 @@ class IssuesService extends Service { return PaginationHelper(github).objects( 'GET', pathSegment, - (i) => Issue.fromJson(i), + (dynamic i) => Issue.fromJson(i), params: params, ); } @@ -141,12 +141,12 @@ class IssuesService extends Service { /// /// See https://developer.github.com/v3/reactions/ Stream listReactions(RepositorySlug slug, int issueNumber, - {ReactionType content}) { + {ReactionType? content}) { var query = content != null ? '?content=${content.content}' : ''; return PaginationHelper(github).objects( 'GET', '/repos/${slug.owner}/${slug.name}/issues/$issueNumber/reactions$query', - (i) => Reaction.fromJson(i), + (dynamic i) => Reaction.fromJson(i), headers: { 'Accept': 'application/vnd.github.squirrel-girl-preview+json', }, @@ -171,7 +171,7 @@ class IssuesService extends Service { /// API docs: https://developer.github.com/v3/issues/#get-a-single-issue Future get(RepositorySlug slug, int issueNumber) => github.getJSON('/repos/${slug.fullName}/issues/$issueNumber', - convert: (i) => Issue.fromJson(i)); + convert: (dynamic i) => Issue.fromJson(i)); /// Create an issue. /// @@ -197,7 +197,7 @@ class IssuesService extends Service { /// API docs: https://developer.github.com/v3/issues/assignees/#list-assignees Stream listAssignees(RepositorySlug slug) { return PaginationHelper(github).objects( - 'GET', '/repos/${slug.fullName}/assignees', (i) => User.fromJson(i)); + 'GET', '/repos/${slug.fullName}/assignees', (dynamic i) => User.fromJson(i)); } /// Checks if a user is an assignee for the specified repository. @@ -217,7 +217,7 @@ class IssuesService extends Service { return PaginationHelper(github).objects( 'GET', '/repos/${slug.fullName}/issues/$issueNumber/comments', - (i) => IssueComment.fromJson(i)); + (dynamic i) => IssueComment.fromJson(i)); } /// Lists all comments in a repository. @@ -227,7 +227,7 @@ class IssuesService extends Service { return PaginationHelper(github).objects( 'GET', '/repos/${slug.fullName}/issues/comments', - (i) => IssueComment.fromJson(i)); + (dynamic i) => IssueComment.fromJson(i)); } /// Fetches the specified issue comment. @@ -235,7 +235,7 @@ class IssuesService extends Service { /// API docs: https://developer.github.com/v3/issues/comments/#get-a-single-comment Future getComment(RepositorySlug slug, int id) => github.getJSON('/repos/${slug.fullName}/issues/comments/$id', - convert: (i) => IssueComment.fromJson(i)); + convert: (dynamic i) => IssueComment.fromJson(i)); /// Creates a new comment on the specified issue /// @@ -246,7 +246,7 @@ class IssuesService extends Service { return github.postJSON( '/repos/${slug.fullName}/issues/$issueNumber/comments', body: it, - convert: (i) => IssueComment.fromJson(i), + convert: (dynamic i) => IssueComment.fromJson(i), statusCode: StatusCodes.CREATED, ); } @@ -269,7 +269,7 @@ class IssuesService extends Service { /// API docs: https://developer.github.com/v3/issues/labels/#list-all-labels-for-this-repository Stream listLabels(RepositorySlug slug) { return PaginationHelper(github).objects( - 'GET', '/repos/${slug.fullName}/labels', (i) => IssueLabel.fromJson(i)); + 'GET', '/repos/${slug.fullName}/labels', (dynamic i) => IssueLabel.fromJson(i)); } /// Fetches a single label. @@ -277,7 +277,7 @@ class IssuesService extends Service { /// API docs: https://developer.github.com/v3/issues/labels/#get-a-single-label Future getLabel(RepositorySlug slug, String name) => github.getJSON('/repos/${slug.fullName}/labels/$name', - convert: (i) => IssueLabel.fromJson(i), statusCode: StatusCodes.OK); + convert: (dynamic i) => IssueLabel.fromJson(i), statusCode: StatusCodes.OK); /// Creates a new label on the specified repository. /// @@ -286,7 +286,7 @@ class IssuesService extends Service { RepositorySlug slug, String name, String color) { return github.postJSON('/repos/${slug.fullName}/labels', body: GitHubJson.encode({'name': name, 'color': color}), - convert: (i) => IssueLabel.fromJson(i)); + convert: (dynamic i) => IssueLabel.fromJson(i)); } /// Edits a label. @@ -295,7 +295,7 @@ class IssuesService extends Service { Future editLabel(RepositorySlug slug, String name, String color) { return github.postJSON('/repos/${slug.fullName}/labels/$name', body: GitHubJson.encode({'name': name, 'color': color}), - convert: (i) => IssueLabel.fromJson(i)); + convert: (dynamic i) => IssueLabel.fromJson(i)); } /// Deletes a label. @@ -315,7 +315,7 @@ class IssuesService extends Service { return PaginationHelper(github).objects( 'GET', '/repos/${slug.fullName}/issues/$issueNumber/labels', - (i) => IssueLabel.fromJson(i)); + (dynamic i) => IssueLabel.fromJson(i)); } /// Adds labels to an issue. @@ -374,7 +374,7 @@ class IssuesService extends Service { /// API docs: https://developer.github.com/v3/issues/milestones/#list-milestones-for-a-repository Stream listMilestones(RepositorySlug slug) { return PaginationHelper(github).objects('GET', - '/repos/${slug.fullName}/milestones', (i) => Milestone.fromJson(i)); + '/repos/${slug.fullName}/milestones', (dynamic i) => Milestone.fromJson(i)); } // TODO: Implement getMilestone: https://developer.github.com/v3/issues/milestones/#get-a-single-milestone @@ -386,7 +386,7 @@ class IssuesService extends Service { RepositorySlug slug, CreateMilestone request) { return github.postJSON('/repos/${slug.fullName}/milestones', body: GitHubJson.encode(request), - convert: (i) => Milestone.fromJson(i)); + convert: (dynamic i) => Milestone.fromJson(i)); } // TODO: Implement editMilestone: https://developer.github.com/v3/issues/milestones/#update-a-milestone diff --git a/lib/src/common/misc_service.dart b/lib/src/common/misc_service.dart index 9ccc289b..3c44b191 100644 --- a/lib/src/common/misc_service.dart +++ b/lib/src/common/misc_service.dart @@ -34,7 +34,7 @@ class MiscService extends Service { /// API docs: https://developer.github.com/v3/gitignore/#get-a-single-template Future getGitignoreTemplate(String name) => github.getJSON('/gitignore/templates/$name', - convert: (i) => GitignoreTemplate.fromJson(i)); + convert: (dynamic i) => GitignoreTemplate.fromJson(i)); /// Renders Markdown from the [input]. /// @@ -42,8 +42,8 @@ class MiscService extends Service { /// [context] is the repository context. Only take into account when [mode] is 'gfm'. /// /// API docs: https://developer.github.com/v3/markdown/#render-an-arbitrary-markdown-document - Future renderMarkdown(String input, - {String mode = 'markdown', String context}) { + Future renderMarkdown(String? input, + {String mode = 'markdown', String? context}) { return github .request('POST', '/markdown', body: GitHubJson.encode( @@ -69,10 +69,10 @@ class MiscService extends Service { /// Gets the GitHub API Status. Future getApiStatus() => github.getJSON('https://status.github.com/api/status.json', - statusCode: StatusCodes.OK, convert: (i) => APIStatus.fromJson(i)); + statusCode: StatusCodes.OK, convert: (dynamic i) => APIStatus.fromJson(i)); /// Returns an ASCII Octocat with the specified [text]. - Future getOctocat([String text]) { + Future getOctocat([String? text]) { final params = {}; if (text != null) { @@ -92,7 +92,7 @@ class MiscService extends Service { } class Octocat { - String name; - String image; - String url; + String? name; + String? image; + String? url; } diff --git a/lib/src/common/model/activity.dart b/lib/src/common/model/activity.dart index 831cc397..ee517ed5 100644 --- a/lib/src/common/model/activity.dart +++ b/lib/src/common/model/activity.dart @@ -16,15 +16,15 @@ class Event { this.payload, this.createdAt, }); - String id; - String type; - Repository repo; - User actor; - Organization org; - Map payload; + String? id; + String? type; + Repository? repo; + User? actor; + Organization? org; + Map? payload; @JsonKey(name: 'created_at') - DateTime createdAt; + DateTime? createdAt; factory Event.fromJson(Map input) => _$EventFromJson(input); Map toJson() => _$EventToJson(this); @@ -39,12 +39,12 @@ class RepositorySubscription { this.reason, this.createdAt, }); - bool subscribed; - bool ignored; - String reason; + bool? subscribed; + bool? ignored; + String? reason; @JsonKey(name: 'created_at') - DateTime createdAt; + DateTime? createdAt; factory RepositorySubscription.fromJson(Map input) => _$RepositorySubscriptionFromJson(input); diff --git a/lib/src/common/model/activity.g.dart b/lib/src/common/model/activity.g.dart index 02da2f73..bc8d3251 100644 --- a/lib/src/common/model/activity.g.dart +++ b/lib/src/common/model/activity.g.dart @@ -8,8 +8,8 @@ part of 'activity.dart'; Event _$EventFromJson(Map json) { return Event( - id: json['id'] as String, - type: json['type'] as String, + id: json['id'] as String?, + type: json['type'] as String?, repo: json['repo'] == null ? null : Repository.fromJson(json['repo'] as Map), @@ -19,7 +19,7 @@ Event _$EventFromJson(Map json) { org: json['org'] == null ? null : Organization.fromJson(json['org'] as Map), - payload: json['payload'] as Map, + payload: json['payload'] as Map?, createdAt: json['created_at'] == null ? null : DateTime.parse(json['created_at'] as String), @@ -39,9 +39,9 @@ Map _$EventToJson(Event instance) => { RepositorySubscription _$RepositorySubscriptionFromJson( Map json) { return RepositorySubscription( - subscribed: json['subscribed'] as bool, - ignored: json['ignored'] as bool, - reason: json['reason'] as String, + subscribed: json['subscribed'] as bool?, + ignored: json['ignored'] as bool?, + reason: json['reason'] as String?, createdAt: json['created_at'] == null ? null : DateTime.parse(json['created_at'] as String), diff --git a/lib/src/common/model/authorizations.dart b/lib/src/common/model/authorizations.dart index 3cd815f0..2a9b7084 100644 --- a/lib/src/common/model/authorizations.dart +++ b/lib/src/common/model/authorizations.dart @@ -18,15 +18,15 @@ class Authorization { this.updatedAt, this.user}); - int id; - List scopes; - String token; - AuthorizationApplication app; - String note; - String noteUrl; - DateTime createdAt; - DateTime updatedAt; - User user; + int? id; + List? scopes; + String? token; + AuthorizationApplication? app; + String? note; + String? noteUrl; + DateTime? createdAt; + DateTime? updatedAt; + User? user; factory Authorization.fromJson(Map input) => _$AuthorizationFromJson(input); @@ -38,9 +38,9 @@ class Authorization { class AuthorizationApplication { AuthorizationApplication({this.url, this.name, this.clientId}); - String url; - String name; - String clientId; + String? url; + String? name; + String? clientId; factory AuthorizationApplication.fromJson(Map input) => _$AuthorizationApplicationFromJson(input); @@ -52,11 +52,11 @@ class CreateAuthorization { CreateAuthorization(this.note, {this.scopes, this.noteUrl, this.clientId, this.clientSecret}); - String note; - List scopes; - String noteUrl; - String clientId; - String clientSecret; + String? note; + List? scopes; + String? noteUrl; + String? clientId; + String? clientSecret; factory CreateAuthorization.fromJson(Map input) => _$CreateAuthorizationFromJson(input); diff --git a/lib/src/common/model/authorizations.g.dart b/lib/src/common/model/authorizations.g.dart index 5c1fcbbc..932857b3 100644 --- a/lib/src/common/model/authorizations.g.dart +++ b/lib/src/common/model/authorizations.g.dart @@ -8,15 +8,16 @@ part of 'authorizations.dart'; Authorization _$AuthorizationFromJson(Map json) { return Authorization( - id: json['id'] as int, - scopes: (json['scopes'] as List)?.map((e) => e as String)?.toList(), - token: json['token'] as String, + id: json['id'] as int?, + scopes: + (json['scopes'] as List?)?.map((e) => e as String).toList(), + token: json['token'] as String?, app: json['app'] == null ? null : AuthorizationApplication.fromJson( json['app'] as Map), - note: json['note'] as String, - noteUrl: json['note_url'] as String, + note: json['note'] as String?, + noteUrl: json['note_url'] as String?, createdAt: json['created_at'] == null ? null : DateTime.parse(json['created_at'] as String), @@ -45,9 +46,9 @@ Map _$AuthorizationToJson(Authorization instance) => AuthorizationApplication _$AuthorizationApplicationFromJson( Map json) { return AuthorizationApplication( - url: json['url'] as String, - name: json['name'] as String, - clientId: json['client_id'] as String, + url: json['url'] as String?, + name: json['name'] as String?, + clientId: json['client_id'] as String?, ); } @@ -61,11 +62,12 @@ Map _$AuthorizationApplicationToJson( CreateAuthorization _$CreateAuthorizationFromJson(Map json) { return CreateAuthorization( - json['note'] as String, - scopes: (json['scopes'] as List)?.map((e) => e as String)?.toList(), - noteUrl: json['note_url'] as String, - clientId: json['client_id'] as String, - clientSecret: json['client_secret'] as String, + json['note'] as String?, + scopes: + (json['scopes'] as List?)?.map((e) => e as String).toList(), + noteUrl: json['note_url'] as String?, + clientId: json['client_id'] as String?, + clientSecret: json['client_secret'] as String?, ); } diff --git a/lib/src/common/model/checks.dart b/lib/src/common/model/checks.dart index 83d6c9c3..e5433947 100644 --- a/lib/src/common/model/checks.dart +++ b/lib/src/common/model/checks.dart @@ -8,7 +8,7 @@ class CheckRunAnnotationLevel extends EnumWithValue { const CheckRunAnnotationLevel._(String value) : super(value); - factory CheckRunAnnotationLevel._fromValue(String value) { + factory CheckRunAnnotationLevel._fromValue(String? value) { switch (value) { case 'notice': return notice; @@ -48,7 +48,7 @@ class CheckRunConclusion extends EnumWithValue { const CheckRunConclusion._(String value) : super(value); - factory CheckRunConclusion._fromValue(String value) { + factory CheckRunConclusion._fromValue(String? value) { for (final level in const [ success, failure, @@ -81,28 +81,28 @@ class CheckRunFilter extends EnumWithValue { @immutable class CheckRun { - final String name; - final int id; - final String externalId; - final String headSha; - final CheckRunStatus status; - final int checkSuiteId; - final String detailsUrl; + final String? name; + final int? id; + final String? externalId; + final String? headSha; + final CheckRunStatus? status; + final int? checkSuiteId; + final String? detailsUrl; final DateTime startedAt; const CheckRun._({ - @required this.id, - @required this.externalId, - @required this.headSha, - @required this.status, - @required this.checkSuiteId, - @required this.name, - @required this.detailsUrl, - @required this.startedAt, + required this.id, + required this.externalId, + required this.headSha, + required this.status, + required this.checkSuiteId, + required this.name, + required this.detailsUrl, + required this.startedAt, }); factory CheckRun.fromJson(Map input) { - CheckRunStatus status; + CheckRunStatus? status; for (final s in const [ CheckRunStatus.completed, CheckRunStatus.inProgress, @@ -135,34 +135,33 @@ class CheckRunOutput { final String summary; /// The details of the check run. This parameter supports Markdown. - final String text; + final String? text; /// Adds information from your analysis to specific lines of code. /// Annotations are visible on GitHub in the Checks and Files changed tab of the pull request. /// The Checks API limits the number of annotations to a maximum of 50 per API request. /// To create more than 50 annotations, you have to make multiple requests to the Update a check run endpoint. /// Each time you update the check run, annotations are appended to the list of annotations that already exist for the check run. - final List annotations; + final List? annotations; /// Adds images to the output displayed in the GitHub pull request UI. - final List images; + final List? images; const CheckRunOutput({ - @required this.title, - @required this.summary, + required this.title, + required this.summary, this.text, this.annotations, this.images, - }) : assert(title != null), - assert(summary != null); + }); Map toJson() { return createNonNullMap({ 'title': title, 'summary': summary, 'text': text, - 'annotations': annotations?.map((a) => a.toJson())?.toList(), - 'images': images?.map((i) => i.toJson())?.toList(), + 'annotations': annotations?.map((a) => a.toJson()).toList(), + 'images': images?.map((i) => i.toJson()).toList(), }); } } @@ -181,12 +180,12 @@ class CheckRunAnnotation { /// The start column of the annotation. /// Annotations only support start_column and end_column on the same line. /// Omit this parameter if start_line and end_line have different values. - final int startColumn; + final int? startColumn; /// The end column of the annotation. /// Annotations only support start_column and end_column on the same line. /// Omit this parameter if start_line and end_line have different values. - final int endColumn; + final int? endColumn; /// The level of the annotation. /// Can be one of notice, warning, or failure. @@ -202,24 +201,19 @@ class CheckRunAnnotation { /// Details about this annotation. /// The maximum size is 64 KB. - final String rawDetails; + final String? rawDetails; const CheckRunAnnotation({ - @required this.annotationLevel, - @required this.endLine, - @required this.message, - @required this.path, - @required this.startLine, + required this.annotationLevel, + required this.endLine, + required this.message, + required this.path, + required this.startLine, + required this.title, this.startColumn, this.endColumn, - this.title, this.rawDetails, - }) : assert(path != null), - assert(startLine != null), - assert(endLine != null), - assert(annotationLevel != null), - assert(message != null), - assert(startColumn == null || startLine == endLine, + }) : assert(startColumn == null || startLine == endLine, 'Annotations only support start_column and end_column on the same line.'), assert(endColumn == null || startLine == endLine, 'Annotations only support start_column and end_column on the same line.'), @@ -245,9 +239,6 @@ class CheckRunAnnotation { int get hashCode => path.hashCode; factory CheckRunAnnotation.fromJSON(Map input) { - if (input == null) { - return null; - } return CheckRunAnnotation( path: input['path'], startLine: input['start_line'], @@ -286,14 +277,13 @@ class CheckRunImage { final String imageUrl; /// A short image description. - final String caption; + final String? caption; const CheckRunImage({ - @required this.alternativeText, - @required this.imageUrl, + required this.alternativeText, + required this.imageUrl, this.caption, - }) : assert(alternativeText != null), - assert(imageUrl != null); + }); Map toJson() { return createNonNullMap({ @@ -319,13 +309,10 @@ class CheckRunAction { final String identifier; const CheckRunAction({ - @required this.label, - @required this.description, - @required this.identifier, - }) : assert(label != null), - assert(description != null), - assert(identifier != null), - assert(label.length <= 20), + required this.label, + required this.description, + required this.identifier, + }) : assert(label.length <= 20), assert(description.length <= 40), assert(identifier.length <= 20); @@ -340,20 +327,17 @@ class CheckRunAction { @immutable class CheckSuite { - final int id; - final String headSha; + final int? id; + final String? headSha; final CheckRunConclusion conclusion; const CheckSuite({ - @required this.conclusion, - @required this.headSha, - @required this.id, + required this.conclusion, + required this.headSha, + required this.id, }); factory CheckSuite.fromJson(Map input) { - if (input == null) { - return null; - } return CheckSuite( conclusion: CheckRunConclusion._fromValue(input['conclusion']), headSha: input['head_sha'], @@ -368,17 +352,14 @@ class AutoTriggerChecks { final int appId; /// Set to true to enable automatic creation of CheckSuite events upon pushes to the repository, or false to disable them. - final bool setting; + final bool? setting; const AutoTriggerChecks({ - @required this.appId, + required this.appId, this.setting = true, - }) : assert(appId != null); + }); factory AutoTriggerChecks.fromJson(Map input) { - if (input == null) { - return null; - } return AutoTriggerChecks( appId: input['app_id'], setting: input['setting'], diff --git a/lib/src/common/model/gists.dart b/lib/src/common/model/gists.dart index 09787941..0495e02e 100644 --- a/lib/src/common/model/gists.dart +++ b/lib/src/common/model/gists.dart @@ -21,30 +21,30 @@ class Gist { this.createdAt, this.updatedAt, }); - String id; - String description; - bool public; - User owner; - User user; - List files; + String? id; + String? description; + bool? public; + User? owner; + User? user; + List? files; @JsonKey(name: 'html_url') - String htmlUrl; + String? htmlUrl; @JsonKey(name: 'comments') - int commentsCount; + int? commentsCount; @JsonKey(name: 'git_pull_url') - String gitPullUrl; + String? gitPullUrl; @JsonKey(name: 'git_push_url') - String gitPushUrl; + String? gitPushUrl; @JsonKey(name: 'created_at') - DateTime createdAt; + DateTime? createdAt; @JsonKey(name: 'updated_at') - DateTime updatedAt; + DateTime? updatedAt; factory Gist.fromJson(Map input) => _$GistFromJson(input); } @@ -61,15 +61,15 @@ class GistFile { this.truncated, this.content, }); - String name; - int size; + String? name; + int? size; @JsonKey(name: 'raw_url') - String rawUrl; - String type; - String language; - bool truncated; - String content; + String? rawUrl; + String? type; + String? language; + bool? truncated; + String? content; factory GistFile.fromJson(Map input) => _$GistFileFromJson(input); @@ -79,14 +79,14 @@ class GistFile { @JsonSerializable(createToJson: false) class GistFork { GistFork({this.user, this.id, this.createdAt, this.updatedAt}); - User user; - int id; + User? user; + int? id; @JsonKey(name: 'created_at') - DateTime createdAt; + DateTime? createdAt; @JsonKey(name: 'updated_at') - DateTime updatedAt; + DateTime? updatedAt; factory GistFork.fromJson(Map input) => _$GistForkFromJson(input); @@ -103,21 +103,21 @@ class GistHistoryEntry { this.totalChanges, this.committedAt, }); - String version; + String? version; - User user; + User? user; @JsonKey(name: 'change_status/deletions') - int deletions; + int? deletions; @JsonKey(name: 'change_status/additions') - int additions; + int? additions; @JsonKey(name: 'change_status/total') - int totalChanges; + int? totalChanges; @JsonKey(name: 'committed_at') - DateTime committedAt; + DateTime? committedAt; factory GistHistoryEntry.fromJson(Map input) => _$GistHistoryEntryFromJson(input); @@ -134,11 +134,11 @@ class GistComment { this.body, }); - int id; - User user; - DateTime createdAt; - DateTime updatedAt; - String body; + int? id; + User? user; + DateTime? createdAt; + DateTime? updatedAt; + String? body; factory GistComment.fromJson(Map input) => _$GistCommentFromJson(input); @@ -149,7 +149,7 @@ class GistComment { @JsonSerializable(fieldRename: FieldRename.snake) class CreateGistComment { CreateGistComment(this.body); - String body; + String? body; factory CreateGistComment.fromJson(Map input) => _$CreateGistCommentFromJson(input); diff --git a/lib/src/common/model/gists.g.dart b/lib/src/common/model/gists.g.dart index 5e557b08..982181f1 100644 --- a/lib/src/common/model/gists.g.dart +++ b/lib/src/common/model/gists.g.dart @@ -8,23 +8,22 @@ part of 'gists.dart'; Gist _$GistFromJson(Map json) { return Gist( - id: json['id'] as String, - description: json['description'] as String, - public: json['public'] as bool, + id: json['id'] as String?, + description: json['description'] as String?, + public: json['public'] as bool?, owner: json['owner'] == null ? null : User.fromJson(json['owner'] as Map), user: json['user'] == null ? null : User.fromJson(json['user'] as Map), - files: (json['files'] as List) - ?.map((e) => - e == null ? null : GistFile.fromJson(e as Map)) - ?.toList(), - htmlUrl: json['html_url'] as String, - commentsCount: json['comments'] as int, - gitPullUrl: json['git_pull_url'] as String, - gitPushUrl: json['git_push_url'] as String, + files: (json['files'] as List?) + ?.map((e) => GistFile.fromJson(e as Map)) + .toList(), + htmlUrl: json['html_url'] as String?, + commentsCount: json['comments'] as int?, + gitPullUrl: json['git_pull_url'] as String?, + gitPushUrl: json['git_push_url'] as String?, createdAt: json['created_at'] == null ? null : DateTime.parse(json['created_at'] as String), @@ -36,13 +35,13 @@ Gist _$GistFromJson(Map json) { GistFile _$GistFileFromJson(Map json) { return GistFile( - name: json['name'] as String, - size: json['size'] as int, - rawUrl: json['raw_url'] as String, - type: json['type'] as String, - language: json['language'] as String, - truncated: json['truncated'] as bool, - content: json['content'] as String, + name: json['name'] as String?, + size: json['size'] as int?, + rawUrl: json['raw_url'] as String?, + type: json['type'] as String?, + language: json['language'] as String?, + truncated: json['truncated'] as bool?, + content: json['content'] as String?, ); } @@ -51,7 +50,7 @@ GistFork _$GistForkFromJson(Map json) { user: json['user'] == null ? null : User.fromJson(json['user'] as Map), - id: json['id'] as int, + id: json['id'] as int?, createdAt: json['created_at'] == null ? null : DateTime.parse(json['created_at'] as String), @@ -63,13 +62,13 @@ GistFork _$GistForkFromJson(Map json) { GistHistoryEntry _$GistHistoryEntryFromJson(Map json) { return GistHistoryEntry( - version: json['version'] as String, + version: json['version'] as String?, user: json['user'] == null ? null : User.fromJson(json['user'] as Map), - deletions: json['change_status/deletions'] as int, - additions: json['change_status/additions'] as int, - totalChanges: json['change_status/total'] as int, + deletions: json['change_status/deletions'] as int?, + additions: json['change_status/additions'] as int?, + totalChanges: json['change_status/total'] as int?, committedAt: json['committed_at'] == null ? null : DateTime.parse(json['committed_at'] as String), @@ -78,7 +77,7 @@ GistHistoryEntry _$GistHistoryEntryFromJson(Map json) { GistComment _$GistCommentFromJson(Map json) { return GistComment( - id: json['id'] as int, + id: json['id'] as int?, user: json['user'] == null ? null : User.fromJson(json['user'] as Map), @@ -88,7 +87,7 @@ GistComment _$GistCommentFromJson(Map json) { updatedAt: json['updated_at'] == null ? null : DateTime.parse(json['updated_at'] as String), - body: json['body'] as String, + body: json['body'] as String?, ); } @@ -103,7 +102,7 @@ Map _$GistCommentToJson(GistComment instance) => CreateGistComment _$CreateGistCommentFromJson(Map json) { return CreateGistComment( - json['body'] as String, + json['body'] as String?, ); } diff --git a/lib/src/common/model/git.dart b/lib/src/common/model/git.dart index 6601b8ab..2223b370 100644 --- a/lib/src/common/model/git.dart +++ b/lib/src/common/model/git.dart @@ -14,11 +14,11 @@ class GitBlob { this.sha, this.size, }); - String content; - String encoding; - String url; - String sha; - int size; + String? content; + String? encoding; + String? url; + String? sha; + int? size; factory GitBlob.fromJson(Map input) => _$GitBlobFromJson(input); @@ -32,8 +32,8 @@ class GitBlob { class CreateGitBlob { CreateGitBlob(this.content, this.encoding); - String content; - String encoding; + String? content; + String? encoding; factory CreateGitBlob.fromJson(Map input) => _$CreateGitBlobFromJson(input); @@ -56,16 +56,16 @@ class GitCommit { this.parents, this.commentCount, }); - String sha; - String url; - GitCommitUser author; - GitCommitUser committer; - String message; - GitTree tree; - List parents; + String? sha; + String? url; + GitCommitUser? author; + GitCommitUser? committer; + String? message; + GitTree? tree; + List? parents; @JsonKey(name: 'comment_count') - int commentCount; + int? commentCount; factory GitCommit.fromJson(Map input) => _$GitCommitFromJson(input); @@ -79,20 +79,20 @@ class CreateGitCommit { {this.parents, this.committer, this.author}); /// The commit message. - String message; + String? message; /// The SHA of the tree object this commit points to. - String tree; + String? tree; /// The SHAs of the commits that were the parents of this commit. If omitted /// or empty, the commit will be written as a root commit. - List parents; + List? parents; /// Info about the committer. - GitCommitUser committer; + GitCommitUser? committer; /// Info about the author. - GitCommitUser author; + GitCommitUser? author; factory CreateGitCommit.fromJson(Map input) => _$CreateGitCommitFromJson(input); @@ -105,10 +105,10 @@ class CreateGitCommit { class GitCommitUser { GitCommitUser(this.name, this.email, this.date); - String name; - String email; + String? name; + String? email; @JsonKey(toJson: dateToGitHubIso8601) - DateTime date; + DateTime? date; factory GitCommitUser.fromJson(Map json) => _$GitCommitUserFromJson(json); @@ -119,15 +119,15 @@ class GitCommitUser { /// Model class for a GitHub tree. @JsonSerializable(fieldRename: FieldRename.snake) class GitTree { - String sha; - String url; + String? sha; + String? url; /// If truncated is true, the number of items in the tree array exceeded /// GitHub's maximum limit. - bool truncated; + bool? truncated; @JsonKey(name: 'tree') - List entries; + List? entries; GitTree(this.sha, this.url, this.truncated, this.entries); @@ -141,12 +141,12 @@ class GitTree { /// tree. @JsonSerializable(fieldRename: FieldRename.snake) class GitTreeEntry { - String path; - String mode; - String type; - int size; - String sha; - String url; + String? path; + String? mode; + String? type; + int? size; + String? sha; + String? url; GitTreeEntry(this.path, this.mode, this.type, this.size, this.sha, this.url); @@ -164,11 +164,11 @@ class CreateGitTree { /// If you don’t set this, the commit will be created on top of everything; /// however, it will only contain your change, the rest of your files will /// show up as deleted. - String baseTree; + String? baseTree; /// The Objects specifying a tree structure. @JsonKey(name: 'tree') - List entries; + List? entries; factory CreateGitTree.fromJson(Map input) => _$CreateGitTreeFromJson(input); @@ -187,11 +187,11 @@ class CreateGitTreeEntry { this.sha, this.content, }); - String path; - String mode; - String type; - String sha; - String content; + String? path; + String? mode; + String? type; + String? sha; + String? content; factory CreateGitTreeEntry.fromJson(Map input) => _$CreateGitTreeEntryFromJson(input); @@ -206,9 +206,9 @@ class GitReference { this.url, this.object, }); - String ref; - String url; - GitObject object; + String? ref; + String? url; + GitObject? object; factory GitReference.fromJson(Map input) => _$GitReferenceFromJson(input); @@ -226,12 +226,12 @@ class GitTag { this.tagger, this.object, }); - String tag; - String sha; - String url; - String message; - GitCommitUser tagger; - GitObject object; + String? tag; + String? sha; + String? url; + String? message; + GitCommitUser? tagger; + GitObject? object; factory GitTag.fromJson(Map input) => _$GitTagFromJson(input); @@ -243,11 +243,11 @@ class GitTag { class CreateGitTag { CreateGitTag(this.tag, this.message, this.object, this.type, this.tagger); - String tag; - String message; - String object; - String type; - GitCommitUser tagger; + String? tag; + String? message; + String? object; + String? type; + GitCommitUser? tagger; factory CreateGitTag.fromJson(Map input) => _$CreateGitTagFromJson(input); @@ -258,9 +258,9 @@ class CreateGitTag { @JsonSerializable(fieldRename: FieldRename.snake) class GitObject { GitObject(this.type, this.sha, this.url); - String type; - String sha; - String url; + String? type; + String? sha; + String? url; factory GitObject.fromJson(Map input) => _$GitObjectFromJson(input); diff --git a/lib/src/common/model/git.g.dart b/lib/src/common/model/git.g.dart index 64321add..d596e7cb 100644 --- a/lib/src/common/model/git.g.dart +++ b/lib/src/common/model/git.g.dart @@ -8,11 +8,11 @@ part of 'git.dart'; GitBlob _$GitBlobFromJson(Map json) { return GitBlob( - content: json['content'] as String, - encoding: json['encoding'] as String, - url: json['url'] as String, - sha: json['sha'] as String, - size: json['size'] as int, + content: json['content'] as String?, + encoding: json['encoding'] as String?, + url: json['url'] as String?, + sha: json['sha'] as String?, + size: json['size'] as int?, ); } @@ -26,8 +26,8 @@ Map _$GitBlobToJson(GitBlob instance) => { CreateGitBlob _$CreateGitBlobFromJson(Map json) { return CreateGitBlob( - json['content'] as String, - json['encoding'] as String, + json['content'] as String?, + json['encoding'] as String?, ); } @@ -39,23 +39,22 @@ Map _$CreateGitBlobToJson(CreateGitBlob instance) => GitCommit _$GitCommitFromJson(Map json) { return GitCommit( - sha: json['sha'] as String, - url: json['url'] as String, + sha: json['sha'] as String?, + url: json['url'] as String?, author: json['author'] == null ? null : GitCommitUser.fromJson(json['author'] as Map), committer: json['committer'] == null ? null : GitCommitUser.fromJson(json['committer'] as Map), - message: json['message'] as String, + message: json['message'] as String?, tree: json['tree'] == null ? null : GitTree.fromJson(json['tree'] as Map), - parents: (json['parents'] as List) - ?.map((e) => - e == null ? null : GitCommit.fromJson(e as Map)) - ?.toList(), - commentCount: json['comment_count'] as int, + parents: (json['parents'] as List?) + ?.map((e) => GitCommit.fromJson(e as Map)) + .toList(), + commentCount: json['comment_count'] as int?, ); } @@ -72,9 +71,10 @@ Map _$GitCommitToJson(GitCommit instance) => { CreateGitCommit _$CreateGitCommitFromJson(Map json) { return CreateGitCommit( - json['message'] as String, - json['tree'] as String, - parents: (json['parents'] as List)?.map((e) => e as String)?.toList(), + json['message'] as String?, + json['tree'] as String?, + parents: + (json['parents'] as List?)?.map((e) => e as String?).toList(), committer: json['committer'] == null ? null : GitCommitUser.fromJson(json['committer'] as Map), @@ -95,8 +95,8 @@ Map _$CreateGitCommitToJson(CreateGitCommit instance) => GitCommitUser _$GitCommitUserFromJson(Map json) { return GitCommitUser( - json['name'] as String, - json['email'] as String, + json['name'] as String?, + json['email'] as String?, json['date'] == null ? null : DateTime.parse(json['date'] as String), ); } @@ -118,13 +118,12 @@ Map _$GitCommitUserToJson(GitCommitUser instance) { GitTree _$GitTreeFromJson(Map json) { return GitTree( - json['sha'] as String, - json['url'] as String, - json['truncated'] as bool, - (json['tree'] as List) - ?.map((e) => - e == null ? null : GitTreeEntry.fromJson(e as Map)) - ?.toList(), + json['sha'] as String?, + json['url'] as String?, + json['truncated'] as bool?, + (json['tree'] as List?) + ?.map((e) => GitTreeEntry.fromJson(e as Map)) + .toList(), ); } @@ -137,12 +136,12 @@ Map _$GitTreeToJson(GitTree instance) => { GitTreeEntry _$GitTreeEntryFromJson(Map json) { return GitTreeEntry( - json['path'] as String, - json['mode'] as String, - json['type'] as String, - json['size'] as int, - json['sha'] as String, - json['url'] as String, + json['path'] as String?, + json['mode'] as String?, + json['type'] as String?, + json['size'] as int?, + json['sha'] as String?, + json['url'] as String?, ); } @@ -158,12 +157,10 @@ Map _$GitTreeEntryToJson(GitTreeEntry instance) => CreateGitTree _$CreateGitTreeFromJson(Map json) { return CreateGitTree( - (json['tree'] as List) - ?.map((e) => e == null - ? null - : CreateGitTreeEntry.fromJson(e as Map)) - ?.toList(), - baseTree: json['base_tree'] as String, + (json['tree'] as List?) + ?.map((e) => CreateGitTreeEntry.fromJson(e as Map)) + .toList(), + baseTree: json['base_tree'] as String?, ); } @@ -175,11 +172,11 @@ Map _$CreateGitTreeToJson(CreateGitTree instance) => CreateGitTreeEntry _$CreateGitTreeEntryFromJson(Map json) { return CreateGitTreeEntry( - json['path'] as String, - json['mode'] as String, - json['type'] as String, - sha: json['sha'] as String, - content: json['content'] as String, + json['path'] as String?, + json['mode'] as String?, + json['type'] as String?, + sha: json['sha'] as String?, + content: json['content'] as String?, ); } @@ -194,8 +191,8 @@ Map _$CreateGitTreeEntryToJson(CreateGitTreeEntry instance) => GitReference _$GitReferenceFromJson(Map json) { return GitReference( - ref: json['ref'] as String, - url: json['url'] as String, + ref: json['ref'] as String?, + url: json['url'] as String?, object: json['object'] == null ? null : GitObject.fromJson(json['object'] as Map), @@ -211,10 +208,10 @@ Map _$GitReferenceToJson(GitReference instance) => GitTag _$GitTagFromJson(Map json) { return GitTag( - tag: json['tag'] as String, - sha: json['sha'] as String, - url: json['url'] as String, - message: json['message'] as String, + tag: json['tag'] as String?, + sha: json['sha'] as String?, + url: json['url'] as String?, + message: json['message'] as String?, tagger: json['tagger'] == null ? null : GitCommitUser.fromJson(json['tagger'] as Map), @@ -235,10 +232,10 @@ Map _$GitTagToJson(GitTag instance) => { CreateGitTag _$CreateGitTagFromJson(Map json) { return CreateGitTag( - json['tag'] as String, - json['message'] as String, - json['object'] as String, - json['type'] as String, + json['tag'] as String?, + json['message'] as String?, + json['object'] as String?, + json['type'] as String?, json['tagger'] == null ? null : GitCommitUser.fromJson(json['tagger'] as Map), @@ -256,9 +253,9 @@ Map _$CreateGitTagToJson(CreateGitTag instance) => GitObject _$GitObjectFromJson(Map json) { return GitObject( - json['type'] as String, - json['sha'] as String, - json['url'] as String, + json['type'] as String?, + json['sha'] as String?, + json['url'] as String?, ); } diff --git a/lib/src/common/model/issues.dart b/lib/src/common/model/issues.dart index 254881b4..839b9296 100644 --- a/lib/src/common/model/issues.dart +++ b/lib/src/common/model/issues.dart @@ -27,61 +27,61 @@ class Issue { this.closedBy, }); - int id; + int? id; /// The api url. - String url; + String? url; /// Url to the Issue Page @JsonKey(name: 'html_url') - String htmlUrl; + String? htmlUrl; /// Issue Number - int number; + int? number; /// Issue State - String state; + String? state; /// Issue Title - String title; + String? title; /// User who created the issue. - User user; + User? user; /// Issue Labels - List labels; + List? labels; /// The User that the issue is assigned to - User assignee; + User? assignee; /// The Milestone - Milestone milestone; + Milestone? milestone; /// Number of Comments @JsonKey(name: 'comments') - int commentsCount; + int? commentsCount; /// A Pull Request @JsonKey(name: 'pull_request') - IssuePullRequest pullRequest; + IssuePullRequest? pullRequest; /// Time that the issue was created at @JsonKey(name: 'created_at') - DateTime createdAt; + DateTime? createdAt; /// The time that the issue was closed at @JsonKey(name: 'closed_at') - DateTime closedAt; + DateTime? closedAt; /// The time that the issue was updated at @JsonKey(name: 'updated_at') - DateTime updatedAt; + DateTime? updatedAt; - String body; + String? body; /// The user who closed the issue @JsonKey(name: 'closed_by') - User closedBy; + User? closedBy; bool get isOpen => state == 'open'; bool get isClosed => state == 'closed'; @@ -100,12 +100,12 @@ class IssueRequest { this.assignee, this.state, this.milestone}); - String title; - String body; - List labels; - String assignee; - String state; - int milestone; + String? title; + String? body; + List? labels; + String? assignee; + String? state; + int? milestone; Map toJson() => _$IssueRequestToJson(this); @@ -123,9 +123,9 @@ class IssuePullRequest { }); /// Url to the Page for this Issue Pull Request - String htmlUrl; - String diffUrl; - String patchUrl; + String? htmlUrl; + String? diffUrl; + String? patchUrl; factory IssuePullRequest.fromJson(Map input) => _$IssuePullRequestFromJson(input); @@ -145,14 +145,14 @@ class IssueComment { this.htmlUrl, this.issueUrl, }); - int id; - String body; - User user; - DateTime createdAt; - DateTime updatedAt; - String url; - String htmlUrl; - String issueUrl; + int? id; + String? body; + User? user; + DateTime? createdAt; + DateTime? updatedAt; + String? url; + String? htmlUrl; + String? issueUrl; factory IssueComment.fromJson(Map input) => _$IssueCommentFromJson(input); @@ -167,8 +167,8 @@ class IssueLabel { this.color, }); - String name; - String color; + String? name; + String? color; factory IssueLabel.fromJson(Map input) => _$IssueLabelFromJson(input); @@ -196,39 +196,39 @@ class Milestone { }); /// Unique Identifier for Milestone - int id; + int? id; /// Milestone Number - int number; + int? number; /// Milestone State - String state; + String? state; /// Milestone Title - String title; + String? title; /// Milestone Description - String description; + String? description; /// Milestone Creator - User creator; + User? creator; /// Number of Open Issues @JsonKey(name: 'open_issues') - int openIssuesCount; + int? openIssuesCount; /// Number of Closed Issues @JsonKey(name: 'closed_issues') - int closedIssuesCount; + int? closedIssuesCount; /// Time the milestone was created at - DateTime createdAt; + DateTime? createdAt; /// The last time the milestone was updated at - DateTime updatedAt; + DateTime? updatedAt; /// The due date for this milestone - DateTime dueOn; + DateTime? dueOn; factory Milestone.fromJson(Map input) => _$MilestoneFromJson(input); @@ -245,10 +245,10 @@ class CreateMilestone { this.dueOn, }); - String title; - String state; - String description; - DateTime dueOn; + String? title; + String? state; + String? description; + DateTime? dueOn; Map toJson() => _$CreateMilestoneToJson(this); diff --git a/lib/src/common/model/issues.g.dart b/lib/src/common/model/issues.g.dart index 975ade86..c82d7e12 100644 --- a/lib/src/common/model/issues.g.dart +++ b/lib/src/common/model/issues.g.dart @@ -8,26 +8,25 @@ part of 'issues.dart'; Issue _$IssueFromJson(Map json) { return Issue( - id: json['id'] as int, - url: json['url'] as String, - htmlUrl: json['html_url'] as String, - number: json['number'] as int, - state: json['state'] as String, - title: json['title'] as String, + id: json['id'] as int?, + url: json['url'] as String?, + htmlUrl: json['html_url'] as String?, + number: json['number'] as int?, + state: json['state'] as String?, + title: json['title'] as String?, user: json['user'] == null ? null : User.fromJson(json['user'] as Map), - labels: (json['labels'] as List) - ?.map((e) => - e == null ? null : IssueLabel.fromJson(e as Map)) - ?.toList(), + labels: (json['labels'] as List?) + ?.map((e) => IssueLabel.fromJson(e as Map)) + .toList(), assignee: json['assignee'] == null ? null : User.fromJson(json['assignee'] as Map), milestone: json['milestone'] == null ? null : Milestone.fromJson(json['milestone'] as Map), - commentsCount: json['comments'] as int, + commentsCount: json['comments'] as int?, pullRequest: json['pull_request'] == null ? null : IssuePullRequest.fromJson( @@ -41,7 +40,7 @@ Issue _$IssueFromJson(Map json) { updatedAt: json['updated_at'] == null ? null : DateTime.parse(json['updated_at'] as String), - body: json['body'] as String, + body: json['body'] as String?, closedBy: json['closed_by'] == null ? null : User.fromJson(json['closed_by'] as Map), @@ -70,12 +69,13 @@ Map _$IssueToJson(Issue instance) => { IssueRequest _$IssueRequestFromJson(Map json) { return IssueRequest( - title: json['title'] as String, - body: json['body'] as String, - labels: (json['labels'] as List)?.map((e) => e as String)?.toList(), - assignee: json['assignee'] as String, - state: json['state'] as String, - milestone: json['milestone'] as int, + title: json['title'] as String?, + body: json['body'] as String?, + labels: + (json['labels'] as List?)?.map((e) => e as String).toList(), + assignee: json['assignee'] as String?, + state: json['state'] as String?, + milestone: json['milestone'] as int?, ); } @@ -91,9 +91,9 @@ Map _$IssueRequestToJson(IssueRequest instance) => IssuePullRequest _$IssuePullRequestFromJson(Map json) { return IssuePullRequest( - htmlUrl: json['html_url'] as String, - diffUrl: json['diff_url'] as String, - patchUrl: json['patch_url'] as String, + htmlUrl: json['html_url'] as String?, + diffUrl: json['diff_url'] as String?, + patchUrl: json['patch_url'] as String?, ); } @@ -106,8 +106,8 @@ Map _$IssuePullRequestToJson(IssuePullRequest instance) => IssueComment _$IssueCommentFromJson(Map json) { return IssueComment( - id: json['id'] as int, - body: json['body'] as String, + id: json['id'] as int?, + body: json['body'] as String?, user: json['user'] == null ? null : User.fromJson(json['user'] as Map), @@ -117,9 +117,9 @@ IssueComment _$IssueCommentFromJson(Map json) { updatedAt: json['updated_at'] == null ? null : DateTime.parse(json['updated_at'] as String), - url: json['url'] as String, - htmlUrl: json['html_url'] as String, - issueUrl: json['issue_url'] as String, + url: json['url'] as String?, + htmlUrl: json['html_url'] as String?, + issueUrl: json['issue_url'] as String?, ); } @@ -137,8 +137,8 @@ Map _$IssueCommentToJson(IssueComment instance) => IssueLabel _$IssueLabelFromJson(Map json) { return IssueLabel( - name: json['name'] as String, - color: json['color'] as String, + name: json['name'] as String?, + color: json['color'] as String?, ); } @@ -150,16 +150,16 @@ Map _$IssueLabelToJson(IssueLabel instance) => Milestone _$MilestoneFromJson(Map json) { return Milestone( - id: json['id'] as int, - number: json['number'] as int, - state: json['state'] as String, - title: json['title'] as String, - description: json['description'] as String, + id: json['id'] as int?, + number: json['number'] as int?, + state: json['state'] as String?, + title: json['title'] as String?, + description: json['description'] as String?, creator: json['creator'] == null ? null : User.fromJson(json['creator'] as Map), - openIssuesCount: json['open_issues'] as int, - closedIssuesCount: json['closed_issues'] as int, + openIssuesCount: json['open_issues'] as int?, + closedIssuesCount: json['closed_issues'] as int?, createdAt: json['created_at'] == null ? null : DateTime.parse(json['created_at'] as String), @@ -188,9 +188,9 @@ Map _$MilestoneToJson(Milestone instance) => { CreateMilestone _$CreateMilestoneFromJson(Map json) { return CreateMilestone( - json['title'] as String, - state: json['state'] as String, - description: json['description'] as String, + json['title'] as String?, + state: json['state'] as String?, + description: json['description'] as String?, dueOn: json['due_on'] == null ? null : DateTime.parse(json['due_on'] as String), diff --git a/lib/src/common/model/keys.dart b/lib/src/common/model/keys.dart index c59c226b..17c2a76e 100644 --- a/lib/src/common/model/keys.dart +++ b/lib/src/common/model/keys.dart @@ -13,9 +13,9 @@ class PublicKey { this.key, this.title, }); - final int id; - final String key; - final String title; + final int? id; + final String? key; + final String? title; factory PublicKey.fromJson(Map input) => _$PublicKeyFromJson(input); @@ -27,8 +27,8 @@ class PublicKey { class CreatePublicKey { CreatePublicKey(this.title, this.key); - final String title; - final String key; + final String? title; + final String? key; Map toJson() => _$CreatePublicKeyToJson(this); diff --git a/lib/src/common/model/keys.g.dart b/lib/src/common/model/keys.g.dart index b99277c8..b1c956a8 100644 --- a/lib/src/common/model/keys.g.dart +++ b/lib/src/common/model/keys.g.dart @@ -8,9 +8,9 @@ part of 'keys.dart'; PublicKey _$PublicKeyFromJson(Map json) { return PublicKey( - id: json['id'] as int, - key: json['key'] as String, - title: json['title'] as String, + id: json['id'] as int?, + key: json['key'] as String?, + title: json['title'] as String?, ); } @@ -22,8 +22,8 @@ Map _$PublicKeyToJson(PublicKey instance) => { CreatePublicKey _$CreatePublicKeyFromJson(Map json) { return CreatePublicKey( - json['title'] as String, - json['key'] as String, + json['title'] as String?, + json['key'] as String?, ); } diff --git a/lib/src/common/model/misc.dart b/lib/src/common/model/misc.dart index b8e6ee77..68c34536 100644 --- a/lib/src/common/model/misc.dart +++ b/lib/src/common/model/misc.dart @@ -8,10 +8,10 @@ class GitignoreTemplate { GitignoreTemplate({this.name, this.source}); /// Template Name - final String name; + final String? name; /// Template Source - final String source; + final String? source; factory GitignoreTemplate.fromJson(Map input) => _$GitignoreTemplateFromJson(input); @@ -21,21 +21,21 @@ class GitignoreTemplate { @JsonSerializable() class RateLimit { /// Maximum number of requests - final int limit; + final int? limit; /// Remaining number of requests - final int remaining; + final int? remaining; /// Time when the limit expires - final DateTime resets; + final DateTime? resets; RateLimit(this.limit, this.remaining, this.resets); factory RateLimit.fromHeaders(Map headers) { - final limit = int.parse(headers['x-ratelimit-limit']); - final remaining = int.parse(headers['x-ratelimit-remaining']); + final limit = int.parse(headers['x-ratelimit-limit']!); + final remaining = int.parse(headers['x-ratelimit-remaining']!); final resets = DateTime.fromMillisecondsSinceEpoch( - int.parse(headers['x-ratelimit-reset']) * 1000); + int.parse(headers['x-ratelimit-reset']!) * 1000); return RateLimit(limit, remaining, resets); } @@ -53,16 +53,16 @@ class APIStatus { this.createdOn, this.message, }); - final String status; + final String? status; @JsonKey(name: 'last_updated') - final DateTime lastUpdatedAt; + final DateTime? lastUpdatedAt; @JsonKey(name: 'created_on') - final DateTime createdOn; + final DateTime? createdOn; @JsonKey(name: 'body') - final String message; + final String? message; factory APIStatus.fromJson(Map input) => _$APIStatusFromJson(input); diff --git a/lib/src/common/model/misc.g.dart b/lib/src/common/model/misc.g.dart index 24b79965..a47d7ff9 100644 --- a/lib/src/common/model/misc.g.dart +++ b/lib/src/common/model/misc.g.dart @@ -8,15 +8,15 @@ part of 'misc.dart'; GitignoreTemplate _$GitignoreTemplateFromJson(Map json) { return GitignoreTemplate( - name: json['name'] as String, - source: json['source'] as String, + name: json['name'] as String?, + source: json['source'] as String?, ); } RateLimit _$RateLimitFromJson(Map json) { return RateLimit( - json['limit'] as int, - json['remaining'] as int, + json['limit'] as int?, + json['remaining'] as int?, json['resets'] == null ? null : DateTime.parse(json['resets'] as String), ); } @@ -29,14 +29,14 @@ Map _$RateLimitToJson(RateLimit instance) => { APIStatus _$APIStatusFromJson(Map json) { return APIStatus( - status: json['status'] as String, + status: json['status'] as String?, lastUpdatedAt: json['last_updated'] == null ? null : DateTime.parse(json['last_updated'] as String), createdOn: json['created_on'] == null ? null : DateTime.parse(json['created_on'] as String), - message: json['body'] as String, + message: json['body'] as String?, ); } diff --git a/lib/src/common/model/notifications.dart b/lib/src/common/model/notifications.dart index 85ae6af0..6032549b 100644 --- a/lib/src/common/model/notifications.dart +++ b/lib/src/common/model/notifications.dart @@ -17,22 +17,22 @@ class Notification { this.url, this.subscriptionUrl, }); - final String id; - final Repository repository; - final NotificationSubject subject; - final String reason; - final bool unread; + final String? id; + final Repository? repository; + final NotificationSubject? subject; + final String? reason; + final bool? unread; @JsonKey(name: 'updated_at') - final DateTime updatedAt; + final DateTime? updatedAt; @JsonKey(name: 'last_read_at') - final DateTime lastReadAt; + final DateTime? lastReadAt; - final String url; + final String? url; @JsonKey(name: 'subscription_url') - final String subscriptionUrl; + final String? subscriptionUrl; factory Notification.fromJson(Map input) => _$NotificationFromJson(input); @@ -42,12 +42,12 @@ class Notification { @JsonSerializable(createToJson: false) class NotificationSubject { NotificationSubject({this.title, this.type, this.url, this.latestCommentUrl}); - final String title; - final String type; - final String url; + final String? title; + final String? type; + final String? url; @JsonKey(name: 'latest_comment_url') - final String latestCommentUrl; + final String? latestCommentUrl; factory NotificationSubject.fromJson(Map input) => _$NotificationSubjectFromJson(input); diff --git a/lib/src/common/model/notifications.g.dart b/lib/src/common/model/notifications.g.dart index b6fbf6fd..83c9ae84 100644 --- a/lib/src/common/model/notifications.g.dart +++ b/lib/src/common/model/notifications.g.dart @@ -8,31 +8,31 @@ part of 'notifications.dart'; Notification _$NotificationFromJson(Map json) { return Notification( - id: json['id'] as String, + id: json['id'] as String?, repository: json['repository'] == null ? null : Repository.fromJson(json['repository'] as Map), subject: json['subject'] == null ? null : NotificationSubject.fromJson(json['subject'] as Map), - reason: json['reason'] as String, - unread: json['unread'] as bool, + reason: json['reason'] as String?, + unread: json['unread'] as bool?, updatedAt: json['updated_at'] == null ? null : DateTime.parse(json['updated_at'] as String), lastReadAt: json['last_read_at'] == null ? null : DateTime.parse(json['last_read_at'] as String), - url: json['url'] as String, - subscriptionUrl: json['subscription_url'] as String, + url: json['url'] as String?, + subscriptionUrl: json['subscription_url'] as String?, ); } NotificationSubject _$NotificationSubjectFromJson(Map json) { return NotificationSubject( - title: json['title'] as String, - type: json['type'] as String, - url: json['url'] as String, - latestCommentUrl: json['latest_comment_url'] as String, + title: json['title'] as String?, + type: json['type'] as String?, + url: json['url'] as String?, + latestCommentUrl: json['latest_comment_url'] as String?, ); } diff --git a/lib/src/common/model/orgs.dart b/lib/src/common/model/orgs.dart index 386404b9..0130868e 100644 --- a/lib/src/common/model/orgs.dart +++ b/lib/src/common/model/orgs.dart @@ -25,57 +25,57 @@ class Organization { }); /// Organization Login - final String login; + final String? login; /// Organization ID - final int id; + final int? id; /// Url to Organization Profile @JsonKey(name: 'html_url') - final String htmlUrl; + final String? htmlUrl; /// Url to the Organization Avatar @JsonKey(name: 'avatar_url') - final String avatarUrl; + final String? avatarUrl; /// Organization Name - final String name; + final String? name; /// Organization Company - final String company; + final String? company; /// Organization Blog - final String blog; + final String? blog; /// Organization Location - final String location; + final String? location; /// Organization Email - final String email; + final String? email; /// Number of Public Repositories @JsonKey(name: 'public_repos') - final int publicReposCount; + final int? publicReposCount; /// Number of Public Gists @JsonKey(name: 'public_gists') - final int publicGistsCount; + final int? publicGistsCount; /// Number of Followers @JsonKey(name: 'followers') - final int followersCount; + final int? followersCount; /// Number of People this Organization is Following @JsonKey(name: 'following') - final int followingCount; + final int? followingCount; /// Time this organization was created @JsonKey(name: 'created_at') - final DateTime createdAt; + final DateTime? createdAt; /// Time this organization was updated @JsonKey(name: 'updated_at') - final DateTime updatedAt; + final DateTime? updatedAt; factory Organization.fromJson(Map input) => _$OrganizationFromJson(input); @@ -89,8 +89,8 @@ class OrganizationMembership { this.state, this.organization, }); - final String state; - final Organization organization; + final String? state; + final Organization? organization; factory OrganizationMembership.fromJson(Map input) { return _$OrganizationMembershipFromJson(input); @@ -110,24 +110,24 @@ class Team { }); /// Team Name - final String name; + final String? name; /// Team ID - final int id; + final int? id; /// Team Permission - final String permission; + final String? permission; /// Number of Members @JsonKey(name: 'members_count') - final int membersCount; + final int? membersCount; /// Number of Repositories @JsonKey(name: 'repos_count') - final int reposCount; + final int? reposCount; /// Organization - final Organization organization; + final Organization? organization; factory Team.fromJson(Map input) { return _$TeamFromJson(input); @@ -136,7 +136,7 @@ class Team { /// Model class for the team membership state. class TeamMembershipState { - final String name; + final String? name; TeamMembershipState(this.name); @@ -157,25 +157,25 @@ class TeamMember { this.htmlUrl}); /// Member Username - final String login; + final String? login; /// Member ID - final int id; + final int? id; /// Url to Member Avatar @JsonKey(name: 'avatar_url') - final String avatarUrl; + final String? avatarUrl; /// Member Type - final String type; + final String? type; /// If the member is a site administrator @JsonKey(name: 'site_admin') - final bool siteAdmin; + final bool? siteAdmin; /// Profile of the Member @JsonKey(name: 'html_url') - final String htmlUrl; + final String? htmlUrl; factory TeamMember.fromJson(Map input) { return _$TeamMemberFromJson(input); @@ -188,7 +188,7 @@ class TeamRepository extends Repository { TeamRepository({this.permissions}); /// Repository Permissions. - TeamRepositoryPermissions permissions; + TeamRepositoryPermissions? permissions; factory TeamRepository.fromJson(Map input) { return _$TeamRepositoryFromJson(input); @@ -201,13 +201,13 @@ class TeamRepositoryPermissions { TeamRepositoryPermissions(this.admin, this.push, this.pull); /// Administrative Access - final bool admin; + final bool? admin; /// Push Access - final bool push; + final bool? push; /// Pull Access - final bool pull; + final bool? pull; factory TeamRepositoryPermissions.fromJson(Map json) => _$TeamRepositoryPermissionsFromJson(json); diff --git a/lib/src/common/model/orgs.g.dart b/lib/src/common/model/orgs.g.dart index a488c764..407febd6 100644 --- a/lib/src/common/model/orgs.g.dart +++ b/lib/src/common/model/orgs.g.dart @@ -8,19 +8,19 @@ part of 'orgs.dart'; Organization _$OrganizationFromJson(Map json) { return Organization( - login: json['login'] as String, - id: json['id'] as int, - htmlUrl: json['html_url'] as String, - avatarUrl: json['avatar_url'] as String, - name: json['name'] as String, - company: json['company'] as String, - blog: json['blog'] as String, - location: json['location'] as String, - email: json['email'] as String, - publicReposCount: json['public_repos'] as int, - publicGistsCount: json['public_gists'] as int, - followersCount: json['followers'] as int, - followingCount: json['following'] as int, + login: json['login'] as String?, + id: json['id'] as int?, + htmlUrl: json['html_url'] as String?, + avatarUrl: json['avatar_url'] as String?, + name: json['name'] as String?, + company: json['company'] as String?, + blog: json['blog'] as String?, + location: json['location'] as String?, + email: json['email'] as String?, + publicReposCount: json['public_repos'] as int?, + publicGistsCount: json['public_gists'] as int?, + followersCount: json['followers'] as int?, + followingCount: json['following'] as int?, createdAt: json['created_at'] == null ? null : DateTime.parse(json['created_at'] as String), @@ -52,7 +52,7 @@ Map _$OrganizationToJson(Organization instance) => OrganizationMembership _$OrganizationMembershipFromJson( Map json) { return OrganizationMembership( - state: json['state'] as String, + state: json['state'] as String?, organization: json['organization'] == null ? null : Organization.fromJson(json['organization'] as Map), @@ -61,11 +61,11 @@ OrganizationMembership _$OrganizationMembershipFromJson( Team _$TeamFromJson(Map json) { return Team( - name: json['name'] as String, - id: json['id'] as int, - permission: json['permission'] as String, - membersCount: json['members_count'] as int, - reposCount: json['repos_count'] as int, + name: json['name'] as String?, + id: json['id'] as int?, + permission: json['permission'] as String?, + membersCount: json['members_count'] as int?, + reposCount: json['repos_count'] as int?, organization: json['organization'] == null ? null : Organization.fromJson(json['organization'] as Map), @@ -74,12 +74,12 @@ Team _$TeamFromJson(Map json) { TeamMember _$TeamMemberFromJson(Map json) { return TeamMember( - login: json['login'] as String, - id: json['id'] as int, - avatarUrl: json['avatar_url'] as String, - type: json['type'] as String, - siteAdmin: json['site_admin'] as bool, - htmlUrl: json['html_url'] as String, + login: json['login'] as String?, + id: json['id'] as int?, + avatarUrl: json['avatar_url'] as String?, + type: json['type'] as String?, + siteAdmin: json['site_admin'] as bool?, + htmlUrl: json['html_url'] as String?, ); } @@ -95,8 +95,8 @@ TeamRepository _$TeamRepositoryFromJson(Map json) { TeamRepositoryPermissions _$TeamRepositoryPermissionsFromJson( Map json) { return TeamRepositoryPermissions( - json['admin'] as bool, - json['push'] as bool, - json['pull'] as bool, + json['admin'] as bool?, + json['push'] as bool?, + json['pull'] as bool?, ); } diff --git a/lib/src/common/model/pulls.dart b/lib/src/common/model/pulls.dart index 2ea0365d..e5930035 100644 --- a/lib/src/common/model/pulls.dart +++ b/lib/src/common/model/pulls.dart @@ -38,80 +38,80 @@ class PullRequest { }); /// Pull Request ID - int id; + int? id; /// Url to the Pull Request Page - String htmlUrl; + String? htmlUrl; /// Url to the diff for this Pull Request - String diffUrl; + String? diffUrl; /// Url to the patch for this Pull Request - String patchUrl; + String? patchUrl; /// Pull Request Number - int number; + int? number; /// Pull Request State - String state; + String? state; /// Pull Request Title - String title; + String? title; /// Pull Request Body - String body; + String? body; /// Time the pull request was created - DateTime createdAt; + DateTime? createdAt; /// Time the pull request was updated - DateTime updatedAt; + DateTime? updatedAt; /// Time the pull request was closed - DateTime closedAt; + DateTime? closedAt; /// Time the pull request was merged - DateTime mergedAt; + DateTime? mergedAt; /// The Pull Request Head - PullRequestHead head; + PullRequestHead? head; /// Pull Request Base - PullRequestHead base; + PullRequestHead? base; /// The User who created the Pull Request - User user; + User? user; /// Whether or not the pull request is a draft - bool draft; - String mergeCommitSha; + bool? draft; + String? mergeCommitSha; /// If the pull request was merged - bool merged; + bool? merged; /// If the pull request is mergeable - bool mergeable; + bool? mergeable; /// The user who merged the pull request - User mergedBy; + User? mergedBy; /// Number of comments - int commentsCount; + int? commentsCount; /// Number of commits - int commitsCount; + int? commitsCount; /// Number of additions - int additionsCount; + int? additionsCount; /// Number of deletions - int deletionsCount; + int? deletionsCount; /// Number of changed files - int changedFilesCount; + int? changedFilesCount; /// Pull Request Labels - List labels; + List? labels; factory PullRequest.fromJson(Map input) => _$PullRequestFromJson(input); @@ -126,9 +126,9 @@ class PullRequestMerge { this.sha, this.message, }); - bool merged; - String sha; - String message; + bool? merged; + String? sha; + String? message; factory PullRequestMerge.fromJson(Map input) => _$PullRequestMergeFromJson(input); @@ -146,11 +146,11 @@ class PullRequestHead { this.repo, }); - String label; - String ref; - String sha; - User user; - Repository repo; + String? label; + String? ref; + String? sha; + User? user; + Repository? repo; factory PullRequestHead.fromJson(Map input) => _$PullRequestHeadFromJson(input); @@ -163,18 +163,18 @@ class CreatePullRequest { CreatePullRequest(this.title, this.head, this.base, {this.draft = false, this.body}); - final String title; - final String head; - final String base; + final String? title; + final String? head; + final String? base; /// Whether a draft PR should be created. /// /// This is currently experimental functionality since the way draft PRs are /// created through Github's REST API is in developer preview only - and could change at any time. @experimental - final bool draft; + final bool? draft; - String body; + String? body; factory CreatePullRequest.fromJson(Map input) => _$CreatePullRequestFromJson(input); @@ -200,21 +200,21 @@ class PullRequestComment { this.pullRequestUrl, this.links, }); - int id; - String diffHunk; - String path; - int position; - int originalPosition; - String commitId; - String originalCommitId; - User user; - String body; - DateTime createdAt; - DateTime updatedAt; - String url; - String pullRequestUrl; + int? id; + String? diffHunk; + String? path; + int? position; + int? originalPosition; + String? commitId; + String? originalCommitId; + User? user; + String? body; + DateTime? createdAt; + DateTime? updatedAt; + String? url; + String? pullRequestUrl; @JsonKey(name: '_links') - Links links; + Links? links; factory PullRequestComment.fromJson(Map input) => _$PullRequestCommentFromJson(input); @@ -225,10 +225,10 @@ class PullRequestComment { @JsonSerializable(fieldRename: FieldRename.snake) class CreatePullRequestComment { CreatePullRequestComment(this.body, this.commitId, this.path, this.position); - String body; - String commitId; - String path; - int position; + String? body; + String? commitId; + String? path; + int? position; factory CreatePullRequestComment.fromJson(Map input) => _$CreatePullRequestCommentFromJson(input); @@ -249,19 +249,19 @@ class PullRequestFile { this.contentsUrl, this.patch, }); - String sha; - String filename; - String status; + String? sha; + String? filename; + String? status; @JsonKey(name: 'additions') - int additionsCount; + int? additionsCount; @JsonKey(name: 'deletions') - int deletionsCount; + int? deletionsCount; @JsonKey(name: 'changes') - int changesCount; - String blobUrl; - String rawUrl; - String contentsUrl; - String patch; + int? changesCount; + String? blobUrl; + String? rawUrl; + String? contentsUrl; + String? patch; factory PullRequestFile.fromJson(Map input) => _$PullRequestFileFromJson(input); diff --git a/lib/src/common/model/pulls.g.dart b/lib/src/common/model/pulls.g.dart index bc9b1293..6c596cf7 100644 --- a/lib/src/common/model/pulls.g.dart +++ b/lib/src/common/model/pulls.g.dart @@ -8,14 +8,14 @@ part of 'pulls.dart'; PullRequest _$PullRequestFromJson(Map json) { return PullRequest( - id: json['id'] as int, - htmlUrl: json['html_url'] as String, - diffUrl: json['diff_url'] as String, - patchUrl: json['patch_url'] as String, - number: json['number'] as int, - state: json['state'] as String, - title: json['title'] as String, - body: json['body'] as String, + id: json['id'] as int?, + htmlUrl: json['html_url'] as String?, + diffUrl: json['diff_url'] as String?, + patchUrl: json['patch_url'] as String?, + number: json['number'] as int?, + state: json['state'] as String?, + title: json['title'] as String?, + body: json['body'] as String?, createdAt: json['created_at'] == null ? null : DateTime.parse(json['created_at'] as String), @@ -37,22 +37,21 @@ PullRequest _$PullRequestFromJson(Map json) { user: json['user'] == null ? null : User.fromJson(json['user'] as Map), - draft: json['draft'] as bool, - mergeCommitSha: json['merge_commit_sha'] as String, - merged: json['merged'] as bool, - mergeable: json['mergeable'] as bool, + draft: json['draft'] as bool?, + mergeCommitSha: json['merge_commit_sha'] as String?, + merged: json['merged'] as bool?, + mergeable: json['mergeable'] as bool?, mergedBy: json['merged_by'] == null ? null : User.fromJson(json['merged_by'] as Map), - commentsCount: json['comments_count'] as int, - commitsCount: json['commits_count'] as int, - additionsCount: json['additions_count'] as int, - deletionsCount: json['deletions_count'] as int, - changedFilesCount: json['changed_files_count'] as int, - labels: (json['labels'] as List) - ?.map((e) => - e == null ? null : IssueLabel.fromJson(e as Map)) - ?.toList(), + commentsCount: json['comments_count'] as int?, + commitsCount: json['commits_count'] as int?, + additionsCount: json['additions_count'] as int?, + deletionsCount: json['deletions_count'] as int?, + changedFilesCount: json['changed_files_count'] as int?, + labels: (json['labels'] as List?) + ?.map((e) => IssueLabel.fromJson(e as Map)) + .toList(), ); } @@ -88,9 +87,9 @@ Map _$PullRequestToJson(PullRequest instance) => PullRequestMerge _$PullRequestMergeFromJson(Map json) { return PullRequestMerge( - merged: json['merged'] as bool, - sha: json['sha'] as String, - message: json['message'] as String, + merged: json['merged'] as bool?, + sha: json['sha'] as String?, + message: json['message'] as String?, ); } @@ -103,9 +102,9 @@ Map _$PullRequestMergeToJson(PullRequestMerge instance) => PullRequestHead _$PullRequestHeadFromJson(Map json) { return PullRequestHead( - label: json['label'] as String, - ref: json['ref'] as String, - sha: json['sha'] as String, + label: json['label'] as String?, + ref: json['ref'] as String?, + sha: json['sha'] as String?, user: json['user'] == null ? null : User.fromJson(json['user'] as Map), @@ -126,11 +125,11 @@ Map _$PullRequestHeadToJson(PullRequestHead instance) => CreatePullRequest _$CreatePullRequestFromJson(Map json) { return CreatePullRequest( - json['title'] as String, - json['head'] as String, - json['base'] as String, - draft: json['draft'] as bool, - body: json['body'] as String, + json['title'] as String?, + json['head'] as String?, + json['base'] as String?, + draft: json['draft'] as bool?, + body: json['body'] as String?, ); } @@ -145,25 +144,25 @@ Map _$CreatePullRequestToJson(CreatePullRequest instance) => PullRequestComment _$PullRequestCommentFromJson(Map json) { return PullRequestComment( - id: json['id'] as int, - diffHunk: json['diff_hunk'] as String, - path: json['path'] as String, - position: json['position'] as int, - originalPosition: json['original_position'] as int, - commitId: json['commit_id'] as String, - originalCommitId: json['original_commit_id'] as String, + id: json['id'] as int?, + diffHunk: json['diff_hunk'] as String?, + path: json['path'] as String?, + position: json['position'] as int?, + originalPosition: json['original_position'] as int?, + commitId: json['commit_id'] as String?, + originalCommitId: json['original_commit_id'] as String?, user: json['user'] == null ? null : User.fromJson(json['user'] as Map), - body: json['body'] as String, + body: json['body'] as String?, createdAt: json['created_at'] == null ? null : DateTime.parse(json['created_at'] as String), updatedAt: json['updated_at'] == null ? null : DateTime.parse(json['updated_at'] as String), - url: json['url'] as String, - pullRequestUrl: json['pull_request_url'] as String, + url: json['url'] as String?, + pullRequestUrl: json['pull_request_url'] as String?, links: json['_links'] == null ? null : Links.fromJson(json['_links'] as Map), @@ -191,10 +190,10 @@ Map _$PullRequestCommentToJson(PullRequestComment instance) => CreatePullRequestComment _$CreatePullRequestCommentFromJson( Map json) { return CreatePullRequestComment( - json['body'] as String, - json['commit_id'] as String, - json['path'] as String, - json['position'] as int, + json['body'] as String?, + json['commit_id'] as String?, + json['path'] as String?, + json['position'] as int?, ); } @@ -209,16 +208,16 @@ Map _$CreatePullRequestCommentToJson( PullRequestFile _$PullRequestFileFromJson(Map json) { return PullRequestFile( - sha: json['sha'] as String, - filename: json['filename'] as String, - status: json['status'] as String, - additionsCount: json['additions'] as int, - deletionsCount: json['deletions'] as int, - changesCount: json['changes'] as int, - blobUrl: json['blob_url'] as String, - rawUrl: json['raw_url'] as String, - contentsUrl: json['contents_url'] as String, - patch: json['patch'] as String, + sha: json['sha'] as String?, + filename: json['filename'] as String?, + status: json['status'] as String?, + additionsCount: json['additions'] as int?, + deletionsCount: json['deletions'] as int?, + changesCount: json['changes'] as int?, + blobUrl: json['blob_url'] as String?, + rawUrl: json['raw_url'] as String?, + contentsUrl: json['contents_url'] as String?, + patch: json['patch'] as String?, ); } diff --git a/lib/src/common/model/reaction.dart b/lib/src/common/model/reaction.dart index 4b1ad1c7..b0720ad8 100644 --- a/lib/src/common/model/reaction.dart +++ b/lib/src/common/model/reaction.dart @@ -10,11 +10,11 @@ part 'reaction.g.dart'; /// See https://developer.github.com/v3/reactions/ @JsonSerializable(fieldRename: FieldRename.snake) class Reaction { - final int id; - final String nodeId; - final User user; - final String content; - final DateTime createdAt; + final int? id; + final String? nodeId; + final User? user; + final String? content; + final DateTime? createdAt; Reaction({ this.id, @@ -24,7 +24,7 @@ class Reaction { this.createdAt, }); - ReactionType get type => ReactionType.fromString(content); + ReactionType? get type => ReactionType.fromString(content); factory Reaction.fromJson(Map json) => _$ReactionFromJson(json); @@ -69,5 +69,5 @@ class ReactionType { ':eyes:': eyes, }; - static ReactionType fromString(String content) => _types[content]; + static ReactionType? fromString(String? content) => _types[content!]; } diff --git a/lib/src/common/model/reaction.g.dart b/lib/src/common/model/reaction.g.dart index 632d7c7f..9c26c58b 100644 --- a/lib/src/common/model/reaction.g.dart +++ b/lib/src/common/model/reaction.g.dart @@ -8,12 +8,12 @@ part of 'reaction.dart'; Reaction _$ReactionFromJson(Map json) { return Reaction( - id: json['id'] as int, - nodeId: json['node_id'] as String, + id: json['id'] as int?, + nodeId: json['node_id'] as String?, user: json['user'] == null ? null : User.fromJson(json['user'] as Map), - content: json['content'] as String, + content: json['content'] as String?, createdAt: json['created_at'] == null ? null : DateTime.parse(json['created_at'] as String), diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart index dbf8ea7c..b46411ec 100644 --- a/lib/src/common/model/repos.dart +++ b/lib/src/common/model/repos.dart @@ -4,11 +4,11 @@ part 'repos.g.dart'; @JsonSerializable(createToJson: false, fieldRename: FieldRename.snake) class GitHubComparison { - final String url; - final String status; - final int aheadBy; - final int behindBy; - final int totalCommits; + final String? url; + final String? status; + final int? aheadBy; + final int? behindBy; + final int? totalCommits; GitHubComparison( this.url, this.status, this.aheadBy, this.behindBy, this.totalCommits); @@ -71,129 +71,129 @@ class Repository { }); /// Repository Name - final String name; + final String? name; /// Repository ID - final int id; + final int? id; /// Full Repository Name - final String fullName; + final String? fullName; /// Repository Owner - final UserInformation owner; + final UserInformation? owner; /// If the Repository is Private @JsonKey(name: 'private') - final bool isPrivate; + final bool? isPrivate; /// If the Repository is a fork @JsonKey(name: 'fork') - final bool isFork; + final bool? isFork; /// Url to the GitHub Repository Page - final String htmlUrl; + final String? htmlUrl; /// Repository Description - final String description; + final String? description; // https clone URL - final String cloneUrl; + final String? cloneUrl; - final String sshUrl; + final String? sshUrl; - final String svnUrl; + final String? svnUrl; - final String gitUrl; + final String? gitUrl; /// Url to the Repository Homepage - final String homepage; + final String? homepage; /// Repository Size - final int size; + final int? size; /// Repository Stars @JsonKey(name: 'stargazers_count') - final int stargazersCount; + final int? stargazersCount; /// Repository Watchers @JsonKey(name: 'watchers_count') - final int watchersCount; + final int? watchersCount; /// Repository Language - final String language; + final String? language; /// If the Repository has Issues Enabled @JsonKey(name: 'has_issues') - final bool hasIssues; + final bool? hasIssues; /// If the Repository has the Wiki Enabled @JsonKey(name: 'has_wiki') - final bool hasWiki; + final bool? hasWiki; /// If the Repository has any Downloads @JsonKey(name: 'has_downloads') - final bool hasDownloads; + final bool? hasDownloads; /// Number of Forks @JsonKey(name: 'forks_count') - final int forksCount; + final int? forksCount; /// Number of Open Issues @JsonKey(name: 'open_issues_count') - final int openIssuesCount; + final int? openIssuesCount; /// Repository Default Branch @JsonKey(name: 'default_branch') - final String defaultBranch; + final String? defaultBranch; /// Number of Subscribers @JsonKey(name: 'subscribers_count') - final int subscribersCount; + final int? subscribersCount; /// Number of users in the network @JsonKey(name: 'network_count') - final int networkCount; + final int? networkCount; /// The time the repository was created at @JsonKey(name: 'created_at') - final DateTime createdAt; + final DateTime? createdAt; /// The last time the repository was pushed at @JsonKey(name: 'pushed_at') - final DateTime pushedAt; + final DateTime? pushedAt; @JsonKey(name: 'updated_at') - final DateTime updatedAt; + final DateTime? updatedAt; - final LicenseKind license; + final LicenseKind? license; - final bool archived; - final bool disabled; + final bool? archived; + final bool? disabled; factory Repository.fromJson(Map input) => _$RepositoryFromJson(input); Map toJson() => _$RepositoryToJson(this); /// Gets the Repository Slug (Full Name). - RepositorySlug slug() => RepositorySlug(owner.login, name); + RepositorySlug slug() => RepositorySlug(owner!.login, name); @override - String toString() => 'Repository: ${owner.login}/$name'; + String toString() => 'Repository: ${owner!.login}/$name'; } @JsonSerializable(createToJson: false) class Tag { - final String name; - final CommitInfo commit; + final String? name; + final CommitInfo? commit; @JsonKey(name: 'zipball_url') - final String zipUrl; + final String? zipUrl; @JsonKey(name: 'tarball_url') - final String tarUrl; + final String? tarUrl; Tag(this.name, this.commit, this.zipUrl, this.tarUrl); factory Tag.fromJson(Map input) => - input == null ? null : _$TagFromJson(input); + _$TagFromJson(input); @override String toString() => 'Tag: $name'; @@ -201,14 +201,14 @@ class Tag { @JsonSerializable(fieldRename: FieldRename.snake) class CommitData { - final String sha; - final GitCommit commit; - final String url; - final String htmlUrl; - final String commentsUrl; + final String? sha; + final GitCommit? commit; + final String? url; + final String? htmlUrl; + final String? commentsUrl; - final CommitDataUser author, committer; - final List> parents; + final CommitDataUser? author, committer; + final List>? parents; CommitData(this.sha, this.commit, this.url, this.htmlUrl, this.commentsUrl, this.author, this.committer, this.parents); @@ -220,9 +220,9 @@ class CommitData { @JsonSerializable() class CommitDataUser { - final String login, type; + final String? login, type; - final int id; + final int? id; CommitDataUser(this.login, this.id, this.type); @@ -233,8 +233,8 @@ class CommitDataUser { @JsonSerializable() class CommitInfo { - final String sha; - final GitTree tree; + final String? sha; + final GitTree? tree; CommitInfo(this.sha, this.tree); @@ -247,16 +247,16 @@ class CommitInfo { @JsonSerializable(fieldRename: FieldRename.snake) class UserInformation { /// Owner Username - final String login; + final String? login; /// Owner ID - final int id; + final int? id; /// Avatar Url - final String avatarUrl; + final String? avatarUrl; /// Url to the user's GitHub Profile - final String htmlUrl; + final String? htmlUrl; UserInformation(this.login, this.id, this.avatarUrl, this.htmlUrl); @@ -269,10 +269,10 @@ class UserInformation { @JsonSerializable() class RepositorySlug { /// Repository Owner - String owner; + String? owner; /// Repository Name - String name; + String? name; RepositorySlug(this.owner, this.name) { ArgumentError.checkNotNull(owner, 'owner'); @@ -323,40 +323,40 @@ class CreateRepository { this.hasWiki}); /// Repository Name - final String name; + final String? name; /// Repository Description - String description; + String? description; /// Repository Homepage - String homepage; + String? homepage; /// If the repository should be private or not. - bool private = false; + bool? private = false; /// If the repository should have issues enabled. - bool hasIssues = true; + bool? hasIssues = true; /// If the repository should have the wiki enabled. - bool hasWiki = true; + bool? hasWiki = true; /// If the repository should have downloads enabled. - bool hasDownloads = true; + bool? hasDownloads = true; /// The Team ID (Only for Creating a Repository for an Organization) @OnlyWhen('Creating a repository for an organization') - int teamId; + int? teamId; /// If GitHub should auto initialize the repository. - bool autoInit = false; + bool? autoInit = false; /// .gitignore template (only when [autoInit] is true) @OnlyWhen('autoInit is true') - String gitignoreTemplate; + String? gitignoreTemplate; /// License template (only when [autoInit] is true) @OnlyWhen('autoInit is true') - String licenseTemplate; + String? licenseTemplate; factory CreateRepository.fromJson(Map input) => _$CreateRepositoryFromJson(input); @@ -367,10 +367,10 @@ class CreateRepository { @JsonSerializable() class Branch { /// The name of the branch. - final String name; + final String? name; /// Commit Information - final CommitData commit; + final CommitData? commit; Branch(this.name, this.commit); @@ -422,24 +422,24 @@ class LanguageBreakdown { @JsonSerializable(fieldRename: FieldRename.snake) class LicenseDetails { - final String name; - final String path; - final String sha; - final int size; - final Uri url; + final String? name; + final String? path; + final String? sha; + final int? size; + final Uri? url; - final Uri htmlUrl; - final Uri gitUrl; - final Uri downloadUrl; + final Uri? htmlUrl; + final Uri? gitUrl; + final Uri? downloadUrl; - final String type; - final String content; - final String encoding; + final String? type; + final String? content; + final String? encoding; @JsonKey(name: '_links') - final Links links; + final Links? links; - final LicenseKind license; + final LicenseKind? license; LicenseDetails( {this.name, @@ -464,11 +464,11 @@ class LicenseDetails { @JsonSerializable(fieldRename: FieldRename.snake) class LicenseKind { - final String key; - final String name; - final String spdxId; - final Uri url; - final String nodeId; + final String? key; + final String? name; + final String? spdxId; + final Uri? url; + final String? nodeId; LicenseKind({this.key, this.name, this.spdxId, this.url, this.nodeId}); diff --git a/lib/src/common/model/repos.g.dart b/lib/src/common/model/repos.g.dart index 615d58f0..a80fe8b8 100644 --- a/lib/src/common/model/repos.g.dart +++ b/lib/src/common/model/repos.g.dart @@ -8,43 +8,43 @@ part of 'repos.dart'; GitHubComparison _$GitHubComparisonFromJson(Map json) { return GitHubComparison( - json['url'] as String, - json['status'] as String, - json['ahead_by'] as int, - json['behind_by'] as int, - json['total_commits'] as int, + json['url'] as String?, + json['status'] as String?, + json['ahead_by'] as int?, + json['behind_by'] as int?, + json['total_commits'] as int?, ); } Repository _$RepositoryFromJson(Map json) { return Repository( - name: json['name'] as String, - id: json['id'] as int, - fullName: json['full_name'] as String, + name: json['name'] as String?, + id: json['id'] as int?, + fullName: json['fullName'] as String?, owner: json['owner'] == null ? null : UserInformation.fromJson(json['owner'] as Map), - isPrivate: json['private'] as bool, - isFork: json['fork'] as bool, - htmlUrl: json['html_url'] as String, - description: json['description'] as String, - cloneUrl: json['clone_url'] as String, - gitUrl: json['git_url'] as String, - sshUrl: json['ssh_url'] as String, - svnUrl: json['svn_url'] as String, - homepage: json['homepage'] as String, - size: json['size'] as int, - stargazersCount: json['stargazers_count'] as int, - watchersCount: json['watchers_count'] as int, - language: json['language'] as String, - hasIssues: json['has_issues'] as bool, - hasWiki: json['has_wiki'] as bool, - hasDownloads: json['has_downloads'] as bool, - forksCount: json['forks_count'] as int, - openIssuesCount: json['open_issues_count'] as int, - defaultBranch: json['default_branch'] as String, - subscribersCount: json['subscribers_count'] as int, - networkCount: json['network_count'] as int, + isPrivate: json['private'] as bool?, + isFork: json['fork'] as bool?, + htmlUrl: json['htmlUrl'] as String?, + description: json['description'] as String?, + cloneUrl: json['cloneUrl'] as String?, + gitUrl: json['gitUrl'] as String?, + sshUrl: json['sshUrl'] as String?, + svnUrl: json['svnUrl'] as String?, + homepage: json['homepage'] as String?, + size: json['size'] as int?, + stargazersCount: json['stargazers_count'] as int?, + watchersCount: json['watchers_count'] as int?, + language: json['language'] as String?, + hasIssues: json['has_issues'] as bool?, + hasWiki: json['has_wiki'] as bool?, + hasDownloads: json['has_downloads'] as bool?, + forksCount: json['forks_count'] as int?, + openIssuesCount: json['open_issues_count'] as int?, + defaultBranch: json['default_branch'] as String?, + subscribersCount: json['subscribers_count'] as int?, + networkCount: json['network_count'] as int?, createdAt: json['created_at'] == null ? null : DateTime.parse(json['created_at'] as String), @@ -57,8 +57,8 @@ Repository _$RepositoryFromJson(Map json) { license: json['license'] == null ? null : LicenseKind.fromJson(json['license'] as Map), - archived: json['archived'] as bool, - disabled: json['disabled'] as bool, + archived: json['archived'] as bool?, + disabled: json['disabled'] as bool?, ); } @@ -66,16 +66,16 @@ Map _$RepositoryToJson(Repository instance) => { 'name': instance.name, 'id': instance.id, - 'full_name': instance.fullName, + 'fullName': instance.fullName, 'owner': instance.owner, 'private': instance.isPrivate, 'fork': instance.isFork, - 'html_url': instance.htmlUrl, + 'htmlUrl': instance.htmlUrl, 'description': instance.description, - 'clone_url': instance.cloneUrl, - 'ssh_url': instance.sshUrl, - 'svn_url': instance.svnUrl, - 'git_url': instance.gitUrl, + 'cloneUrl': instance.cloneUrl, + 'sshUrl': instance.sshUrl, + 'svnUrl': instance.svnUrl, + 'gitUrl': instance.gitUrl, 'homepage': instance.homepage, 'size': instance.size, 'stargazers_count': instance.stargazersCount, @@ -99,31 +99,33 @@ Map _$RepositoryToJson(Repository instance) => Tag _$TagFromJson(Map json) { return Tag( - json['name'] as String, + json['name'] as String?, json['commit'] == null ? null : CommitInfo.fromJson(json['commit'] as Map), - json['zipball_url'] as String, - json['tarball_url'] as String, + json['zipball_url'] as String?, + json['tarball_url'] as String?, ); } CommitData _$CommitDataFromJson(Map json) { return CommitData( - json['sha'] as String, + json['sha'] as String?, json['commit'] == null ? null : GitCommit.fromJson(json['commit'] as Map), - json['url'] as String, - json['html_url'] as String, - json['comments_url'] as String, + json['url'] as String?, + json['html_url'] as String?, + json['comments_url'] as String?, json['author'] == null ? null : CommitDataUser.fromJson(json['author'] as Map), json['committer'] == null ? null : CommitDataUser.fromJson(json['committer'] as Map), - (json['parents'] as List)?.map((e) => e as Map)?.toList(), + (json['parents'] as List?) + ?.map((e) => e as Map) + .toList(), ); } @@ -141,9 +143,9 @@ Map _$CommitDataToJson(CommitData instance) => CommitDataUser _$CommitDataUserFromJson(Map json) { return CommitDataUser( - json['login'] as String, - json['id'] as int, - json['type'] as String, + json['login'] as String?, + json['id'] as int?, + json['type'] as String?, ); } @@ -156,7 +158,7 @@ Map _$CommitDataUserToJson(CommitDataUser instance) => CommitInfo _$CommitInfoFromJson(Map json) { return CommitInfo( - json['sha'] as String, + json['sha'] as String?, json['tree'] == null ? null : GitTree.fromJson(json['tree'] as Map), @@ -171,10 +173,10 @@ Map _$CommitInfoToJson(CommitInfo instance) => UserInformation _$UserInformationFromJson(Map json) { return UserInformation( - json['login'] as String, - json['id'] as int, - json['avatar_url'] as String, - json['html_url'] as String, + json['login'] as String?, + json['id'] as int?, + json['avatar_url'] as String?, + json['html_url'] as String?, ); } @@ -188,8 +190,8 @@ Map _$UserInformationToJson(UserInformation instance) => RepositorySlug _$RepositorySlugFromJson(Map json) { return RepositorySlug( - json['owner'] as String, - json['name'] as String, + json['owner'] as String?, + json['name'] as String?, ); } @@ -201,17 +203,17 @@ Map _$RepositorySlugToJson(RepositorySlug instance) => CreateRepository _$CreateRepositoryFromJson(Map json) { return CreateRepository( - json['name'] as String, - description: json['description'] as String, - homepage: json['homepage'] as String, - private: json['private'] as bool, - hasIssues: json['has_issues'] as bool, - hasDownloads: json['has_downloads'] as bool, - teamId: json['team_id'] as int, - autoInit: json['auto_init'] as bool, - gitignoreTemplate: json['gitignore_template'] as String, - licenseTemplate: json['license_template'] as String, - hasWiki: json['has_wiki'] as bool, + json['name'] as String?, + description: json['description'] as String?, + homepage: json['homepage'] as String?, + private: json['private'] as bool?, + hasIssues: json['has_issues'] as bool?, + hasDownloads: json['has_downloads'] as bool?, + teamId: json['team_id'] as int?, + autoInit: json['auto_init'] as bool?, + gitignoreTemplate: json['gitignore_template'] as String?, + licenseTemplate: json['license_template'] as String?, + hasWiki: json['has_wiki'] as bool?, ); } @@ -232,7 +234,7 @@ Map _$CreateRepositoryToJson(CreateRepository instance) => Branch _$BranchFromJson(Map json) { return Branch( - json['name'] as String, + json['name'] as String?, json['commit'] == null ? null : CommitData.fromJson(json['commit'] as Map), @@ -246,10 +248,10 @@ Map _$BranchToJson(Branch instance) => { LicenseDetails _$LicenseDetailsFromJson(Map json) { return LicenseDetails( - name: json['name'] as String, - path: json['path'] as String, - sha: json['sha'] as String, - size: json['size'] as int, + name: json['name'] as String?, + path: json['path'] as String?, + sha: json['sha'] as String?, + size: json['size'] as int?, url: json['url'] == null ? null : Uri.parse(json['url'] as String), htmlUrl: json['html_url'] == null ? null : Uri.parse(json['html_url'] as String), @@ -258,9 +260,9 @@ LicenseDetails _$LicenseDetailsFromJson(Map json) { downloadUrl: json['download_url'] == null ? null : Uri.parse(json['download_url'] as String), - type: json['type'] as String, - content: json['content'] as String, - encoding: json['encoding'] as String, + type: json['type'] as String?, + content: json['content'] as String?, + encoding: json['encoding'] as String?, links: json['_links'] == null ? null : Links.fromJson(json['_links'] as Map), @@ -289,11 +291,11 @@ Map _$LicenseDetailsToJson(LicenseDetails instance) => LicenseKind _$LicenseKindFromJson(Map json) { return LicenseKind( - key: json['key'] as String, - name: json['name'] as String, - spdxId: json['spdx_id'] as String, + key: json['key'] as String?, + name: json['name'] as String?, + spdxId: json['spdx_id'] as String?, url: json['url'] == null ? null : Uri.parse(json['url'] as String), - nodeId: json['node_id'] as String, + nodeId: json['node_id'] as String?, ); } diff --git a/lib/src/common/model/repos_commits.dart b/lib/src/common/model/repos_commits.dart index 606132c8..59e689c7 100644 --- a/lib/src/common/model/repos_commits.dart +++ b/lib/src/common/model/repos_commits.dart @@ -25,36 +25,36 @@ class RepositoryCommit { }); /// API url. - String url; + String? url; /// Commit SHA - String sha; + String? sha; /// Url to Commit Page @JsonKey(name: 'html_url') - String htmlUrl; + String? htmlUrl; /// Comments url. @JsonKey(name: 'comments_url') - String commentsUrl; + String? commentsUrl; /// A reference to the raw [GitCommit]. - GitCommit commit; + GitCommit? commit; /// Commit Author - User author; + User? author; /// Commit Committer. - User committer; + User? committer; /// Commit parents. - List parents; + List? parents; /// Commit statistics. - CommitStats stats; + CommitStats? stats; /// The files changed in this commit. - List files; + List? files; factory RepositoryCommit.fromJson(Map input) => _$RepositoryCommitFromJson(input); @@ -71,13 +71,13 @@ class CommitStats { }); /// Number of Additions. - int additions; + int? additions; /// Number of Deletions. - int deletions; + int? deletions; /// Total changes. - int total; + int? total; factory CommitStats.fromJson(Map input) => _$CommitStatsFromJson(input); @@ -98,20 +98,20 @@ class CommitFile { this.patch, }); @JsonKey(name: 'filename') - String name; + String? name; - int additions; - int deletions; - int changes; - String status; + int? additions; + int? deletions; + int? changes; + String? status; @JsonKey(name: 'raw_url') - String rawUrl; + String? rawUrl; @JsonKey(name: 'blob_url') - String blobUrl; + String? blobUrl; - String patch; + String? patch; factory CommitFile.fromJson(Map input) => _$CommitFileFromJson(input); @@ -137,34 +137,34 @@ class CommitComment { }); /// Id of the comment - final int id; + final int? id; /// Relative path of the file on which the comment has been posted - final String path; + final String? path; /// Line on file - final int line; + final int? line; /// Position on the diff - final int position; + final int? position; /// SHA of the commit where the comment has been made - final String commitId; + final String? commitId; - final DateTime createdAt; + final DateTime? createdAt; /// Can be equals to [createdAt] - final DateTime updatedAt; + final DateTime? updatedAt; /// Ex: https://github.com/... - final String htmlUrl; + final String? htmlUrl; /// Ex: https://api.github.com/... @JsonKey(name: 'url') - final String apiUrl; + final String? apiUrl; /// Content of the comment - final String body; + final String? body; factory CommitComment.fromJson(Map input) => _$CommitCommentFromJson(input); diff --git a/lib/src/common/model/repos_commits.g.dart b/lib/src/common/model/repos_commits.g.dart index 75ebf64d..ef794d22 100644 --- a/lib/src/common/model/repos_commits.g.dart +++ b/lib/src/common/model/repos_commits.g.dart @@ -8,10 +8,10 @@ part of 'repos_commits.dart'; RepositoryCommit _$RepositoryCommitFromJson(Map json) { return RepositoryCommit( - url: json['url'] as String, - sha: json['sha'] as String, - htmlUrl: json['html_url'] as String, - commentsUrl: json['comments_url'] as String, + url: json['url'] as String?, + sha: json['sha'] as String?, + htmlUrl: json['html_url'] as String?, + commentsUrl: json['comments_url'] as String?, commit: json['commit'] == null ? null : GitCommit.fromJson(json['commit'] as Map), @@ -21,17 +21,15 @@ RepositoryCommit _$RepositoryCommitFromJson(Map json) { committer: json['committer'] == null ? null : User.fromJson(json['committer'] as Map), - parents: (json['parents'] as List) - ?.map((e) => - e == null ? null : GitCommit.fromJson(e as Map)) - ?.toList(), + parents: (json['parents'] as List?) + ?.map((e) => GitCommit.fromJson(e as Map)) + .toList(), stats: json['stats'] == null ? null : CommitStats.fromJson(json['stats'] as Map), - files: (json['files'] as List) - ?.map((e) => - e == null ? null : CommitFile.fromJson(e as Map)) - ?.toList(), + files: (json['files'] as List?) + ?.map((e) => CommitFile.fromJson(e as Map)) + .toList(), ); } @@ -51,9 +49,9 @@ Map _$RepositoryCommitToJson(RepositoryCommit instance) => CommitStats _$CommitStatsFromJson(Map json) { return CommitStats( - additions: json['additions'] as int, - deletions: json['deletions'] as int, - total: json['total'] as int, + additions: json['additions'] as int?, + deletions: json['deletions'] as int?, + total: json['total'] as int?, ); } @@ -66,14 +64,14 @@ Map _$CommitStatsToJson(CommitStats instance) => CommitFile _$CommitFileFromJson(Map json) { return CommitFile( - name: json['filename'] as String, - additions: json['additions'] as int, - deletions: json['deletions'] as int, - changes: json['changes'] as int, - status: json['status'] as String, - rawUrl: json['raw_url'] as String, - blobUrl: json['blob_url'] as String, - patch: json['patch'] as String, + name: json['filename'] as String?, + additions: json['additions'] as int?, + deletions: json['deletions'] as int?, + changes: json['changes'] as int?, + status: json['status'] as String?, + rawUrl: json['raw_url'] as String?, + blobUrl: json['blob_url'] as String?, + patch: json['patch'] as String?, ); } @@ -91,20 +89,20 @@ Map _$CommitFileToJson(CommitFile instance) => CommitComment _$CommitCommentFromJson(Map json) { return CommitComment( - id: json['id'] as int, - line: json['line'] as int, - position: json['position'] as int, - path: json['path'] as String, - apiUrl: json['url'] as String, - commitId: json['commit_id'] as String, + id: json['id'] as int?, + line: json['line'] as int?, + position: json['position'] as int?, + path: json['path'] as String?, + apiUrl: json['url'] as String?, + commitId: json['commit_id'] as String?, createdAt: json['created_at'] == null ? null : DateTime.parse(json['created_at'] as String), - htmlUrl: json['html_url'] as String, + htmlUrl: json['html_url'] as String?, updatedAt: json['updated_at'] == null ? null : DateTime.parse(json['updated_at'] as String), - body: json['body'] as String, + body: json['body'] as String?, ); } diff --git a/lib/src/common/model/repos_contents.dart b/lib/src/common/model/repos_contents.dart index 6ecc335b..068d5b0f 100644 --- a/lib/src/common/model/repos_contents.dart +++ b/lib/src/common/model/repos_contents.dart @@ -24,52 +24,52 @@ class GitHubFile { }); /// Type of File - String type; + String? type; /// File Encoding - String encoding; + String? encoding; /// File Size - int size; + int? size; /// File Name - String name; + String? name; /// File Path - String path; + String? path; /// Base-64 encoded file content with newlines. - String content; + String? content; /// SHA - String sha; + String? sha; /// Url to file @JsonKey(name: 'html_url') - String htmlUrl; + String? htmlUrl; /// Git Url @JsonKey(name: 'git_url') - String gitUrl; + String? gitUrl; /// Download Url @JsonKey(name: 'download_url') - String downloadUrl; + String? downloadUrl; /// Links @JsonKey(name: '_links') - Links links; + Links? links; /// The value in [content] Base-64 decoded. String get text { return _text ??= - utf8.decode(base64Decode(LineSplitter.split(content).join())); + utf8.decode(base64Decode(LineSplitter.split(content!).join())); } - String _text; + String? _text; /// Source Repository - RepositorySlug sourceRepository; + RepositorySlug? sourceRepository; factory GitHubFile.fromJson(Map input) => _$GitHubFileFromJson(input); @@ -78,9 +78,9 @@ class GitHubFile { @JsonSerializable() class Links { - final Uri self; - final Uri git; - final Uri html; + final Uri? self; + final Uri? git; + final Uri? html; Links({this.git, this.self, this.html}); @@ -96,8 +96,8 @@ class RepositoryContents { this.file, this.tree, }); - GitHubFile file; - List tree; + GitHubFile? file; + List? tree; bool get isFile => file != null; bool get isDirectory => tree != null; @@ -115,11 +115,11 @@ class CreateFile { CreateFile( {this.path, this.content, this.message, this.branch, this.committer}); - String path; - String message; - String content; - String branch; - CommitUser committer; + String? path; + String? message; + String? content; + String? branch; + CommitUser? committer; factory CreateFile.fromJson(Map json) => _$CreateFileFromJson(json); @@ -132,8 +132,8 @@ class CreateFile { class CommitUser { CommitUser(this.name, this.email); - final String name; - final String email; + final String? name; + final String? email; factory CommitUser.fromJson(Map input) => _$CommitUserFromJson(input); @@ -144,8 +144,8 @@ class CommitUser { /// Model class for the response of a content creation. @JsonSerializable() class ContentCreation { - final RepositoryCommit commit; - final GitHubFile content; + final RepositoryCommit? commit; + final GitHubFile? content; ContentCreation(this.commit, this.content); diff --git a/lib/src/common/model/repos_contents.g.dart b/lib/src/common/model/repos_contents.g.dart index afa3a385..30410b63 100644 --- a/lib/src/common/model/repos_contents.g.dart +++ b/lib/src/common/model/repos_contents.g.dart @@ -8,16 +8,16 @@ part of 'repos_contents.dart'; GitHubFile _$GitHubFileFromJson(Map json) { return GitHubFile( - type: json['type'] as String, - encoding: json['encoding'] as String, - size: json['size'] as int, - name: json['name'] as String, - path: json['path'] as String, - content: json['content'] as String, - sha: json['sha'] as String, - htmlUrl: json['html_url'] as String, - gitUrl: json['git_url'] as String, - downloadUrl: json['download_url'] as String, + type: json['type'] as String?, + encoding: json['encoding'] as String?, + size: json['size'] as int?, + name: json['name'] as String?, + path: json['path'] as String?, + content: json['content'] as String?, + sha: json['sha'] as String?, + htmlUrl: json['html_url'] as String?, + gitUrl: json['git_url'] as String?, + downloadUrl: json['download_url'] as String?, links: json['_links'] == null ? null : Links.fromJson(json['_links'] as Map), @@ -63,10 +63,9 @@ RepositoryContents _$RepositoryContentsFromJson(Map json) { file: json['file'] == null ? null : GitHubFile.fromJson(json['file'] as Map), - tree: (json['tree'] as List) - ?.map((e) => - e == null ? null : GitHubFile.fromJson(e as Map)) - ?.toList(), + tree: (json['tree'] as List?) + ?.map((e) => GitHubFile.fromJson(e as Map)) + .toList(), ); } @@ -78,10 +77,10 @@ Map _$RepositoryContentsToJson(RepositoryContents instance) => CreateFile _$CreateFileFromJson(Map json) { return CreateFile( - path: json['path'] as String, - content: json['content'] as String, - message: json['message'] as String, - branch: json['branch'] as String, + path: json['path'] as String?, + content: json['content'] as String?, + message: json['message'] as String?, + branch: json['branch'] as String?, committer: json['committer'] == null ? null : CommitUser.fromJson(json['committer'] as Map), @@ -99,8 +98,8 @@ Map _$CreateFileToJson(CreateFile instance) => CommitUser _$CommitUserFromJson(Map json) { return CommitUser( - json['name'] as String, - json['email'] as String, + json['name'] as String?, + json['email'] as String?, ); } diff --git a/lib/src/common/model/repos_forks.dart b/lib/src/common/model/repos_forks.dart index 6830130d..43be629d 100644 --- a/lib/src/common/model/repos_forks.dart +++ b/lib/src/common/model/repos_forks.dart @@ -6,7 +6,7 @@ part 'repos_forks.g.dart'; class CreateFork { CreateFork([this.organization]); - String organization; + String? organization; factory CreateFork.fromJson(Map input) => _$CreateForkFromJson(input); diff --git a/lib/src/common/model/repos_forks.g.dart b/lib/src/common/model/repos_forks.g.dart index 55779541..31eda0a1 100644 --- a/lib/src/common/model/repos_forks.g.dart +++ b/lib/src/common/model/repos_forks.g.dart @@ -8,7 +8,7 @@ part of 'repos_forks.dart'; CreateFork _$CreateForkFromJson(Map json) { return CreateFork( - json['organization'] as String, + json['organization'] as String?, ); } diff --git a/lib/src/common/model/repos_hooks.dart b/lib/src/common/model/repos_hooks.dart index 0c181ed5..779fc3d0 100644 --- a/lib/src/common/model/repos_hooks.dart +++ b/lib/src/common/model/repos_hooks.dart @@ -10,28 +10,28 @@ class Hook { this.name, }); - int id; - String name; + int? id; + String? name; /// Events to Subscribe to - List events; + List? events; /// Content Type - String get contentType => config.contentType; + String? get contentType => config!.contentType; /// If the hook is active - bool active; + bool? active; /// The time the hook was created - DateTime createdAt; + DateTime? createdAt; /// The last time the hook was updated - DateTime updatedAt; + DateTime? updatedAt; /// The Repository Name - String repoName; + String? repoName; - HookConfig config; + HookConfig? config; factory Hook.fromJson(Map input) => _$HookFromJson(input); Map toJson() => _$HookToJson(this); @@ -45,10 +45,10 @@ class HookConfig { this.secret, this.insecureSsl, }); - String url; - String contentType; - String secret; - String insecureSsl; + String? url; + String? contentType; + String? secret; + String? insecureSsl; factory HookConfig.fromJson(Map input) => _$HookConfigFromJson(input); Map toJson() => _$HookConfigToJson(this); @@ -58,16 +58,16 @@ class HookConfig { @JsonSerializable(fieldRename: FieldRename.snake) class CreateHook { /// Hook Name - final String name; + final String? name; /// Hook Configuration - final HookConfig config; + final HookConfig? config; /// Events to Subscribe to - final List events; + final List? events; /// If the Hook should be active. - final bool active; + final bool? active; CreateHook(this.name, this.config, {this.events = const ['push'], this.active = true}); diff --git a/lib/src/common/model/repos_hooks.g.dart b/lib/src/common/model/repos_hooks.g.dart index c74559a0..d230f85c 100644 --- a/lib/src/common/model/repos_hooks.g.dart +++ b/lib/src/common/model/repos_hooks.g.dart @@ -8,18 +8,19 @@ part of 'repos_hooks.dart'; Hook _$HookFromJson(Map json) { return Hook( - id: json['id'] as int, - name: json['name'] as String, + id: json['id'] as int?, + name: json['name'] as String?, ) - ..events = (json['events'] as List)?.map((e) => e as String)?.toList() - ..active = json['active'] as bool + ..events = + (json['events'] as List?)?.map((e) => e as String).toList() + ..active = json['active'] as bool? ..createdAt = json['created_at'] == null ? null : DateTime.parse(json['created_at'] as String) ..updatedAt = json['updated_at'] == null ? null : DateTime.parse(json['updated_at'] as String) - ..repoName = json['repo_name'] as String + ..repoName = json['repo_name'] as String? ..config = json['config'] == null ? null : HookConfig.fromJson(json['config'] as Map); @@ -38,10 +39,10 @@ Map _$HookToJson(Hook instance) => { HookConfig _$HookConfigFromJson(Map json) { return HookConfig( - url: json['url'] as String, - contentType: json['content_type'] as String, - secret: json['secret'] as String, - insecureSsl: json['insecure_ssl'] as String, + url: json['url'] as String?, + contentType: json['content_type'] as String?, + secret: json['secret'] as String?, + insecureSsl: json['insecure_ssl'] as String?, ); } @@ -55,12 +56,13 @@ Map _$HookConfigToJson(HookConfig instance) => CreateHook _$CreateHookFromJson(Map json) { return CreateHook( - json['name'] as String, + json['name'] as String?, json['config'] == null ? null : HookConfig.fromJson(json['config'] as Map), - events: (json['events'] as List)?.map((e) => e as String)?.toList(), - active: json['active'] as bool, + events: + (json['events'] as List?)?.map((e) => e as String).toList(), + active: json['active'] as bool?, ); } diff --git a/lib/src/common/model/repos_merging.dart b/lib/src/common/model/repos_merging.dart index 28bd2bf7..7f73b969 100644 --- a/lib/src/common/model/repos_merging.dart +++ b/lib/src/common/model/repos_merging.dart @@ -6,9 +6,9 @@ part 'repos_merging.g.dart'; class CreateMerge { CreateMerge(this.base, this.head, {this.commitMessage}); - final String base; - final String head; - String commitMessage; + final String? base; + final String? head; + String? commitMessage; factory CreateMerge.fromJson(Map input) => _$CreateMergeFromJson(input); diff --git a/lib/src/common/model/repos_merging.g.dart b/lib/src/common/model/repos_merging.g.dart index ee0b8dc2..d4fa2d4b 100644 --- a/lib/src/common/model/repos_merging.g.dart +++ b/lib/src/common/model/repos_merging.g.dart @@ -8,9 +8,9 @@ part of 'repos_merging.dart'; CreateMerge _$CreateMergeFromJson(Map json) { return CreateMerge( - json['base'] as String, - json['head'] as String, - commitMessage: json['commit_message'] as String, + json['base'] as String?, + json['head'] as String?, + commitMessage: json['commit_message'] as String?, ); } diff --git a/lib/src/common/model/repos_pages.dart b/lib/src/common/model/repos_pages.dart index 990e6403..d2401940 100644 --- a/lib/src/common/model/repos_pages.dart +++ b/lib/src/common/model/repos_pages.dart @@ -11,10 +11,10 @@ class RepositoryPages { this.hasCustom404, }); - String cname; - String status; + String? cname; + String? status; @JsonKey(name: 'custom_404') - bool hasCustom404; + bool? hasCustom404; factory RepositoryPages.fromJson(Map input) => _$RepositoryPagesFromJson(input); @@ -33,14 +33,14 @@ class PageBuild { this.createdAt, this.updatedAt, }); - String url; - String status; - PageBuildError error; - PageBuildPusher pusher; - String commit; - int duration; - DateTime createdAt; - DateTime updatedAt; + String? url; + String? status; + PageBuildError? error; + PageBuildPusher? pusher; + String? commit; + int? duration; + DateTime? createdAt; + DateTime? updatedAt; factory PageBuild.fromJson(Map input) => _$PageBuildFromJson(input); @@ -57,13 +57,13 @@ class PageBuildPusher { this.type, this.siteAdmin, }); - int id; - String login; + int? id; + String? login; @JsonKey(name: 'url') - String apiUrl; - String htmlUrl; - String type; - bool siteAdmin; + String? apiUrl; + String? htmlUrl; + String? type; + bool? siteAdmin; factory PageBuildPusher.fromJson(Map input) => _$PageBuildPusherFromJson(input); @@ -73,7 +73,7 @@ class PageBuildPusher { @JsonSerializable(fieldRename: FieldRename.snake) class PageBuildError { PageBuildError({this.message}); - String message; + String? message; factory PageBuildError.fromJson(Map input) => _$PageBuildErrorFromJson(input); diff --git a/lib/src/common/model/repos_pages.g.dart b/lib/src/common/model/repos_pages.g.dart index 790ec2ef..8cdb0c34 100644 --- a/lib/src/common/model/repos_pages.g.dart +++ b/lib/src/common/model/repos_pages.g.dart @@ -8,9 +8,9 @@ part of 'repos_pages.dart'; RepositoryPages _$RepositoryPagesFromJson(Map json) { return RepositoryPages( - cname: json['cname'] as String, - status: json['status'] as String, - hasCustom404: json['custom_404'] as bool, + cname: json['cname'] as String?, + status: json['status'] as String?, + hasCustom404: json['custom_404'] as bool?, ); } @@ -23,16 +23,16 @@ Map _$RepositoryPagesToJson(RepositoryPages instance) => PageBuild _$PageBuildFromJson(Map json) { return PageBuild( - url: json['url'] as String, - status: json['status'] as String, + url: json['url'] as String?, + status: json['status'] as String?, error: json['error'] == null ? null : PageBuildError.fromJson(json['error'] as Map), pusher: json['pusher'] == null ? null : PageBuildPusher.fromJson(json['pusher'] as Map), - commit: json['commit'] as String, - duration: json['duration'] as int, + commit: json['commit'] as String?, + duration: json['duration'] as int?, createdAt: json['created_at'] == null ? null : DateTime.parse(json['created_at'] as String), @@ -55,12 +55,12 @@ Map _$PageBuildToJson(PageBuild instance) => { PageBuildPusher _$PageBuildPusherFromJson(Map json) { return PageBuildPusher( - login: json['login'] as String, - id: json['id'] as int, - apiUrl: json['url'] as String, - htmlUrl: json['html_url'] as String, - type: json['type'] as String, - siteAdmin: json['site_admin'] as bool, + login: json['login'] as String?, + id: json['id'] as int?, + apiUrl: json['url'] as String?, + htmlUrl: json['html_url'] as String?, + type: json['type'] as String?, + siteAdmin: json['site_admin'] as bool?, ); } @@ -76,7 +76,7 @@ Map _$PageBuildPusherToJson(PageBuildPusher instance) => PageBuildError _$PageBuildErrorFromJson(Map json) { return PageBuildError( - message: json['message'] as String, + message: json['message'] as String?, ); } diff --git a/lib/src/common/model/repos_releases.dart b/lib/src/common/model/repos_releases.dart index 59085fe3..f80b5a8e 100644 --- a/lib/src/common/model/repos_releases.dart +++ b/lib/src/common/model/repos_releases.dart @@ -2,7 +2,6 @@ import 'dart:typed_data'; import 'package:github/src/common/model/users.dart'; import 'package:json_annotation/json_annotation.dart'; -import 'package:meta/meta.dart'; part 'repos_releases.g.dart'; @@ -30,73 +29,73 @@ class Release { }); /// Url to this Release - String url; + String? url; /// Url to this Release - String htmlUrl; + String? htmlUrl; /// Tarball of the Repository Tree at the commit of this release. - String tarballUrl; + String? tarballUrl; /// ZIP of the Repository Tree at the commit of this release. - String zipballUrl; + String? zipballUrl; /// The endpoint for uploading release assets. /// This key is a hypermedia resource. https://developer.github.com/v3/#hypermedia - String uploadUrl; + String? uploadUrl; - String assetsUrl; + String? assetsUrl; /// Release ID - int id; + int? id; - String nodeId; + String? nodeId; /// Release Tag Name - String tagName; + String? tagName; /// Target Commit - String targetCommitish; + String? targetCommitish; /// Release Name - String name; + String? name; /// Release Notes - String body; + String? body; /// Release Description - String description; + String? description; /// If the release is a draft. @JsonKey(name: 'draft') - bool isDraft; + bool? isDraft; /// If the release is a pre-release. @JsonKey(name: 'prerelease') - bool isPrerelease; + bool? isPrerelease; /// The time this release was created at. - DateTime createdAt; + DateTime? createdAt; /// The time this release was published at. - DateTime publishedAt; + DateTime? publishedAt; /// The author of this release. - User author; + User? author; /// Release Assets - List assets; + List? assets; - List errors; + List? errors; factory Release.fromJson(Map input) => _$ReleaseFromJson(input); Map toJson() => _$ReleaseToJson(this); - String getUploadUrlFor(String name, [String label]) => - "${uploadUrl.substring(0, uploadUrl.indexOf('{'))}?name=$name${label != null ? ",$label" : ""}"; + String getUploadUrlFor(String name, [String? label]) => + "${uploadUrl!.substring(0, uploadUrl!.indexOf('{'))}?name=$name${label != null ? ",$label" : ""}"; - bool get hasErrors => errors == null ? false : errors.isNotEmpty; + bool get hasErrors => errors == null ? false : errors!.isNotEmpty; } /// Model class for a release asset. @@ -116,34 +115,34 @@ class ReleaseAsset { }); /// Url to download the asset. - String browserDownloadUrl; + String? browserDownloadUrl; /// Asset ID - int id; + int? id; /// Asset Name - String name; + String? name; /// Asset Label - String label; + String? label; /// Asset State - String state; + String? state; /// Asset Content Type - String contentType; + String? contentType; /// Size of Asset - int size; + int? size; /// Number of Downloads - int downloadCount; + int? downloadCount; /// Time the asset was created at - DateTime createdAt; + DateTime? createdAt; /// Time the asset was last updated - DateTime updatedAt; + DateTime? updatedAt; factory ReleaseAsset.fromJson(Map input) => _$ReleaseAssetFromJson(input); @@ -154,34 +153,34 @@ class ReleaseAsset { @JsonSerializable(fieldRename: FieldRename.snake) class CreateRelease { /// Tag Name to Base off of - final String tagName; + final String? tagName; /// Commit to Target - String targetCommitish; + String? targetCommitish; /// Release Name - String name; + String? name; /// Release Body - String body; + String? body; /// If the release is a draft @JsonKey(name: 'draft') - bool isDraft; + bool? isDraft; /// true to identify the release as a prerelease. /// false to identify the release as a full release. Default: false @JsonKey(name: 'prerelease') - bool isPrerelease; + bool? isPrerelease; CreateRelease(this.tagName); CreateRelease.from({ - @required this.tagName, - @required this.name, - @required this.targetCommitish, - @required this.isDraft, - @required this.isPrerelease, + required this.tagName, + required this.name, + required this.targetCommitish, + required this.isDraft, + required this.isPrerelease, this.body, }); @@ -213,9 +212,9 @@ class CreateRelease { class CreateReleaseAsset { CreateReleaseAsset({ - @required this.name, - @required this.contentType, - @required this.assetData, + required this.name, + required this.contentType, + required this.assetData, this.label, }); @@ -223,7 +222,7 @@ class CreateReleaseAsset { String name; /// An alternate short description of the asset. Used in place of the filename. - String label; + String? label; /// The media type of the asset. /// diff --git a/lib/src/common/model/repos_releases.g.dart b/lib/src/common/model/repos_releases.g.dart index 19e03d22..5b3b78e5 100644 --- a/lib/src/common/model/repos_releases.g.dart +++ b/lib/src/common/model/repos_releases.g.dart @@ -8,19 +8,19 @@ part of 'repos_releases.dart'; Release _$ReleaseFromJson(Map json) { return Release( - id: json['id'] as int, - url: json['url'] as String, - htmlUrl: json['html_url'] as String, - tarballUrl: json['tarball_url'] as String, - uploadUrl: json['upload_url'] as String, - nodeId: json['node_id'] as String, - tagName: json['tag_name'] as String, - targetCommitish: json['target_commitish'] as String, - name: json['name'] as String, - body: json['body'] as String, - description: json['description'] as String, - isDraft: json['draft'] as bool, - isPrerelease: json['prerelease'] as bool, + id: json['id'] as int?, + url: json['url'] as String?, + htmlUrl: json['html_url'] as String?, + tarballUrl: json['tarball_url'] as String?, + uploadUrl: json['upload_url'] as String?, + nodeId: json['node_id'] as String?, + tagName: json['tag_name'] as String?, + targetCommitish: json['target_commitish'] as String?, + name: json['name'] as String?, + body: json['body'] as String?, + description: json['description'] as String?, + isDraft: json['draft'] as bool?, + isPrerelease: json['prerelease'] as bool?, createdAt: json['created_at'] == null ? null : DateTime.parse(json['created_at'] as String), @@ -30,14 +30,13 @@ Release _$ReleaseFromJson(Map json) { author: json['author'] == null ? null : User.fromJson(json['author'] as Map), - assets: (json['assets'] as List) - ?.map((e) => - e == null ? null : ReleaseAsset.fromJson(e as Map)) - ?.toList(), + assets: (json['assets'] as List?) + ?.map((e) => ReleaseAsset.fromJson(e as Map)) + .toList(), ) - ..zipballUrl = json['zipball_url'] as String - ..assetsUrl = json['assets_url'] as String - ..errors = json['errors'] as List; + ..zipballUrl = json['zipball_url'] as String? + ..assetsUrl = json['assets_url'] as String? + ..errors = json['errors'] as List?; } Map _$ReleaseToJson(Release instance) => { @@ -65,14 +64,14 @@ Map _$ReleaseToJson(Release instance) => { ReleaseAsset _$ReleaseAssetFromJson(Map json) { return ReleaseAsset( - id: json['id'] as int, - name: json['name'] as String, - label: json['label'] as String, - state: json['state'] as String, - contentType: json['content_type'] as String, - size: json['size'] as int, - downloadCount: json['download_count'] as int, - browserDownloadUrl: json['browser_download_url'] as String, + id: json['id'] as int?, + name: json['name'] as String?, + label: json['label'] as String?, + state: json['state'] as String?, + contentType: json['content_type'] as String?, + size: json['size'] as int?, + downloadCount: json['download_count'] as int?, + browserDownloadUrl: json['browser_download_url'] as String?, createdAt: json['created_at'] == null ? null : DateTime.parse(json['created_at'] as String), @@ -98,13 +97,13 @@ Map _$ReleaseAssetToJson(ReleaseAsset instance) => CreateRelease _$CreateReleaseFromJson(Map json) { return CreateRelease( - json['tag_name'] as String, + json['tag_name'] as String?, ) - ..targetCommitish = json['target_commitish'] as String - ..name = json['name'] as String - ..body = json['body'] as String - ..isDraft = json['draft'] as bool - ..isPrerelease = json['prerelease'] as bool; + ..targetCommitish = json['target_commitish'] as String? + ..name = json['name'] as String? + ..body = json['body'] as String? + ..isDraft = json['draft'] as bool? + ..isPrerelease = json['prerelease'] as bool?; } Map _$CreateReleaseToJson(CreateRelease instance) => diff --git a/lib/src/common/model/repos_stats.dart b/lib/src/common/model/repos_stats.dart index 8f2a6608..5cfb82f5 100644 --- a/lib/src/common/model/repos_stats.dart +++ b/lib/src/common/model/repos_stats.dart @@ -9,13 +9,13 @@ part 'repos_stats.g.dart'; class ContributorStatistics { ContributorStatistics(this.author, this.total, this.weeks); - final User author; + final User? author; /// Total Commits - final int total; + final int? total; /// Weekly Statistics - final List weeks; + final List? weeks; factory ContributorStatistics.fromJson(Map input) => _$ContributorStatisticsFromJson(input); @@ -31,19 +31,19 @@ class ContributorWeekStatistics { /// Beginning of the Week (As a Unix Timestamp) @JsonKey(name: 'w') - final int start; + final int? start; /// Number of Additions @JsonKey(name: 'a') - final int additions; + final int? additions; /// Number of Deletions @JsonKey(name: 'd') - final int deletions; + final int? deletions; /// Number of Commits @JsonKey(name: 'c') - final int commits; + final int? commits; factory ContributorWeekStatistics.fromJson(Map input) => _$ContributorWeekStatisticsFromJson(input); @@ -63,10 +63,10 @@ class ContributorParticipation { }); /// Commit Counts for All Users - List all; + List? all; /// Commit Counts for the Owner - List owner; + List? owner; factory ContributorParticipation.fromJson(Map input) => _$ContributorParticipationFromJson(input); @@ -83,13 +83,13 @@ class YearCommitCountWeek { }); /// Commit Counts for each day (starting with Sunday) - List days; + List? days; /// Total Commit Count - int total; + int? total; /// Timestamp for Beginning of Week - int timestamp; + int? timestamp; factory YearCommitCountWeek.fromJson(Map input) => _$YearCommitCountWeekFromJson(input); @@ -106,13 +106,13 @@ class WeeklyChangesCount { }); /// Timestamp for Beginning of Week - int timestamp; + int? timestamp; /// Number of Additions - int additions; + int? additions; /// Number of Deletions - int deletions; + int? deletions; factory WeeklyChangesCount.fromJson(Map input) => _$WeeklyChangesCountFromJson(input); @@ -129,13 +129,13 @@ class PunchcardEntry { }); /// Weekday (With 0 as Sunday and 6 as Saturday) - int weekday; + int? weekday; /// Hour of Day - int hour; + int? hour; /// Number of Commits - int commits; + int? commits; factory PunchcardEntry.fromJson(Map input) => _$PunchcardEntryFromJson(input); diff --git a/lib/src/common/model/repos_stats.g.dart b/lib/src/common/model/repos_stats.g.dart index fdf25d96..d832e1bc 100644 --- a/lib/src/common/model/repos_stats.g.dart +++ b/lib/src/common/model/repos_stats.g.dart @@ -12,12 +12,11 @@ ContributorStatistics _$ContributorStatisticsFromJson( json['author'] == null ? null : User.fromJson(json['author'] as Map), - json['total'] as int, - (json['weeks'] as List) - ?.map((e) => e == null - ? null - : ContributorWeekStatistics.fromJson(e as Map)) - ?.toList(), + json['total'] as int?, + (json['weeks'] as List?) + ?.map((e) => + ContributorWeekStatistics.fromJson(e as Map)) + .toList(), ); } @@ -32,10 +31,10 @@ Map _$ContributorStatisticsToJson( ContributorWeekStatistics _$ContributorWeekStatisticsFromJson( Map json) { return ContributorWeekStatistics( - json['w'] as int, - json['a'] as int, - json['d'] as int, - json['c'] as int, + json['w'] as int?, + json['a'] as int?, + json['d'] as int?, + json['c'] as int?, ); } @@ -51,8 +50,8 @@ Map _$ContributorWeekStatisticsToJson( ContributorParticipation _$ContributorParticipationFromJson( Map json) { return ContributorParticipation( - all: (json['all'] as List)?.map((e) => e as int)?.toList(), - owner: (json['owner'] as List)?.map((e) => e as int)?.toList(), + all: (json['all'] as List?)?.map((e) => e as int).toList(), + owner: (json['owner'] as List?)?.map((e) => e as int).toList(), ); } @@ -65,9 +64,9 @@ Map _$ContributorParticipationToJson( YearCommitCountWeek _$YearCommitCountWeekFromJson(Map json) { return YearCommitCountWeek( - days: (json['days'] as List)?.map((e) => e as int)?.toList(), - total: json['total'] as int, - timestamp: json['timestamp'] as int, + days: (json['days'] as List?)?.map((e) => e as int).toList(), + total: json['total'] as int?, + timestamp: json['timestamp'] as int?, ); } @@ -81,9 +80,9 @@ Map _$YearCommitCountWeekToJson( WeeklyChangesCount _$WeeklyChangesCountFromJson(Map json) { return WeeklyChangesCount( - timestamp: json['timestamp'] as int, - additions: json['additions'] as int, - deletions: json['deletions'] as int, + timestamp: json['timestamp'] as int?, + additions: json['additions'] as int?, + deletions: json['deletions'] as int?, ); } @@ -96,9 +95,9 @@ Map _$WeeklyChangesCountToJson(WeeklyChangesCount instance) => PunchcardEntry _$PunchcardEntryFromJson(Map json) { return PunchcardEntry( - weekday: json['weekday'] as int, - hour: json['hour'] as int, - commits: json['commits'] as int, + weekday: json['weekday'] as int?, + hour: json['hour'] as int?, + commits: json['commits'] as int?, ); } diff --git a/lib/src/common/model/repos_statuses.dart b/lib/src/common/model/repos_statuses.dart index 97b3f9a9..a6c301c3 100644 --- a/lib/src/common/model/repos_statuses.dart +++ b/lib/src/common/model/repos_statuses.dart @@ -13,11 +13,11 @@ class CombinedRepositoryStatus { this.statuses, this.repository, }); - String state; - String sha; - int totalCount; - List statuses; - Repository repository; + String? state; + String? sha; + int? totalCount; + List? statuses; + Repository? repository; factory CombinedRepositoryStatus.fromJson(Map input) => _$CombinedRepositoryStatusFromJson(input); @@ -35,12 +35,12 @@ class RepositoryStatus { this.description, this.context, }); - DateTime createdAt; - DateTime updatedAt; - String state; - String targetUrl; - String description; - String context; + DateTime? createdAt; + DateTime? updatedAt; + String? state; + String? targetUrl; + String? description; + String? context; factory RepositoryStatus.fromJson(Map input) => _$RepositoryStatusFromJson(input); @@ -52,11 +52,11 @@ class RepositoryStatus { class CreateStatus { CreateStatus(this.state, {this.targetUrl, this.description, this.context}); - final String state; - String description; - String context; + final String? state; + String? description; + String? context; @JsonKey(name: 'target_url') - String targetUrl; + String? targetUrl; factory CreateStatus.fromJson(Map input) => _$CreateStatusFromJson(input); diff --git a/lib/src/common/model/repos_statuses.g.dart b/lib/src/common/model/repos_statuses.g.dart index 9441832f..2938d369 100644 --- a/lib/src/common/model/repos_statuses.g.dart +++ b/lib/src/common/model/repos_statuses.g.dart @@ -9,14 +9,12 @@ part of 'repos_statuses.dart'; CombinedRepositoryStatus _$CombinedRepositoryStatusFromJson( Map json) { return CombinedRepositoryStatus( - state: json['state'] as String, - sha: json['sha'] as String, - totalCount: json['total_count'] as int, - statuses: (json['statuses'] as List) - ?.map((e) => e == null - ? null - : RepositoryStatus.fromJson(e as Map)) - ?.toList(), + state: json['state'] as String?, + sha: json['sha'] as String?, + totalCount: json['total_count'] as int?, + statuses: (json['statuses'] as List?) + ?.map((e) => RepositoryStatus.fromJson(e as Map)) + .toList(), repository: json['repository'] == null ? null : Repository.fromJson(json['repository'] as Map), @@ -41,10 +39,10 @@ RepositoryStatus _$RepositoryStatusFromJson(Map json) { updatedAt: json['updated_at'] == null ? null : DateTime.parse(json['updated_at'] as String), - state: json['state'] as String, - targetUrl: json['target_url'] as String, - description: json['description'] as String, - context: json['context'] as String, + state: json['state'] as String?, + targetUrl: json['target_url'] as String?, + description: json['description'] as String?, + context: json['context'] as String?, ); } @@ -60,10 +58,10 @@ Map _$RepositoryStatusToJson(RepositoryStatus instance) => CreateStatus _$CreateStatusFromJson(Map json) { return CreateStatus( - json['state'] as String, - targetUrl: json['target_url'] as String, - description: json['description'] as String, - context: json['context'] as String, + json['state'] as String?, + targetUrl: json['target_url'] as String?, + description: json['description'] as String?, + context: json['context'] as String?, ); } diff --git a/lib/src/common/model/search.dart b/lib/src/common/model/search.dart index 19d2cce9..1735a465 100644 --- a/lib/src/common/model/search.dart +++ b/lib/src/common/model/search.dart @@ -4,24 +4,24 @@ import 'package:json_annotation/json_annotation.dart'; part 'search.g.dart'; abstract class SearchResults { - int totalCount; - bool incompleteResults; - List items; + int? totalCount; + bool? incompleteResults; + List? items; } @JsonSerializable(createToJson: false) class CodeSearchResults implements SearchResults { @JsonKey(name: 'total_count') @override - int totalCount; + int? totalCount; @JsonKey(name: 'incomplete_results') @override - bool incompleteResults; + bool? incompleteResults; @JsonKey(fromJson: CodeSearchItem.fromJsonList) @override - List items; + List? items; static CodeSearchResults fromJson(Map input) => _$CodeSearchResultsFromJson(input); @@ -29,20 +29,20 @@ class CodeSearchResults implements SearchResults { @JsonSerializable(createToJson: false) class CodeSearchItem { - String name; - String path; - String sha; + String? name; + String? path; + String? sha; @JsonKey(fromJson: Uri.parse) - Uri url; + Uri? url; @JsonKey(name: 'git_url', fromJson: Uri.parse) - Uri gitUrl; + Uri? gitUrl; @JsonKey(name: 'html_url', fromJson: Uri.parse) - Uri htmlUrl; + Uri? htmlUrl; - Repository repository; + Repository? repository; static CodeSearchItem fromJson(Map input) { return _$CodeSearchItemFromJson(input); diff --git a/lib/src/common/model/search.g.dart b/lib/src/common/model/search.g.dart index 03d6b850..be89b80c 100644 --- a/lib/src/common/model/search.g.dart +++ b/lib/src/common/model/search.g.dart @@ -8,16 +8,16 @@ part of 'search.dart'; CodeSearchResults _$CodeSearchResultsFromJson(Map json) { return CodeSearchResults() - ..totalCount = json['total_count'] as int - ..incompleteResults = json['incomplete_results'] as bool + ..totalCount = json['total_count'] as int? + ..incompleteResults = json['incomplete_results'] as bool? ..items = CodeSearchItem.fromJsonList(json['items'] as List); } CodeSearchItem _$CodeSearchItemFromJson(Map json) { return CodeSearchItem() - ..name = json['name'] as String - ..path = json['path'] as String - ..sha = json['sha'] as String + ..name = json['name'] as String? + ..path = json['path'] as String? + ..sha = json['sha'] as String? ..url = Uri.parse(json['url'] as String) ..gitUrl = Uri.parse(json['git_url'] as String) ..htmlUrl = Uri.parse(json['html_url'] as String) diff --git a/lib/src/common/model/users.dart b/lib/src/common/model/users.dart index b616bd3b..f61e4613 100644 --- a/lib/src/common/model/users.dart +++ b/lib/src/common/model/users.dart @@ -27,68 +27,68 @@ class User { }); @JsonKey(ignore: true) - Map json; // TODO remove + Map? json; // TODO remove /// User's Username - String login; + String? login; /// User ID - int id; + int? id; /// Avatar URL - String avatarUrl; + String? avatarUrl; /// Url to this user's profile. - String htmlUrl; + String? htmlUrl; /// If the user is a site administrator - bool siteAdmin; + bool? siteAdmin; /// User's Name - String name; + String? name; /// Name of User's Company - String company; + String? company; /// Link to User's Blog - String blog; + String? blog; /// User's Location - String location; + String? location; /// User's Email - String email; + String? email; /// If this user is hirable - bool hirable; + bool? hirable; /// The User's Biography - String bio; + String? bio; /// Number of public repositories that this user has @JsonKey(name: 'public_repos') - int publicReposCount; + int? publicReposCount; /// Number of public gists that this user has @JsonKey(name: 'public_gists') - int publicGistsCount; + int? publicGistsCount; /// Number of followers that this user has @JsonKey(name: 'followers') - int followersCount; + int? followersCount; /// Number of Users that this user follows @JsonKey(name: 'following') - int followingCount; + int? followingCount; /// The time this [User] was created. - DateTime createdAt; + DateTime? createdAt; /// Last time this [User] was updated. - DateTime updatedAt; + DateTime? updatedAt; /// The username of the twitter account (without leading @) - String twitterUsername; + String? twitterUsername; factory User.fromJson(Map input) => _$UserFromJson(input); Map toJson() => _$UserToJson(this); @@ -98,12 +98,12 @@ class User { // https://developer.github.com/v3/repos/collaborators/#response @JsonSerializable(createToJson: false, fieldRename: FieldRename.snake) class Collaborator { - final String login; - final int id; - final String htmlUrl; - final String type; - final bool siteAdmin; - final Map permissions; + final String? login; + final int? id; + final String? htmlUrl; + final String? type; + final bool? siteAdmin; + final Map? permissions; Collaborator( this.login, @@ -134,24 +134,24 @@ class Contributor { }); /// User's Username - String login; + String? login; /// User ID - int id; + int? id; /// Avatar URL - String avatarUrl; + String? avatarUrl; /// Url to this user's profile. - String htmlUrl; + String? htmlUrl; - String type; + String? type; /// If the user is a site administrator - bool siteAdmin; + bool? siteAdmin; /// Contributions count - int contributions; + int? contributions; factory Contributor.fromJson(Map input) => _$ContributorFromJson(input); @@ -165,18 +165,18 @@ class CurrentUser extends User { /// Number of Private Repositories @JsonKey(name: 'total_private_repos') - int privateReposCount; + int? privateReposCount; /// Number of Owned Private Repositories that the user owns @JsonKey(name: 'owned_private_repos') - int ownedPrivateReposCount; + int? ownedPrivateReposCount; /// The User's Disk Usage @JsonKey(name: 'disk_usage') - int diskUsage; + int? diskUsage; /// The User's GitHub Plan - UserPlan plan; + UserPlan? plan; factory CurrentUser.fromJson(Map input) => _$CurrentUserFromJson(input); @@ -190,18 +190,18 @@ class UserPlan { UserPlan(); // Plan Name - String name; + String? name; // Plan Space - int space; + int? space; // Number of Private Repositories @JsonKey(name: 'private_repos') - int privateReposCount; + int? privateReposCount; // Number of Collaborators @JsonKey(name: 'collaborators') - int collaboratorsCount; + int? collaboratorsCount; factory UserPlan.fromJson(Map input) => _$UserPlanFromJson(input); @@ -216,9 +216,9 @@ class UserEmail { this.verified, this.primary, }); - String email; - bool verified; - bool primary; + String? email; + bool? verified; + bool? primary; factory UserEmail.fromJson(Map input) => _$UserEmailFromJson(input); diff --git a/lib/src/common/model/users.g.dart b/lib/src/common/model/users.g.dart index 57a69716..e9a20aaa 100644 --- a/lib/src/common/model/users.g.dart +++ b/lib/src/common/model/users.g.dart @@ -8,29 +8,29 @@ part of 'users.dart'; User _$UserFromJson(Map json) { return User( - id: json['id'] as int, - login: json['login'] as String, - avatarUrl: json['avatar_url'] as String, - htmlUrl: json['html_url'] as String, - siteAdmin: json['site_admin'] as bool, - name: json['name'] as String, - company: json['company'] as String, - blog: json['blog'] as String, - location: json['location'] as String, - email: json['email'] as String, - hirable: json['hirable'] as bool, - bio: json['bio'] as String, - publicReposCount: json['public_repos'] as int, - publicGistsCount: json['public_gists'] as int, - followersCount: json['followers'] as int, - followingCount: json['following'] as int, + id: json['id'] as int?, + login: json['login'] as String?, + avatarUrl: json['avatar_url'] as String?, + htmlUrl: json['html_url'] as String?, + siteAdmin: json['site_admin'] as bool?, + name: json['name'] as String?, + company: json['company'] as String?, + blog: json['blog'] as String?, + location: json['location'] as String?, + email: json['email'] as String?, + hirable: json['hirable'] as bool?, + bio: json['bio'] as String?, + publicReposCount: json['public_repos'] as int?, + publicGistsCount: json['public_gists'] as int?, + followersCount: json['followers'] as int?, + followingCount: json['following'] as int?, createdAt: json['created_at'] == null ? null : DateTime.parse(json['created_at'] as String), updatedAt: json['updated_at'] == null ? null : DateTime.parse(json['updated_at'] as String), - )..twitterUsername = json['twitter_username'] as String; + )..twitterUsername = json['twitter_username'] as String?; } Map _$UserToJson(User instance) => { @@ -57,12 +57,12 @@ Map _$UserToJson(User instance) => { Collaborator _$CollaboratorFromJson(Map json) { return Collaborator( - json['login'] as String, - json['id'] as int, - json['html_url'] as String, - json['type'] as String, - json['site_admin'] as bool, - (json['permissions'] as Map)?.map( + json['login'] as String?, + json['id'] as int?, + json['html_url'] as String?, + json['type'] as String?, + json['site_admin'] as bool?, + (json['permissions'] as Map?)?.map( (k, e) => MapEntry(k, e as bool), ), ); @@ -70,13 +70,13 @@ Collaborator _$CollaboratorFromJson(Map json) { Contributor _$ContributorFromJson(Map json) { return Contributor( - id: json['id'] as int, - login: json['login'] as String, - avatarUrl: json['avatar_url'] as String, - htmlUrl: json['html_url'] as String, - type: json['type'] as String, - siteAdmin: json['site_admin'] as bool, - contributions: json['contributions'] as int, + id: json['id'] as int?, + login: json['login'] as String?, + avatarUrl: json['avatar_url'] as String?, + htmlUrl: json['html_url'] as String?, + type: json['type'] as String?, + siteAdmin: json['site_admin'] as bool?, + contributions: json['contributions'] as int?, ); } @@ -93,32 +93,32 @@ Map _$ContributorToJson(Contributor instance) => CurrentUser _$CurrentUserFromJson(Map json) { return CurrentUser() - ..login = json['login'] as String - ..id = json['id'] as int - ..avatarUrl = json['avatar_url'] as String - ..htmlUrl = json['html_url'] as String - ..siteAdmin = json['site_admin'] as bool - ..name = json['name'] as String - ..company = json['company'] as String - ..blog = json['blog'] as String - ..location = json['location'] as String - ..email = json['email'] as String - ..hirable = json['hirable'] as bool - ..bio = json['bio'] as String - ..publicReposCount = json['public_repos'] as int - ..publicGistsCount = json['public_gists'] as int - ..followersCount = json['followers'] as int - ..followingCount = json['following'] as int + ..login = json['login'] as String? + ..id = json['id'] as int? + ..avatarUrl = json['avatar_url'] as String? + ..htmlUrl = json['html_url'] as String? + ..siteAdmin = json['site_admin'] as bool? + ..name = json['name'] as String? + ..company = json['company'] as String? + ..blog = json['blog'] as String? + ..location = json['location'] as String? + ..email = json['email'] as String? + ..hirable = json['hirable'] as bool? + ..bio = json['bio'] as String? + ..publicReposCount = json['public_repos'] as int? + ..publicGistsCount = json['public_gists'] as int? + ..followersCount = json['followers'] as int? + ..followingCount = json['following'] as int? ..createdAt = json['created_at'] == null ? null : DateTime.parse(json['created_at'] as String) ..updatedAt = json['updated_at'] == null ? null : DateTime.parse(json['updated_at'] as String) - ..twitterUsername = json['twitter_username'] as String - ..privateReposCount = json['total_private_repos'] as int - ..ownedPrivateReposCount = json['owned_private_repos'] as int - ..diskUsage = json['disk_usage'] as int + ..twitterUsername = json['twitter_username'] as String? + ..privateReposCount = json['total_private_repos'] as int? + ..ownedPrivateReposCount = json['owned_private_repos'] as int? + ..diskUsage = json['disk_usage'] as int? ..plan = json['plan'] == null ? null : UserPlan.fromJson(json['plan'] as Map); @@ -153,10 +153,10 @@ Map _$CurrentUserToJson(CurrentUser instance) => UserPlan _$UserPlanFromJson(Map json) { return UserPlan() - ..name = json['name'] as String - ..space = json['space'] as int - ..privateReposCount = json['private_repos'] as int - ..collaboratorsCount = json['collaborators'] as int; + ..name = json['name'] as String? + ..space = json['space'] as int? + ..privateReposCount = json['private_repos'] as int? + ..collaboratorsCount = json['collaborators'] as int?; } Map _$UserPlanToJson(UserPlan instance) => { @@ -168,9 +168,9 @@ Map _$UserPlanToJson(UserPlan instance) => { UserEmail _$UserEmailFromJson(Map json) { return UserEmail( - email: json['email'] as String, - verified: json['verified'] as bool, - primary: json['primary'] as bool, + email: json['email'] as String?, + verified: json['verified'] as bool?, + primary: json['primary'] as bool?, ); } diff --git a/lib/src/common/orgs_service.dart b/lib/src/common/orgs_service.dart index 3f3dfa6c..b738f24f 100644 --- a/lib/src/common/orgs_service.dart +++ b/lib/src/common/orgs_service.dart @@ -17,20 +17,20 @@ class OrganizationsService extends Service { /// for the authenticated user. /// /// API docs: : https://developer.github.com/v3/orgs/#list-user-organizations - Stream list([String userName]) { + Stream list([String? userName]) { var requestPath = '/users/$userName/orgs'; if (userName == null) { requestPath = '/user/orgs'; } return PaginationHelper(github) - .objects('GET', requestPath, (i) => Organization.fromJson(i)); + .objects('GET', requestPath, (dynamic i) => Organization.fromJson(i)); } /// Fetches the organization specified by [name]. /// /// API docs: https://developer.github.com/v3/orgs/#get-an-organization - Future get(String name) => github.getJSON('/orgs/$name', - convert: (i) => Organization.fromJson(i), + Future get(String? name) => github.getJSON('/orgs/$name', + convert: (dynamic i) => Organization.fromJson(i), statusCode: StatusCodes.OK, fail: (http.Response response) { if (response.statusCode == 404) { @@ -50,12 +50,12 @@ class OrganizationsService extends Service { /// /// API docs: https://developer.github.com/v3/orgs/#edit-an-organization Future edit(String org, - {String billingEmail, - String company, - String email, - String location, - String name, - String description}) { + {String? billingEmail, + String? company, + String? email, + String? location, + String? name, + String? description}) { final map = createNonNullMap({ 'billing_email': billingEmail, 'company': company, @@ -67,7 +67,7 @@ class OrganizationsService extends Service { return github.postJSON('/orgs/$org', statusCode: 200, - convert: (i) => Organization.fromJson(i), + convert: (dynamic i) => Organization.fromJson(i), body: GitHubJson.encode(map)); } @@ -76,7 +76,7 @@ class OrganizationsService extends Service { /// API docs: https://developer.github.com/v3/orgs/teams/#list-teams Stream listTeams(String orgName) { return PaginationHelper(github) - .objects('GET', '/orgs/$orgName/teams', (i) => Team.fromJson(i)); + .objects('GET', '/orgs/$orgName/teams', (dynamic i) => Team.fromJson(i)); } /// Gets the team specified by the [teamId]. @@ -84,7 +84,7 @@ class OrganizationsService extends Service { /// API docs: https://developer.github.com/v3/orgs/teams/#get-team Future getTeam(int teamId) { return github.getJSON('/teams/$teamId', - convert: (i) => Organization.fromJson(i), + convert: (dynamic i) => Organization.fromJson(i), statusCode: 200) as Future; } @@ -92,7 +92,7 @@ class OrganizationsService extends Service { /// /// API docs: https://developer.github.com/v3/orgs/teams/#create-team Future createTeam(String org, String name, - {String description, List repos, String permission}) { + {String? description, List? repos, String? permission}) { final map = createNonNullMap({ 'name': name, 'description': description, @@ -102,7 +102,7 @@ class OrganizationsService extends Service { return github.postJSON('/orgs/$org/teams', statusCode: 201, - convert: (i) => Team.fromJson(i), + convert: (dynamic i) => Team.fromJson(i), body: GitHubJson.encode(map)); } @@ -110,7 +110,7 @@ class OrganizationsService extends Service { /// /// API docs: https://developer.github.com/v3/orgs/teams/#edit-team Future editTeam(int teamId, String name, - {String description, String permission}) { + {String? description, String? permission}) { final map = createNonNullMap({ 'name': name, 'description': description, @@ -120,7 +120,7 @@ class OrganizationsService extends Service { return github.postJSON( '/teams/$teamId', statusCode: 200, - convert: (i) => Team.fromJson(i), + convert: (dynamic i) => Team.fromJson(i), body: GitHubJson.encode(map), ); } @@ -139,7 +139,7 @@ class OrganizationsService extends Service { /// API docs: https://developer.github.com/v3/orgs/teams/#list-team-members Stream listTeamMembers(int teamId) { return PaginationHelper(github).objects( - 'GET', '/teams/$teamId/members', (i) => TeamMember.fromJson(i)); + 'GET', '/teams/$teamId/members', (dynamic i) => TeamMember.fromJson(i)); } Future getTeamMemberStatus(int teamId, String user) { @@ -165,7 +165,7 @@ class OrganizationsService extends Service { github.handleStatusCode(response); } }, - convert: (json) => TeamMembershipState(json['state']), + convert: (dynamic json) => TeamMembershipState(json['state']), ) .then(completer.complete); @@ -194,7 +194,7 @@ class OrganizationsService extends Service { /// API docs: https://developer.github.com/v3/orgs/teams/#list-team-repos Stream listTeamRepositories(int teamId) { return PaginationHelper(github) - .objects('GET', '/teams/$teamId/repos', (i) => Repository.fromJson(i)); + .objects('GET', '/teams/$teamId/repos', (dynamic i) => Repository.fromJson(i)); } /// Checks if a team manages the specified repository. @@ -235,7 +235,7 @@ class OrganizationsService extends Service { /// API docs: https://developer.github.com/v3/orgs/teams/#list-user-teams Stream listUserTeams() { return PaginationHelper(github) - .objects('GET', '/user/teams', (i) => Team.fromJson(i)); + .objects('GET', '/user/teams', (dynamic i) => Team.fromJson(i)); } /// Lists the hooks for the specified organization. @@ -243,7 +243,7 @@ class OrganizationsService extends Service { /// API docs: https://developer.github.com/v3/orgs/hooks/#list-hooks Stream listHooks(String org) { return PaginationHelper(github).objects( - 'GET', '/orgs/$org/hooks', (i) => Hook.fromJson(i)..repoName = org); + 'GET', '/orgs/$org/hooks', (dynamic i) => Hook.fromJson(i)..repoName = org); } /// Fetches a single hook by [id]. @@ -251,7 +251,7 @@ class OrganizationsService extends Service { /// API docs: https://developer.github.com/v3/orgs/hooks/#get-single-hook Future getHook(String org, int id) => github.getJSON('/orgs/$org/hooks/$id', - convert: (i) => Hook.fromJson(i)..repoName = org); + convert: (dynamic i) => Hook.fromJson(i)..repoName = org); /// Creates an organization hook based on the specified [hook]. /// diff --git a/lib/src/common/pulls_service.dart b/lib/src/common/pulls_service.dart index ddc51b22..8932682a 100644 --- a/lib/src/common/pulls_service.dart +++ b/lib/src/common/pulls_service.dart @@ -16,10 +16,10 @@ class PullRequestsService extends Service { /// API docs: https://developer.github.com/v3/pulls/#list-pull-requests Stream list( RepositorySlug slug, { - int pages, - String base, + int? pages, + String? base, String direction = 'desc', - String head, + String? head, String sort = 'created', String state = 'open', }) { @@ -33,7 +33,7 @@ class PullRequestsService extends Service { return PaginationHelper(github).objects( 'GET', '/repos/${slug.fullName}/pulls?state=$state', - (i) => PullRequest.fromJson(i), + (dynamic i) => PullRequest.fromJson(i), pages: pages, params: params); } @@ -43,7 +43,7 @@ class PullRequestsService extends Service { /// API docs: https://developer.github.com/v3/pulls/#get-a-single-pull-request Future get(RepositorySlug slug, int number) => github.getJSON('/repos/${slug.fullName}/pulls/$number', - convert: (i) => PullRequest.fromJson(i), statusCode: StatusCodes.OK); + convert: (dynamic i) => PullRequest.fromJson(i), statusCode: StatusCodes.OK); /// Creates a Pull Request based on the given [request]. /// @@ -51,9 +51,9 @@ class PullRequestsService extends Service { Future create(RepositorySlug slug, CreatePullRequest request) { return github.postJSON( '/repos/${slug.fullName}/pulls', - convert: (i) => PullRequest.fromJson(i), + convert: (dynamic i) => PullRequest.fromJson(i), body: GitHubJson.encode(request), - preview: request.draft + preview: request.draft! ? 'application/vnd.github.shadow-cat-preview+json' : null, ); @@ -63,7 +63,7 @@ class PullRequestsService extends Service { /// /// API docs: https://developer.github.com/v3/pulls/#update-a-pull-request Future edit(RepositorySlug slug, int number, - {String title, String body, String state, String base}) { + {String? title, String? body, String? state, String? base}) { final map = {}; putValue('title', title, map); putValue('body', body, map); @@ -86,7 +86,7 @@ class PullRequestsService extends Service { return PaginationHelper(github).objects( 'GET', '/repos/${slug.fullName}/pulls/$number/commits', - (i) => RepositoryCommit.fromJson(i)); + (dynamic i) => RepositoryCommit.fromJson(i)); } /// Lists the files in a pull request. @@ -96,7 +96,7 @@ class PullRequestsService extends Service { return PaginationHelper(github).objects( 'GET', '/repos/${slug.fullName}/pulls/$number/files', - (i) => PullRequestFile.fromJson(i)); + (dynamic i) => PullRequestFile.fromJson(i)); } Future isMerged(RepositorySlug slug, int number) { @@ -113,7 +113,7 @@ class PullRequestsService extends Service { Future merge( RepositorySlug slug, int number, { - String message, + String? message, }) { final json = {}; @@ -138,7 +138,7 @@ class PullRequestsService extends Service { return PaginationHelper(github).objects( 'GET', '/repos/${slug.fullName}/pulls/$number/comments', - (i) => PullRequestComment.fromJson(i)); + (dynamic i) => PullRequestComment.fromJson(i)); } /// Lists all comments on all pull requests for the repository. @@ -148,7 +148,7 @@ class PullRequestsService extends Service { return PaginationHelper(github).objects( 'GET', '/repos/${slug.fullName}/pulls/comments', - (i) => PullRequestComment.fromJson(i)); + (dynamic i) => PullRequestComment.fromJson(i)); } /// Creates a new pull request comment. @@ -158,7 +158,7 @@ class PullRequestsService extends Service { RepositorySlug slug, int number, CreatePullRequestComment comment) { return github.postJSON('/repos/${slug.fullName}/pulls/$number/comments', body: GitHubJson.encode(comment.toJson()), - convert: (i) => PullRequestComment.fromJson(i), + convert: (dynamic i) => PullRequestComment.fromJson(i), statusCode: 201) as Future; } diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index ee2860b5..2a9b1b37 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -6,7 +6,6 @@ import 'package:github/src/common/model/users.dart'; import 'package:github/src/common/util/pagination.dart'; import 'package:github/src/common/util/utils.dart'; import 'package:http/http.dart' as http; -import 'package:meta/meta.dart'; /// The [RepositoriesService] handles communication with repository related /// methods of the GitHub API. @@ -81,14 +80,14 @@ class RepositoriesService extends Service { /// If [limit] is null, it will fetch ALL the repositories on GitHub. /// /// API docs: https://developer.github.com/v3/repos/#list-all-public-repositories - Stream listPublicRepositories({int limit = 50, DateTime since}) { + Stream listPublicRepositories({int limit = 50, DateTime? since}) { final params = {}; if (since != null) { params['since'] = since.toIso8601String(); } - final pages = limit != null ? (limit / 30).ceil() : null; + final pages = (limit / 30).ceil(); return PaginationHelper(github) .fetchStreamed('GET', '/repositories', pages: pages, params: params) @@ -105,7 +104,7 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/#create Future createRepository(CreateRepository repository, - {String org}) async { + {String? org}) async { ArgumentError.checkNotNull(repository); if (org != null) { return github.postJSON, TeamRepository>( @@ -159,22 +158,22 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/#edit Future editRepository(RepositorySlug slug, - {String name, - String description, - String homepage, - bool private, - bool hasIssues, - bool hasWiki, - bool hasDownloads}) async { + {String? name, + String? description, + String? homepage, + bool? private, + bool? hasIssues, + bool? hasWiki, + bool? hasDownloads}) async { ArgumentError.checkNotNull(slug); final data = createNonNullMap({ - 'name': name, - 'description': description, - 'homepage': homepage, - 'private': private, - 'has_issues': hasIssues, - 'has_wiki': hasWiki, - 'has_downloads': hasDownloads, + 'name': name!, + 'description': description!, + 'homepage': homepage!, + 'private': private!, + 'has_issues': hasIssues!, + 'has_wiki': hasWiki!, + 'has_downloads': hasDownloads!, 'default_branch': 'defaultBranch' }); return github.postJSON( @@ -380,18 +379,18 @@ class RepositoriesService extends Service { Future createCommitComment( RepositorySlug slug, RepositoryCommit commit, { - @required String body, - String path, - int position, - @Deprecated('Use position parameter instead') int line, + required String body, + String? path, + int? position, + @Deprecated('Use position parameter instead') int? line, }) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(commit); final data = createNonNullMap({ 'body': body, - 'path': path, - 'position': position, - 'line': line, + 'path': path!, + 'position': position!, + 'line': line!, }); return github.postJSON, CommitComment>( '/repos/${slug.fullName}/commits/${commit.sha}/comments', @@ -405,7 +404,7 @@ class RepositoriesService extends Service { /// /// https://developer.github.com/v3/repos/comments/#get-a-single-commit-comment Future getCommitComment(RepositorySlug slug, - {@required int id}) async { + {required int id}) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(id); return github.getJSON, CommitComment>( @@ -423,7 +422,7 @@ class RepositoriesService extends Service { /// /// https://developer.github.com/v3/repos/comments/#update-a-commit-comment Future updateCommitComment(RepositorySlug slug, - {@required int id, @required String body}) async { + {required int id, required String body}) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(id); ArgumentError.checkNotNull(body); @@ -440,7 +439,7 @@ class RepositoriesService extends Service { /// /// https://developer.github.com/v3/repos/comments/#delete-a-commit-comment Future deleteCommitComment(RepositorySlug slug, - {@required int id}) async { + {required int id}) async { ArgumentError.checkNotNull(slug); return github .request( @@ -516,7 +515,7 @@ class RepositoriesService extends Service { /// is defined, the repository's default branch is used (usually master). /// /// API docs: https://developer.github.com/v3/repos/contents/#get-the-readme - Future getReadme(RepositorySlug slug, {String ref}) async { + Future getReadme(RepositorySlug slug, {String? ref}) async { ArgumentError.checkNotNull(slug); final headers = {}; @@ -533,9 +532,7 @@ class RepositoriesService extends Service { } }, convert: (Map input) { var file = GitHubFile.fromJson(input); - if (file != null && slug != null) { - file.sourceRepository = slug; - } + file.sourceRepository = slug; return file; }); } @@ -556,7 +553,7 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/contents/#get-contents Future getContents(RepositorySlug slug, String path, - {String ref}) async { + {String? ref}) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(path); var url = '/repos/${slug.fullName}/contents/$path'; @@ -567,7 +564,7 @@ class RepositoriesService extends Service { return github.getJSON( url, - convert: (input) { + convert: (dynamic input) { final contents = RepositoryContents(); if (input is Map) { // Weird one-off. If the content of `input` is JSON w/ a message @@ -608,14 +605,14 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/contents/#update-a-file Future updateFile(RepositorySlug slug, String path, String message, String content, String sha, - {String branch}) async { + {String? branch}) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(path); final map = createNonNullMap({ 'message': message, 'content': content, 'sha': sha, - 'branch': branch, + 'branch': branch!, }); final response = await github.request( 'PUT', @@ -648,7 +645,7 @@ class RepositoriesService extends Service { /// Gets an archive link for the specified repository and reference. /// /// API docs: https://developer.github.com/v3/repos/contents/#get-archive-link - Future getArchiveLink(RepositorySlug slug, String ref, + Future getArchiveLink(RepositorySlug slug, String ref, {String format = 'tarball'}) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(ref); @@ -676,7 +673,7 @@ class RepositoriesService extends Service { /// Creates a fork for the authenticated user. /// /// API docs: https://developer.github.com/v3/repos/forks/#create-a-fork - Future createFork(RepositorySlug slug, [CreateFork fork]) async { + Future createFork(RepositorySlug slug, [CreateFork? fork]) async { ArgumentError.checkNotNull(slug); fork ??= CreateFork(); return github.postJSON, Repository>( @@ -740,18 +737,18 @@ class RepositoriesService extends Service { Future editHook( RepositorySlug slug, Hook hookToEdit, { - String configUrl, - String configContentType, - String configSecret, - bool configInsecureSsl, - List events, - List addEvents, - List removeEvents, - bool active, + String? configUrl, + String? configContentType, + String? configSecret, + bool? configInsecureSsl, + List? events, + List? addEvents, + List? removeEvents, + bool? active, }) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(hookToEdit); - ArgumentError.checkNotNull(configUrl ?? hookToEdit.config.url); + ArgumentError.checkNotNull(configUrl ?? hookToEdit.config!.url); if (configContentType != 'json' && configContentType != 'form') { throw ArgumentError.value(configContentType, 'configContentType'); } @@ -765,9 +762,9 @@ class RepositoriesService extends Service { 'add_events': addEvents, 'remove_events': removeEvents, 'config': { - 'url': configUrl ?? hookToEdit.config.url, - 'content_type': configContentType ?? hookToEdit.config.contentType, - 'secret': configSecret ?? hookToEdit.config.secret, + 'url': configUrl ?? hookToEdit.config!.url, + 'content_type': configContentType ?? hookToEdit.config!.contentType, + 'secret': configSecret ?? hookToEdit.config!.secret, 'insecure_ssl': configInsecureSsl == null || !configInsecureSsl ? '0' : '1', }, @@ -836,7 +833,7 @@ class RepositoriesService extends Service { /// /// https://developer.github.com/v3/repos/keys/#get Future getDeployKey(RepositorySlug slug, - {@required int id}) async { + {required int id}) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(id); return github.getJSON, PublicKey>( @@ -865,7 +862,7 @@ class RepositoriesService extends Service { /// /// https://developer.github.com/v3/repos/keys/#delete Future deleteDeployKey( - {@required RepositorySlug slug, @required PublicKey key}) async { + {required RepositorySlug slug, required PublicKey key}) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(key); return github @@ -923,7 +920,7 @@ class RepositoriesService extends Service { ArgumentError.checkNotNull(slug); return github.getJSON( '/repos/${slug.fullName}/pages/builds/latest', - convert: (i) => PageBuild.fromJson(i), + convert: (dynamic i) => PageBuild.fromJson(i), statusCode: StatusCodes.OK, ); } @@ -973,10 +970,10 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/releases/#get-a-release-by-tag-name Future getReleaseByTagName( - RepositorySlug slug, String tagName) async { + RepositorySlug slug, String? tagName) async { return github.getJSON( '/repos/${slug.fullName}/releases/tags/$tagName', - convert: (i) => Release.fromJson(i), + convert: (dynamic i) => Release.fromJson(i), statusCode: StatusCodes.OK, fail: (http.Response response) { if (response.statusCode == 404) { @@ -1004,7 +1001,7 @@ class RepositoriesService extends Service { body: GitHubJson.encode(createRelease.toJson()), statusCode: StatusCodes.CREATED); if (release.hasErrors) { - final alreadyExistsErrorCode = release.errors.firstWhere( + final alreadyExistsErrorCode = release.errors!.firstWhere( (error) => error['code'] == 'already_exists', orElse: () => null, ); @@ -1035,12 +1032,12 @@ class RepositoriesService extends Service { Future editRelease( RepositorySlug slug, Release releaseToEdit, { - String tagName, - String targetCommitish, - String name, - String body, - bool draft, - bool preRelease, + String? tagName, + String? targetCommitish, + String? name, + String? body, + bool? draft, + bool? preRelease, }) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(releaseToEdit); @@ -1093,7 +1090,7 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/releases/#get-a-single-release-asset // TODO: implement a way to retrieve the asset's binary content Future getReleaseAsset(RepositorySlug slug, Release release, - {@required int assetId}) async { + {required int assetId}) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(release); return github.postJSON, ReleaseAsset>( @@ -1109,8 +1106,8 @@ class RepositoriesService extends Service { Future editReleaseAsset( RepositorySlug slug, ReleaseAsset assetToEdit, { - String name, - String label, + String? name, + String? label, }) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(assetToEdit); @@ -1155,7 +1152,7 @@ class RepositoriesService extends Service { ), headers: headers, body: createReleaseAsset.assetData, - convert: (i) => ReleaseAsset.fromJson(i)); + convert: (dynamic i) => ReleaseAsset.fromJson(i)); releaseAssets.add(releaseAsset); } return releaseAssets; @@ -1183,6 +1180,7 @@ class RepositoriesService extends Service { throw NotReady(github, path); } github.handleStatusCode(response); + throw UnknownError(github); } /// Fetches commit counts for the past year. @@ -1219,7 +1217,7 @@ class RepositoriesService extends Service { return github.getJSON( '/repos/${slug.fullName}/stats/participation', statusCode: StatusCodes.OK, - convert: (i) => ContributorParticipation.fromJson(i), + convert: (dynamic i) => ContributorParticipation.fromJson(i), ); } diff --git a/lib/src/common/search_service.dart b/lib/src/common/search_service.dart index 4418b6c6..72da0465 100644 --- a/lib/src/common/search_service.dart +++ b/lib/src/common/search_service.dart @@ -15,7 +15,7 @@ class SearchService extends Service { /// Since the Search Rate Limit is small, this is a best effort implementation. /// /// API docs: https://developer.github.com/v3/search/#search-repositories - Stream repositories(String query, {String sort, int pages = 2}) { + Stream repositories(String query, {String? sort, int pages = 2}) { final params = {'q': query}; if (sort != null) { params['sort'] = sort; @@ -65,17 +65,17 @@ class SearchService extends Service { /// https://developer.github.com/v3/search/#search-code Stream code( String query, { - int pages, - int perPage, - String language, - String filename, - String extension, - String user, - String org, - String repo, - String fork, - String path, - String size, + int? pages, + int? perPage, + String? language, + String? filename, + String? extension, + String? user, + String? org, + String? repo, + String? fork, + String? path, + String? size, bool inFile = true, bool inPath = false, }) { @@ -111,7 +111,7 @@ class SearchService extends Service { } final params = {}; - params['q'] = query ?? ''; + params['q'] = query; if (perPage != null) { params['per_page'] = perPage.toString(); } @@ -121,7 +121,7 @@ class SearchService extends Service { .map((r) => CodeSearchResults.fromJson(json.decode(r.body))); } - String _searchQualifier(String key, String value) { + String _searchQualifier(String key, String? value) { if (value != null && value.isNotEmpty) { return ' $key:$value'; } @@ -131,7 +131,7 @@ class SearchService extends Service { /// Search for issues and pull-requests using [query]. /// Since the Search Rate Limit is small, this is a best effort implementation. /// API docs: https://developer.github.com/v3/search/#search-issues - Stream issues(String query, {String sort, int pages = 2}) { + Stream issues(String query, {String? sort, int pages = 2}) { final params = {'q': query}; if (sort != null) { params['sort'] = sort; @@ -172,7 +172,7 @@ class SearchService extends Service { /// API docs: https://developer.github.com/v3/search/#search-users Stream users( String query, { - String sort, + String? sort, int pages = 2, int perPage = 30, }) { diff --git a/lib/src/common/url_shortener_service.dart b/lib/src/common/url_shortener_service.dart index 950b0844..0b1e296f 100644 --- a/lib/src/common/url_shortener_service.dart +++ b/lib/src/common/url_shortener_service.dart @@ -10,7 +10,7 @@ class UrlShortenerService extends Service { /// Shortens the provided [url]. An optional [code] can be provided to create /// your own vanity URL. - Future shortenUrl(String url, {String code}) { + Future shortenUrl(String url, {String? code}) { final params = {}; params['url'] = url; @@ -26,7 +26,7 @@ class UrlShortenerService extends Service { throw GitHubError(github, 'Failed to create shortened url!'); } - return response.headers['Location'].split('/').last; + return response.headers['Location']!.split('/').last; }); } } diff --git a/lib/src/common/users_service.dart b/lib/src/common/users_service.dart index e6e3b829..f7d7b619 100644 --- a/lib/src/common/users_service.dart +++ b/lib/src/common/users_service.dart @@ -15,20 +15,20 @@ class UsersService extends Service { /// Fetches the user specified by [name]. /// /// API docs: https://developer.github.com/v3/users/#get-a-single-user - Future getUser(String name) => - github.getJSON('/users/$name', convert: (i) => User.fromJson(i)); + Future getUser(String? name) => + github.getJSON('/users/$name', convert: (dynamic i) => User.fromJson(i)); /// Updates the Current User. /// /// API docs: https://developer.github.com/v3/users/#update-the-authenticated-user Future editCurrentUser( - {String name, - String email, - String blog, - String company, - String location, - bool hireable, - String bio}) { + {String? name, + String? email, + String? blog, + String? company, + String? location, + bool? hireable, + String? bio}) { final map = createNonNullMap({ 'name': name, 'email': email, @@ -43,12 +43,12 @@ class UsersService extends Service { '/user', body: GitHubJson.encode(map), statusCode: 200, - convert: (i) => CurrentUser.fromJson(i), + convert: (dynamic i) => CurrentUser.fromJson(i), ); } /// Fetches a list of users specified by [names]. - Stream getUsers(List names, {int pages}) async* { + Stream getUsers(List names, {int? pages}) async* { for (final name in names) { final user = await getUser(name); yield user; @@ -67,7 +67,7 @@ class UsersService extends Service { throw AccessForbidden(github); } }, - convert: (i) => CurrentUser.fromJson(i)); + convert: (dynamic i) => CurrentUser.fromJson(i)); /// Checks if a user exists. Future isUser(String name) => github @@ -79,21 +79,21 @@ class UsersService extends Service { /// Lists all users. /// /// API docs: https://developer.github.com/v3/users/#get-all-users - Stream listUsers({int pages, int since}) => - PaginationHelper(github).objects('GET', '/users', (i) => User.fromJson(i), + Stream listUsers({int? pages, int? since}) => + PaginationHelper(github).objects('GET', '/users', (dynamic i) => User.fromJson(i), pages: pages, params: {'since': since}); /// Lists all email addresses for the currently authenticated user. /// /// API docs: https://developer.github.com/v3/users/emails/#list-email-addresses-for-a-user Stream listEmails() => PaginationHelper(github) - .objects('GET', '/user/emails', (i) => UserEmail.fromJson(i)); + .objects('GET', '/user/emails', (dynamic i) => UserEmail.fromJson(i)); /// Add Emails /// /// API docs: https://developer.github.com/v3/users/emails/#add-email-addresses Stream addEmails(List emails) => PaginationHelper(github) - .objects('POST', '/user/emails', (i) => UserEmail.fromJson(i), + .objects('POST', '/user/emails', (dynamic i) => UserEmail.fromJson(i), statusCode: 201, body: GitHubJson.encode(emails)); /// Delete Emails @@ -108,7 +108,7 @@ class UsersService extends Service { /// /// API docs: https://developer.github.com/v3/users/followers/#list-followers-of-a-user Stream listUserFollowers(String user) => PaginationHelper(github) - .objects('GET', '/users/$user/followers', (i) => User.fromJson(i), + .objects('GET', '/users/$user/followers', (dynamic i) => User.fromJson(i), statusCode: 200); /// Check if the current user is following the specified user. @@ -147,14 +147,14 @@ class UsersService extends Service { /// /// API docs: https://developer.github.com/v3/users/followers/#list-followers-of-a-user Stream listCurrentUserFollowers() => PaginationHelper(github).objects( - 'GET', '/user/followers', (i) => User.fromJson(i), + 'GET', '/user/followers', (dynamic i) => User.fromJson(i), statusCode: 200); /// List current user following /// /// API docs: https://developer.github.com/v3/users/followers/#list-users-followed-by-the-authenticated-user Stream listCurrentUserFollowing() => PaginationHelper(github).objects( - 'GET', '/user/following', (i) => User.fromJson(i), + 'GET', '/user/following', (dynamic i) => User.fromJson(i), statusCode: 200); /// Lists the verified public keys for a [userLogin]. If no [userLogin] is specified, @@ -162,10 +162,10 @@ class UsersService extends Service { /// /// API docs: https://developer.github.com/v3/users/keys/#list-public-keys-for-a-user /// and https://developer.github.com/v3/users/keys/#list-your-public-keys - Stream listPublicKeys([String userLogin]) { + Stream listPublicKeys([String? userLogin]) { final path = userLogin == null ? '/user/keys' : '/users/$userLogin/keys'; return PaginationHelper(github) - .objects('GET', path, (i) => PublicKey.fromJson(i)); + .objects('GET', path, (dynamic i) => PublicKey.fromJson(i)); } // TODO: Implement getPublicKey: https://developer.github.com/v3/users/keys/#get-a-single-public-key diff --git a/lib/src/common/util/auth.dart b/lib/src/common/util/auth.dart index 9a11ea24..925ffc93 100644 --- a/lib/src/common/util/auth.dart +++ b/lib/src/common/util/auth.dart @@ -1,13 +1,13 @@ /// Authentication information. class Authentication { /// OAuth2 Token - final String token; + final String? token; /// GitHub Username - final String username; + final String? username; /// GitHub Password - final String password; + final String? password; /// Creates an [Authentication] instance that uses the specified OAuth2 [token]. Authentication.withToken(this.token) diff --git a/lib/src/common/util/crawler.dart b/lib/src/common/util/crawler.dart index 62018924..5b5a7f7e 100644 --- a/lib/src/common/util/crawler.dart +++ b/lib/src/common/util/crawler.dart @@ -12,9 +12,9 @@ class RepositoryCrawler { Stream scan(String path) async* { final contents = await github.repositories.getContents(slug, path); - for (final content in contents.tree) { + for (final content in contents.tree!) { if (content.type == 'dir') { - yield* scan(content.path); + yield* scan(content.path!); } else { yield content; } diff --git a/lib/src/common/util/errors.dart b/lib/src/common/util/errors.dart index a140f583..81fa72b2 100644 --- a/lib/src/common/util/errors.dart +++ b/lib/src/common/util/errors.dart @@ -2,10 +2,10 @@ import 'package:github/src/common.dart'; /// Error Generated by [GitHub] class GitHubError implements Exception { - final String message; - final String apiUrl; + final String? message; + final String? apiUrl; final GitHub github; - final Object source; + final Object? source; const GitHubError(this.github, this.message, {this.apiUrl, this.source}); @@ -31,7 +31,7 @@ class NotFound extends GitHubError { } class BadRequest extends GitHubError { - const BadRequest(GitHub github, [String msg = 'Not Found']) + const BadRequest(GitHub github, [String? msg = 'Not Found']) : super(github, msg); } @@ -43,7 +43,7 @@ class RepositoryNotFound extends NotFound { /// Release not found class ReleaseNotFound extends NotFound { - const ReleaseNotFound.fromTagName(GitHub github, String tagName) + const ReleaseNotFound.fromTagName(GitHub github, String? tagName) : super(github, 'Release for tagName $tagName Not Found.'); } @@ -55,7 +55,7 @@ class UserNotFound extends NotFound { /// GitHub Organization was not found class OrganizationNotFound extends NotFound { - const OrganizationNotFound(GitHub github, String organization) + const OrganizationNotFound(GitHub github, String? organization) : super(github, 'Organization Not Found: $organization'); } @@ -77,13 +77,13 @@ class RateLimitHit extends GitHubError { /// A GitHub Server Error class ServerError extends GitHubError { - ServerError(GitHub github, int statusCode, String message) + ServerError(GitHub github, int statusCode, String? message) : super(github, '${message ?? 'Server Error'} ($statusCode)'); } /// An Unknown Error class UnknownError extends GitHubError { - const UnknownError(GitHub github, [String message]) + const UnknownError(GitHub github, [String? message]) : super(github, message ?? 'Unknown Error'); } @@ -94,7 +94,7 @@ class NotAuthenticated extends GitHubError { } class InvalidJSON extends BadRequest { - const InvalidJSON(GitHub github, [String message = 'Invalid JSON']) + const InvalidJSON(GitHub github, [String? message = 'Invalid JSON']) : super(github, message); } diff --git a/lib/src/common/util/json.dart b/lib/src/common/util/json.dart index 5912bfe9..ff922b0b 100644 --- a/lib/src/common/util/json.dart +++ b/lib/src/common/util/json.dart @@ -38,7 +38,7 @@ class GitHubJson { /// and it also deletes keys associated with null values in maps before converting them. /// /// The obtained String can be decoded using `jsonDecode`. - static String encode(Object object, {String indent}) { + static String encode(Object object, {String? indent}) { final encoder = JsonEncoder.withIndent(indent, _toEncodable); return encoder.convert(_checkObject(object)); } diff --git a/lib/src/common/util/oauth2.dart b/lib/src/common/util/oauth2.dart index 54788d1c..b69559cf 100644 --- a/lib/src/common/util/oauth2.dart +++ b/lib/src/common/util/oauth2.dart @@ -24,10 +24,10 @@ class OAuth2Flow { final List scopes; /// Redirect URI - final String redirectUri; + final String? redirectUri; /// State - final String state; + final String? state; /// Client Secret final String clientSecret; @@ -35,10 +35,10 @@ class OAuth2Flow { /// OAuth2 Base URL final String baseUrl; - GitHub github; + GitHub? github; OAuth2Flow(this.clientId, this.clientSecret, - {String redirectUri, + {String? redirectUri, this.scopes = const [], this.state, this.github, @@ -65,7 +65,7 @@ class OAuth2Flow { } /// Exchanges the given [code] for a token. - Future exchange(String code, [String origin]) { + Future exchange(String code, [String? origin]) { final headers = { 'Accept': 'application/json', 'content-type': 'application/json' @@ -82,8 +82,8 @@ class OAuth2Flow { 'redirect_uri': redirectUri }); - return (github == null ? http.Client() : github.client) - .post('$baseUrl/access_token', body: body, headers: headers) + return (github == null ? http.Client() : github!.client) + .post(Uri.parse('$baseUrl/access_token'), body: body, headers: headers) .then((response) { final json = jsonDecode(response.body) as Map; if (json['error'] != null) { @@ -97,9 +97,9 @@ class OAuth2Flow { /// Represents a response for exchanging a code for a token. class ExchangeResponse { - final String token; + final String? token; final List scopes; - final String tokenType; + final String? tokenType; ExchangeResponse(this.token, this.tokenType, this.scopes); } diff --git a/lib/src/common/util/pagination.dart b/lib/src/common/util/pagination.dart index 2e371835..8ed4090a 100644 --- a/lib/src/common/util/pagination.dart +++ b/lib/src/common/util/pagination.dart @@ -12,10 +12,10 @@ class PaginationHelper { PaginationHelper(this.github); Stream fetchStreamed(String method, String path, - {int pages, - Map headers, - Map params, - String body, + {int? pages, + Map? headers, + Map? params, + String? body, int statusCode = 200}) async* { var count = 0; const serverErrorBackOff = Duration(seconds: 10); @@ -62,9 +62,6 @@ class PaginationHelper { } final info = parseLinkHeader(link); - if (info == null) { - break; - } final next = info['next']; @@ -73,8 +70,7 @@ class PaginationHelper { } final nextUrl = Uri.parse(next); - final nextPageArg = nextUrl.queryParameters['page']; - assert(nextPageArg != null); + final nextPageArg = nextUrl.queryParameters['page']!; params['page'] = nextPageArg; } } @@ -82,13 +78,13 @@ class PaginationHelper { Stream jsonObjects( String method, String path, { - int pages, - Map headers, - Map params, - String body, + int? pages, + Map? headers, + Map? params, + String? body, int statusCode = 200, - String preview, - String arrayKey, + String? preview, + String? arrayKey, }) async* { headers ??= {}; if (preview != null) { @@ -106,11 +102,11 @@ class PaginationHelper { statusCode: statusCode, )) { final json = arrayKey == null - ? jsonDecode(response.body) as List + ? jsonDecode(response.body) as List? : (jsonDecode(response.body) as Map)[arrayKey]; for (final item in json) { - yield item as T; + yield (item as T?)!; } } } @@ -121,13 +117,13 @@ class PaginationHelper { String method, String path, JSONConverter converter, { - int pages, - Map headers, - Map params, - String body, + int? pages, + Map? headers, + Map? params, + String? body, int statusCode = 200, - String preview, - String arrayKey, + String? preview, + String? arrayKey, }) { return jsonObjects( method, diff --git a/lib/src/common/util/utils.dart b/lib/src/common/util/utils.dart index 92fdb7a2..655404bd 100644 --- a/lib/src/common/util/utils.dart +++ b/lib/src/common/util/utils.dart @@ -45,7 +45,7 @@ class OnlyWhen { /// Converts the [date] to GitHub's ISO-8601 format: /// /// The format is "YYYY-MM-DDTHH:mm:ssZ" -String dateToGitHubIso8601(DateTime date) { +String? dateToGitHubIso8601(DateTime? date) { if (date == null) { return null; } @@ -143,24 +143,15 @@ List> mapToList(Map input) { return out; } -/// Internal method to handle null for parsing dates. -DateTime parseDateTime(String input) { - if (input == null) { - return null; - } - - return DateTime.parse(input); -} - /// Returns a new map containing only the entries of [input] whose value is not null. /// /// If [recursive] is true, nested maps are also filtered. -Map createNonNullMap(Map input, {bool recursive = true}) { - final map = {}; +Map createNonNullMap(Map input, {bool recursive = true}) { + final map = {}; for (final entry in input.entries) { if (entry.value != null) { map[entry.key] = recursive && entry.value is Map - ? createNonNullMap(entry.value as Map, recursive: recursive) + ? createNonNullMap(entry.value as Map, recursive: recursive) as V? : entry.value; } } @@ -182,7 +173,7 @@ int parseFancyNumber(String input) { } else { final m = multipliers.keys.firstWhere((m) => input.endsWith(m)); input = input.substring(0, input.length - m.length); - value = num.parse(input) * multipliers[m]; + value = num.parse(input) * multipliers[m]! as int; } return value; diff --git a/lib/src/common/xplat_common.dart b/lib/src/common/xplat_common.dart index 5d7e7226..cc0bfcbb 100644 --- a/lib/src/common/xplat_common.dart +++ b/lib/src/common/xplat_common.dart @@ -16,7 +16,7 @@ Authentication findAuthenticationFromEnvironment() => /// The first one that exists is used as the github token to call [Authentication.withToken] with. /// If the above fails, the GITHUB_USERNAME and GITHUB_PASSWORD keys will be checked. /// If those keys both exist, then [Authentication.basic] will be used. -Authentication findAuthenticationInMap(Map map) { +Authentication? findAuthenticationInMap(Map map) { for (final key in COMMON_GITHUB_TOKEN_ENV_KEYS) { if (map.containsKey(key)) { return Authentication.withToken(map[key]); diff --git a/lib/src/const/language_color.dart b/lib/src/const/language_color.dart index 7c3d40d7..d3546670 100644 --- a/lib/src/const/language_color.dart +++ b/lib/src/const/language_color.dart @@ -1,10 +1,11 @@ // GENERATED CODE - DO NOT MODIFY BY HAND -// VERSION OF 2020-10-03T23:56:33.788466 +// VERSION OF 2021-02-14T13:29:43.072192 const languageColors = { '1C Enterprise': '#814CCC', '4D': '#EDEDED', 'ABAP': '#E8274B', + 'ABAP CDS': '#555E25', 'ABNF': '#EDEDED', 'AGS Script': '#B9D9FF', 'AL': '#3AA2B5', @@ -41,6 +42,7 @@ const languageColors = { 'Awk': '#EDEDED', 'Ballerina': '#FF5000', 'Batchfile': '#C1F12E', + 'Beef': '#A52F4E', 'Befunge': '#EDEDED', 'BibTeX': '#EDEDED', 'Bison': '#6A463F', @@ -50,8 +52,10 @@ const languageColors = { 'BlitzMax': '#CD6400', 'Bluespec': '#EDEDED', 'Boo': '#D4BEC1', + 'Boogie': '#C80FA0', 'Brainfuck': '#2F2530', 'Brightscript': '#EDEDED', + 'Browserslist': '#FFD539', 'C': '#555555', 'C#': '#178600', 'C++': '#F34B7D', @@ -78,7 +82,7 @@ const languageColors = { 'Clean': '#3F85AF', 'Click': '#E4E6F3', 'Clojure': '#DB5855', - 'Closure Templates': '#EDEDED', + 'Closure Templates': '#0D948F', 'Cloud Firestore Security Rules': '#EDEDED', 'CoNLL-U': '#EDEDED', 'CodeQL': '#EDEDED', @@ -212,6 +216,7 @@ const languageColors = { 'IRC log': '#EDEDED', 'Idris': '#B30000', 'Ignore List': '#EDEDED', + 'ImageJ Macro': '#99AAFF', 'Inform 7': '#EDEDED', 'Inno Setup': '#EDEDED', 'Io': '#A9188D', @@ -225,7 +230,6 @@ const languageColors = { 'JSON5': '#EDEDED', 'JSONLD': '#EDEDED', 'JSONiq': '#40D47E', - 'JSX': '#EDEDED', 'Jasmin': '#EDEDED', 'Java': '#B07219', 'Java Properties': '#EDEDED', @@ -251,6 +255,7 @@ const languageColors = { 'LSL': '#3D9970', 'LTspice Symbol': '#EDEDED', 'LabVIEW': '#EDEDED', + 'Lark': '#0B130F', 'Lasso': '#999999', 'Latte': '#F2A542', 'Lean': '#EDEDED', @@ -260,7 +265,7 @@ const languageColors = { 'Limbo': '#EDEDED', 'Linker Script': '#EDEDED', 'Linux Kernel Module': '#EDEDED', - 'Liquid': '#EDEDED', + 'Liquid': '#67B8DE', 'Literate Agda': '#EDEDED', 'Literate CoffeeScript': '#EDEDED', 'Literate Haskell': '#EDEDED', @@ -305,7 +310,7 @@ const languageColors = { 'MoonScript': '#EDEDED', 'Motorola 68K Assembly': '#EDEDED', 'Muse': '#EDEDED', - 'Mustache': '#EDEDED', + 'Mustache': '#724B3B', 'Myghty': '#EDEDED', 'NASL': '#EDEDED', 'NCL': '#28431F', @@ -313,6 +318,7 @@ const languageColors = { 'NL': '#EDEDED', 'NPM Config': '#EDEDED', 'NSIS': '#EDEDED', + 'NWScript': '#111522', 'Nearley': '#990000', 'Nemerle': '#3D3C6E', 'NetLinx': '#0AA0FF', @@ -327,6 +333,7 @@ const languageColors = { 'Nix': '#7E7EFF', 'Nu': '#C9DF40', 'NumPy': '#9C8AF9', + 'Nunjucks': '#3D8137', 'OCaml': '#3BE133', 'ObjDump': '#EDEDED', 'Object Data Instance Notation': '#EDEDED', @@ -346,7 +353,7 @@ const languageColors = { 'OpenSCAD': '#EDEDED', 'OpenStep Property List': '#EDEDED', 'OpenType Feature File': '#EDEDED', - 'Org': '#EDEDED', + 'Org': '#77AA99', 'Ox': '#EDEDED', 'Oxygene': '#CDD0E3', 'Oz': '#FAB738', @@ -412,9 +419,11 @@ const languageColors = { 'Raku': '#0000FB', 'Rascal': '#FFFAA0', 'Raw token data': '#EDEDED', + 'ReScript': '#ED5051', 'Readline Config': '#EDEDED', 'Reason': '#FF5847', 'Rebol': '#358A5B', + 'Record Jar': '#0673BA', 'Red': '#F50000', 'Redcode': '#EDEDED', 'Regular Expression': '#EDEDED', @@ -445,7 +454,7 @@ const languageColors = { 'SaltStack': '#646464', 'Sass': '#A53B70', 'Scala': '#C22D40', - 'Scaml': '#EDEDED', + 'Scaml': '#BD181A', 'Scheme': '#1E4AEC', 'Scilab': '#EDEDED', 'Self': '#0579AA', diff --git a/lib/src/server/hooks.dart b/lib/src/server/hooks.dart index bb3c1018..0625f4bd 100644 --- a/lib/src/server/hooks.dart +++ b/lib/src/server/hooks.dart @@ -30,7 +30,7 @@ class HookMiddleware { const Utf8Decoder().bind(request).join().then((content) { _eventController.add(HookEvent.fromJson( request.headers.value('X-GitHub-Event'), - jsonDecode(content) as Map)); + jsonDecode(content) as Map?)); request.response ..write(GitHubJson.encode({'handled': _eventController.hasListener})) ..close(); @@ -42,7 +42,7 @@ class HookServer extends HookMiddleware { final String host; final int port; - HttpServer _server; + late HttpServer _server; HookServer(this.port, [this.host = '0.0.0.0']); @@ -68,23 +68,23 @@ class HookServer extends HookMiddleware { class HookEvent { HookEvent(); - factory HookEvent.fromJson(String event, Map json) { + factory HookEvent.fromJson(String? event, Map? json) { if (event == 'pull_request') { - return PullRequestEvent.fromJson(json); + return PullRequestEvent.fromJson(json!); } else if (event == 'issues') { - return IssueEvent.fromJson(json); + return IssueEvent.fromJson(json!); } else if (event == 'issue_comment') { - return IssueCommentEvent.fromJson(json); + return IssueCommentEvent.fromJson(json!); } else if (event == 'repository') { - return RepositoryEvent.fromJson(json); + return RepositoryEvent.fromJson(json!); } return UnknownHookEvent(event, json); } } class UnknownHookEvent extends HookEvent { - final String event; - final Map data; + final String? event; + final Map? data; UnknownHookEvent(this.event, this.data); } @@ -96,9 +96,9 @@ class RepositoryEvent extends HookEvent { this.repository, this.sender, }); - String action; - Repository repository; - User sender; + String? action; + Repository? repository; + User? sender; factory RepositoryEvent.fromJson(Map input) => _$RepositoryEventFromJson(input); @@ -112,9 +112,9 @@ class IssueCommentEvent extends HookEvent { this.issue, this.comment, }); - String action; - Issue issue; - IssueComment comment; + String? action; + Issue? issue; + IssueComment? comment; factory IssueCommentEvent.fromJson(Map input) => _$IssueCommentEventFromJson(input); @@ -127,8 +127,8 @@ class ForkEvent extends HookEvent { this.forkee, this.sender, }); - Repository forkee; - User sender; + Repository? forkee; + User? sender; factory ForkEvent.fromJson(Map input) => _$ForkEventFromJson(input); @@ -145,12 +145,12 @@ class IssueEvent extends HookEvent { this.sender, this.repository, }); - String action; - User assignee; - IssueLabel label; - Issue issue; - User sender; - Repository repository; + String? action; + User? assignee; + IssueLabel? label; + Issue? issue; + User? sender; + Repository? repository; factory IssueEvent.fromJson(Map input) => _$IssueEventFromJson(input); @@ -166,11 +166,11 @@ class PullRequestEvent extends HookEvent { this.sender, this.repository, }); - String action; - int number; - PullRequest pullRequest; - User sender; - Repository repository; + String? action; + int? number; + PullRequest? pullRequest; + User? sender; + Repository? repository; factory PullRequestEvent.fromJson(Map input) => _$PullRequestEventFromJson(input); diff --git a/lib/src/server/hooks.g.dart b/lib/src/server/hooks.g.dart index 2c7dfcb5..867b54ef 100644 --- a/lib/src/server/hooks.g.dart +++ b/lib/src/server/hooks.g.dart @@ -8,7 +8,7 @@ part of 'hooks.dart'; RepositoryEvent _$RepositoryEventFromJson(Map json) { return RepositoryEvent( - action: json['action'] as String, + action: json['action'] as String?, repository: json['repository'] == null ? null : Repository.fromJson(json['repository'] as Map), @@ -27,7 +27,7 @@ Map _$RepositoryEventToJson(RepositoryEvent instance) => IssueCommentEvent _$IssueCommentEventFromJson(Map json) { return IssueCommentEvent( - action: json['action'] as String, + action: json['action'] as String?, issue: json['issue'] == null ? null : Issue.fromJson(json['issue'] as Map), @@ -62,7 +62,7 @@ Map _$ForkEventToJson(ForkEvent instance) => { IssueEvent _$IssueEventFromJson(Map json) { return IssueEvent( - action: json['action'] as String, + action: json['action'] as String?, assignee: json['assignee'] == null ? null : User.fromJson(json['assignee'] as Map), @@ -93,8 +93,8 @@ Map _$IssueEventToJson(IssueEvent instance) => PullRequestEvent _$PullRequestEventFromJson(Map json) { return PullRequestEvent( - action: json['action'] as String, - number: json['number'] as int, + action: json['action'] as String?, + number: json['number'] as int?, pullRequest: json['pull_request'] == null ? null : PullRequest.fromJson(json['pull_request'] as Map), diff --git a/pubspec.yaml b/pubspec.yaml index e070bcf8..ce4f32e5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,13 +4,14 @@ description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart environment: - sdk: '>=2.3.0 <3.0.0' + sdk: '>=2.12.0-259.12.beta <3.0.0' dependencies: http: '^0.12.0' http_parser: ^3.1.1 json_annotation: '>=2.0.0 <4.0.0' meta: ^1.1.0 + collection: ^1.15.0-nullsafety.4 dev_dependencies: build_runner: any @@ -21,3 +22,14 @@ dev_dependencies: pedantic: ^1.0.0 test: ^1.3.0 yaml: ^2.2.0 + +dependency_overrides: + http: ^0.13.0-nullsafety.0 + http_parser: ^4.0.0-nullsafety + json_annotation: ^4.0.0-nullsafety.0 + json_serializable: ^4.0.0-nullsafety.0 + meta: ^1.3.0-nullsafety.6 + mockito: ^5.0.0-nullsafety.5 + pedantic: ^1.10.0-nullsafety.3 + test: ^1.16.0-nullsafety.17 + yaml: ^3.0.0-nullsafety.0 \ No newline at end of file diff --git a/test/code_search_test.dart b/test/code_search_test.dart index 06ade1aa..3d60cf63 100644 --- a/test/code_search_test.dart +++ b/test/code_search_test.dart @@ -14,7 +14,7 @@ Future main() async { final results = await resultsStream.first; print('${results.totalCount} results'); var k = 1; - for (final i in results.items) { + for (final i in results.items!) { print('${k++} ${i.path}'); } exit(0); diff --git a/test/experiment/files.dart b/test/experiment/files.dart index 69d17e6f..37efa7b0 100755 --- a/test/experiment/files.dart +++ b/test/experiment/files.dart @@ -9,6 +9,6 @@ void main() { 'pubspec.yaml', ) .then((contents) => contents.file) - .then((file) => print(file.text)) + .then((file) => print(file?.text)) .then((_) => github.dispose()); } diff --git a/test/experiment/reactions.dart b/test/experiment/reactions.dart index 0b07d915..76f2a8b4 100644 --- a/test/experiment/reactions.dart +++ b/test/experiment/reactions.dart @@ -6,6 +6,6 @@ void main() { .listReactions(RepositorySlug('SpinlockLabs', 'github.dart'), 177, content: ReactionType.plusOne) .listen((Reaction r) { - print(ReactionType.fromString(r.content).emoji); + print(ReactionType.fromString(r.content)!.emoji); }); } diff --git a/test/experiment/search.dart b/test/experiment/search.dart index 1aacb5c1..57dc2beb 100755 --- a/test/experiment/search.dart +++ b/test/experiment/search.dart @@ -5,6 +5,6 @@ void main() { github.search.repositories('github').listen((repo) { print( - "${repo.fullName}: ${repo.description.isNotEmpty ? repo.description : "No Description"}"); + "${repo.fullName}: ${repo.description!.isNotEmpty ? repo.description : "No Description"}"); }).onDone(github.dispose); } diff --git a/test/git_integration_test.dart b/test/git_integration_test.dart index 1d95c676..68c3afbc 100644 --- a/test/git_integration_test.dart +++ b/test/git_integration_test.dart @@ -5,14 +5,14 @@ import 'package:github/github.dart'; import 'package:test/test.dart'; void main() { - String firstCommitSha; - String firstCommitTreeSha; + String? firstCommitSha; + String? firstCommitTreeSha; - String createdTreeSha; - String createdCommitSha; + String? createdTreeSha; + String? createdCommitSha; - GitHub github; - RepositorySlug slug; + late GitHub github; + late RepositorySlug slug; setUpAll(() { final authToken = Platform.environment['GITHUB_API_TOKEN']; @@ -30,8 +30,8 @@ void main() { // Test definitions. test('get last commit of master', () async { final branch = await github.repositories.getBranch(slug, 'master'); - firstCommitSha = branch.commit.sha; - firstCommitTreeSha = branch.commit.commit.sha; + firstCommitSha = branch.commit!.sha; + firstCommitTreeSha = branch.commit!.commit!.sha; }); test('create and get a new blob', () async { @@ -43,7 +43,7 @@ void main() { final fetchedBlob = await github.git.getBlob(slug, createdBlobSha); - final base64Decoded = base64Decode(fetchedBlob.content); + final base64Decoded = base64Decode(fetchedBlob.content!); expect(utf8.decode(base64Decoded), equals('bbb')); expect(fetchedBlob.encoding, equals('base64')); @@ -72,7 +72,7 @@ void main() { final fetchedTree = await github.git.getTree(slug, createdTreeSha); expect(fetchedTree.sha, equals(createdTreeSha)); - expect(fetchedTree.entries.length, equals(2)); + expect(fetchedTree.entries!.length, equals(2)); }); test('create and get a new commit', () async { @@ -87,8 +87,8 @@ void main() { final fetchedCommit = await github.git.getCommit(slug, createdCommitSha); expect(fetchedCommit.sha, equals(createdCommitSha)); expect(fetchedCommit.message, equals('My test commit')); - expect(fetchedCommit.tree.sha, equals(createdTreeSha)); - expect(fetchedCommit.parents.first.sha, equals(firstCommitSha)); + expect(fetchedCommit.tree!.sha, equals(createdTreeSha)); + expect(fetchedCommit.parents!.first.sha, equals(firstCommitSha)); }); test('update heads/master reference to new commit', () { @@ -103,8 +103,8 @@ void main() { final fetchedRef = await github.git.getReference(slug, 'heads/$branchName'); expect(fetchedRef.ref, equals('refs/heads/$branchName')); - expect(fetchedRef.object.type, equals('commit')); - expect(fetchedRef.object.sha, equals(createdCommitSha)); + expect(fetchedRef.object!.type, equals('commit')); + expect(fetchedRef.object!.sha, equals(createdCommitSha)); }); test('create and get a new tag', () async { @@ -122,8 +122,8 @@ void main() { expect(fetchedTag.tag, equals(tagName)); expect(fetchedTag.sha, equals(createdTagSha)); expect(fetchedTag.message, equals('Version 0.0.1')); - expect(fetchedTag.tagger.name, equals('aName')); - expect(fetchedTag.object.sha, equals(createdCommitSha)); + expect(fetchedTag.tagger!.name, equals('aName')); + expect(fetchedTag.object!.sha, equals(createdCommitSha)); // Create a reference for the tag. await github.git.createReference(slug, 'refs/tags/$tagName', createdTagSha); diff --git a/test/git_test.dart b/test/git_test.dart index 813f5946..b6d0ed41 100644 --- a/test/git_test.dart +++ b/test/git_test.dart @@ -9,9 +9,9 @@ import 'package:test/test.dart'; class MockGitHub extends Mock implements GitHub {} void main() { - MockGitHub github; - GitService git; - RepositorySlug repo; + late MockGitHub github; + late GitService git; + late RepositorySlug repo; const someSha = 'someSHA'; setUp(() { @@ -25,7 +25,7 @@ void main() { git.getBlob(repo, 'sh'); verify(github.getJSON('/repos/o/n/git/blobs/sh', - convert: (i) => GitBlob.fromJson(i), statusCode: StatusCodes.OK)); + convert: (dynamic i) => GitBlob.fromJson(i), statusCode: StatusCodes.OK)); }); }); @@ -36,7 +36,7 @@ void main() { verify(github.postJSON( '/repos/o/n/git/blobs', - convert: (i) => GitBlob.fromJson(i), + convert: (dynamic i) => GitBlob.fromJson(i), statusCode: StatusCodes.CREATED, body: GitHubJson.encode(blob), )); @@ -46,7 +46,7 @@ void main() { var blob = CreateGitBlob('bbb', 'utf-8'); git.createBlob(repo, blob); - final body = captureSentBody(github); + final body = captureSentBody(github)!; expect(body['content'], equals('bbb')); expect(body['encoding'], equals('utf-8')); }); @@ -57,7 +57,7 @@ void main() { git.getCommit(repo, 'sh'); verify(github.getJSON('/repos/o/n/git/commits/sh', - convert: (i) => GitCommit.fromJson(i), statusCode: StatusCodes.OK)); + convert: (dynamic i) => GitCommit.fromJson(i), statusCode: StatusCodes.OK)); }); }); @@ -68,7 +68,7 @@ void main() { verify(github.postJSON( '/repos/o/n/git/commits', - convert: (i) => GitCommit.fromJson(i), + convert: (dynamic i) => GitCommit.fromJson(i), statusCode: StatusCodes.CREATED, body: GitHubJson.encode(commit), )); @@ -80,14 +80,14 @@ void main() { final commit = CreateGitCommit('aMessage', 'aTreeSha') ..parents = ['parentSha1', 'parentSha2'] - ..committer = GitCommitUser('cName', 'cEmail', parseDateTime(date)) - ..author = GitCommitUser('aName', 'aEmail', parseDateTime(date)); + ..committer = GitCommitUser('cName', 'cEmail', DateTime.parse(date)) + ..author = GitCommitUser('aName', 'aEmail', DateTime.parse(date)); // when git.createCommit(repo, commit); // then - final body = captureSentBody(github); + final body = captureSentBody(github)!; expect(body['message'], equals('aMessage')); expect(body['tree'], equals('aTreeSha')); expect(body['parents'], equals(['parentSha1', 'parentSha2'])); @@ -105,7 +105,7 @@ void main() { git.getReference(repo, 'heads/b'); verify(github.getJSON('/repos/o/n/git/refs/heads/b', - convert: (i) => GitReference.fromJson(i), + convert: (dynamic i) => GitReference.fromJson(i), statusCode: StatusCodes.OK)); }); }); @@ -116,7 +116,7 @@ void main() { git.createReference(repo, someRef, someSha); verify(github.postJSON('/repos/o/n/git/refs', - convert: (i) => GitReference.fromJson(i), + convert: (dynamic i) => GitReference.fromJson(i), statusCode: StatusCodes.CREATED, body: GitHubJson.encode({'ref': someRef, 'sha': someSha}))); }); @@ -124,7 +124,7 @@ void main() { test('creates valid JSON body', () { git.createReference(repo, someRef, someSha); - final body = captureSentBody(github); + final body = captureSentBody(github)!; expect(body['ref'], equals(someRef)); expect(body['sha'], equals(someSha)); }); @@ -135,7 +135,7 @@ void main() { // given final expectedResponse = http.Response('{}', 200); - when(github.request(any, any, body: any, headers: any)) + when(github.request(any!, any!, body: any, headers: any)) .thenReturn(Future.value(expectedResponse)); // when @@ -149,7 +149,7 @@ void main() { test('creates valid JSON body', () { // given final expectedResponse = http.Response('{}', 200); - when(github.request(any, any, body: any, headers: any)) + when(github.request(any!, any!, body: any, headers: any)) .thenReturn(Future.value(expectedResponse)); // when @@ -157,8 +157,8 @@ void main() { // then final captured = verify(github.request( - any, - any, + any!, + any!, body: captureAny, headers: captureAny, )).captured; @@ -176,7 +176,7 @@ void main() { test('constructs correct path', () { // given final expectedResponse = http.Response('{}', 200); - when(github.request(any, any)).thenReturn(Future.value(expectedResponse)); + when(github.request(any!, any!)).thenReturn(Future.value(expectedResponse)); // when git.deleteReference(repo, 'heads/b'); @@ -191,7 +191,7 @@ void main() { git.getTag(repo, someSha); verify(github.getJSON('/repos/o/n/git/tags/someSHA', - convert: (i) => GitTag.fromJson(i), statusCode: StatusCodes.OK)); + convert: (dynamic i) => GitTag.fromJson(i), statusCode: StatusCodes.OK)); }); }); @@ -203,7 +203,7 @@ void main() { git.createTag(repo, createGitTag); verify(github.postJSON('/repos/o/n/git/tags', - convert: (i) => GitTag.fromJson(i), + convert: (dynamic i) => GitTag.fromJson(i), statusCode: StatusCodes.CREATED, body: GitHubJson.encode(createGitTag))); }); @@ -211,7 +211,7 @@ void main() { test('creates valid JSON body', () { git.createTag(repo, createGitTag); - final body = captureSentBody(github); + final body = captureSentBody(github)!; expect(body['tag'], equals('v0.0.1')); expect(body['message'], equals('a message')); expect(body['object'], equals(someSha)); @@ -225,7 +225,7 @@ void main() { git.getTree(repo, 'sh'); verify(github.getJSON('/repos/o/n/git/trees/sh', - convert: (j) => GitTree.fromJson(j), statusCode: StatusCodes.OK)); + convert: (dynamic j) => GitTree.fromJson(j), statusCode: StatusCodes.OK)); }); }); @@ -234,7 +234,7 @@ void main() { git.getTree(repo, 'sh', recursive: true); verify(github.getJSON('/repos/o/n/git/trees/sh?recursive=1', - convert: (j) => GitTree.fromJson(j), statusCode: StatusCodes.OK)); + convert: (dynamic j) => GitTree.fromJson(j), statusCode: StatusCodes.OK)); }); }); @@ -244,7 +244,7 @@ void main() { git.createTree(repo, createGitTree); verify(github.postJSON('/repos/o/n/git/trees', - convert: (j) => GitTree.fromJson(j), + convert: (dynamic j) => GitTree.fromJson(j), statusCode: StatusCodes.CREATED, body: GitHubJson.encode(createGitTree))); }); @@ -260,7 +260,7 @@ void main() { git.createTree(repo, tree); // then - final body = captureSentBody(github); + final body = captureSentBody(github)!; expect(body['tree'], isNotNull); expect(body['tree'][0]['path'], equals('file.rb')); expect(body['tree'][0]['mode'], equals('100644')); @@ -281,7 +281,7 @@ void main() { git.createTree(repo, tree); // then - final body = captureSentBody(github); + final body = captureSentBody(github)!; expect(body['tree'], isNotNull); expect(body['tree'][0]['path'], equals('file.rb')); expect(body['tree'][0]['mode'], equals('100644')); @@ -292,14 +292,14 @@ void main() { }); } -Map captureSentBody(MockGitHub github) { +Map? captureSentBody(MockGitHub github) { final bodyString = verify(github.postJSON( - any, + any!, convert: any, statusCode: any, body: captureAny, )).captured.single; - final body = jsonDecode(bodyString) as Map; + final body = jsonDecode(bodyString) as Map?; return body; } diff --git a/test/helper/http.dart b/test/helper/http.dart index 566611d3..2c5eaab4 100644 --- a/test/helper/http.dart +++ b/test/helper/http.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'package:collection/collection.dart' show IterableExtension; import 'package:http/http.dart' as http; import 'assets.dart'; @@ -12,10 +13,9 @@ class MockHTTPClient extends http.BaseClient { @override Future send(http.BaseRequest request) async { - final matchingUrlCreatorKey = responses.keys.firstWhere( - (it) => it.allMatches(request.url.toString()).isNotEmpty, - orElse: () => null); - final creator = responses[matchingUrlCreatorKey]; + final matchingUrlCreatorKey = responses.keys.firstWhereOrNull( + (it) => it.allMatches(request.url.toString()).isNotEmpty); + final creator = responses[matchingUrlCreatorKey!]; if (creator == null) { throw Exception('No Response Configured'); } @@ -35,13 +35,13 @@ class MockResponse extends http.Response { final headers = responseData['headers'] as Map; final dynamic body = responseData['body']; final int statusCode = responseData['statusCode']; - String actualBody; + String? actualBody; if (body is Map || body is List) { actualBody = jsonDecode(body); } else { actualBody = body.toString(); } - return MockResponse(actualBody, headers, statusCode); + return MockResponse(actualBody!, headers, statusCode); } } diff --git a/tool/language_color_generator.dart b/tool/language_color_generator.dart index 42fdcb66..a4710ca1 100644 --- a/tool/language_color_generator.dart +++ b/tool/language_color_generator.dart @@ -9,7 +9,7 @@ const _url = 'https://raw.githubusercontent.com/' 'github/linguist/master/lib/linguist/languages.yml'; Future main() async { - final response = await http.Client().get(_url); + final response = await http.Client().get(Uri.parse(_url)); final yaml = loadYaml(response.body) as YamlMap; @@ -25,7 +25,7 @@ Future main() async { for (var language in languages) { final color = - map[language]['color']?.toString()?.toUpperCase() ?? '#EDEDED'; + map[language]['color']?.toString().toUpperCase() ?? '#EDEDED'; language = language.replaceAll("'", "\\'"); From 9c3cc4128f327538876937829b2f841b2ad9dfe5 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sun, 14 Feb 2021 13:38:42 -0700 Subject: [PATCH 198/390] Fix github actions for 2.12 beta & keep analysis options the same --- .github/workflows/dart.yml | 2 +- analysis_options.yaml | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/dart.yml b/.github/workflows/dart.yml index 255bcec2..bf092d26 100644 --- a/.github/workflows/dart.yml +++ b/.github/workflows/dart.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest container: - image: google/dart:latest + image: google/dart:2.12-beta steps: - uses: actions/checkout@v1 diff --git a/analysis_options.yaml b/analysis_options.yaml index c8f57997..442b7c0c 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1,9 +1,9 @@ include: package:pedantic/analysis_options.yaml -# analyzer: -# strong-mode: -# implicit-casts: true -# implicit-dynamic: true +analyzer: + strong-mode: + implicit-casts: true + implicit-dynamic: true linter: rules: From bf618a7b6445deed5c1a67c0bc34e940848ee06c Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sun, 14 Feb 2021 13:41:08 -0700 Subject: [PATCH 199/390] dart format :sigh: --- example/repos.dart | 6 ++- lib/src/common/activity_service.dart | 50 ++++++++++++---------- lib/src/common/authorizations_service.dart | 4 +- lib/src/common/gists_service.dart | 8 ++-- lib/src/common/git_service.dart | 15 ++++--- lib/src/common/github.dart | 2 +- lib/src/common/issues_service.dart | 17 +++++--- lib/src/common/misc_service.dart | 3 +- lib/src/common/model/checks.dart | 2 +- lib/src/common/model/repos.dart | 3 +- lib/src/common/orgs_service.dart | 12 +++--- lib/src/common/pulls_service.dart | 3 +- lib/src/common/repos_service.dart | 3 +- lib/src/common/users_service.dart | 4 +- test/git_test.dart | 18 +++++--- tool/language_color_generator.dart | 3 +- 16 files changed, 88 insertions(+), 65 deletions(-) diff --git a/example/repos.dart b/example/repos.dart index 277a181a..93101a1d 100644 --- a/example/repos.dart +++ b/example/repos.dart @@ -11,8 +11,10 @@ List? repos; Map> sorts = { 'stars': (Repository a, Repository b) => b.stargazersCount!.compareTo(a.stargazersCount!), - 'forks': (Repository a, Repository b) => b.forksCount!.compareTo(a.forksCount!), - 'created': (Repository a, Repository b) => b.createdAt!.compareTo(a.createdAt!), + 'forks': (Repository a, Repository b) => + b.forksCount!.compareTo(a.forksCount!), + 'created': (Repository a, Repository b) => + b.createdAt!.compareTo(a.createdAt!), 'pushed': (Repository a, Repository b) => b.pushedAt!.compareTo(a.pushedAt!), 'size': (Repository a, Repository b) => b.size!.compareTo(a.size!) }; diff --git a/lib/src/common/activity_service.dart b/lib/src/common/activity_service.dart index faf86e22..d07e5eb1 100644 --- a/lib/src/common/activity_service.dart +++ b/lib/src/common/activity_service.dart @@ -17,8 +17,9 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/events/#list-public-events Stream listPublicEvents({int pages = 2}) { - return PaginationHelper(github) - .objects('GET', '/events', (dynamic i) => Event.fromJson(i), pages: pages); + return PaginationHelper(github).objects( + 'GET', '/events', (dynamic i) => Event.fromJson(i), + pages: pages); } /// Lists public events for a network of repositories. @@ -26,8 +27,8 @@ class ActivityService extends Service { /// API docs: https://developer.github.com/v3/activity/events/#list-public-events-for-a-network-of-repositories Stream listRepositoryNetworkEvents(RepositorySlug slug, {int pages = 2}) { - return PaginationHelper(github).objects( - 'GET', '/networks/${slug.fullName}/events', (dynamic i) => Event.fromJson(i), + return PaginationHelper(github).objects('GET', + '/networks/${slug.fullName}/events', (dynamic i) => Event.fromJson(i), pages: pages); } @@ -47,8 +48,10 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/events/#list-repository-events Stream listRepositoryIssueEvents(RepositorySlug slug, {int? pages}) { - return PaginationHelper(github).objects('GET', - '/repos/${slug.fullName}/issues/events', (dynamic i) => Event.fromJson(i), + return PaginationHelper(github).objects( + 'GET', + '/repos/${slug.fullName}/issues/events', + (dynamic i) => Event.fromJson(i), pages: pages); } @@ -61,8 +64,8 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/events/#list-repository-events Stream listRepositoryEvents(RepositorySlug slug, {int? pages}) { - return PaginationHelper(github).objects( - 'GET', '/repos/${slug.fullName}/events', (dynamic i) => Event.fromJson(i), + return PaginationHelper(github).objects('GET', + '/repos/${slug.fullName}/events', (dynamic i) => Event.fromJson(i), pages: pages); } @@ -112,8 +115,8 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/events/#list-public-events-performed-by-a-user Stream listPublicEventsPerformedByUser(String username, {int? pages}) { - return PaginationHelper(github).objects( - 'GET', '/users/$username/events/public', (dynamic i) => Event.fromJson(i), + return PaginationHelper(github).objects('GET', + '/users/$username/events/public', (dynamic i) => Event.fromJson(i), pages: pages); } @@ -191,7 +194,8 @@ class ActivityService extends Service { /// API docs: https://developer.github.com/v3/activity/notifications/#view-a-single-thread Future getThread(String threadId) => github.getJSON('/notification/threads/$threadId', - statusCode: StatusCodes.OK, convert: (dynamic i) => Notification.fromJson(i)); + statusCode: StatusCodes.OK, + convert: (dynamic i) => Notification.fromJson(i)); /// Mark the specified notification thread as read. /// @@ -212,16 +216,16 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/starring/#list-stargazers Stream listStargazers(RepositorySlug slug) { - return PaginationHelper(github).objects( - 'GET', '/repos/${slug.fullName}/stargazers', (dynamic i) => User.fromJson(i)); + return PaginationHelper(github).objects('GET', + '/repos/${slug.fullName}/stargazers', (dynamic i) => User.fromJson(i)); } /// Lists all the repos starred by a user. /// /// API docs: https://developer.github.com/v3/activity/starring/#list-repositories-being-starred Stream listStarredByUser(String user) { - return PaginationHelper(github) - .objects('GET', '/users/$user/starred', (dynamic i) => Repository.fromJson(i)); + return PaginationHelper(github).objects( + 'GET', '/users/$user/starred', (dynamic i) => Repository.fromJson(i)); } /// Lists all the repos by the current user. @@ -267,24 +271,24 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/watching/#list-watchers Stream listWatchers(RepositorySlug slug) { - return PaginationHelper(github).objects( - 'GET', '/repos/${slug.fullName}/subscribers', (dynamic i) => User.fromJson(i)); + return PaginationHelper(github).objects('GET', + '/repos/${slug.fullName}/subscribers', (dynamic i) => User.fromJson(i)); } /// Lists the repositories the specified user is watching. /// /// API docs: https://developer.github.com/v3/activity/watching/#list-repositories-being-watched Stream listWatchedByUser(String user) { - return PaginationHelper(github).objects( - 'GET', '/users/$user/subscriptions', (dynamic i) => Repository.fromJson(i)); + return PaginationHelper(github).objects('GET', '/users/$user/subscriptions', + (dynamic i) => Repository.fromJson(i)); } /// Lists the repositories the current user is watching. /// /// API docs: https://developer.github.com/v3/activity/watching/#list-repositories-being-watched Stream listWatched() { - return PaginationHelper(github) - .objects('GET', '/user/subscriptions', (dynamic i) => Repository.fromJson(i)); + return PaginationHelper(github).objects( + 'GET', '/user/subscriptions', (dynamic i) => Repository.fromJson(i)); } /// Fetches repository subscription information. @@ -364,7 +368,9 @@ class EventPoller { for (final item in json) { final event = Event.fromJson(item); - if (after == null ? false : event.createdAt!.toUtc().isBefore(after)) { + if (after == null + ? false + : event.createdAt!.toUtc().isBefore(after)) { continue; } diff --git a/lib/src/common/authorizations_service.dart b/lib/src/common/authorizations_service.dart index f7337e01..5673001f 100644 --- a/lib/src/common/authorizations_service.dart +++ b/lib/src/common/authorizations_service.dart @@ -16,8 +16,8 @@ class AuthorizationsService extends Service { /// /// API docs: https://developer.github.com/v3/oauth_authorizations/#list-your-authorizations Stream listAuthorizations() { - return PaginationHelper(github) - .objects('GET', '/authorizations', (dynamic i) => Authorization.fromJson(i)); + return PaginationHelper(github).objects( + 'GET', '/authorizations', (dynamic i) => Authorization.fromJson(i)); } /// Fetches an authorization specified by [id]. diff --git a/lib/src/common/gists_service.dart b/lib/src/common/gists_service.dart index 87c7f3f0..dc0f7316 100644 --- a/lib/src/common/gists_service.dart +++ b/lib/src/common/gists_service.dart @@ -14,8 +14,8 @@ class GistsService extends Service { /// /// API docs: https://developer.github.com/v3/gists/#list-gists Stream listUserGists(String username) { - return PaginationHelper(github) - .objects('GET', '/users/$username/gists', (dynamic i) => Gist.fromJson(i)); + return PaginationHelper(github).objects( + 'GET', '/users/$username/gists', (dynamic i) => Gist.fromJson(i)); } /// Fetches the gists for the currently authenticated user. @@ -166,8 +166,8 @@ class GistsService extends Service { /// /// API docs: https://developer.github.com/v3/gists/comments/#list-comments-on-a-gist Stream listComments(String gistId) { - return PaginationHelper(github).objects( - 'GET', '/gists/$gistId/comments', (dynamic i) => GistComment.fromJson(i)); + return PaginationHelper(github).objects('GET', '/gists/$gistId/comments', + (dynamic i) => GistComment.fromJson(i)); } // TODO: Implement getComment: https://developer.github.com/v3/gists/comments/#get-a-single-comment diff --git a/lib/src/common/git_service.dart b/lib/src/common/git_service.dart index 9e358e5c..d3541ed8 100644 --- a/lib/src/common/git_service.dart +++ b/lib/src/common/git_service.dart @@ -15,7 +15,8 @@ class GitService extends Service { /// API docs: https://developer.github.com/v3/git/blobs/#get-a-blob Future getBlob(RepositorySlug slug, String? sha) => github.getJSON('/repos/${slug.fullName}/git/blobs/$sha', - convert: (dynamic i) => GitBlob.fromJson(i), statusCode: StatusCodes.OK); + convert: (dynamic i) => GitBlob.fromJson(i), + statusCode: StatusCodes.OK); /// Creates a blob with specified [blob] content. /// @@ -32,7 +33,8 @@ class GitService extends Service { /// API docs: https://developer.github.com/v3/git/commits/#get-a-commit Future getCommit(RepositorySlug slug, String? sha) => github.getJSON('/repos/${slug.fullName}/git/commits/$sha', - convert: (dynamic i) => GitCommit.fromJson(i), statusCode: StatusCodes.OK); + convert: (dynamic i) => GitCommit.fromJson(i), + statusCode: StatusCodes.OK); /// Creates a new commit in a repository. /// @@ -51,7 +53,8 @@ class GitService extends Service { /// API docs: https://developer.github.com/v3/git/refs/#get-a-reference Future getReference(RepositorySlug slug, String ref) => github.getJSON('/repos/${slug.fullName}/git/refs/$ref', - convert: (dynamic i) => GitReference.fromJson(i), statusCode: StatusCodes.OK); + convert: (dynamic i) => GitReference.fromJson(i), + statusCode: StatusCodes.OK); /// Lists the references in a repository. /// @@ -120,7 +123,8 @@ class GitService extends Service { /// API docs: https://developer.github.com/v3/git/tags/#get-a-tag Future getTag(RepositorySlug slug, String? sha) => github.getJSON('/repos/${slug.fullName}/git/tags/$sha', - convert: (dynamic i) => GitTag.fromJson(i), statusCode: StatusCodes.OK); + convert: (dynamic i) => GitTag.fromJson(i), + statusCode: StatusCodes.OK); /// Creates a new tag in a repository. /// @@ -145,7 +149,8 @@ class GitService extends Service { } return github.getJSON(path, - convert: (dynamic j) => GitTree.fromJson(j), statusCode: StatusCodes.OK); + convert: (dynamic j) => GitTree.fromJson(j), + statusCode: StatusCodes.OK); } /// Creates a new tree in a repository. diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index 951a527a..607c2731 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -368,7 +368,7 @@ class GitHub { } else { return response; } - + throw UnknownError(this); } diff --git a/lib/src/common/issues_service.dart b/lib/src/common/issues_service.dart index ec94d887..448da36f 100644 --- a/lib/src/common/issues_service.dart +++ b/lib/src/common/issues_service.dart @@ -196,8 +196,8 @@ class IssuesService extends Service { /// /// API docs: https://developer.github.com/v3/issues/assignees/#list-assignees Stream listAssignees(RepositorySlug slug) { - return PaginationHelper(github).objects( - 'GET', '/repos/${slug.fullName}/assignees', (dynamic i) => User.fromJson(i)); + return PaginationHelper(github).objects('GET', + '/repos/${slug.fullName}/assignees', (dynamic i) => User.fromJson(i)); } /// Checks if a user is an assignee for the specified repository. @@ -269,7 +269,9 @@ class IssuesService extends Service { /// API docs: https://developer.github.com/v3/issues/labels/#list-all-labels-for-this-repository Stream listLabels(RepositorySlug slug) { return PaginationHelper(github).objects( - 'GET', '/repos/${slug.fullName}/labels', (dynamic i) => IssueLabel.fromJson(i)); + 'GET', + '/repos/${slug.fullName}/labels', + (dynamic i) => IssueLabel.fromJson(i)); } /// Fetches a single label. @@ -277,7 +279,8 @@ class IssuesService extends Service { /// API docs: https://developer.github.com/v3/issues/labels/#get-a-single-label Future getLabel(RepositorySlug slug, String name) => github.getJSON('/repos/${slug.fullName}/labels/$name', - convert: (dynamic i) => IssueLabel.fromJson(i), statusCode: StatusCodes.OK); + convert: (dynamic i) => IssueLabel.fromJson(i), + statusCode: StatusCodes.OK); /// Creates a new label on the specified repository. /// @@ -373,8 +376,10 @@ class IssuesService extends Service { /// /// API docs: https://developer.github.com/v3/issues/milestones/#list-milestones-for-a-repository Stream listMilestones(RepositorySlug slug) { - return PaginationHelper(github).objects('GET', - '/repos/${slug.fullName}/milestones', (dynamic i) => Milestone.fromJson(i)); + return PaginationHelper(github).objects( + 'GET', + '/repos/${slug.fullName}/milestones', + (dynamic i) => Milestone.fromJson(i)); } // TODO: Implement getMilestone: https://developer.github.com/v3/issues/milestones/#get-a-single-milestone diff --git a/lib/src/common/misc_service.dart b/lib/src/common/misc_service.dart index 3c44b191..a0555360 100644 --- a/lib/src/common/misc_service.dart +++ b/lib/src/common/misc_service.dart @@ -69,7 +69,8 @@ class MiscService extends Service { /// Gets the GitHub API Status. Future getApiStatus() => github.getJSON('https://status.github.com/api/status.json', - statusCode: StatusCodes.OK, convert: (dynamic i) => APIStatus.fromJson(i)); + statusCode: StatusCodes.OK, + convert: (dynamic i) => APIStatus.fromJson(i)); /// Returns an ASCII Octocat with the specified [text]. Future getOctocat([String? text]) { diff --git a/lib/src/common/model/checks.dart b/lib/src/common/model/checks.dart index e5433947..c0e3797e 100644 --- a/lib/src/common/model/checks.dart +++ b/lib/src/common/model/checks.dart @@ -312,7 +312,7 @@ class CheckRunAction { required this.label, required this.description, required this.identifier, - }) : assert(label.length <= 20), + }) : assert(label.length <= 20), assert(description.length <= 40), assert(identifier.length <= 20); diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart index b46411ec..215e0f98 100644 --- a/lib/src/common/model/repos.dart +++ b/lib/src/common/model/repos.dart @@ -192,8 +192,7 @@ class Tag { Tag(this.name, this.commit, this.zipUrl, this.tarUrl); - factory Tag.fromJson(Map input) => - _$TagFromJson(input); + factory Tag.fromJson(Map input) => _$TagFromJson(input); @override String toString() => 'Tag: $name'; diff --git a/lib/src/common/orgs_service.dart b/lib/src/common/orgs_service.dart index b738f24f..86ebc0b6 100644 --- a/lib/src/common/orgs_service.dart +++ b/lib/src/common/orgs_service.dart @@ -75,8 +75,8 @@ class OrganizationsService extends Service { /// /// API docs: https://developer.github.com/v3/orgs/teams/#list-teams Stream listTeams(String orgName) { - return PaginationHelper(github) - .objects('GET', '/orgs/$orgName/teams', (dynamic i) => Team.fromJson(i)); + return PaginationHelper(github).objects( + 'GET', '/orgs/$orgName/teams', (dynamic i) => Team.fromJson(i)); } /// Gets the team specified by the [teamId]. @@ -193,8 +193,8 @@ class OrganizationsService extends Service { /// /// API docs: https://developer.github.com/v3/orgs/teams/#list-team-repos Stream listTeamRepositories(int teamId) { - return PaginationHelper(github) - .objects('GET', '/teams/$teamId/repos', (dynamic i) => Repository.fromJson(i)); + return PaginationHelper(github).objects( + 'GET', '/teams/$teamId/repos', (dynamic i) => Repository.fromJson(i)); } /// Checks if a team manages the specified repository. @@ -242,8 +242,8 @@ class OrganizationsService extends Service { /// /// API docs: https://developer.github.com/v3/orgs/hooks/#list-hooks Stream listHooks(String org) { - return PaginationHelper(github).objects( - 'GET', '/orgs/$org/hooks', (dynamic i) => Hook.fromJson(i)..repoName = org); + return PaginationHelper(github).objects('GET', '/orgs/$org/hooks', + (dynamic i) => Hook.fromJson(i)..repoName = org); } /// Fetches a single hook by [id]. diff --git a/lib/src/common/pulls_service.dart b/lib/src/common/pulls_service.dart index 8932682a..0f317745 100644 --- a/lib/src/common/pulls_service.dart +++ b/lib/src/common/pulls_service.dart @@ -43,7 +43,8 @@ class PullRequestsService extends Service { /// API docs: https://developer.github.com/v3/pulls/#get-a-single-pull-request Future get(RepositorySlug slug, int number) => github.getJSON('/repos/${slug.fullName}/pulls/$number', - convert: (dynamic i) => PullRequest.fromJson(i), statusCode: StatusCodes.OK); + convert: (dynamic i) => PullRequest.fromJson(i), + statusCode: StatusCodes.OK); /// Creates a Pull Request based on the given [request]. /// diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 2a9b1b37..98999163 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -832,8 +832,7 @@ class RepositoriesService extends Service { /// * [id]: id of the key to retrieve. /// /// https://developer.github.com/v3/repos/keys/#get - Future getDeployKey(RepositorySlug slug, - {required int id}) async { + Future getDeployKey(RepositorySlug slug, {required int id}) async { ArgumentError.checkNotNull(slug); ArgumentError.checkNotNull(id); return github.getJSON, PublicKey>( diff --git a/lib/src/common/users_service.dart b/lib/src/common/users_service.dart index f7d7b619..ac19ae69 100644 --- a/lib/src/common/users_service.dart +++ b/lib/src/common/users_service.dart @@ -79,8 +79,8 @@ class UsersService extends Service { /// Lists all users. /// /// API docs: https://developer.github.com/v3/users/#get-all-users - Stream listUsers({int? pages, int? since}) => - PaginationHelper(github).objects('GET', '/users', (dynamic i) => User.fromJson(i), + Stream listUsers({int? pages, int? since}) => PaginationHelper(github) + .objects('GET', '/users', (dynamic i) => User.fromJson(i), pages: pages, params: {'since': since}); /// Lists all email addresses for the currently authenticated user. diff --git a/test/git_test.dart b/test/git_test.dart index b6d0ed41..86abf2b0 100644 --- a/test/git_test.dart +++ b/test/git_test.dart @@ -25,7 +25,8 @@ void main() { git.getBlob(repo, 'sh'); verify(github.getJSON('/repos/o/n/git/blobs/sh', - convert: (dynamic i) => GitBlob.fromJson(i), statusCode: StatusCodes.OK)); + convert: (dynamic i) => GitBlob.fromJson(i), + statusCode: StatusCodes.OK)); }); }); @@ -57,7 +58,8 @@ void main() { git.getCommit(repo, 'sh'); verify(github.getJSON('/repos/o/n/git/commits/sh', - convert: (dynamic i) => GitCommit.fromJson(i), statusCode: StatusCodes.OK)); + convert: (dynamic i) => GitCommit.fromJson(i), + statusCode: StatusCodes.OK)); }); }); @@ -176,7 +178,8 @@ void main() { test('constructs correct path', () { // given final expectedResponse = http.Response('{}', 200); - when(github.request(any!, any!)).thenReturn(Future.value(expectedResponse)); + when(github.request(any!, any!)) + .thenReturn(Future.value(expectedResponse)); // when git.deleteReference(repo, 'heads/b'); @@ -191,7 +194,8 @@ void main() { git.getTag(repo, someSha); verify(github.getJSON('/repos/o/n/git/tags/someSHA', - convert: (dynamic i) => GitTag.fromJson(i), statusCode: StatusCodes.OK)); + convert: (dynamic i) => GitTag.fromJson(i), + statusCode: StatusCodes.OK)); }); }); @@ -225,7 +229,8 @@ void main() { git.getTree(repo, 'sh'); verify(github.getJSON('/repos/o/n/git/trees/sh', - convert: (dynamic j) => GitTree.fromJson(j), statusCode: StatusCodes.OK)); + convert: (dynamic j) => GitTree.fromJson(j), + statusCode: StatusCodes.OK)); }); }); @@ -234,7 +239,8 @@ void main() { git.getTree(repo, 'sh', recursive: true); verify(github.getJSON('/repos/o/n/git/trees/sh?recursive=1', - convert: (dynamic j) => GitTree.fromJson(j), statusCode: StatusCodes.OK)); + convert: (dynamic j) => GitTree.fromJson(j), + statusCode: StatusCodes.OK)); }); }); diff --git a/tool/language_color_generator.dart b/tool/language_color_generator.dart index a4710ca1..2bc948f1 100644 --- a/tool/language_color_generator.dart +++ b/tool/language_color_generator.dart @@ -24,8 +24,7 @@ Future main() async { final languages = map.keys.cast().toList(growable: false)..sort(); for (var language in languages) { - final color = - map[language]['color']?.toString().toUpperCase() ?? '#EDEDED'; + final color = map[language]['color']?.toString().toUpperCase() ?? '#EDEDED'; language = language.replaceAll("'", "\\'"); From 7337bd2bf8af3f3cfdfad86d6736200272e57a2e Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sun, 14 Feb 2021 15:36:08 -0700 Subject: [PATCH 200/390] nullsafe fixes 2 --- lib/src/common/activity_service.dart | 10 +++++----- lib/src/common/github.dart | 6 +++--- lib/src/common/model/repos.g.dart | 24 ++++++++++++------------ 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/lib/src/common/activity_service.dart b/lib/src/common/activity_service.dart index d07e5eb1..4145b0d1 100644 --- a/lib/src/common/activity_service.dart +++ b/lib/src/common/activity_service.dart @@ -336,7 +336,7 @@ class EventPoller { final List handledEvents = []; Timer? _timer; - StreamController? _controller; + StreamController? _controller; // ignore: close_sinks String? _lastFetched; @@ -385,20 +385,20 @@ class EventPoller { } _timer ??= Timer.periodic(Duration(seconds: interval!), (timer) { - final headers = {}; + final headers = {}; if (_lastFetched != null) { - headers['If-None-Match'] = _lastFetched; + headers['If-None-Match'] = _lastFetched ?? ''; } github.request('GET', path, headers: headers).then(handleEvent); }); } - final headers = {}; + final headers = {}; if (_lastFetched != null) { - headers['If-None-Match'] = _lastFetched; + headers['If-None-Match'] = _lastFetched ?? ''; } github.request('GET', path, headers: headers).then(handleEvent); diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index 607c2731..f69288a6 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -293,7 +293,7 @@ class GitHub { Future request( String method, String path, { - Map? headers, + Map? headers, Map? params, dynamic body, int? statusCode, @@ -307,7 +307,7 @@ class GitHub { await Future.delayed(waitTime); } - headers ??= {}; + headers ??= {}; if (preview != null) { headers['Accept'] = preview; @@ -346,7 +346,7 @@ class GitHub { } final request = http.Request(method, Uri.parse(url.toString())); - request.headers.addAll(headers as Map); + request.headers.addAll(headers); if (body != null) { if (body is List) { request.bodyBytes = body; diff --git a/lib/src/common/model/repos.g.dart b/lib/src/common/model/repos.g.dart index a80fe8b8..44c7deb8 100644 --- a/lib/src/common/model/repos.g.dart +++ b/lib/src/common/model/repos.g.dart @@ -20,18 +20,18 @@ Repository _$RepositoryFromJson(Map json) { return Repository( name: json['name'] as String?, id: json['id'] as int?, - fullName: json['fullName'] as String?, + fullName: json['full_name'] as String?, owner: json['owner'] == null ? null : UserInformation.fromJson(json['owner'] as Map), isPrivate: json['private'] as bool?, isFork: json['fork'] as bool?, - htmlUrl: json['htmlUrl'] as String?, + htmlUrl: json['html_url'] as String?, description: json['description'] as String?, - cloneUrl: json['cloneUrl'] as String?, - gitUrl: json['gitUrl'] as String?, - sshUrl: json['sshUrl'] as String?, - svnUrl: json['svnUrl'] as String?, + cloneUrl: json['clone_url'] as String?, + gitUrl: json['git_url'] as String?, + sshUrl: json['ssh_url'] as String?, + svnUrl: json['svn_url'] as String?, homepage: json['homepage'] as String?, size: json['size'] as int?, stargazersCount: json['stargazers_count'] as int?, @@ -66,16 +66,16 @@ Map _$RepositoryToJson(Repository instance) => { 'name': instance.name, 'id': instance.id, - 'fullName': instance.fullName, + 'full_name': instance.fullName, 'owner': instance.owner, 'private': instance.isPrivate, 'fork': instance.isFork, - 'htmlUrl': instance.htmlUrl, + 'html_url': instance.htmlUrl, 'description': instance.description, - 'cloneUrl': instance.cloneUrl, - 'sshUrl': instance.sshUrl, - 'svnUrl': instance.svnUrl, - 'gitUrl': instance.gitUrl, + 'clone_url': instance.cloneUrl, + 'ssh_url': instance.sshUrl, + 'svn_url': instance.svnUrl, + 'git_url': instance.gitUrl, 'homepage': instance.homepage, 'size': instance.size, 'stargazers_count': instance.stargazersCount, From 197f1eed1ce448db600fe8df76aad8297a7f9185 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sun, 14 Feb 2021 16:03:45 -0700 Subject: [PATCH 201/390] fix readme example --- example/readme.dart | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/example/readme.dart b/example/readme.dart index fa572b52..c901ff3e 100644 --- a/example/readme.dart +++ b/example/readme.dart @@ -1,4 +1,3 @@ -import 'dart:convert'; import 'dart:html'; import 'package:github/github.dart'; @@ -12,11 +11,6 @@ Future main() async { readmeDiv = querySelector('#readme'); var repo = RepositorySlug('SpinlockLabs', 'github.dart'); final readme = await github.repositories.getReadme(repo); - var markdown = readme.content; - if (readme.encoding == 'base64') { - markdown = String.fromCharCodes(base64.decode(markdown)); - } - print(markdown); - final html = await github.misc.renderMarkdown(markdown); + final html = await github.misc.renderMarkdown(readme.text); readmeDiv.appendHtml(html, treeSanitizer: NodeTreeSanitizer.trusted); } From f7bfe0a2b2e0723246f3c54a105a6624a6ff2ae5 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sun, 14 Feb 2021 16:31:11 -0700 Subject: [PATCH 202/390] Auto publish demos to gh-pages --- .github/workflows/publish_demos.yml | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 .github/workflows/publish_demos.yml diff --git a/.github/workflows/publish_demos.yml b/.github/workflows/publish_demos.yml new file mode 100644 index 00000000..2497fc56 --- /dev/null +++ b/.github/workflows/publish_demos.yml @@ -0,0 +1,25 @@ +name: Build and Deploy +on: + push: + branches: + - master +jobs: + build-and-deploy: + runs-on: ubuntu-latest + container: + image: google/dart:latest + steps: + - name: Checkout 🛎️ + uses: actions/checkout@v2.3.1 + + - name: Install and Build 🔧 + run: | + pub global activate webdev + webdev build -o build + rm build/example/packages + + - name: Deploy 🚀 + uses: JamesIves/github-pages-deploy-action@4.0.0 + with: + branch: gh-pages # The branch the action should deploy to. + folder: build/example # The folder the action should deploy. \ No newline at end of file From 45da5affae51719d3f9c5c2b22a2b6d3efca9196 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sun, 14 Feb 2021 18:31:43 -0700 Subject: [PATCH 203/390] Create publish_demos.yml --- .github/workflows/publish_demos.yml | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 .github/workflows/publish_demos.yml diff --git a/.github/workflows/publish_demos.yml b/.github/workflows/publish_demos.yml new file mode 100644 index 00000000..9f3cda2a --- /dev/null +++ b/.github/workflows/publish_demos.yml @@ -0,0 +1,25 @@ +name: Publish Demos +on: + push: + branches: + - master +jobs: + build-and-deploy: + runs-on: ubuntu-latest + container: + image: google/dart:latest + steps: + - name: Checkout 🛎️ + uses: actions/checkout@v2.3.1 + + - name: Install and Build 🔧 + run: | + pub global activate webdev + webdev build -o build + rm build/example/packages + + - name: Publish 🚀 + uses: JamesIves/github-pages-deploy-action@4.0.0 + with: + branch: gh-pages # The branch the action should deploy to. + folder: build/example # The folder the action should deploy. From 2ac25e20739bb2c7e3ab5f80577c24d0a276940a Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sun, 14 Feb 2021 18:54:51 -0700 Subject: [PATCH 204/390] Update publish_demos.yml --- .github/workflows/publish_demos.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish_demos.yml b/.github/workflows/publish_demos.yml index 9f3cda2a..c1cb0fea 100644 --- a/.github/workflows/publish_demos.yml +++ b/.github/workflows/publish_demos.yml @@ -15,7 +15,7 @@ jobs: - name: Install and Build 🔧 run: | pub global activate webdev - webdev build -o build + pub global run webdev build -o build rm build/example/packages - name: Publish 🚀 From eac5436f78ae5702560ed3e8d721c025c03f3065 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sun, 14 Feb 2021 18:56:46 -0700 Subject: [PATCH 205/390] Update publish_demos.yml --- .github/workflows/publish_demos.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/publish_demos.yml b/.github/workflows/publish_demos.yml index c1cb0fea..3c4553e8 100644 --- a/.github/workflows/publish_demos.yml +++ b/.github/workflows/publish_demos.yml @@ -15,6 +15,7 @@ jobs: - name: Install and Build 🔧 run: | pub global activate webdev + pub get pub global run webdev build -o build rm build/example/packages From 4a64951563163f43f845807256bbacd8c6d6f7ef Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sun, 14 Feb 2021 18:59:46 -0700 Subject: [PATCH 206/390] Update publish_demos.yml --- .github/workflows/publish_demos.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish_demos.yml b/.github/workflows/publish_demos.yml index 3c4553e8..9757c2bf 100644 --- a/.github/workflows/publish_demos.yml +++ b/.github/workflows/publish_demos.yml @@ -16,7 +16,7 @@ jobs: run: | pub global activate webdev pub get - pub global run webdev build -o build + pub global run webdev build -o build --delete-conflicting-outputs rm build/example/packages - name: Publish 🚀 From 0400be4d41d181439a0300c531a4fffd0c57e282 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sun, 14 Feb 2021 19:02:10 -0700 Subject: [PATCH 207/390] Update publish_demos.yml --- .github/workflows/publish_demos.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish_demos.yml b/.github/workflows/publish_demos.yml index 9757c2bf..796c3356 100644 --- a/.github/workflows/publish_demos.yml +++ b/.github/workflows/publish_demos.yml @@ -16,7 +16,7 @@ jobs: run: | pub global activate webdev pub get - pub global run webdev build -o build --delete-conflicting-outputs + pub global run webdev build -o build -- --delete-conflicting-outputs rm build/example/packages - name: Publish 🚀 From e5fc7b22656fafbd39722e05e42331b943146f19 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sun, 14 Feb 2021 19:10:36 -0700 Subject: [PATCH 208/390] Update publish_demos.yml --- .github/workflows/publish_demos.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/publish_demos.yml b/.github/workflows/publish_demos.yml index 796c3356..def1306a 100644 --- a/.github/workflows/publish_demos.yml +++ b/.github/workflows/publish_demos.yml @@ -14,6 +14,7 @@ jobs: - name: Install and Build 🔧 run: | + apt-get install rsync pub global activate webdev pub get pub global run webdev build -o build -- --delete-conflicting-outputs From 25532677d8a91c8e6b0e90b1b211fafb5baaeebb Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sun, 14 Feb 2021 19:27:13 -0700 Subject: [PATCH 209/390] Update publish_demos.yml --- .github/workflows/publish_demos.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish_demos.yml b/.github/workflows/publish_demos.yml index def1306a..a92beb58 100644 --- a/.github/workflows/publish_demos.yml +++ b/.github/workflows/publish_demos.yml @@ -12,9 +12,12 @@ jobs: - name: Checkout 🛎️ uses: actions/checkout@v2.3.1 + - name: Install rsync 📚 + run: | + apt-get update && apt-get install -y rsync + - name: Install and Build 🔧 run: | - apt-get install rsync pub global activate webdev pub get pub global run webdev build -o build -- --delete-conflicting-outputs From ab0710411c118e02298269ab7f31a87cde699aad Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sun, 14 Feb 2021 19:36:32 -0700 Subject: [PATCH 210/390] Update link to demos to gh pages --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2bcc18f6..90a42fc3 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ Please submit issues and pull requests, help out, or just give encouragement. ## Links -- [Library Demos](https://github.directcode.org/demos/) (based on the [sample code](https://github.com/SpinlockLabs/github.dart/tree/master/example)) +- [Library Demos](http://spinlocklabs.github.io/github.dart/) (based on the [sample code](https://github.com/SpinlockLabs/github.dart/tree/master/example)) - [Pub Package](https://pub.dartlang.org/packages/github) - [Wiki](https://github.com/SpinlockLabs/github.dart/wiki) - [Latest API reference](https://pub.dev/documentation/github/latest/) From d468c4718651c3ea21cb79836e253a6392708495 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Tue, 16 Feb 2021 19:31:28 -0700 Subject: [PATCH 211/390] Update dependencies to stable nullsafe versions --- pubspec.yaml | 31 ++++++++++--------------------- 1 file changed, 10 insertions(+), 21 deletions(-) diff --git a/pubspec.yaml b/pubspec.yaml index 8ed15ada..ea8426d8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 7.0.4 +version: 7.1.0-nullsafe.0 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart @@ -7,29 +7,18 @@ environment: sdk: '>=2.12.0-259.12.beta <3.0.0' dependencies: - collection: ^1.15.0-nullsafety.4 - http: '^0.12.0' - http_parser: ^3.1.1 - json_annotation: '>=2.0.0 <4.0.0' - meta: ^1.1.0 + collection: ^1.15.0 + http: ^0.13.0 + http_parser: ^4.0.0 + json_annotation: ^4.0.0 + meta: ^1.3.0 dev_dependencies: build_runner: any build_test: any build_web_compilers: any - json_serializable: ^3.2.2 - mockito: ^3.0.0 - pedantic: ^1.0.0 - test: ^1.3.0 - yaml: ^2.2.0 - -dependency_overrides: - http: ^0.13.0-nullsafety.0 - http_parser: ^4.0.0-nullsafety - json_annotation: ^4.0.0-nullsafety.0 - json_serializable: ^4.0.0-nullsafety.0 - meta: ^1.3.0-nullsafety.6 + json_serializable: ^4.0.0 mockito: ^5.0.0-nullsafety.5 - pedantic: ^1.10.0-nullsafety.3 - test: ^1.16.0-nullsafety.17 - yaml: ^3.0.0-nullsafety.0 \ No newline at end of file + pedantic: ^1.10.0 + test: ^1.16.0 + yaml: ^3.0.0 \ No newline at end of file From 0b4eca997c1dc25b54a62c4bfb508ab580e2a9e6 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Tue, 16 Feb 2021 19:58:26 -0700 Subject: [PATCH 212/390] add 7.10.0-nullsafe.0 to the changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1809a8fa..8d446932 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## 7.1.0-nullsafe.0 + - Update to null safety + ## 7.0.4 - Add hasPages attribute to Repository https://github.com/SpinlockLabs/github.dart/pull/238 From 9b91133793f287bf807ea28132f207400f6d6027 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Thu, 18 Feb 2021 11:36:38 -0700 Subject: [PATCH 213/390] address feedback --- CHANGELOG.md | 2 +- lib/src/common/model/repos.dart | 8 ++++---- lib/src/common/model/repos.g.dart | 10 ++++------ pubspec.yaml | 5 +++-- 4 files changed, 12 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d446932..43538e56 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## 7.1.0-nullsafe.0 +## 8.0.0-nullsafe.1 - Update to null safety ## 7.0.4 diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart index 0193a047..df9280a7 100644 --- a/lib/src/common/model/repos.dart +++ b/lib/src/common/model/repos.dart @@ -188,12 +188,12 @@ class Repository { @JsonSerializable(createToJson: false) class Tag { - final String? name; - final CommitInfo? commit; + final String name; + final CommitInfo commit; @JsonKey(name: 'zipball_url') - final String? zipUrl; + final String zipUrl; @JsonKey(name: 'tarball_url') - final String? tarUrl; + final String tarUrl; Tag(this.name, this.commit, this.zipUrl, this.tarUrl); diff --git a/lib/src/common/model/repos.g.dart b/lib/src/common/model/repos.g.dart index 1f9fccc9..550c0649 100644 --- a/lib/src/common/model/repos.g.dart +++ b/lib/src/common/model/repos.g.dart @@ -101,12 +101,10 @@ Map _$RepositoryToJson(Repository instance) => Tag _$TagFromJson(Map json) { return Tag( - json['name'] as String?, - json['commit'] == null - ? null - : CommitInfo.fromJson(json['commit'] as Map), - json['zipball_url'] as String?, - json['tarball_url'] as String?, + json['name'] as String, + CommitInfo.fromJson(json['commit'] as Map), + json['zipball_url'] as String, + json['tarball_url'] as String, ); } diff --git a/pubspec.yaml b/pubspec.yaml index ea8426d8..4e622285 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 7.1.0-nullsafe.0 +version: 8.0.0-nullsafe.1 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart @@ -21,4 +21,5 @@ dev_dependencies: mockito: ^5.0.0-nullsafety.5 pedantic: ^1.10.0 test: ^1.16.0 - yaml: ^3.0.0 \ No newline at end of file + yaml: ^3.0.0 + \ No newline at end of file From d5a15ba0d7f4c2e4d79575580bb5df6a6e643ef9 Mon Sep 17 00:00:00 2001 From: John Ryan Date: Mon, 1 Mar 2021 07:41:18 -0800 Subject: [PATCH 214/390] make hasPages nullable This threw an exception when I called GitHub().activity.listEventsPerformedByUser(username) --- lib/src/common/model/repos.dart | 2 +- lib/src/common/model/repos.g.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart index df9280a7..ff7cea33 100644 --- a/lib/src/common/model/repos.dart +++ b/lib/src/common/model/repos.dart @@ -137,7 +137,7 @@ class Repository { /// If the Repository has any Github Pages @JsonKey(name: 'has_pages') - final bool hasPages; + final bool? hasPages; /// Number of Forks @JsonKey(name: 'forks_count') diff --git a/lib/src/common/model/repos.g.dart b/lib/src/common/model/repos.g.dart index 550c0649..b26ce255 100644 --- a/lib/src/common/model/repos.g.dart +++ b/lib/src/common/model/repos.g.dart @@ -40,7 +40,7 @@ Repository _$RepositoryFromJson(Map json) { hasIssues: json['has_issues'] as bool?, hasWiki: json['has_wiki'] as bool?, hasDownloads: json['has_downloads'] as bool?, - hasPages: json['has_pages'] as bool, + hasPages: json['has_pages'] as bool?, forksCount: json['forks_count'] as int?, openIssuesCount: json['open_issues_count'] as int?, defaultBranch: json['default_branch'] as String?, From 3bc06b9d54c1aa6c62249d15bd6853f47eff488c Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Mon, 1 Mar 2021 15:44:56 -0700 Subject: [PATCH 215/390] Some nullsafe fixes --- example/index.dart | 4 +- example/languages.dart | 13 +- example/repos.dart | 17 +- example/stars.dart | 12 +- example/status.dart | 17 -- example/status.html | 22 --- lib/src/browser/xplat_browser.dart | 2 +- lib/src/common/model/authorizations.dart | 6 +- lib/src/common/model/authorizations.g.dart | 32 ++-- lib/src/common/model/gists.dart | 4 +- lib/src/common/model/gists.g.dart | 12 +- lib/src/common/model/git.dart | 24 +-- lib/src/common/model/git.g.dart | 4 +- lib/src/common/model/issues.dart | 75 +++++---- lib/src/common/model/issues.g.dart | 86 +++++----- lib/src/common/model/keys.dart | 4 +- lib/src/common/model/orgs.dart | 19 +-- lib/src/common/model/orgs.g.dart | 9 - lib/src/common/model/pulls.dart | 14 +- lib/src/common/model/pulls.g.dart | 114 ++++++------- lib/src/common/model/reaction.dart | 2 +- lib/src/common/model/reaction.g.dart | 10 +- lib/src/common/model/repos.dart | 187 +++++++++++---------- lib/src/common/model/repos.g.dart | 187 ++++++++++----------- lib/src/common/model/repos_commits.dart | 2 +- lib/src/common/model/repos_commits.g.dart | 20 +-- lib/src/common/model/repos_contents.dart | 6 +- lib/src/common/model/repos_forks.dart | 2 +- lib/src/common/model/repos_hooks.dart | 6 +- lib/src/common/model/repos_hooks.g.dart | 24 +-- lib/src/common/model/repos_merging.dart | 2 +- lib/src/common/model/repos_merging.g.dart | 4 +- lib/src/common/model/repos_pages.dart | 8 +- lib/src/common/model/repos_pages.g.dart | 20 +-- lib/src/common/model/repos_releases.dart | 6 +- lib/src/common/model/repos_releases.g.dart | 76 ++++----- lib/src/common/model/repos_stats.dart | 12 +- lib/src/common/model/repos_statuses.dart | 6 +- lib/src/common/model/repos_statuses.g.dart | 20 +-- lib/src/common/model/users.dart | 12 +- lib/src/common/model/users.g.dart | 72 ++++---- lib/src/common/repos_service.dart | 4 +- lib/src/server/hooks.dart | 10 +- lib/src/server/hooks.g.dart | 6 +- test/experiment/search.dart | 2 +- test/git_integration_test.dart | 4 +- tool/ci/retry.sh | 14 -- tool/publish.sh | 9 - tool/serve.sh | 2 - tool/update-demos.sh | 20 --- 50 files changed, 577 insertions(+), 668 deletions(-) delete mode 100644 example/status.dart delete mode 100644 example/status.html delete mode 100755 tool/ci/retry.sh delete mode 100755 tool/publish.sh delete mode 100755 tool/serve.sh delete mode 100755 tool/update-demos.sh diff --git a/example/index.dart b/example/index.dart index 3a0f10b2..9e2828b2 100644 --- a/example/index.dart +++ b/example/index.dart @@ -4,8 +4,8 @@ import 'common.dart'; void main() { final tokenInput = querySelector('#token') as InputElement; tokenInput.value = github.auth!.token ?? ''; - window.sessionStorage['GITHUB_TOKEN'] = tokenInput.value!; + window.localStorage['GITHUB_TOKEN'] = tokenInput.value!; tokenInput.onKeyUp.listen((_) { - window.sessionStorage['GITHUB_TOKEN'] = tokenInput.value!; + window.localStorage['GITHUB_TOKEN'] = tokenInput.value!; }); } diff --git a/example/languages.dart b/example/languages.dart index 93b6827e..56276f62 100644 --- a/example/languages.dart +++ b/example/languages.dart @@ -14,18 +14,9 @@ Future main() async { } Future loadRepository() async { - String? user = 'dart-lang'; - String? reponame = 'sdk'; - final params = queryString; - - if (params.containsKey('user')) { - user = params['user']; - } - - if (params.containsKey('repo')) { - reponame = params['repo']; - } + var user = params['user'] ?? 'dart-lang'; + var reponame = params['repo'] ?? 'sdk'; document.getElementById('name')!.setInnerHtml('$user/$reponame'); diff --git a/example/repos.dart b/example/repos.dart index 93101a1d..d3451366 100644 --- a/example/repos.dart +++ b/example/repos.dart @@ -10,13 +10,13 @@ List? repos; Map> sorts = { 'stars': (Repository a, Repository b) => - b.stargazersCount!.compareTo(a.stargazersCount!), + b.stargazersCount.compareTo(a.stargazersCount), 'forks': (Repository a, Repository b) => - b.forksCount!.compareTo(a.forksCount!), + b.forksCount.compareTo(a.forksCount), 'created': (Repository a, Repository b) => b.createdAt!.compareTo(a.createdAt!), 'pushed': (Repository a, Repository b) => b.pushedAt!.compareTo(a.pushedAt!), - 'size': (Repository a, Repository b) => b.size!.compareTo(a.size!) + 'size': (Repository a, Repository b) => b.size.compareTo(a.size) }; Future main() async { @@ -53,8 +53,8 @@ void updateRepos(

${repo.name}

- ${repo.description != "" && repo.description != null ? "Description: ${repo.description}
" : ""} - Language: ${repo.language ?? "Unknown"} + ${repo.description != "" ? "Description: ${repo.description}
" : ""} + Language: ${repo.language}
Default Branch: ${repo.defaultBranch}
@@ -79,7 +79,7 @@ void loadRepos([int Function(Repository a, Repository b)? compare]) { ..id = 'title'); } - String? user = 'SpinlockLabs'; + String? user = 'Workiva'; if (queryString.containsKey('user')) { user = queryString['user']; @@ -92,10 +92,13 @@ void loadRepos([int Function(Repository a, Repository b)? compare]) { } } - compare ??= (a, b) => a.name!.compareTo(b.name!); + compare ??= (a, b) => a.name.compareTo(b.name); github.repositories.listUserRepositories(user!).toList().then((repos) { _reposCache = repos; updateRepos(repos, compare); }); + + github.repositories.listTags(RepositorySlug('Workiva','font_face_observer')).toList(); + github.issues.listByRepo(RepositorySlug('Workiva','over_react')).toList().then((value) => print); } diff --git a/example/stars.dart b/example/stars.dart index 2901ea08..16767cfe 100644 --- a/example/stars.dart +++ b/example/stars.dart @@ -12,16 +12,8 @@ Future main() async { } void loadStars() { - String? user = 'SpinlockLabs'; - String? repo = 'github.dart'; - - if (queryString.containsKey('user')) { - user = queryString['user']; - } - - if (queryString.containsKey('repo')) { - repo = queryString['repo']; - } + var user = queryString['user'] ?? 'SpinlockLabs'; + var repo = queryString['repo'] ?? 'github.dart'; querySelector('#title')!.appendText(' for $user/$repo'); diff --git a/example/status.dart b/example/status.dart deleted file mode 100644 index fa42333a..00000000 --- a/example/status.dart +++ /dev/null @@ -1,17 +0,0 @@ -import 'dart:async'; -import 'dart:convert'; -import 'dart:html'; - -Future main() async { - final request = await HttpRequest.request( - 'https://status.github.com/api/status.json', - requestHeaders: {'Origin': window.location.origin}, - ); - - final text = request.responseText!; - final map = json.decode(text); - - querySelector('#status')! - ..appendText(map['status']) - ..classes.add('status-${map["status"]}'); -} diff --git a/example/status.html b/example/status.html deleted file mode 100644 index f0156762..00000000 --- a/example/status.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - GitHub Status - - - - - - - - -
-

-
- - - - - - diff --git a/lib/src/browser/xplat_browser.dart b/lib/src/browser/xplat_browser.dart index 79aeeb17..2f363fdc 100644 --- a/lib/src/browser/xplat_browser.dart +++ b/lib/src/browser/xplat_browser.dart @@ -10,7 +10,7 @@ import 'package:github/src/common/xplat_common.dart' Authentication findAuthenticationFromEnvironment() { // search the query string parameters first var auth = findAuthenticationInMap(_parseQuery(window.location.href)); - auth ??= findAuthenticationInMap(window.sessionStorage); + auth ??= findAuthenticationInMap(window.localStorage); return auth ?? Authentication.anonymous(); } diff --git a/lib/src/common/model/authorizations.dart b/lib/src/common/model/authorizations.dart index 2a9b7084..fa80708e 100644 --- a/lib/src/common/model/authorizations.dart +++ b/lib/src/common/model/authorizations.dart @@ -5,7 +5,7 @@ import 'package:json_annotation/json_annotation.dart'; part 'authorizations.g.dart'; /// Model class for an authorization. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class Authorization { Authorization( {this.id, @@ -34,7 +34,7 @@ class Authorization { } /// Model class for an application of an [Authorization]. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class AuthorizationApplication { AuthorizationApplication({this.url, this.name, this.clientId}); @@ -47,7 +47,7 @@ class AuthorizationApplication { Map toJson() => _$AuthorizationApplicationToJson(this); } -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class CreateAuthorization { CreateAuthorization(this.note, {this.scopes, this.noteUrl, this.clientId, this.clientSecret}); diff --git a/lib/src/common/model/authorizations.g.dart b/lib/src/common/model/authorizations.g.dart index 932857b3..6624b9f4 100644 --- a/lib/src/common/model/authorizations.g.dart +++ b/lib/src/common/model/authorizations.g.dart @@ -17,13 +17,13 @@ Authorization _$AuthorizationFromJson(Map json) { : AuthorizationApplication.fromJson( json['app'] as Map), note: json['note'] as String?, - noteUrl: json['note_url'] as String?, - createdAt: json['created_at'] == null + noteUrl: json['noteUrl'] as String?, + createdAt: json['createdAt'] == null ? null - : DateTime.parse(json['created_at'] as String), - updatedAt: json['updated_at'] == null + : DateTime.parse(json['createdAt'] as String), + updatedAt: json['updatedAt'] == null ? null - : DateTime.parse(json['updated_at'] as String), + : DateTime.parse(json['updatedAt'] as String), user: json['user'] == null ? null : User.fromJson(json['user'] as Map), @@ -37,9 +37,9 @@ Map _$AuthorizationToJson(Authorization instance) => 'token': instance.token, 'app': instance.app, 'note': instance.note, - 'note_url': instance.noteUrl, - 'created_at': instance.createdAt?.toIso8601String(), - 'updated_at': instance.updatedAt?.toIso8601String(), + 'noteUrl': instance.noteUrl, + 'createdAt': instance.createdAt?.toIso8601String(), + 'updatedAt': instance.updatedAt?.toIso8601String(), 'user': instance.user, }; @@ -48,7 +48,7 @@ AuthorizationApplication _$AuthorizationApplicationFromJson( return AuthorizationApplication( url: json['url'] as String?, name: json['name'] as String?, - clientId: json['client_id'] as String?, + clientId: json['clientId'] as String?, ); } @@ -57,7 +57,7 @@ Map _$AuthorizationApplicationToJson( { 'url': instance.url, 'name': instance.name, - 'client_id': instance.clientId, + 'clientId': instance.clientId, }; CreateAuthorization _$CreateAuthorizationFromJson(Map json) { @@ -65,9 +65,9 @@ CreateAuthorization _$CreateAuthorizationFromJson(Map json) { json['note'] as String?, scopes: (json['scopes'] as List?)?.map((e) => e as String).toList(), - noteUrl: json['note_url'] as String?, - clientId: json['client_id'] as String?, - clientSecret: json['client_secret'] as String?, + noteUrl: json['noteUrl'] as String?, + clientId: json['clientId'] as String?, + clientSecret: json['clientSecret'] as String?, ); } @@ -76,7 +76,7 @@ Map _$CreateAuthorizationToJson( { 'note': instance.note, 'scopes': instance.scopes, - 'note_url': instance.noteUrl, - 'client_id': instance.clientId, - 'client_secret': instance.clientSecret, + 'noteUrl': instance.noteUrl, + 'clientId': instance.clientId, + 'clientSecret': instance.clientSecret, }; diff --git a/lib/src/common/model/gists.dart b/lib/src/common/model/gists.dart index 0495e02e..dc225eb4 100644 --- a/lib/src/common/model/gists.dart +++ b/lib/src/common/model/gists.dart @@ -124,7 +124,7 @@ class GistHistoryEntry { } /// Model class for gist comments. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class GistComment { GistComment({ this.id, @@ -146,7 +146,7 @@ class GistComment { } /// Model class for a new gist comment to be created. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class CreateGistComment { CreateGistComment(this.body); String? body; diff --git a/lib/src/common/model/gists.g.dart b/lib/src/common/model/gists.g.dart index 982181f1..3d1f2197 100644 --- a/lib/src/common/model/gists.g.dart +++ b/lib/src/common/model/gists.g.dart @@ -81,12 +81,12 @@ GistComment _$GistCommentFromJson(Map json) { user: json['user'] == null ? null : User.fromJson(json['user'] as Map), - createdAt: json['created_at'] == null + createdAt: json['createdAt'] == null ? null - : DateTime.parse(json['created_at'] as String), - updatedAt: json['updated_at'] == null + : DateTime.parse(json['createdAt'] as String), + updatedAt: json['updatedAt'] == null ? null - : DateTime.parse(json['updated_at'] as String), + : DateTime.parse(json['updatedAt'] as String), body: json['body'] as String?, ); } @@ -95,8 +95,8 @@ Map _$GistCommentToJson(GistComment instance) => { 'id': instance.id, 'user': instance.user, - 'created_at': instance.createdAt?.toIso8601String(), - 'updated_at': instance.updatedAt?.toIso8601String(), + 'createdAt': instance.createdAt?.toIso8601String(), + 'updatedAt': instance.updatedAt?.toIso8601String(), 'body': instance.body, }; diff --git a/lib/src/common/model/git.dart b/lib/src/common/model/git.dart index 2223b370..861a7028 100644 --- a/lib/src/common/model/git.dart +++ b/lib/src/common/model/git.dart @@ -5,7 +5,7 @@ import 'package:json_annotation/json_annotation.dart'; part 'git.g.dart'; /// Model class for a blob. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class GitBlob { GitBlob({ this.content, @@ -28,7 +28,7 @@ class GitBlob { /// Model class for a new blob to be created. /// /// The [encoding] can be either 'utf-8' or 'base64'. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class CreateGitBlob { CreateGitBlob(this.content, this.encoding); @@ -44,7 +44,7 @@ class CreateGitBlob { /// /// Note: This is the raw [GitCommit]. The [RepositoryCommit] is a repository /// commit containing GitHub-specific information. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class GitCommit { GitCommit({ this.sha, @@ -73,7 +73,7 @@ class GitCommit { } /// Model class for a new commit to be created. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class CreateGitCommit { CreateGitCommit(this.message, this.tree, {this.parents, this.committer, this.author}); @@ -117,7 +117,7 @@ class GitCommitUser { } /// Model class for a GitHub tree. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class GitTree { String? sha; String? url; @@ -139,7 +139,7 @@ class GitTree { /// Model class for the contents of a tree structure. [GitTreeEntry] can /// represent either a blog, a commit (in the case of a submodule), or another /// tree. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class GitTreeEntry { String? path; String? mode; @@ -156,7 +156,7 @@ class GitTreeEntry { } /// Model class for a new tree to be created. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class CreateGitTree { CreateGitTree(this.entries, {this.baseTree}); @@ -176,7 +176,7 @@ class CreateGitTree { } /// Model class for a new tree entry to be created. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class CreateGitTreeEntry { /// Constructor. /// Either [sha] or [content] must be defined. @@ -199,7 +199,7 @@ class CreateGitTreeEntry { } /// Model class for a reference. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class GitReference { GitReference({ this.ref, @@ -216,7 +216,7 @@ class GitReference { } /// Model class for a tag. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class GitTag { GitTag({ this.tag, @@ -239,7 +239,7 @@ class GitTag { } /// Model class for a new tag to be created. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class CreateGitTag { CreateGitTag(this.tag, this.message, this.object, this.type, this.tagger); @@ -255,7 +255,7 @@ class CreateGitTag { } /// Model class for an object referenced by [GitReference] and [GitTag]. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class GitObject { GitObject(this.type, this.sha, this.url); String? type; diff --git a/lib/src/common/model/git.g.dart b/lib/src/common/model/git.g.dart index d596e7cb..2bb5e836 100644 --- a/lib/src/common/model/git.g.dart +++ b/lib/src/common/model/git.g.dart @@ -160,13 +160,13 @@ CreateGitTree _$CreateGitTreeFromJson(Map json) { (json['tree'] as List?) ?.map((e) => CreateGitTreeEntry.fromJson(e as Map)) .toList(), - baseTree: json['base_tree'] as String?, + baseTree: json['baseTree'] as String?, ); } Map _$CreateGitTreeToJson(CreateGitTree instance) => { - 'base_tree': instance.baseTree, + 'baseTree': instance.baseTree, 'tree': instance.entries, }; diff --git a/lib/src/common/model/issues.dart b/lib/src/common/model/issues.dart index 839b9296..a3e1aa65 100644 --- a/lib/src/common/model/issues.dart +++ b/lib/src/common/model/issues.dart @@ -5,52 +5,57 @@ import 'package:json_annotation/json_annotation.dart'; part 'issues.g.dart'; /// Model class for an issue on the tracker. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class Issue { Issue({ - this.id, - this.url, - this.htmlUrl, - this.number, - this.state, - this.title, + this.id = 0, + this.url = '', + this.htmlUrl = '', + this.number = 0, + this.state = '', + this.title = '', this.user, - this.labels, + this.labels = const [], this.assignee, this.milestone, - this.commentsCount, + this.commentsCount = 0, this.pullRequest, this.createdAt, this.closedAt, this.updatedAt, - this.body, + this.body = '', this.closedBy, }); - int? id; + /// Issue Labels + List labels = []; + + @JsonKey(defaultValue: 0) + int id; /// The api url. - String? url; + @JsonKey(defaultValue: '') + String url; /// Url to the Issue Page - @JsonKey(name: 'html_url') - String? htmlUrl; + @JsonKey(defaultValue: '') + String htmlUrl; /// Issue Number - int? number; + @JsonKey(defaultValue: 0) + int number; /// Issue State - String? state; + @JsonKey(defaultValue: '') + String state; /// Issue Title - String? title; + @JsonKey(defaultValue: '') + String title; /// User who created the issue. User? user; - /// Issue Labels - List? labels; - /// The User that the issue is assigned to User? assignee; @@ -58,8 +63,8 @@ class Issue { Milestone? milestone; /// Number of Comments - @JsonKey(name: 'comments') - int? commentsCount; + @JsonKey(name: 'comments', defaultValue: 0) + int commentsCount; /// A Pull Request @JsonKey(name: 'pull_request') @@ -77,7 +82,8 @@ class Issue { @JsonKey(name: 'updated_at') DateTime? updatedAt; - String? body; + @JsonKey(defaultValue: '') + String body; /// The user who closed the issue @JsonKey(name: 'closed_by') @@ -91,7 +97,7 @@ class Issue { } /// Model class for a request to create/edit an issue. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class IssueRequest { IssueRequest( {this.title, @@ -114,7 +120,7 @@ class IssueRequest { } /// Model class for a pull request for an issue. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class IssuePullRequest { IssuePullRequest({ this.htmlUrl, @@ -133,7 +139,7 @@ class IssuePullRequest { } /// Model class for an issue comment. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class IssueComment { IssueComment({ this.id, @@ -160,15 +166,18 @@ class IssueComment { } /// Model class for an issue label. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class IssueLabel { IssueLabel({ - this.name, - this.color, + this.name = '', + this.color = '', }); - String? name; - String? color; + @JsonKey(defaultValue: '') + String name; + + @JsonKey(defaultValue: '') + String color; factory IssueLabel.fromJson(Map input) => _$IssueLabelFromJson(input); @@ -179,7 +188,7 @@ class IssueLabel { } /// Model class for a milestone. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class Milestone { Milestone({ this.id, @@ -236,7 +245,7 @@ class Milestone { } /// Model class for a new milestone to be created. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class CreateMilestone { CreateMilestone( this.title, { diff --git a/lib/src/common/model/issues.g.dart b/lib/src/common/model/issues.g.dart index c82d7e12..10536791 100644 --- a/lib/src/common/model/issues.g.dart +++ b/lib/src/common/model/issues.g.dart @@ -8,17 +8,17 @@ part of 'issues.dart'; Issue _$IssueFromJson(Map json) { return Issue( - id: json['id'] as int?, - url: json['url'] as String?, - htmlUrl: json['html_url'] as String?, - number: json['number'] as int?, - state: json['state'] as String?, - title: json['title'] as String?, + id: json['id'] as int? ?? 0, + url: json['url'] as String? ?? '', + htmlUrl: json['htmlUrl'] as String? ?? '', + number: json['number'] as int? ?? 0, + state: json['state'] as String? ?? '', + title: json['title'] as String? ?? '', user: json['user'] == null ? null : User.fromJson(json['user'] as Map), - labels: (json['labels'] as List?) - ?.map((e) => IssueLabel.fromJson(e as Map)) + labels: (json['labels'] as List) + .map((e) => IssueLabel.fromJson(e as Map)) .toList(), assignee: json['assignee'] == null ? null @@ -26,7 +26,7 @@ Issue _$IssueFromJson(Map json) { milestone: json['milestone'] == null ? null : Milestone.fromJson(json['milestone'] as Map), - commentsCount: json['comments'] as int?, + commentsCount: json['comments'] as int? ?? 0, pullRequest: json['pull_request'] == null ? null : IssuePullRequest.fromJson( @@ -40,7 +40,7 @@ Issue _$IssueFromJson(Map json) { updatedAt: json['updated_at'] == null ? null : DateTime.parse(json['updated_at'] as String), - body: json['body'] as String?, + body: json['body'] as String? ?? '', closedBy: json['closed_by'] == null ? null : User.fromJson(json['closed_by'] as Map), @@ -48,14 +48,14 @@ Issue _$IssueFromJson(Map json) { } Map _$IssueToJson(Issue instance) => { + 'labels': instance.labels, 'id': instance.id, 'url': instance.url, - 'html_url': instance.htmlUrl, + 'htmlUrl': instance.htmlUrl, 'number': instance.number, 'state': instance.state, 'title': instance.title, 'user': instance.user, - 'labels': instance.labels, 'assignee': instance.assignee, 'milestone': instance.milestone, 'comments': instance.commentsCount, @@ -91,17 +91,17 @@ Map _$IssueRequestToJson(IssueRequest instance) => IssuePullRequest _$IssuePullRequestFromJson(Map json) { return IssuePullRequest( - htmlUrl: json['html_url'] as String?, - diffUrl: json['diff_url'] as String?, - patchUrl: json['patch_url'] as String?, + htmlUrl: json['htmlUrl'] as String?, + diffUrl: json['diffUrl'] as String?, + patchUrl: json['patchUrl'] as String?, ); } Map _$IssuePullRequestToJson(IssuePullRequest instance) => { - 'html_url': instance.htmlUrl, - 'diff_url': instance.diffUrl, - 'patch_url': instance.patchUrl, + 'htmlUrl': instance.htmlUrl, + 'diffUrl': instance.diffUrl, + 'patchUrl': instance.patchUrl, }; IssueComment _$IssueCommentFromJson(Map json) { @@ -111,15 +111,15 @@ IssueComment _$IssueCommentFromJson(Map json) { user: json['user'] == null ? null : User.fromJson(json['user'] as Map), - createdAt: json['created_at'] == null + createdAt: json['createdAt'] == null ? null - : DateTime.parse(json['created_at'] as String), - updatedAt: json['updated_at'] == null + : DateTime.parse(json['createdAt'] as String), + updatedAt: json['updatedAt'] == null ? null - : DateTime.parse(json['updated_at'] as String), + : DateTime.parse(json['updatedAt'] as String), url: json['url'] as String?, - htmlUrl: json['html_url'] as String?, - issueUrl: json['issue_url'] as String?, + htmlUrl: json['htmlUrl'] as String?, + issueUrl: json['issueUrl'] as String?, ); } @@ -128,17 +128,17 @@ Map _$IssueCommentToJson(IssueComment instance) => 'id': instance.id, 'body': instance.body, 'user': instance.user, - 'created_at': instance.createdAt?.toIso8601String(), - 'updated_at': instance.updatedAt?.toIso8601String(), + 'createdAt': instance.createdAt?.toIso8601String(), + 'updatedAt': instance.updatedAt?.toIso8601String(), 'url': instance.url, - 'html_url': instance.htmlUrl, - 'issue_url': instance.issueUrl, + 'htmlUrl': instance.htmlUrl, + 'issueUrl': instance.issueUrl, }; IssueLabel _$IssueLabelFromJson(Map json) { return IssueLabel( - name: json['name'] as String?, - color: json['color'] as String?, + name: json['name'] as String? ?? '', + color: json['color'] as String? ?? '', ); } @@ -160,15 +160,14 @@ Milestone _$MilestoneFromJson(Map json) { : User.fromJson(json['creator'] as Map), openIssuesCount: json['open_issues'] as int?, closedIssuesCount: json['closed_issues'] as int?, - createdAt: json['created_at'] == null + createdAt: json['createdAt'] == null ? null - : DateTime.parse(json['created_at'] as String), - updatedAt: json['updated_at'] == null + : DateTime.parse(json['createdAt'] as String), + updatedAt: json['updatedAt'] == null ? null - : DateTime.parse(json['updated_at'] as String), - dueOn: json['due_on'] == null - ? null - : DateTime.parse(json['due_on'] as String), + : DateTime.parse(json['updatedAt'] as String), + dueOn: + json['dueOn'] == null ? null : DateTime.parse(json['dueOn'] as String), ); } @@ -181,9 +180,9 @@ Map _$MilestoneToJson(Milestone instance) => { 'creator': instance.creator, 'open_issues': instance.openIssuesCount, 'closed_issues': instance.closedIssuesCount, - 'created_at': instance.createdAt?.toIso8601String(), - 'updated_at': instance.updatedAt?.toIso8601String(), - 'due_on': instance.dueOn?.toIso8601String(), + 'createdAt': instance.createdAt?.toIso8601String(), + 'updatedAt': instance.updatedAt?.toIso8601String(), + 'dueOn': instance.dueOn?.toIso8601String(), }; CreateMilestone _$CreateMilestoneFromJson(Map json) { @@ -191,9 +190,8 @@ CreateMilestone _$CreateMilestoneFromJson(Map json) { json['title'] as String?, state: json['state'] as String?, description: json['description'] as String?, - dueOn: json['due_on'] == null - ? null - : DateTime.parse(json['due_on'] as String), + dueOn: + json['dueOn'] == null ? null : DateTime.parse(json['dueOn'] as String), ); } @@ -202,5 +200,5 @@ Map _$CreateMilestoneToJson(CreateMilestone instance) => 'title': instance.title, 'state': instance.state, 'description': instance.description, - 'due_on': instance.dueOn?.toIso8601String(), + 'dueOn': instance.dueOn?.toIso8601String(), }; diff --git a/lib/src/common/model/keys.dart b/lib/src/common/model/keys.dart index 17c2a76e..1628a376 100644 --- a/lib/src/common/model/keys.dart +++ b/lib/src/common/model/keys.dart @@ -6,7 +6,7 @@ part 'keys.g.dart'; /// /// Note: [PublicKey] is used both by the repositories' deploy keys and by the /// users' public keys. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class PublicKey { PublicKey({ this.id, @@ -23,7 +23,7 @@ class PublicKey { } /// Model class for a new public key to be created. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class CreatePublicKey { CreatePublicKey(this.title, this.key); diff --git a/lib/src/common/model/orgs.dart b/lib/src/common/model/orgs.dart index 0130868e..c5878bfb 100644 --- a/lib/src/common/model/orgs.dart +++ b/lib/src/common/model/orgs.dart @@ -1,4 +1,3 @@ -import 'package:github/src/common.dart'; import 'package:json_annotation/json_annotation.dart'; part 'orgs.g.dart'; @@ -183,17 +182,17 @@ class TeamMember { } /// Model class for a team repository. -@JsonSerializable(createToJson: false) -class TeamRepository extends Repository { - TeamRepository({this.permissions}); +// @JsonSerializable(createToJson: false) +// class TeamRepository extends Repository { +// TeamRepository({this.permissions}); - /// Repository Permissions. - TeamRepositoryPermissions? permissions; +// /// Repository Permissions. +// TeamRepositoryPermissions? permissions; - factory TeamRepository.fromJson(Map input) { - return _$TeamRepositoryFromJson(input); - } -} +// factory TeamRepository.fromJson(Map input) { +// return _$TeamRepositoryFromJson(input); +// } +// } /// Model class for team repository permissions. @JsonSerializable(createToJson: false) diff --git a/lib/src/common/model/orgs.g.dart b/lib/src/common/model/orgs.g.dart index 407febd6..a12bbe5a 100644 --- a/lib/src/common/model/orgs.g.dart +++ b/lib/src/common/model/orgs.g.dart @@ -83,15 +83,6 @@ TeamMember _$TeamMemberFromJson(Map json) { ); } -TeamRepository _$TeamRepositoryFromJson(Map json) { - return TeamRepository( - permissions: json['permissions'] == null - ? null - : TeamRepositoryPermissions.fromJson( - json['permissions'] as Map), - ); -} - TeamRepositoryPermissions _$TeamRepositoryPermissionsFromJson( Map json) { return TeamRepositoryPermissions( diff --git a/lib/src/common/model/pulls.dart b/lib/src/common/model/pulls.dart index e5930035..2ba555bd 100644 --- a/lib/src/common/model/pulls.dart +++ b/lib/src/common/model/pulls.dart @@ -6,7 +6,7 @@ import 'package:meta/meta.dart'; part 'pulls.g.dart'; /// Model class for a Pull Request. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class PullRequest { PullRequest({ this.id, @@ -119,7 +119,7 @@ class PullRequest { } /// Model class for a pull request merge. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class PullRequestMerge { PullRequestMerge({ this.merged, @@ -136,7 +136,7 @@ class PullRequestMerge { } /// Model class for a Pull Request Head. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class PullRequestHead { PullRequestHead({ this.label, @@ -158,7 +158,7 @@ class PullRequestHead { } /// Model class for a pull request to be created. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class CreatePullRequest { CreatePullRequest(this.title, this.head, this.base, {this.draft = false, this.body}); @@ -182,7 +182,7 @@ class CreatePullRequest { } /// Model class for a pull request comment. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class PullRequestComment { PullRequestComment({ this.id, @@ -222,7 +222,7 @@ class PullRequestComment { } /// Model class for a pull request comment to be created. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class CreatePullRequestComment { CreatePullRequestComment(this.body, this.commitId, this.path, this.position); String? body; @@ -235,7 +235,7 @@ class CreatePullRequestComment { Map toJson() => _$CreatePullRequestCommentToJson(this); } -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class PullRequestFile { PullRequestFile({ this.sha, diff --git a/lib/src/common/model/pulls.g.dart b/lib/src/common/model/pulls.g.dart index 6c596cf7..47a3033e 100644 --- a/lib/src/common/model/pulls.g.dart +++ b/lib/src/common/model/pulls.g.dart @@ -9,25 +9,25 @@ part of 'pulls.dart'; PullRequest _$PullRequestFromJson(Map json) { return PullRequest( id: json['id'] as int?, - htmlUrl: json['html_url'] as String?, - diffUrl: json['diff_url'] as String?, - patchUrl: json['patch_url'] as String?, + htmlUrl: json['htmlUrl'] as String?, + diffUrl: json['diffUrl'] as String?, + patchUrl: json['patchUrl'] as String?, number: json['number'] as int?, state: json['state'] as String?, title: json['title'] as String?, body: json['body'] as String?, - createdAt: json['created_at'] == null + createdAt: json['createdAt'] == null ? null - : DateTime.parse(json['created_at'] as String), - updatedAt: json['updated_at'] == null + : DateTime.parse(json['createdAt'] as String), + updatedAt: json['updatedAt'] == null ? null - : DateTime.parse(json['updated_at'] as String), - closedAt: json['closed_at'] == null + : DateTime.parse(json['updatedAt'] as String), + closedAt: json['closedAt'] == null ? null - : DateTime.parse(json['closed_at'] as String), - mergedAt: json['merged_at'] == null + : DateTime.parse(json['closedAt'] as String), + mergedAt: json['mergedAt'] == null ? null - : DateTime.parse(json['merged_at'] as String), + : DateTime.parse(json['mergedAt'] as String), head: json['head'] == null ? null : PullRequestHead.fromJson(json['head'] as Map), @@ -38,17 +38,17 @@ PullRequest _$PullRequestFromJson(Map json) { ? null : User.fromJson(json['user'] as Map), draft: json['draft'] as bool?, - mergeCommitSha: json['merge_commit_sha'] as String?, + mergeCommitSha: json['mergeCommitSha'] as String?, merged: json['merged'] as bool?, mergeable: json['mergeable'] as bool?, - mergedBy: json['merged_by'] == null + mergedBy: json['mergedBy'] == null ? null - : User.fromJson(json['merged_by'] as Map), - commentsCount: json['comments_count'] as int?, - commitsCount: json['commits_count'] as int?, - additionsCount: json['additions_count'] as int?, - deletionsCount: json['deletions_count'] as int?, - changedFilesCount: json['changed_files_count'] as int?, + : User.fromJson(json['mergedBy'] as Map), + commentsCount: json['commentsCount'] as int?, + commitsCount: json['commitsCount'] as int?, + additionsCount: json['additionsCount'] as int?, + deletionsCount: json['deletionsCount'] as int?, + changedFilesCount: json['changedFilesCount'] as int?, labels: (json['labels'] as List?) ?.map((e) => IssueLabel.fromJson(e as Map)) .toList(), @@ -58,30 +58,30 @@ PullRequest _$PullRequestFromJson(Map json) { Map _$PullRequestToJson(PullRequest instance) => { 'id': instance.id, - 'html_url': instance.htmlUrl, - 'diff_url': instance.diffUrl, - 'patch_url': instance.patchUrl, + 'htmlUrl': instance.htmlUrl, + 'diffUrl': instance.diffUrl, + 'patchUrl': instance.patchUrl, 'number': instance.number, 'state': instance.state, 'title': instance.title, 'body': instance.body, - 'created_at': instance.createdAt?.toIso8601String(), - 'updated_at': instance.updatedAt?.toIso8601String(), - 'closed_at': instance.closedAt?.toIso8601String(), - 'merged_at': instance.mergedAt?.toIso8601String(), + 'createdAt': instance.createdAt?.toIso8601String(), + 'updatedAt': instance.updatedAt?.toIso8601String(), + 'closedAt': instance.closedAt?.toIso8601String(), + 'mergedAt': instance.mergedAt?.toIso8601String(), 'head': instance.head, 'base': instance.base, 'user': instance.user, 'draft': instance.draft, - 'merge_commit_sha': instance.mergeCommitSha, + 'mergeCommitSha': instance.mergeCommitSha, 'merged': instance.merged, 'mergeable': instance.mergeable, - 'merged_by': instance.mergedBy, - 'comments_count': instance.commentsCount, - 'commits_count': instance.commitsCount, - 'additions_count': instance.additionsCount, - 'deletions_count': instance.deletionsCount, - 'changed_files_count': instance.changedFilesCount, + 'mergedBy': instance.mergedBy, + 'commentsCount': instance.commentsCount, + 'commitsCount': instance.commitsCount, + 'additionsCount': instance.additionsCount, + 'deletionsCount': instance.deletionsCount, + 'changedFilesCount': instance.changedFilesCount, 'labels': instance.labels, }; @@ -145,24 +145,24 @@ Map _$CreatePullRequestToJson(CreatePullRequest instance) => PullRequestComment _$PullRequestCommentFromJson(Map json) { return PullRequestComment( id: json['id'] as int?, - diffHunk: json['diff_hunk'] as String?, + diffHunk: json['diffHunk'] as String?, path: json['path'] as String?, position: json['position'] as int?, - originalPosition: json['original_position'] as int?, - commitId: json['commit_id'] as String?, - originalCommitId: json['original_commit_id'] as String?, + originalPosition: json['originalPosition'] as int?, + commitId: json['commitId'] as String?, + originalCommitId: json['originalCommitId'] as String?, user: json['user'] == null ? null : User.fromJson(json['user'] as Map), body: json['body'] as String?, - createdAt: json['created_at'] == null + createdAt: json['createdAt'] == null ? null - : DateTime.parse(json['created_at'] as String), - updatedAt: json['updated_at'] == null + : DateTime.parse(json['createdAt'] as String), + updatedAt: json['updatedAt'] == null ? null - : DateTime.parse(json['updated_at'] as String), + : DateTime.parse(json['updatedAt'] as String), url: json['url'] as String?, - pullRequestUrl: json['pull_request_url'] as String?, + pullRequestUrl: json['pullRequestUrl'] as String?, links: json['_links'] == null ? null : Links.fromJson(json['_links'] as Map), @@ -172,18 +172,18 @@ PullRequestComment _$PullRequestCommentFromJson(Map json) { Map _$PullRequestCommentToJson(PullRequestComment instance) => { 'id': instance.id, - 'diff_hunk': instance.diffHunk, + 'diffHunk': instance.diffHunk, 'path': instance.path, 'position': instance.position, - 'original_position': instance.originalPosition, - 'commit_id': instance.commitId, - 'original_commit_id': instance.originalCommitId, + 'originalPosition': instance.originalPosition, + 'commitId': instance.commitId, + 'originalCommitId': instance.originalCommitId, 'user': instance.user, 'body': instance.body, - 'created_at': instance.createdAt?.toIso8601String(), - 'updated_at': instance.updatedAt?.toIso8601String(), + 'createdAt': instance.createdAt?.toIso8601String(), + 'updatedAt': instance.updatedAt?.toIso8601String(), 'url': instance.url, - 'pull_request_url': instance.pullRequestUrl, + 'pullRequestUrl': instance.pullRequestUrl, '_links': instance.links, }; @@ -191,7 +191,7 @@ CreatePullRequestComment _$CreatePullRequestCommentFromJson( Map json) { return CreatePullRequestComment( json['body'] as String?, - json['commit_id'] as String?, + json['commitId'] as String?, json['path'] as String?, json['position'] as int?, ); @@ -201,7 +201,7 @@ Map _$CreatePullRequestCommentToJson( CreatePullRequestComment instance) => { 'body': instance.body, - 'commit_id': instance.commitId, + 'commitId': instance.commitId, 'path': instance.path, 'position': instance.position, }; @@ -214,9 +214,9 @@ PullRequestFile _$PullRequestFileFromJson(Map json) { additionsCount: json['additions'] as int?, deletionsCount: json['deletions'] as int?, changesCount: json['changes'] as int?, - blobUrl: json['blob_url'] as String?, - rawUrl: json['raw_url'] as String?, - contentsUrl: json['contents_url'] as String?, + blobUrl: json['blobUrl'] as String?, + rawUrl: json['rawUrl'] as String?, + contentsUrl: json['contentsUrl'] as String?, patch: json['patch'] as String?, ); } @@ -229,8 +229,8 @@ Map _$PullRequestFileToJson(PullRequestFile instance) => 'additions': instance.additionsCount, 'deletions': instance.deletionsCount, 'changes': instance.changesCount, - 'blob_url': instance.blobUrl, - 'raw_url': instance.rawUrl, - 'contents_url': instance.contentsUrl, + 'blobUrl': instance.blobUrl, + 'rawUrl': instance.rawUrl, + 'contentsUrl': instance.contentsUrl, 'patch': instance.patch, }; diff --git a/lib/src/common/model/reaction.dart b/lib/src/common/model/reaction.dart index b0720ad8..00b8e4ac 100644 --- a/lib/src/common/model/reaction.dart +++ b/lib/src/common/model/reaction.dart @@ -8,7 +8,7 @@ part 'reaction.g.dart'; /// This API is currently in preview. It may break. /// /// See https://developer.github.com/v3/reactions/ -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class Reaction { final int? id; final String? nodeId; diff --git a/lib/src/common/model/reaction.g.dart b/lib/src/common/model/reaction.g.dart index 9c26c58b..9090875a 100644 --- a/lib/src/common/model/reaction.g.dart +++ b/lib/src/common/model/reaction.g.dart @@ -9,21 +9,21 @@ part of 'reaction.dart'; Reaction _$ReactionFromJson(Map json) { return Reaction( id: json['id'] as int?, - nodeId: json['node_id'] as String?, + nodeId: json['nodeId'] as String?, user: json['user'] == null ? null : User.fromJson(json['user'] as Map), content: json['content'] as String?, - createdAt: json['created_at'] == null + createdAt: json['createdAt'] == null ? null - : DateTime.parse(json['created_at'] as String), + : DateTime.parse(json['createdAt'] as String), ); } Map _$ReactionToJson(Reaction instance) => { 'id': instance.id, - 'node_id': instance.nodeId, + 'nodeId': instance.nodeId, 'user': instance.user, 'content': instance.content, - 'created_at': instance.createdAt?.toIso8601String(), + 'createdAt': instance.createdAt?.toIso8601String(), }; diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart index ff7cea33..2478f648 100644 --- a/lib/src/common/model/repos.dart +++ b/lib/src/common/model/repos.dart @@ -2,7 +2,7 @@ import 'package:github/src/common.dart'; import 'package:json_annotation/json_annotation.dart'; part 'repos.g.dart'; -@JsonSerializable(createToJson: false, fieldRename: FieldRename.snake) +@JsonSerializable(createToJson: false, ) class GitHubComparison { final String? url; final String? status; @@ -34,156 +34,168 @@ class GitHubComparison { } /// Model class for a repository. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class Repository { Repository({ - this.name, - this.id, - this.fullName, + this.name = '', + this.id = 0, + this.fullName = '', this.owner, - this.isPrivate, - this.isFork, - this.htmlUrl, - this.description, - this.cloneUrl, - this.gitUrl, - this.sshUrl, - this.svnUrl, - this.homepage, - this.size, - this.stargazersCount, - this.watchersCount, - this.language, - this.hasIssues, - this.hasWiki, - this.hasDownloads, - this.hasPages = false, - this.forksCount, - this.openIssuesCount, - this.defaultBranch, - this.subscribersCount, - this.networkCount, + this.htmlUrl = '', + this.description = '', + this.cloneUrl = '', + this.gitUrl = '', + this.sshUrl = '', + this.svnUrl = '', + this.defaultBranch = '', this.createdAt, + this.isPrivate = false, + this.isFork = false, + this.stargazersCount = 0, + this.watchersCount = 0, + this.language = '', + this.hasWiki = false, + this.hasDownloads = false, + this.forksCount = 0, + this.openIssuesCount = 0, + this.subscribersCount = 0, + this.networkCount = 0, + this.hasIssues = false, + this.size = 0, + this.archived = false, + this.disabled = false, + this.homepage = '', this.updatedAt, this.pushedAt, this.license, - this.archived, - this.disabled, + this.hasPages = false, }); /// Repository Name - final String? name; + @JsonKey(defaultValue: '') + final String name; /// Repository ID - final int? id; + @JsonKey(defaultValue: 0) + final int id; /// Full Repository Name - final String? fullName; + @JsonKey(defaultValue: '') + final String fullName; /// Repository Owner final UserInformation? owner; /// If the Repository is Private - @JsonKey(name: 'private') - final bool? isPrivate; + @JsonKey(name: 'private', defaultValue: false) + final bool isPrivate; /// If the Repository is a fork - @JsonKey(name: 'fork') - final bool? isFork; + @JsonKey(name: 'fork', defaultValue: false) + final bool isFork; /// Url to the GitHub Repository Page - final String? htmlUrl; + @JsonKey(defaultValue: '') + final String htmlUrl; /// Repository Description - final String? description; + @JsonKey(defaultValue: '') + final String description; // https clone URL - final String? cloneUrl; + @JsonKey(defaultValue: '') + final String cloneUrl; - final String? sshUrl; + @JsonKey(defaultValue: '') + final String sshUrl; - final String? svnUrl; + @JsonKey(defaultValue: '') + final String svnUrl; - final String? gitUrl; + @JsonKey(defaultValue: '') + final String gitUrl; /// Url to the Repository Homepage - final String? homepage; + @JsonKey(defaultValue: '') + final String homepage; /// Repository Size - final int? size; + @JsonKey(defaultValue: 0) + final int size; /// Repository Stars - @JsonKey(name: 'stargazers_count') - final int? stargazersCount; + @JsonKey(defaultValue: 0) + final int stargazersCount; /// Repository Watchers - @JsonKey(name: 'watchers_count') - final int? watchersCount; + @JsonKey(defaultValue: 0) + final int watchersCount; /// Repository Language - final String? language; + @JsonKey(defaultValue: '') + final String language; /// If the Repository has Issues Enabled - @JsonKey(name: 'has_issues') - final bool? hasIssues; + @JsonKey(defaultValue: false) + final bool hasIssues; /// If the Repository has the Wiki Enabled - @JsonKey(name: 'has_wiki') - final bool? hasWiki; + @JsonKey(defaultValue: false) + final bool hasWiki; /// If the Repository has any Downloads - @JsonKey(name: 'has_downloads') - final bool? hasDownloads; + @JsonKey(defaultValue: false) + final bool hasDownloads; /// If the Repository has any Github Pages - @JsonKey(name: 'has_pages') - final bool? hasPages; + @JsonKey(defaultValue: false) + final bool hasPages; /// Number of Forks - @JsonKey(name: 'forks_count') - final int? forksCount; + @JsonKey(defaultValue: 0) + final int forksCount; /// Number of Open Issues - @JsonKey(name: 'open_issues_count') - final int? openIssuesCount; + @JsonKey(defaultValue: 0) + final int openIssuesCount; /// Repository Default Branch - @JsonKey(name: 'default_branch') - final String? defaultBranch; + @JsonKey(defaultValue: '') + final String defaultBranch; /// Number of Subscribers - @JsonKey(name: 'subscribers_count') - final int? subscribersCount; + @JsonKey(defaultValue: 0) + final int subscribersCount; /// Number of users in the network - @JsonKey(name: 'network_count') - final int? networkCount; + @JsonKey(defaultValue: 0) + final int networkCount; /// The time the repository was created at - @JsonKey(name: 'created_at') final DateTime? createdAt; /// The last time the repository was pushed at - @JsonKey(name: 'pushed_at') final DateTime? pushedAt; - @JsonKey(name: 'updated_at') final DateTime? updatedAt; final LicenseKind? license; - final bool? archived; - final bool? disabled; + @JsonKey(defaultValue: false) + final bool archived; + + @JsonKey(defaultValue: false) + final bool disabled; factory Repository.fromJson(Map input) => _$RepositoryFromJson(input); Map toJson() => _$RepositoryToJson(this); /// Gets the Repository Slug (Full Name). - RepositorySlug slug() => RepositorySlug(owner!.login, name); + RepositorySlug slug() => RepositorySlug(owner?.login ?? '', name); @override - String toString() => 'Repository: ${owner!.login}/$name'; + String toString() => 'Repository: $owner/$name'; } @JsonSerializable(createToJson: false) @@ -203,7 +215,7 @@ class Tag { String toString() => 'Tag: $name'; } -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class CommitData { final String? sha; final GitCommit? commit; @@ -248,19 +260,19 @@ class CommitInfo { } /// User Information -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class UserInformation { /// Owner Username - final String? login; + final String login; /// Owner ID - final int? id; + final int id; /// Avatar Url - final String? avatarUrl; + final String avatarUrl; /// Url to the user's GitHub Profile - final String? htmlUrl; + final String htmlUrl; UserInformation(this.login, this.id, this.avatarUrl, this.htmlUrl); @@ -273,15 +285,12 @@ class UserInformation { @JsonSerializable() class RepositorySlug { /// Repository Owner - String? owner; + String owner; /// Repository Name - String? name; + String name; - RepositorySlug(this.owner, this.name) { - ArgumentError.checkNotNull(owner, 'owner'); - ArgumentError.checkNotNull(name, 'name'); - } + RepositorySlug(this.owner, this.name); /// Creates a Repository Slug from a full name. factory RepositorySlug.full(String f) { @@ -312,7 +321,7 @@ class RepositorySlug { } /// Model class for a new repository to be created. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class CreateRepository { CreateRepository(this.name, {this.description, @@ -424,7 +433,7 @@ class LanguageBreakdown { } } -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class LicenseDetails { final String? name; final String? path; @@ -466,7 +475,7 @@ class LicenseDetails { Map toJson() => _$LicenseDetailsToJson(this); } -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class LicenseKind { final String? key; final String? name; diff --git a/lib/src/common/model/repos.g.dart b/lib/src/common/model/repos.g.dart index b26ce255..219e4865 100644 --- a/lib/src/common/model/repos.g.dart +++ b/lib/src/common/model/repos.g.dart @@ -10,56 +10,56 @@ GitHubComparison _$GitHubComparisonFromJson(Map json) { return GitHubComparison( json['url'] as String?, json['status'] as String?, - json['ahead_by'] as int?, - json['behind_by'] as int?, - json['total_commits'] as int?, + json['aheadBy'] as int?, + json['behindBy'] as int?, + json['totalCommits'] as int?, ); } Repository _$RepositoryFromJson(Map json) { return Repository( - name: json['name'] as String?, - id: json['id'] as int?, - fullName: json['full_name'] as String?, + name: json['name'] as String? ?? '', + id: json['id'] as int? ?? 0, + fullName: json['fullName'] as String? ?? '', owner: json['owner'] == null ? null : UserInformation.fromJson(json['owner'] as Map), - isPrivate: json['private'] as bool?, - isFork: json['fork'] as bool?, - htmlUrl: json['html_url'] as String?, - description: json['description'] as String?, - cloneUrl: json['clone_url'] as String?, - gitUrl: json['git_url'] as String?, - sshUrl: json['ssh_url'] as String?, - svnUrl: json['svn_url'] as String?, - homepage: json['homepage'] as String?, - size: json['size'] as int?, - stargazersCount: json['stargazers_count'] as int?, - watchersCount: json['watchers_count'] as int?, - language: json['language'] as String?, - hasIssues: json['has_issues'] as bool?, - hasWiki: json['has_wiki'] as bool?, - hasDownloads: json['has_downloads'] as bool?, - hasPages: json['has_pages'] as bool?, - forksCount: json['forks_count'] as int?, - openIssuesCount: json['open_issues_count'] as int?, - defaultBranch: json['default_branch'] as String?, - subscribersCount: json['subscribers_count'] as int?, - networkCount: json['network_count'] as int?, - createdAt: json['created_at'] == null + htmlUrl: json['htmlUrl'] as String? ?? '', + description: json['description'] as String? ?? '', + cloneUrl: json['cloneUrl'] as String? ?? '', + gitUrl: json['gitUrl'] as String? ?? '', + sshUrl: json['sshUrl'] as String? ?? '', + svnUrl: json['svnUrl'] as String? ?? '', + defaultBranch: json['defaultBranch'] as String? ?? '', + createdAt: json['createdAt'] == null ? null - : DateTime.parse(json['created_at'] as String), - updatedAt: json['updated_at'] == null + : DateTime.parse(json['createdAt'] as String), + isPrivate: json['private'] as bool? ?? false, + isFork: json['fork'] as bool? ?? false, + stargazersCount: json['stargazersCount'] as int? ?? 0, + watchersCount: json['watchersCount'] as int? ?? 0, + language: json['language'] as String? ?? '', + hasWiki: json['hasWiki'] as bool? ?? false, + hasDownloads: json['hasDownloads'] as bool? ?? false, + forksCount: json['forksCount'] as int? ?? 0, + openIssuesCount: json['openIssuesCount'] as int? ?? 0, + subscribersCount: json['subscribersCount'] as int? ?? 0, + networkCount: json['networkCount'] as int? ?? 0, + hasIssues: json['hasIssues'] as bool? ?? false, + size: json['size'] as int? ?? 0, + archived: json['archived'] as bool? ?? false, + disabled: json['disabled'] as bool? ?? false, + homepage: json['homepage'] as String? ?? '', + updatedAt: json['updatedAt'] == null ? null - : DateTime.parse(json['updated_at'] as String), - pushedAt: json['pushed_at'] == null + : DateTime.parse(json['updatedAt'] as String), + pushedAt: json['pushedAt'] == null ? null - : DateTime.parse(json['pushed_at'] as String), + : DateTime.parse(json['pushedAt'] as String), license: json['license'] == null ? null : LicenseKind.fromJson(json['license'] as Map), - archived: json['archived'] as bool?, - disabled: json['disabled'] as bool?, + hasPages: json['hasPages'] as bool? ?? false, ); } @@ -67,33 +67,33 @@ Map _$RepositoryToJson(Repository instance) => { 'name': instance.name, 'id': instance.id, - 'full_name': instance.fullName, + 'fullName': instance.fullName, 'owner': instance.owner, 'private': instance.isPrivate, 'fork': instance.isFork, - 'html_url': instance.htmlUrl, + 'htmlUrl': instance.htmlUrl, 'description': instance.description, - 'clone_url': instance.cloneUrl, - 'ssh_url': instance.sshUrl, - 'svn_url': instance.svnUrl, - 'git_url': instance.gitUrl, + 'cloneUrl': instance.cloneUrl, + 'sshUrl': instance.sshUrl, + 'svnUrl': instance.svnUrl, + 'gitUrl': instance.gitUrl, 'homepage': instance.homepage, 'size': instance.size, - 'stargazers_count': instance.stargazersCount, - 'watchers_count': instance.watchersCount, + 'stargazersCount': instance.stargazersCount, + 'watchersCount': instance.watchersCount, 'language': instance.language, - 'has_issues': instance.hasIssues, - 'has_wiki': instance.hasWiki, - 'has_downloads': instance.hasDownloads, - 'has_pages': instance.hasPages, - 'forks_count': instance.forksCount, - 'open_issues_count': instance.openIssuesCount, - 'default_branch': instance.defaultBranch, - 'subscribers_count': instance.subscribersCount, - 'network_count': instance.networkCount, - 'created_at': instance.createdAt?.toIso8601String(), - 'pushed_at': instance.pushedAt?.toIso8601String(), - 'updated_at': instance.updatedAt?.toIso8601String(), + 'hasIssues': instance.hasIssues, + 'hasWiki': instance.hasWiki, + 'hasDownloads': instance.hasDownloads, + 'hasPages': instance.hasPages, + 'forksCount': instance.forksCount, + 'openIssuesCount': instance.openIssuesCount, + 'defaultBranch': instance.defaultBranch, + 'subscribersCount': instance.subscribersCount, + 'networkCount': instance.networkCount, + 'createdAt': instance.createdAt?.toIso8601String(), + 'pushedAt': instance.pushedAt?.toIso8601String(), + 'updatedAt': instance.updatedAt?.toIso8601String(), 'license': instance.license, 'archived': instance.archived, 'disabled': instance.disabled, @@ -115,8 +115,8 @@ CommitData _$CommitDataFromJson(Map json) { ? null : GitCommit.fromJson(json['commit'] as Map), json['url'] as String?, - json['html_url'] as String?, - json['comments_url'] as String?, + json['htmlUrl'] as String?, + json['commentsUrl'] as String?, json['author'] == null ? null : CommitDataUser.fromJson(json['author'] as Map), @@ -134,8 +134,8 @@ Map _$CommitDataToJson(CommitData instance) => 'sha': instance.sha, 'commit': instance.commit, 'url': instance.url, - 'html_url': instance.htmlUrl, - 'comments_url': instance.commentsUrl, + 'htmlUrl': instance.htmlUrl, + 'commentsUrl': instance.commentsUrl, 'author': instance.author, 'committer': instance.committer, 'parents': instance.parents, @@ -173,10 +173,10 @@ Map _$CommitInfoToJson(CommitInfo instance) => UserInformation _$UserInformationFromJson(Map json) { return UserInformation( - json['login'] as String?, - json['id'] as int?, - json['avatar_url'] as String?, - json['html_url'] as String?, + json['login'] as String, + json['id'] as int, + json['avatarUrl'] as String, + json['htmlUrl'] as String, ); } @@ -184,14 +184,14 @@ Map _$UserInformationToJson(UserInformation instance) => { 'login': instance.login, 'id': instance.id, - 'avatar_url': instance.avatarUrl, - 'html_url': instance.htmlUrl, + 'avatarUrl': instance.avatarUrl, + 'htmlUrl': instance.htmlUrl, }; RepositorySlug _$RepositorySlugFromJson(Map json) { return RepositorySlug( - json['owner'] as String?, - json['name'] as String?, + json['owner'] as String, + json['name'] as String, ); } @@ -207,13 +207,13 @@ CreateRepository _$CreateRepositoryFromJson(Map json) { description: json['description'] as String?, homepage: json['homepage'] as String?, private: json['private'] as bool?, - hasIssues: json['has_issues'] as bool?, - hasDownloads: json['has_downloads'] as bool?, - teamId: json['team_id'] as int?, - autoInit: json['auto_init'] as bool?, - gitignoreTemplate: json['gitignore_template'] as String?, - licenseTemplate: json['license_template'] as String?, - hasWiki: json['has_wiki'] as bool?, + hasIssues: json['hasIssues'] as bool?, + hasDownloads: json['hasDownloads'] as bool?, + teamId: json['teamId'] as int?, + autoInit: json['autoInit'] as bool?, + gitignoreTemplate: json['gitignoreTemplate'] as String?, + licenseTemplate: json['licenseTemplate'] as String?, + hasWiki: json['hasWiki'] as bool?, ); } @@ -223,13 +223,13 @@ Map _$CreateRepositoryToJson(CreateRepository instance) => 'description': instance.description, 'homepage': instance.homepage, 'private': instance.private, - 'has_issues': instance.hasIssues, - 'has_wiki': instance.hasWiki, - 'has_downloads': instance.hasDownloads, - 'team_id': instance.teamId, - 'auto_init': instance.autoInit, - 'gitignore_template': instance.gitignoreTemplate, - 'license_template': instance.licenseTemplate, + 'hasIssues': instance.hasIssues, + 'hasWiki': instance.hasWiki, + 'hasDownloads': instance.hasDownloads, + 'teamId': instance.teamId, + 'autoInit': instance.autoInit, + 'gitignoreTemplate': instance.gitignoreTemplate, + 'licenseTemplate': instance.licenseTemplate, }; Branch _$BranchFromJson(Map json) { @@ -254,12 +254,11 @@ LicenseDetails _$LicenseDetailsFromJson(Map json) { size: json['size'] as int?, url: json['url'] == null ? null : Uri.parse(json['url'] as String), htmlUrl: - json['html_url'] == null ? null : Uri.parse(json['html_url'] as String), - gitUrl: - json['git_url'] == null ? null : Uri.parse(json['git_url'] as String), - downloadUrl: json['download_url'] == null + json['htmlUrl'] == null ? null : Uri.parse(json['htmlUrl'] as String), + gitUrl: json['gitUrl'] == null ? null : Uri.parse(json['gitUrl'] as String), + downloadUrl: json['downloadUrl'] == null ? null - : Uri.parse(json['download_url'] as String), + : Uri.parse(json['downloadUrl'] as String), type: json['type'] as String?, content: json['content'] as String?, encoding: json['encoding'] as String?, @@ -279,9 +278,9 @@ Map _$LicenseDetailsToJson(LicenseDetails instance) => 'sha': instance.sha, 'size': instance.size, 'url': instance.url?.toString(), - 'html_url': instance.htmlUrl?.toString(), - 'git_url': instance.gitUrl?.toString(), - 'download_url': instance.downloadUrl?.toString(), + 'htmlUrl': instance.htmlUrl?.toString(), + 'gitUrl': instance.gitUrl?.toString(), + 'downloadUrl': instance.downloadUrl?.toString(), 'type': instance.type, 'content': instance.content, 'encoding': instance.encoding, @@ -293,9 +292,9 @@ LicenseKind _$LicenseKindFromJson(Map json) { return LicenseKind( key: json['key'] as String?, name: json['name'] as String?, - spdxId: json['spdx_id'] as String?, + spdxId: json['spdxId'] as String?, url: json['url'] == null ? null : Uri.parse(json['url'] as String), - nodeId: json['node_id'] as String?, + nodeId: json['nodeId'] as String?, ); } @@ -303,7 +302,7 @@ Map _$LicenseKindToJson(LicenseKind instance) => { 'key': instance.key, 'name': instance.name, - 'spdx_id': instance.spdxId, + 'spdxId': instance.spdxId, 'url': instance.url?.toString(), - 'node_id': instance.nodeId, + 'nodeId': instance.nodeId, }; diff --git a/lib/src/common/model/repos_commits.dart b/lib/src/common/model/repos_commits.dart index 59e689c7..e3698663 100644 --- a/lib/src/common/model/repos_commits.dart +++ b/lib/src/common/model/repos_commits.dart @@ -121,7 +121,7 @@ class CommitFile { /// Model class for a commit comment. /// /// See https://developer.github.com/v3/repos/comments -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class CommitComment { CommitComment({ this.id, diff --git a/lib/src/common/model/repos_commits.g.dart b/lib/src/common/model/repos_commits.g.dart index ef794d22..bdbbce85 100644 --- a/lib/src/common/model/repos_commits.g.dart +++ b/lib/src/common/model/repos_commits.g.dart @@ -94,14 +94,14 @@ CommitComment _$CommitCommentFromJson(Map json) { position: json['position'] as int?, path: json['path'] as String?, apiUrl: json['url'] as String?, - commitId: json['commit_id'] as String?, - createdAt: json['created_at'] == null + commitId: json['commitId'] as String?, + createdAt: json['createdAt'] == null ? null - : DateTime.parse(json['created_at'] as String), - htmlUrl: json['html_url'] as String?, - updatedAt: json['updated_at'] == null + : DateTime.parse(json['createdAt'] as String), + htmlUrl: json['htmlUrl'] as String?, + updatedAt: json['updatedAt'] == null ? null - : DateTime.parse(json['updated_at'] as String), + : DateTime.parse(json['updatedAt'] as String), body: json['body'] as String?, ); } @@ -112,10 +112,10 @@ Map _$CommitCommentToJson(CommitComment instance) => 'path': instance.path, 'line': instance.line, 'position': instance.position, - 'commit_id': instance.commitId, - 'created_at': instance.createdAt?.toIso8601String(), - 'updated_at': instance.updatedAt?.toIso8601String(), - 'html_url': instance.htmlUrl, + 'commitId': instance.commitId, + 'createdAt': instance.createdAt?.toIso8601String(), + 'updatedAt': instance.updatedAt?.toIso8601String(), + 'htmlUrl': instance.htmlUrl, 'url': instance.apiUrl, 'body': instance.body, }; diff --git a/lib/src/common/model/repos_contents.dart b/lib/src/common/model/repos_contents.dart index 068d5b0f..53250994 100644 --- a/lib/src/common/model/repos_contents.dart +++ b/lib/src/common/model/repos_contents.dart @@ -90,7 +90,7 @@ class Links { } /// Model class for a file or directory. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class RepositoryContents { RepositoryContents({ this.file, @@ -110,7 +110,7 @@ class RepositoryContents { /// Model class for a new file to be created. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class CreateFile { CreateFile( {this.path, this.content, this.message, this.branch, this.committer}); @@ -128,7 +128,7 @@ class CreateFile { } /// Model class for a committer of a commit. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class CommitUser { CommitUser(this.name, this.email); diff --git a/lib/src/common/model/repos_forks.dart b/lib/src/common/model/repos_forks.dart index 43be629d..cbf4b68c 100644 --- a/lib/src/common/model/repos_forks.dart +++ b/lib/src/common/model/repos_forks.dart @@ -2,7 +2,7 @@ import 'package:json_annotation/json_annotation.dart'; part 'repos_forks.g.dart'; /// Model class for a new fork to be created. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class CreateFork { CreateFork([this.organization]); diff --git a/lib/src/common/model/repos_hooks.dart b/lib/src/common/model/repos_hooks.dart index 779fc3d0..f39972a1 100644 --- a/lib/src/common/model/repos_hooks.dart +++ b/lib/src/common/model/repos_hooks.dart @@ -3,7 +3,7 @@ import 'package:json_annotation/json_annotation.dart'; part 'repos_hooks.g.dart'; /// Model class for a repository hook. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class Hook { Hook({ this.id, @@ -37,7 +37,7 @@ class Hook { Map toJson() => _$HookToJson(this); } -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class HookConfig { HookConfig({ this.url, @@ -55,7 +55,7 @@ class HookConfig { } /// Model class for a new hook to be created. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class CreateHook { /// Hook Name final String? name; diff --git a/lib/src/common/model/repos_hooks.g.dart b/lib/src/common/model/repos_hooks.g.dart index d230f85c..6730f655 100644 --- a/lib/src/common/model/repos_hooks.g.dart +++ b/lib/src/common/model/repos_hooks.g.dart @@ -14,13 +14,13 @@ Hook _$HookFromJson(Map json) { ..events = (json['events'] as List?)?.map((e) => e as String).toList() ..active = json['active'] as bool? - ..createdAt = json['created_at'] == null + ..createdAt = json['createdAt'] == null ? null - : DateTime.parse(json['created_at'] as String) - ..updatedAt = json['updated_at'] == null + : DateTime.parse(json['createdAt'] as String) + ..updatedAt = json['updatedAt'] == null ? null - : DateTime.parse(json['updated_at'] as String) - ..repoName = json['repo_name'] as String? + : DateTime.parse(json['updatedAt'] as String) + ..repoName = json['repoName'] as String? ..config = json['config'] == null ? null : HookConfig.fromJson(json['config'] as Map); @@ -31,27 +31,27 @@ Map _$HookToJson(Hook instance) => { 'name': instance.name, 'events': instance.events, 'active': instance.active, - 'created_at': instance.createdAt?.toIso8601String(), - 'updated_at': instance.updatedAt?.toIso8601String(), - 'repo_name': instance.repoName, + 'createdAt': instance.createdAt?.toIso8601String(), + 'updatedAt': instance.updatedAt?.toIso8601String(), + 'repoName': instance.repoName, 'config': instance.config, }; HookConfig _$HookConfigFromJson(Map json) { return HookConfig( url: json['url'] as String?, - contentType: json['content_type'] as String?, + contentType: json['contentType'] as String?, secret: json['secret'] as String?, - insecureSsl: json['insecure_ssl'] as String?, + insecureSsl: json['insecureSsl'] as String?, ); } Map _$HookConfigToJson(HookConfig instance) => { 'url': instance.url, - 'content_type': instance.contentType, + 'contentType': instance.contentType, 'secret': instance.secret, - 'insecure_ssl': instance.insecureSsl, + 'insecureSsl': instance.insecureSsl, }; CreateHook _$CreateHookFromJson(Map json) { diff --git a/lib/src/common/model/repos_merging.dart b/lib/src/common/model/repos_merging.dart index 7f73b969..7deaf0e5 100644 --- a/lib/src/common/model/repos_merging.dart +++ b/lib/src/common/model/repos_merging.dart @@ -2,7 +2,7 @@ import 'package:json_annotation/json_annotation.dart'; part 'repos_merging.g.dart'; /// Model class for a new merge to be created. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class CreateMerge { CreateMerge(this.base, this.head, {this.commitMessage}); diff --git a/lib/src/common/model/repos_merging.g.dart b/lib/src/common/model/repos_merging.g.dart index d4fa2d4b..901a94d0 100644 --- a/lib/src/common/model/repos_merging.g.dart +++ b/lib/src/common/model/repos_merging.g.dart @@ -10,7 +10,7 @@ CreateMerge _$CreateMergeFromJson(Map json) { return CreateMerge( json['base'] as String?, json['head'] as String?, - commitMessage: json['commit_message'] as String?, + commitMessage: json['commitMessage'] as String?, ); } @@ -18,5 +18,5 @@ Map _$CreateMergeToJson(CreateMerge instance) => { 'base': instance.base, 'head': instance.head, - 'commit_message': instance.commitMessage, + 'commitMessage': instance.commitMessage, }; diff --git a/lib/src/common/model/repos_pages.dart b/lib/src/common/model/repos_pages.dart index d2401940..09d0bf0b 100644 --- a/lib/src/common/model/repos_pages.dart +++ b/lib/src/common/model/repos_pages.dart @@ -3,7 +3,7 @@ import 'package:json_annotation/json_annotation.dart'; part 'repos_pages.g.dart'; /// GitHub Pages Information -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class RepositoryPages { RepositoryPages({ this.cname, @@ -21,7 +21,7 @@ class RepositoryPages { Map toJson() => _$RepositoryPagesToJson(this); } -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class PageBuild { PageBuild({ this.url, @@ -47,7 +47,7 @@ class PageBuild { Map toJson() => _$PageBuildToJson(this); } -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class PageBuildPusher { PageBuildPusher({ this.login, @@ -70,7 +70,7 @@ class PageBuildPusher { Map toJson() => _$PageBuildPusherToJson(this); } -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class PageBuildError { PageBuildError({this.message}); String? message; diff --git a/lib/src/common/model/repos_pages.g.dart b/lib/src/common/model/repos_pages.g.dart index 8cdb0c34..292c9765 100644 --- a/lib/src/common/model/repos_pages.g.dart +++ b/lib/src/common/model/repos_pages.g.dart @@ -33,12 +33,12 @@ PageBuild _$PageBuildFromJson(Map json) { : PageBuildPusher.fromJson(json['pusher'] as Map), commit: json['commit'] as String?, duration: json['duration'] as int?, - createdAt: json['created_at'] == null + createdAt: json['createdAt'] == null ? null - : DateTime.parse(json['created_at'] as String), - updatedAt: json['updated_at'] == null + : DateTime.parse(json['createdAt'] as String), + updatedAt: json['updatedAt'] == null ? null - : DateTime.parse(json['updated_at'] as String), + : DateTime.parse(json['updatedAt'] as String), ); } @@ -49,8 +49,8 @@ Map _$PageBuildToJson(PageBuild instance) => { 'pusher': instance.pusher, 'commit': instance.commit, 'duration': instance.duration, - 'created_at': instance.createdAt?.toIso8601String(), - 'updated_at': instance.updatedAt?.toIso8601String(), + 'createdAt': instance.createdAt?.toIso8601String(), + 'updatedAt': instance.updatedAt?.toIso8601String(), }; PageBuildPusher _$PageBuildPusherFromJson(Map json) { @@ -58,9 +58,9 @@ PageBuildPusher _$PageBuildPusherFromJson(Map json) { login: json['login'] as String?, id: json['id'] as int?, apiUrl: json['url'] as String?, - htmlUrl: json['html_url'] as String?, + htmlUrl: json['htmlUrl'] as String?, type: json['type'] as String?, - siteAdmin: json['site_admin'] as bool?, + siteAdmin: json['siteAdmin'] as bool?, ); } @@ -69,9 +69,9 @@ Map _$PageBuildPusherToJson(PageBuildPusher instance) => 'id': instance.id, 'login': instance.login, 'url': instance.apiUrl, - 'html_url': instance.htmlUrl, + 'htmlUrl': instance.htmlUrl, 'type': instance.type, - 'site_admin': instance.siteAdmin, + 'siteAdmin': instance.siteAdmin, }; PageBuildError _$PageBuildErrorFromJson(Map json) { diff --git a/lib/src/common/model/repos_releases.dart b/lib/src/common/model/repos_releases.dart index f80b5a8e..3259ff1e 100644 --- a/lib/src/common/model/repos_releases.dart +++ b/lib/src/common/model/repos_releases.dart @@ -6,7 +6,7 @@ import 'package:json_annotation/json_annotation.dart'; part 'repos_releases.g.dart'; /// Model class for a release. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class Release { Release({ this.id, @@ -99,7 +99,7 @@ class Release { } /// Model class for a release asset. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class ReleaseAsset { ReleaseAsset({ this.id, @@ -150,7 +150,7 @@ class ReleaseAsset { } /// Model class for a new release to be created. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class CreateRelease { /// Tag Name to Base off of final String? tagName; diff --git a/lib/src/common/model/repos_releases.g.dart b/lib/src/common/model/repos_releases.g.dart index 5b3b78e5..00b3e59c 100644 --- a/lib/src/common/model/repos_releases.g.dart +++ b/lib/src/common/model/repos_releases.g.dart @@ -10,23 +10,23 @@ Release _$ReleaseFromJson(Map json) { return Release( id: json['id'] as int?, url: json['url'] as String?, - htmlUrl: json['html_url'] as String?, - tarballUrl: json['tarball_url'] as String?, - uploadUrl: json['upload_url'] as String?, - nodeId: json['node_id'] as String?, - tagName: json['tag_name'] as String?, - targetCommitish: json['target_commitish'] as String?, + htmlUrl: json['htmlUrl'] as String?, + tarballUrl: json['tarballUrl'] as String?, + uploadUrl: json['uploadUrl'] as String?, + nodeId: json['nodeId'] as String?, + tagName: json['tagName'] as String?, + targetCommitish: json['targetCommitish'] as String?, name: json['name'] as String?, body: json['body'] as String?, description: json['description'] as String?, isDraft: json['draft'] as bool?, isPrerelease: json['prerelease'] as bool?, - createdAt: json['created_at'] == null + createdAt: json['createdAt'] == null ? null - : DateTime.parse(json['created_at'] as String), - publishedAt: json['published_at'] == null + : DateTime.parse(json['createdAt'] as String), + publishedAt: json['publishedAt'] == null ? null - : DateTime.parse(json['published_at'] as String), + : DateTime.parse(json['publishedAt'] as String), author: json['author'] == null ? null : User.fromJson(json['author'] as Map), @@ -34,29 +34,29 @@ Release _$ReleaseFromJson(Map json) { ?.map((e) => ReleaseAsset.fromJson(e as Map)) .toList(), ) - ..zipballUrl = json['zipball_url'] as String? - ..assetsUrl = json['assets_url'] as String? + ..zipballUrl = json['zipballUrl'] as String? + ..assetsUrl = json['assetsUrl'] as String? ..errors = json['errors'] as List?; } Map _$ReleaseToJson(Release instance) => { 'url': instance.url, - 'html_url': instance.htmlUrl, - 'tarball_url': instance.tarballUrl, - 'zipball_url': instance.zipballUrl, - 'upload_url': instance.uploadUrl, - 'assets_url': instance.assetsUrl, + 'htmlUrl': instance.htmlUrl, + 'tarballUrl': instance.tarballUrl, + 'zipballUrl': instance.zipballUrl, + 'uploadUrl': instance.uploadUrl, + 'assetsUrl': instance.assetsUrl, 'id': instance.id, - 'node_id': instance.nodeId, - 'tag_name': instance.tagName, - 'target_commitish': instance.targetCommitish, + 'nodeId': instance.nodeId, + 'tagName': instance.tagName, + 'targetCommitish': instance.targetCommitish, 'name': instance.name, 'body': instance.body, 'description': instance.description, 'draft': instance.isDraft, 'prerelease': instance.isPrerelease, - 'created_at': instance.createdAt?.toIso8601String(), - 'published_at': instance.publishedAt?.toIso8601String(), + 'createdAt': instance.createdAt?.toIso8601String(), + 'publishedAt': instance.publishedAt?.toIso8601String(), 'author': instance.author, 'assets': instance.assets, 'errors': instance.errors, @@ -68,38 +68,38 @@ ReleaseAsset _$ReleaseAssetFromJson(Map json) { name: json['name'] as String?, label: json['label'] as String?, state: json['state'] as String?, - contentType: json['content_type'] as String?, + contentType: json['contentType'] as String?, size: json['size'] as int?, - downloadCount: json['download_count'] as int?, - browserDownloadUrl: json['browser_download_url'] as String?, - createdAt: json['created_at'] == null + downloadCount: json['downloadCount'] as int?, + browserDownloadUrl: json['browserDownloadUrl'] as String?, + createdAt: json['createdAt'] == null ? null - : DateTime.parse(json['created_at'] as String), - updatedAt: json['updated_at'] == null + : DateTime.parse(json['createdAt'] as String), + updatedAt: json['updatedAt'] == null ? null - : DateTime.parse(json['updated_at'] as String), + : DateTime.parse(json['updatedAt'] as String), ); } Map _$ReleaseAssetToJson(ReleaseAsset instance) => { - 'browser_download_url': instance.browserDownloadUrl, + 'browserDownloadUrl': instance.browserDownloadUrl, 'id': instance.id, 'name': instance.name, 'label': instance.label, 'state': instance.state, - 'content_type': instance.contentType, + 'contentType': instance.contentType, 'size': instance.size, - 'download_count': instance.downloadCount, - 'created_at': instance.createdAt?.toIso8601String(), - 'updated_at': instance.updatedAt?.toIso8601String(), + 'downloadCount': instance.downloadCount, + 'createdAt': instance.createdAt?.toIso8601String(), + 'updatedAt': instance.updatedAt?.toIso8601String(), }; CreateRelease _$CreateReleaseFromJson(Map json) { return CreateRelease( - json['tag_name'] as String?, + json['tagName'] as String?, ) - ..targetCommitish = json['target_commitish'] as String? + ..targetCommitish = json['targetCommitish'] as String? ..name = json['name'] as String? ..body = json['body'] as String? ..isDraft = json['draft'] as bool? @@ -108,8 +108,8 @@ CreateRelease _$CreateReleaseFromJson(Map json) { Map _$CreateReleaseToJson(CreateRelease instance) => { - 'tag_name': instance.tagName, - 'target_commitish': instance.targetCommitish, + 'tagName': instance.tagName, + 'targetCommitish': instance.targetCommitish, 'name': instance.name, 'body': instance.body, 'draft': instance.isDraft, diff --git a/lib/src/common/model/repos_stats.dart b/lib/src/common/model/repos_stats.dart index 5cfb82f5..449ad36c 100644 --- a/lib/src/common/model/repos_stats.dart +++ b/lib/src/common/model/repos_stats.dart @@ -5,7 +5,7 @@ import 'package:json_annotation/json_annotation.dart'; part 'repos_stats.g.dart'; /// Model class for a contributor's statistics for a repository. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class ContributorStatistics { ContributorStatistics(this.author, this.total, this.weeks); @@ -24,7 +24,7 @@ class ContributorStatistics { /// Model class to represent the number of additions, deletions and commits /// a contributor made in a given week. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class ContributorWeekStatistics { ContributorWeekStatistics( this.start, this.additions, this.deletions, this.commits); @@ -55,7 +55,7 @@ class ContributorWeekStatistics { } /// Model class for contributor participation. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class ContributorParticipation { ContributorParticipation({ this.all, @@ -74,7 +74,7 @@ class ContributorParticipation { } /// Model class for a week in a full year commit count. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class YearCommitCountWeek { YearCommitCountWeek({ this.days, @@ -97,7 +97,7 @@ class YearCommitCountWeek { } /// Model class for a weekly change count. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class WeeklyChangesCount { WeeklyChangesCount({ this.timestamp, @@ -120,7 +120,7 @@ class WeeklyChangesCount { } /// Model Class for a Punchcard Entry -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class PunchcardEntry { PunchcardEntry({ this.weekday, diff --git a/lib/src/common/model/repos_statuses.dart b/lib/src/common/model/repos_statuses.dart index a6c301c3..dd20266f 100644 --- a/lib/src/common/model/repos_statuses.dart +++ b/lib/src/common/model/repos_statuses.dart @@ -4,7 +4,7 @@ import 'package:json_annotation/json_annotation.dart'; part 'repos_statuses.g.dart'; /// Model class for the combined status of a repository. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class CombinedRepositoryStatus { CombinedRepositoryStatus({ this.state, @@ -25,7 +25,7 @@ class CombinedRepositoryStatus { } /// Model class for the status of a repository at a particular reference. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class RepositoryStatus { RepositoryStatus({ this.createdAt, @@ -48,7 +48,7 @@ class RepositoryStatus { } /// Model class for a new repository status to be created. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class CreateStatus { CreateStatus(this.state, {this.targetUrl, this.description, this.context}); diff --git a/lib/src/common/model/repos_statuses.g.dart b/lib/src/common/model/repos_statuses.g.dart index 2938d369..ea235d05 100644 --- a/lib/src/common/model/repos_statuses.g.dart +++ b/lib/src/common/model/repos_statuses.g.dart @@ -11,7 +11,7 @@ CombinedRepositoryStatus _$CombinedRepositoryStatusFromJson( return CombinedRepositoryStatus( state: json['state'] as String?, sha: json['sha'] as String?, - totalCount: json['total_count'] as int?, + totalCount: json['totalCount'] as int?, statuses: (json['statuses'] as List?) ?.map((e) => RepositoryStatus.fromJson(e as Map)) .toList(), @@ -26,21 +26,21 @@ Map _$CombinedRepositoryStatusToJson( { 'state': instance.state, 'sha': instance.sha, - 'total_count': instance.totalCount, + 'totalCount': instance.totalCount, 'statuses': instance.statuses, 'repository': instance.repository, }; RepositoryStatus _$RepositoryStatusFromJson(Map json) { return RepositoryStatus( - createdAt: json['created_at'] == null + createdAt: json['createdAt'] == null ? null - : DateTime.parse(json['created_at'] as String), - updatedAt: json['updated_at'] == null + : DateTime.parse(json['createdAt'] as String), + updatedAt: json['updatedAt'] == null ? null - : DateTime.parse(json['updated_at'] as String), + : DateTime.parse(json['updatedAt'] as String), state: json['state'] as String?, - targetUrl: json['target_url'] as String?, + targetUrl: json['targetUrl'] as String?, description: json['description'] as String?, context: json['context'] as String?, ); @@ -48,10 +48,10 @@ RepositoryStatus _$RepositoryStatusFromJson(Map json) { Map _$RepositoryStatusToJson(RepositoryStatus instance) => { - 'created_at': instance.createdAt?.toIso8601String(), - 'updated_at': instance.updatedAt?.toIso8601String(), + 'createdAt': instance.createdAt?.toIso8601String(), + 'updatedAt': instance.updatedAt?.toIso8601String(), 'state': instance.state, - 'target_url': instance.targetUrl, + 'targetUrl': instance.targetUrl, 'description': instance.description, 'context': instance.context, }; diff --git a/lib/src/common/model/users.dart b/lib/src/common/model/users.dart index f61e4613..abb0e024 100644 --- a/lib/src/common/model/users.dart +++ b/lib/src/common/model/users.dart @@ -3,7 +3,7 @@ import 'package:json_annotation/json_annotation.dart'; part 'users.g.dart'; /// Model class for a user. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class User { User({ this.id, @@ -96,7 +96,7 @@ class User { /// The response from listing collaborators on a repo. // https://developer.github.com/v3/repos/collaborators/#response -@JsonSerializable(createToJson: false, fieldRename: FieldRename.snake) +@JsonSerializable(createToJson: false, ) class Collaborator { final String? login; final int? id; @@ -121,7 +121,7 @@ class Collaborator { /// The response from listing contributors on a repo. /// /// https://developer.github.com/v3/repos/#response-if-repository-contains-content -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class Contributor { Contributor({ this.id, @@ -159,7 +159,7 @@ class Contributor { } /// The Currently Authenticated User -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class CurrentUser extends User { CurrentUser(); @@ -185,7 +185,7 @@ class CurrentUser extends User { } /// A Users GitHub Plan -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class UserPlan { UserPlan(); @@ -209,7 +209,7 @@ class UserPlan { } /// Model class for a user's email address. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class UserEmail { UserEmail({ this.email, diff --git a/lib/src/common/model/users.g.dart b/lib/src/common/model/users.g.dart index e9a20aaa..df0fdd0e 100644 --- a/lib/src/common/model/users.g.dart +++ b/lib/src/common/model/users.g.dart @@ -10,9 +10,9 @@ User _$UserFromJson(Map json) { return User( id: json['id'] as int?, login: json['login'] as String?, - avatarUrl: json['avatar_url'] as String?, - htmlUrl: json['html_url'] as String?, - siteAdmin: json['site_admin'] as bool?, + avatarUrl: json['avatarUrl'] as String?, + htmlUrl: json['htmlUrl'] as String?, + siteAdmin: json['siteAdmin'] as bool?, name: json['name'] as String?, company: json['company'] as String?, blog: json['blog'] as String?, @@ -24,21 +24,21 @@ User _$UserFromJson(Map json) { publicGistsCount: json['public_gists'] as int?, followersCount: json['followers'] as int?, followingCount: json['following'] as int?, - createdAt: json['created_at'] == null + createdAt: json['createdAt'] == null ? null - : DateTime.parse(json['created_at'] as String), - updatedAt: json['updated_at'] == null + : DateTime.parse(json['createdAt'] as String), + updatedAt: json['updatedAt'] == null ? null - : DateTime.parse(json['updated_at'] as String), - )..twitterUsername = json['twitter_username'] as String?; + : DateTime.parse(json['updatedAt'] as String), + )..twitterUsername = json['twitterUsername'] as String?; } Map _$UserToJson(User instance) => { 'login': instance.login, 'id': instance.id, - 'avatar_url': instance.avatarUrl, - 'html_url': instance.htmlUrl, - 'site_admin': instance.siteAdmin, + 'avatarUrl': instance.avatarUrl, + 'htmlUrl': instance.htmlUrl, + 'siteAdmin': instance.siteAdmin, 'name': instance.name, 'company': instance.company, 'blog': instance.blog, @@ -50,18 +50,18 @@ Map _$UserToJson(User instance) => { 'public_gists': instance.publicGistsCount, 'followers': instance.followersCount, 'following': instance.followingCount, - 'created_at': instance.createdAt?.toIso8601String(), - 'updated_at': instance.updatedAt?.toIso8601String(), - 'twitter_username': instance.twitterUsername, + 'createdAt': instance.createdAt?.toIso8601String(), + 'updatedAt': instance.updatedAt?.toIso8601String(), + 'twitterUsername': instance.twitterUsername, }; Collaborator _$CollaboratorFromJson(Map json) { return Collaborator( json['login'] as String?, json['id'] as int?, - json['html_url'] as String?, + json['htmlUrl'] as String?, json['type'] as String?, - json['site_admin'] as bool?, + json['siteAdmin'] as bool?, (json['permissions'] as Map?)?.map( (k, e) => MapEntry(k, e as bool), ), @@ -72,10 +72,10 @@ Contributor _$ContributorFromJson(Map json) { return Contributor( id: json['id'] as int?, login: json['login'] as String?, - avatarUrl: json['avatar_url'] as String?, - htmlUrl: json['html_url'] as String?, + avatarUrl: json['avatarUrl'] as String?, + htmlUrl: json['htmlUrl'] as String?, type: json['type'] as String?, - siteAdmin: json['site_admin'] as bool?, + siteAdmin: json['siteAdmin'] as bool?, contributions: json['contributions'] as int?, ); } @@ -84,10 +84,10 @@ Map _$ContributorToJson(Contributor instance) => { 'login': instance.login, 'id': instance.id, - 'avatar_url': instance.avatarUrl, - 'html_url': instance.htmlUrl, + 'avatarUrl': instance.avatarUrl, + 'htmlUrl': instance.htmlUrl, 'type': instance.type, - 'site_admin': instance.siteAdmin, + 'siteAdmin': instance.siteAdmin, 'contributions': instance.contributions, }; @@ -95,9 +95,9 @@ CurrentUser _$CurrentUserFromJson(Map json) { return CurrentUser() ..login = json['login'] as String? ..id = json['id'] as int? - ..avatarUrl = json['avatar_url'] as String? - ..htmlUrl = json['html_url'] as String? - ..siteAdmin = json['site_admin'] as bool? + ..avatarUrl = json['avatarUrl'] as String? + ..htmlUrl = json['htmlUrl'] as String? + ..siteAdmin = json['siteAdmin'] as bool? ..name = json['name'] as String? ..company = json['company'] as String? ..blog = json['blog'] as String? @@ -109,13 +109,13 @@ CurrentUser _$CurrentUserFromJson(Map json) { ..publicGistsCount = json['public_gists'] as int? ..followersCount = json['followers'] as int? ..followingCount = json['following'] as int? - ..createdAt = json['created_at'] == null + ..createdAt = json['createdAt'] == null ? null - : DateTime.parse(json['created_at'] as String) - ..updatedAt = json['updated_at'] == null + : DateTime.parse(json['createdAt'] as String) + ..updatedAt = json['updatedAt'] == null ? null - : DateTime.parse(json['updated_at'] as String) - ..twitterUsername = json['twitter_username'] as String? + : DateTime.parse(json['updatedAt'] as String) + ..twitterUsername = json['twitterUsername'] as String? ..privateReposCount = json['total_private_repos'] as int? ..ownedPrivateReposCount = json['owned_private_repos'] as int? ..diskUsage = json['disk_usage'] as int? @@ -128,9 +128,9 @@ Map _$CurrentUserToJson(CurrentUser instance) => { 'login': instance.login, 'id': instance.id, - 'avatar_url': instance.avatarUrl, - 'html_url': instance.htmlUrl, - 'site_admin': instance.siteAdmin, + 'avatarUrl': instance.avatarUrl, + 'htmlUrl': instance.htmlUrl, + 'siteAdmin': instance.siteAdmin, 'name': instance.name, 'company': instance.company, 'blog': instance.blog, @@ -142,9 +142,9 @@ Map _$CurrentUserToJson(CurrentUser instance) => 'public_gists': instance.publicGistsCount, 'followers': instance.followersCount, 'following': instance.followingCount, - 'created_at': instance.createdAt?.toIso8601String(), - 'updated_at': instance.updatedAt?.toIso8601String(), - 'twitter_username': instance.twitterUsername, + 'createdAt': instance.createdAt?.toIso8601String(), + 'updatedAt': instance.updatedAt?.toIso8601String(), + 'twitterUsername': instance.twitterUsername, 'total_private_repos': instance.privateReposCount, 'owned_private_repos': instance.ownedPrivateReposCount, 'disk_usage': instance.diskUsage, diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 98999163..5d773c49 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -107,10 +107,10 @@ class RepositoriesService extends Service { {String? org}) async { ArgumentError.checkNotNull(repository); if (org != null) { - return github.postJSON, TeamRepository>( + return github.postJSON, Repository>( '/orgs/$org/repos', body: GitHubJson.encode(repository), - convert: (i) => TeamRepository.fromJson(i), + convert: (i) => Repository.fromJson(i), ); } else { return github.postJSON, Repository>( diff --git a/lib/src/server/hooks.dart b/lib/src/server/hooks.dart index 0625f4bd..b622cfd6 100644 --- a/lib/src/server/hooks.dart +++ b/lib/src/server/hooks.dart @@ -89,7 +89,7 @@ class UnknownHookEvent extends HookEvent { UnknownHookEvent(this.event, this.data); } -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class RepositoryEvent extends HookEvent { RepositoryEvent({ this.action, @@ -105,7 +105,7 @@ class RepositoryEvent extends HookEvent { Map toJson() => _$RepositoryEventToJson(this); } -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class IssueCommentEvent extends HookEvent { IssueCommentEvent({ this.action, @@ -121,7 +121,7 @@ class IssueCommentEvent extends HookEvent { Map toJson() => _$IssueCommentEventToJson(this); } -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class ForkEvent extends HookEvent { ForkEvent({ this.forkee, @@ -135,7 +135,7 @@ class ForkEvent extends HookEvent { Map toJson() => _$ForkEventToJson(this); } -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class IssueEvent extends HookEvent { IssueEvent({ this.action, @@ -157,7 +157,7 @@ class IssueEvent extends HookEvent { Map toJson() => _$IssueEventToJson(this); } -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class PullRequestEvent extends HookEvent { PullRequestEvent({ this.action, diff --git a/lib/src/server/hooks.g.dart b/lib/src/server/hooks.g.dart index 867b54ef..706cd44a 100644 --- a/lib/src/server/hooks.g.dart +++ b/lib/src/server/hooks.g.dart @@ -95,9 +95,9 @@ PullRequestEvent _$PullRequestEventFromJson(Map json) { return PullRequestEvent( action: json['action'] as String?, number: json['number'] as int?, - pullRequest: json['pull_request'] == null + pullRequest: json['pullRequest'] == null ? null - : PullRequest.fromJson(json['pull_request'] as Map), + : PullRequest.fromJson(json['pullRequest'] as Map), sender: json['sender'] == null ? null : User.fromJson(json['sender'] as Map), @@ -111,7 +111,7 @@ Map _$PullRequestEventToJson(PullRequestEvent instance) => { 'action': instance.action, 'number': instance.number, - 'pull_request': instance.pullRequest, + 'pullRequest': instance.pullRequest, 'sender': instance.sender, 'repository': instance.repository, }; diff --git a/test/experiment/search.dart b/test/experiment/search.dart index 57dc2beb..42779560 100755 --- a/test/experiment/search.dart +++ b/test/experiment/search.dart @@ -5,6 +5,6 @@ void main() { github.search.repositories('github').listen((repo) { print( - "${repo.fullName}: ${repo.description!.isNotEmpty ? repo.description : "No Description"}"); + '${repo.fullName}: ${repo.description}'); }).onDone(github.dispose); } diff --git a/test/git_integration_test.dart b/test/git_integration_test.dart index 68c3afbc..3ff4d113 100644 --- a/test/git_integration_test.dart +++ b/test/git_integration_test.dart @@ -18,7 +18,9 @@ void main() { final authToken = Platform.environment['GITHUB_API_TOKEN']; final repoOwner = Platform.environment['GITHUB_DART_TEST_REPO_OWNER']; final repoName = Platform.environment['GITHUB_DART_TEST_REPO_NAME']; - + if (repoName == null || repoOwner == null) { + throw AssertionError('config incorrect'); + } github = GitHub(auth: Authentication.withToken(authToken)); slug = RepositorySlug(repoOwner, repoName); }); diff --git a/tool/ci/retry.sh b/tool/ci/retry.sh deleted file mode 100755 index b784c8d8..00000000 --- a/tool/ci/retry.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env bash -n=0 -LAST_EXIT=0 -until [ $n -ge 5 ] -do - echo "$ ${@}" - ${@} - LAST_EXIT=${?} - [ ${LAST_EXIT} == 0 ] && break - n=$[$n+1] - sleep 2 -done - -exit ${LAST_EXIT} \ No newline at end of file diff --git a/tool/publish.sh b/tool/publish.sh deleted file mode 100755 index 836d0ae3..00000000 --- a/tool/publish.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env bash -# Publishes a GitHub.dart release -./tool/build.dart publish ${@} -VERSION=`grep 'version:' pubspec.yaml | sed 's/version: //'` -echo Releasing ${VERSION} -git add . -git tag v${VERSION} -git commit -m "v${VERSION}" -git push --tags origin master diff --git a/tool/serve.sh b/tool/serve.sh deleted file mode 100755 index 1b0f658c..00000000 --- a/tool/serve.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env bash -pub serve example/ test/ --hostname 0.0.0.0 --port 8080 diff --git a/tool/update-demos.sh b/tool/update-demos.sh deleted file mode 100755 index 27462b73..00000000 --- a/tool/update-demos.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env bash - -set -e - -if [ -z ${1} ] -then - echo "Usage: tool/update-demos.sh path/to/demos" - exit 1 -fi - -rm -rf build -rm -rf ${1} - -pub build example --mode=debug -cp -R build/example ${1} - -cd ${1} -git add . -git commit -m "Updating Demos" -git push From a8d10ec25556007a091451b96646678d25351c46 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Mon, 1 Mar 2021 16:01:02 -0700 Subject: [PATCH 216/390] null fixes 3 --- CHANGELOG.md | 2 +- example/index.dart | 4 ++-- example/repos.dart | 5 +---- lib/src/browser/xplat_browser.dart | 2 +- lib/src/common/model/issues.dart | 9 +++++++-- lib/src/common/model/issues.g.dart | 7 ++++--- 6 files changed, 16 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 43538e56..54657751 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -72,7 +72,7 @@ - For web: browser specific helper methods have moved. use import `package:github/browser_helper.dart` (renderMarkdown, and createAvatorImage) - `createGithubClient(...)` has been removed. Just create a GitHub object directly now. - `findAuthenticationFromEnvironment` now works in both server/flutter and web environments - - On the web, it will check the query string first, then localstorage + - On the web, it will check the query string first, then session storage - all static methods are now factory constructors - fromJSON is now fromJson everywhere - toJSON is now toJson everywhere diff --git a/example/index.dart b/example/index.dart index 9e2828b2..3a0f10b2 100644 --- a/example/index.dart +++ b/example/index.dart @@ -4,8 +4,8 @@ import 'common.dart'; void main() { final tokenInput = querySelector('#token') as InputElement; tokenInput.value = github.auth!.token ?? ''; - window.localStorage['GITHUB_TOKEN'] = tokenInput.value!; + window.sessionStorage['GITHUB_TOKEN'] = tokenInput.value!; tokenInput.onKeyUp.listen((_) { - window.localStorage['GITHUB_TOKEN'] = tokenInput.value!; + window.sessionStorage['GITHUB_TOKEN'] = tokenInput.value!; }); } diff --git a/example/repos.dart b/example/repos.dart index d3451366..7c8060ca 100644 --- a/example/repos.dart +++ b/example/repos.dart @@ -79,7 +79,7 @@ void loadRepos([int Function(Repository a, Repository b)? compare]) { ..id = 'title'); } - String? user = 'Workiva'; + String? user = 'SpinlockLabs'; if (queryString.containsKey('user')) { user = queryString['user']; @@ -98,7 +98,4 @@ void loadRepos([int Function(Repository a, Repository b)? compare]) { _reposCache = repos; updateRepos(repos, compare); }); - - github.repositories.listTags(RepositorySlug('Workiva','font_face_observer')).toList(); - github.issues.listByRepo(RepositorySlug('Workiva','over_react')).toList().then((value) => print); } diff --git a/lib/src/browser/xplat_browser.dart b/lib/src/browser/xplat_browser.dart index 2f363fdc..79aeeb17 100644 --- a/lib/src/browser/xplat_browser.dart +++ b/lib/src/browser/xplat_browser.dart @@ -10,7 +10,7 @@ import 'package:github/src/common/xplat_common.dart' Authentication findAuthenticationFromEnvironment() { // search the query string parameters first var auth = findAuthenticationInMap(_parseQuery(window.location.href)); - auth ??= findAuthenticationInMap(window.localStorage); + auth ??= findAuthenticationInMap(window.sessionStorage); return auth ?? Authentication.anonymous(); } diff --git a/lib/src/common/model/issues.dart b/lib/src/common/model/issues.dart index a3e1aa65..c00004ee 100644 --- a/lib/src/common/model/issues.dart +++ b/lib/src/common/model/issues.dart @@ -15,7 +15,7 @@ class Issue { this.state = '', this.title = '', this.user, - this.labels = const [], + List? labels, this.assignee, this.milestone, this.commentsCount = 0, @@ -25,9 +25,14 @@ class Issue { this.updatedAt, this.body = '', this.closedBy, - }); + }) { + if (labels != null) { + this.labels = labels; + } + } /// Issue Labels + @JsonKey(defaultValue: []) List labels = []; @JsonKey(defaultValue: 0) diff --git a/lib/src/common/model/issues.g.dart b/lib/src/common/model/issues.g.dart index 10536791..532cf26b 100644 --- a/lib/src/common/model/issues.g.dart +++ b/lib/src/common/model/issues.g.dart @@ -17,9 +17,10 @@ Issue _$IssueFromJson(Map json) { user: json['user'] == null ? null : User.fromJson(json['user'] as Map), - labels: (json['labels'] as List) - .map((e) => IssueLabel.fromJson(e as Map)) - .toList(), + labels: (json['labels'] as List?) + ?.map((e) => IssueLabel.fromJson(e as Map)) + .toList() ?? + [], assignee: json['assignee'] == null ? null : User.fromJson(json['assignee'] as Map), From 1eee871c50a655d9799bbd4361b5c5ffd11bda09 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Mon, 1 Mar 2021 16:32:44 -0700 Subject: [PATCH 217/390] null fixes 4 --- build.yaml | 8 + lib/src/common/model/authorizations.g.dart | 32 ++-- lib/src/common/model/gists.g.dart | 12 +- lib/src/common/model/git.g.dart | 4 +- lib/src/common/model/issues.dart | 8 +- lib/src/common/model/issues.g.dart | 64 ++++---- lib/src/common/model/orgs.dart | 31 ---- lib/src/common/model/orgs.g.dart | 9 - lib/src/common/model/pulls.g.dart | 114 ++++++------- lib/src/common/model/reaction.g.dart | 10 +- lib/src/common/model/repos.dart | 25 +++ lib/src/common/model/repos.g.dart | 181 ++++++++++++--------- lib/src/common/model/repos_commits.g.dart | 20 +-- lib/src/common/model/repos_contents.g.dart | 6 +- lib/src/common/model/repos_hooks.g.dart | 24 +-- lib/src/common/model/repos_merging.g.dart | 4 +- lib/src/common/model/repos_pages.g.dart | 20 +-- lib/src/common/model/repos_releases.g.dart | 76 ++++----- lib/src/common/model/repos_statuses.g.dart | 20 +-- lib/src/common/model/users.g.dart | 72 ++++---- lib/src/server/hooks.g.dart | 6 +- 21 files changed, 382 insertions(+), 364 deletions(-) create mode 100644 build.yaml diff --git a/build.yaml b/build.yaml new file mode 100644 index 00000000..fdbbd17d --- /dev/null +++ b/build.yaml @@ -0,0 +1,8 @@ +targets: + $default: + builders: + json_serializable: + options: + # Options configure how source code is generated for every + # `@JsonSerializable`-annotated class in the package. + field_rename: snake diff --git a/lib/src/common/model/authorizations.g.dart b/lib/src/common/model/authorizations.g.dart index 6624b9f4..932857b3 100644 --- a/lib/src/common/model/authorizations.g.dart +++ b/lib/src/common/model/authorizations.g.dart @@ -17,13 +17,13 @@ Authorization _$AuthorizationFromJson(Map json) { : AuthorizationApplication.fromJson( json['app'] as Map), note: json['note'] as String?, - noteUrl: json['noteUrl'] as String?, - createdAt: json['createdAt'] == null + noteUrl: json['note_url'] as String?, + createdAt: json['created_at'] == null ? null - : DateTime.parse(json['createdAt'] as String), - updatedAt: json['updatedAt'] == null + : DateTime.parse(json['created_at'] as String), + updatedAt: json['updated_at'] == null ? null - : DateTime.parse(json['updatedAt'] as String), + : DateTime.parse(json['updated_at'] as String), user: json['user'] == null ? null : User.fromJson(json['user'] as Map), @@ -37,9 +37,9 @@ Map _$AuthorizationToJson(Authorization instance) => 'token': instance.token, 'app': instance.app, 'note': instance.note, - 'noteUrl': instance.noteUrl, - 'createdAt': instance.createdAt?.toIso8601String(), - 'updatedAt': instance.updatedAt?.toIso8601String(), + 'note_url': instance.noteUrl, + 'created_at': instance.createdAt?.toIso8601String(), + 'updated_at': instance.updatedAt?.toIso8601String(), 'user': instance.user, }; @@ -48,7 +48,7 @@ AuthorizationApplication _$AuthorizationApplicationFromJson( return AuthorizationApplication( url: json['url'] as String?, name: json['name'] as String?, - clientId: json['clientId'] as String?, + clientId: json['client_id'] as String?, ); } @@ -57,7 +57,7 @@ Map _$AuthorizationApplicationToJson( { 'url': instance.url, 'name': instance.name, - 'clientId': instance.clientId, + 'client_id': instance.clientId, }; CreateAuthorization _$CreateAuthorizationFromJson(Map json) { @@ -65,9 +65,9 @@ CreateAuthorization _$CreateAuthorizationFromJson(Map json) { json['note'] as String?, scopes: (json['scopes'] as List?)?.map((e) => e as String).toList(), - noteUrl: json['noteUrl'] as String?, - clientId: json['clientId'] as String?, - clientSecret: json['clientSecret'] as String?, + noteUrl: json['note_url'] as String?, + clientId: json['client_id'] as String?, + clientSecret: json['client_secret'] as String?, ); } @@ -76,7 +76,7 @@ Map _$CreateAuthorizationToJson( { 'note': instance.note, 'scopes': instance.scopes, - 'noteUrl': instance.noteUrl, - 'clientId': instance.clientId, - 'clientSecret': instance.clientSecret, + 'note_url': instance.noteUrl, + 'client_id': instance.clientId, + 'client_secret': instance.clientSecret, }; diff --git a/lib/src/common/model/gists.g.dart b/lib/src/common/model/gists.g.dart index 3d1f2197..982181f1 100644 --- a/lib/src/common/model/gists.g.dart +++ b/lib/src/common/model/gists.g.dart @@ -81,12 +81,12 @@ GistComment _$GistCommentFromJson(Map json) { user: json['user'] == null ? null : User.fromJson(json['user'] as Map), - createdAt: json['createdAt'] == null + createdAt: json['created_at'] == null ? null - : DateTime.parse(json['createdAt'] as String), - updatedAt: json['updatedAt'] == null + : DateTime.parse(json['created_at'] as String), + updatedAt: json['updated_at'] == null ? null - : DateTime.parse(json['updatedAt'] as String), + : DateTime.parse(json['updated_at'] as String), body: json['body'] as String?, ); } @@ -95,8 +95,8 @@ Map _$GistCommentToJson(GistComment instance) => { 'id': instance.id, 'user': instance.user, - 'createdAt': instance.createdAt?.toIso8601String(), - 'updatedAt': instance.updatedAt?.toIso8601String(), + 'created_at': instance.createdAt?.toIso8601String(), + 'updated_at': instance.updatedAt?.toIso8601String(), 'body': instance.body, }; diff --git a/lib/src/common/model/git.g.dart b/lib/src/common/model/git.g.dart index 2bb5e836..d596e7cb 100644 --- a/lib/src/common/model/git.g.dart +++ b/lib/src/common/model/git.g.dart @@ -160,13 +160,13 @@ CreateGitTree _$CreateGitTreeFromJson(Map json) { (json['tree'] as List?) ?.map((e) => CreateGitTreeEntry.fromJson(e as Map)) .toList(), - baseTree: json['baseTree'] as String?, + baseTree: json['base_tree'] as String?, ); } Map _$CreateGitTreeToJson(CreateGitTree instance) => { - 'baseTree': instance.baseTree, + 'base_tree': instance.baseTree, 'tree': instance.entries, }; diff --git a/lib/src/common/model/issues.dart b/lib/src/common/model/issues.dart index c00004ee..c565b90c 100644 --- a/lib/src/common/model/issues.dart +++ b/lib/src/common/model/issues.dart @@ -31,10 +31,6 @@ class Issue { } } - /// Issue Labels - @JsonKey(defaultValue: []) - List labels = []; - @JsonKey(defaultValue: 0) int id; @@ -61,6 +57,10 @@ class Issue { /// User who created the issue. User? user; + /// Issue Labels + @JsonKey(defaultValue: []) + List labels = []; + /// The User that the issue is assigned to User? assignee; diff --git a/lib/src/common/model/issues.g.dart b/lib/src/common/model/issues.g.dart index 532cf26b..0e2d0a8b 100644 --- a/lib/src/common/model/issues.g.dart +++ b/lib/src/common/model/issues.g.dart @@ -10,7 +10,7 @@ Issue _$IssueFromJson(Map json) { return Issue( id: json['id'] as int? ?? 0, url: json['url'] as String? ?? '', - htmlUrl: json['htmlUrl'] as String? ?? '', + htmlUrl: json['html_url'] as String? ?? '', number: json['number'] as int? ?? 0, state: json['state'] as String? ?? '', title: json['title'] as String? ?? '', @@ -49,14 +49,14 @@ Issue _$IssueFromJson(Map json) { } Map _$IssueToJson(Issue instance) => { - 'labels': instance.labels, 'id': instance.id, 'url': instance.url, - 'htmlUrl': instance.htmlUrl, + 'html_url': instance.htmlUrl, 'number': instance.number, 'state': instance.state, 'title': instance.title, 'user': instance.user, + 'labels': instance.labels, 'assignee': instance.assignee, 'milestone': instance.milestone, 'comments': instance.commentsCount, @@ -92,17 +92,17 @@ Map _$IssueRequestToJson(IssueRequest instance) => IssuePullRequest _$IssuePullRequestFromJson(Map json) { return IssuePullRequest( - htmlUrl: json['htmlUrl'] as String?, - diffUrl: json['diffUrl'] as String?, - patchUrl: json['patchUrl'] as String?, + htmlUrl: json['html_url'] as String?, + diffUrl: json['diff_url'] as String?, + patchUrl: json['patch_url'] as String?, ); } Map _$IssuePullRequestToJson(IssuePullRequest instance) => { - 'htmlUrl': instance.htmlUrl, - 'diffUrl': instance.diffUrl, - 'patchUrl': instance.patchUrl, + 'html_url': instance.htmlUrl, + 'diff_url': instance.diffUrl, + 'patch_url': instance.patchUrl, }; IssueComment _$IssueCommentFromJson(Map json) { @@ -112,15 +112,15 @@ IssueComment _$IssueCommentFromJson(Map json) { user: json['user'] == null ? null : User.fromJson(json['user'] as Map), - createdAt: json['createdAt'] == null + createdAt: json['created_at'] == null ? null - : DateTime.parse(json['createdAt'] as String), - updatedAt: json['updatedAt'] == null + : DateTime.parse(json['created_at'] as String), + updatedAt: json['updated_at'] == null ? null - : DateTime.parse(json['updatedAt'] as String), + : DateTime.parse(json['updated_at'] as String), url: json['url'] as String?, - htmlUrl: json['htmlUrl'] as String?, - issueUrl: json['issueUrl'] as String?, + htmlUrl: json['html_url'] as String?, + issueUrl: json['issue_url'] as String?, ); } @@ -129,11 +129,11 @@ Map _$IssueCommentToJson(IssueComment instance) => 'id': instance.id, 'body': instance.body, 'user': instance.user, - 'createdAt': instance.createdAt?.toIso8601String(), - 'updatedAt': instance.updatedAt?.toIso8601String(), + 'created_at': instance.createdAt?.toIso8601String(), + 'updated_at': instance.updatedAt?.toIso8601String(), 'url': instance.url, - 'htmlUrl': instance.htmlUrl, - 'issueUrl': instance.issueUrl, + 'html_url': instance.htmlUrl, + 'issue_url': instance.issueUrl, }; IssueLabel _$IssueLabelFromJson(Map json) { @@ -161,14 +161,15 @@ Milestone _$MilestoneFromJson(Map json) { : User.fromJson(json['creator'] as Map), openIssuesCount: json['open_issues'] as int?, closedIssuesCount: json['closed_issues'] as int?, - createdAt: json['createdAt'] == null + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + updatedAt: json['updated_at'] == null ? null - : DateTime.parse(json['createdAt'] as String), - updatedAt: json['updatedAt'] == null + : DateTime.parse(json['updated_at'] as String), + dueOn: json['due_on'] == null ? null - : DateTime.parse(json['updatedAt'] as String), - dueOn: - json['dueOn'] == null ? null : DateTime.parse(json['dueOn'] as String), + : DateTime.parse(json['due_on'] as String), ); } @@ -181,9 +182,9 @@ Map _$MilestoneToJson(Milestone instance) => { 'creator': instance.creator, 'open_issues': instance.openIssuesCount, 'closed_issues': instance.closedIssuesCount, - 'createdAt': instance.createdAt?.toIso8601String(), - 'updatedAt': instance.updatedAt?.toIso8601String(), - 'dueOn': instance.dueOn?.toIso8601String(), + 'created_at': instance.createdAt?.toIso8601String(), + 'updated_at': instance.updatedAt?.toIso8601String(), + 'due_on': instance.dueOn?.toIso8601String(), }; CreateMilestone _$CreateMilestoneFromJson(Map json) { @@ -191,8 +192,9 @@ CreateMilestone _$CreateMilestoneFromJson(Map json) { json['title'] as String?, state: json['state'] as String?, description: json['description'] as String?, - dueOn: - json['dueOn'] == null ? null : DateTime.parse(json['dueOn'] as String), + dueOn: json['due_on'] == null + ? null + : DateTime.parse(json['due_on'] as String), ); } @@ -201,5 +203,5 @@ Map _$CreateMilestoneToJson(CreateMilestone instance) => 'title': instance.title, 'state': instance.state, 'description': instance.description, - 'dueOn': instance.dueOn?.toIso8601String(), + 'due_on': instance.dueOn?.toIso8601String(), }; diff --git a/lib/src/common/model/orgs.dart b/lib/src/common/model/orgs.dart index c5878bfb..0a28ea42 100644 --- a/lib/src/common/model/orgs.dart +++ b/lib/src/common/model/orgs.dart @@ -180,34 +180,3 @@ class TeamMember { return _$TeamMemberFromJson(input); } } - -/// Model class for a team repository. -// @JsonSerializable(createToJson: false) -// class TeamRepository extends Repository { -// TeamRepository({this.permissions}); - -// /// Repository Permissions. -// TeamRepositoryPermissions? permissions; - -// factory TeamRepository.fromJson(Map input) { -// return _$TeamRepositoryFromJson(input); -// } -// } - -/// Model class for team repository permissions. -@JsonSerializable(createToJson: false) -class TeamRepositoryPermissions { - TeamRepositoryPermissions(this.admin, this.push, this.pull); - - /// Administrative Access - final bool? admin; - - /// Push Access - final bool? push; - - /// Pull Access - final bool? pull; - - factory TeamRepositoryPermissions.fromJson(Map json) => - _$TeamRepositoryPermissionsFromJson(json); -} diff --git a/lib/src/common/model/orgs.g.dart b/lib/src/common/model/orgs.g.dart index a12bbe5a..e411fc07 100644 --- a/lib/src/common/model/orgs.g.dart +++ b/lib/src/common/model/orgs.g.dart @@ -82,12 +82,3 @@ TeamMember _$TeamMemberFromJson(Map json) { htmlUrl: json['html_url'] as String?, ); } - -TeamRepositoryPermissions _$TeamRepositoryPermissionsFromJson( - Map json) { - return TeamRepositoryPermissions( - json['admin'] as bool?, - json['push'] as bool?, - json['pull'] as bool?, - ); -} diff --git a/lib/src/common/model/pulls.g.dart b/lib/src/common/model/pulls.g.dart index 47a3033e..6c596cf7 100644 --- a/lib/src/common/model/pulls.g.dart +++ b/lib/src/common/model/pulls.g.dart @@ -9,25 +9,25 @@ part of 'pulls.dart'; PullRequest _$PullRequestFromJson(Map json) { return PullRequest( id: json['id'] as int?, - htmlUrl: json['htmlUrl'] as String?, - diffUrl: json['diffUrl'] as String?, - patchUrl: json['patchUrl'] as String?, + htmlUrl: json['html_url'] as String?, + diffUrl: json['diff_url'] as String?, + patchUrl: json['patch_url'] as String?, number: json['number'] as int?, state: json['state'] as String?, title: json['title'] as String?, body: json['body'] as String?, - createdAt: json['createdAt'] == null + createdAt: json['created_at'] == null ? null - : DateTime.parse(json['createdAt'] as String), - updatedAt: json['updatedAt'] == null + : DateTime.parse(json['created_at'] as String), + updatedAt: json['updated_at'] == null ? null - : DateTime.parse(json['updatedAt'] as String), - closedAt: json['closedAt'] == null + : DateTime.parse(json['updated_at'] as String), + closedAt: json['closed_at'] == null ? null - : DateTime.parse(json['closedAt'] as String), - mergedAt: json['mergedAt'] == null + : DateTime.parse(json['closed_at'] as String), + mergedAt: json['merged_at'] == null ? null - : DateTime.parse(json['mergedAt'] as String), + : DateTime.parse(json['merged_at'] as String), head: json['head'] == null ? null : PullRequestHead.fromJson(json['head'] as Map), @@ -38,17 +38,17 @@ PullRequest _$PullRequestFromJson(Map json) { ? null : User.fromJson(json['user'] as Map), draft: json['draft'] as bool?, - mergeCommitSha: json['mergeCommitSha'] as String?, + mergeCommitSha: json['merge_commit_sha'] as String?, merged: json['merged'] as bool?, mergeable: json['mergeable'] as bool?, - mergedBy: json['mergedBy'] == null + mergedBy: json['merged_by'] == null ? null - : User.fromJson(json['mergedBy'] as Map), - commentsCount: json['commentsCount'] as int?, - commitsCount: json['commitsCount'] as int?, - additionsCount: json['additionsCount'] as int?, - deletionsCount: json['deletionsCount'] as int?, - changedFilesCount: json['changedFilesCount'] as int?, + : User.fromJson(json['merged_by'] as Map), + commentsCount: json['comments_count'] as int?, + commitsCount: json['commits_count'] as int?, + additionsCount: json['additions_count'] as int?, + deletionsCount: json['deletions_count'] as int?, + changedFilesCount: json['changed_files_count'] as int?, labels: (json['labels'] as List?) ?.map((e) => IssueLabel.fromJson(e as Map)) .toList(), @@ -58,30 +58,30 @@ PullRequest _$PullRequestFromJson(Map json) { Map _$PullRequestToJson(PullRequest instance) => { 'id': instance.id, - 'htmlUrl': instance.htmlUrl, - 'diffUrl': instance.diffUrl, - 'patchUrl': instance.patchUrl, + 'html_url': instance.htmlUrl, + 'diff_url': instance.diffUrl, + 'patch_url': instance.patchUrl, 'number': instance.number, 'state': instance.state, 'title': instance.title, 'body': instance.body, - 'createdAt': instance.createdAt?.toIso8601String(), - 'updatedAt': instance.updatedAt?.toIso8601String(), - 'closedAt': instance.closedAt?.toIso8601String(), - 'mergedAt': instance.mergedAt?.toIso8601String(), + 'created_at': instance.createdAt?.toIso8601String(), + 'updated_at': instance.updatedAt?.toIso8601String(), + 'closed_at': instance.closedAt?.toIso8601String(), + 'merged_at': instance.mergedAt?.toIso8601String(), 'head': instance.head, 'base': instance.base, 'user': instance.user, 'draft': instance.draft, - 'mergeCommitSha': instance.mergeCommitSha, + 'merge_commit_sha': instance.mergeCommitSha, 'merged': instance.merged, 'mergeable': instance.mergeable, - 'mergedBy': instance.mergedBy, - 'commentsCount': instance.commentsCount, - 'commitsCount': instance.commitsCount, - 'additionsCount': instance.additionsCount, - 'deletionsCount': instance.deletionsCount, - 'changedFilesCount': instance.changedFilesCount, + 'merged_by': instance.mergedBy, + 'comments_count': instance.commentsCount, + 'commits_count': instance.commitsCount, + 'additions_count': instance.additionsCount, + 'deletions_count': instance.deletionsCount, + 'changed_files_count': instance.changedFilesCount, 'labels': instance.labels, }; @@ -145,24 +145,24 @@ Map _$CreatePullRequestToJson(CreatePullRequest instance) => PullRequestComment _$PullRequestCommentFromJson(Map json) { return PullRequestComment( id: json['id'] as int?, - diffHunk: json['diffHunk'] as String?, + diffHunk: json['diff_hunk'] as String?, path: json['path'] as String?, position: json['position'] as int?, - originalPosition: json['originalPosition'] as int?, - commitId: json['commitId'] as String?, - originalCommitId: json['originalCommitId'] as String?, + originalPosition: json['original_position'] as int?, + commitId: json['commit_id'] as String?, + originalCommitId: json['original_commit_id'] as String?, user: json['user'] == null ? null : User.fromJson(json['user'] as Map), body: json['body'] as String?, - createdAt: json['createdAt'] == null + createdAt: json['created_at'] == null ? null - : DateTime.parse(json['createdAt'] as String), - updatedAt: json['updatedAt'] == null + : DateTime.parse(json['created_at'] as String), + updatedAt: json['updated_at'] == null ? null - : DateTime.parse(json['updatedAt'] as String), + : DateTime.parse(json['updated_at'] as String), url: json['url'] as String?, - pullRequestUrl: json['pullRequestUrl'] as String?, + pullRequestUrl: json['pull_request_url'] as String?, links: json['_links'] == null ? null : Links.fromJson(json['_links'] as Map), @@ -172,18 +172,18 @@ PullRequestComment _$PullRequestCommentFromJson(Map json) { Map _$PullRequestCommentToJson(PullRequestComment instance) => { 'id': instance.id, - 'diffHunk': instance.diffHunk, + 'diff_hunk': instance.diffHunk, 'path': instance.path, 'position': instance.position, - 'originalPosition': instance.originalPosition, - 'commitId': instance.commitId, - 'originalCommitId': instance.originalCommitId, + 'original_position': instance.originalPosition, + 'commit_id': instance.commitId, + 'original_commit_id': instance.originalCommitId, 'user': instance.user, 'body': instance.body, - 'createdAt': instance.createdAt?.toIso8601String(), - 'updatedAt': instance.updatedAt?.toIso8601String(), + 'created_at': instance.createdAt?.toIso8601String(), + 'updated_at': instance.updatedAt?.toIso8601String(), 'url': instance.url, - 'pullRequestUrl': instance.pullRequestUrl, + 'pull_request_url': instance.pullRequestUrl, '_links': instance.links, }; @@ -191,7 +191,7 @@ CreatePullRequestComment _$CreatePullRequestCommentFromJson( Map json) { return CreatePullRequestComment( json['body'] as String?, - json['commitId'] as String?, + json['commit_id'] as String?, json['path'] as String?, json['position'] as int?, ); @@ -201,7 +201,7 @@ Map _$CreatePullRequestCommentToJson( CreatePullRequestComment instance) => { 'body': instance.body, - 'commitId': instance.commitId, + 'commit_id': instance.commitId, 'path': instance.path, 'position': instance.position, }; @@ -214,9 +214,9 @@ PullRequestFile _$PullRequestFileFromJson(Map json) { additionsCount: json['additions'] as int?, deletionsCount: json['deletions'] as int?, changesCount: json['changes'] as int?, - blobUrl: json['blobUrl'] as String?, - rawUrl: json['rawUrl'] as String?, - contentsUrl: json['contentsUrl'] as String?, + blobUrl: json['blob_url'] as String?, + rawUrl: json['raw_url'] as String?, + contentsUrl: json['contents_url'] as String?, patch: json['patch'] as String?, ); } @@ -229,8 +229,8 @@ Map _$PullRequestFileToJson(PullRequestFile instance) => 'additions': instance.additionsCount, 'deletions': instance.deletionsCount, 'changes': instance.changesCount, - 'blobUrl': instance.blobUrl, - 'rawUrl': instance.rawUrl, - 'contentsUrl': instance.contentsUrl, + 'blob_url': instance.blobUrl, + 'raw_url': instance.rawUrl, + 'contents_url': instance.contentsUrl, 'patch': instance.patch, }; diff --git a/lib/src/common/model/reaction.g.dart b/lib/src/common/model/reaction.g.dart index 9090875a..9c26c58b 100644 --- a/lib/src/common/model/reaction.g.dart +++ b/lib/src/common/model/reaction.g.dart @@ -9,21 +9,21 @@ part of 'reaction.dart'; Reaction _$ReactionFromJson(Map json) { return Reaction( id: json['id'] as int?, - nodeId: json['nodeId'] as String?, + nodeId: json['node_id'] as String?, user: json['user'] == null ? null : User.fromJson(json['user'] as Map), content: json['content'] as String?, - createdAt: json['createdAt'] == null + createdAt: json['created_at'] == null ? null - : DateTime.parse(json['createdAt'] as String), + : DateTime.parse(json['created_at'] as String), ); } Map _$ReactionToJson(Reaction instance) => { 'id': instance.id, - 'nodeId': instance.nodeId, + 'node_id': instance.nodeId, 'user': instance.user, 'content': instance.content, - 'createdAt': instance.createdAt?.toIso8601String(), + 'created_at': instance.createdAt?.toIso8601String(), }; diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart index 2478f648..4737ed8a 100644 --- a/lib/src/common/model/repos.dart +++ b/lib/src/common/model/repos.dart @@ -69,6 +69,7 @@ class Repository { this.pushedAt, this.license, this.hasPages = false, + this.permissions }); /// Repository Name @@ -84,6 +85,7 @@ class Repository { final String fullName; /// Repository Owner + @JsonKey(defaultValue: null) final UserInformation? owner; /// If the Repository is Private @@ -187,6 +189,8 @@ class Repository { @JsonKey(defaultValue: false) final bool disabled; + RepositoryPermissions? permissions; + factory Repository.fromJson(Map input) => _$RepositoryFromJson(input); Map toJson() => _$RepositoryToJson(this); @@ -198,6 +202,27 @@ class Repository { String toString() => 'Repository: $owner/$name'; } +/// Model class for repository permissions. +@JsonSerializable() +class RepositoryPermissions { + RepositoryPermissions({this.admin = false, this.push = false, this.pull = false}); + + /// Administrative Access + @JsonKey(defaultValue: false) + final bool admin; + + /// Push Access + @JsonKey(defaultValue: false) + final bool push; + + /// Pull Access + @JsonKey(defaultValue: false) + final bool pull; + + factory RepositoryPermissions.fromJson(Map json) => + _$RepositoryPermissionsFromJson(json); +} + @JsonSerializable(createToJson: false) class Tag { final String name; diff --git a/lib/src/common/model/repos.g.dart b/lib/src/common/model/repos.g.dart index 219e4865..944df226 100644 --- a/lib/src/common/model/repos.g.dart +++ b/lib/src/common/model/repos.g.dart @@ -10,9 +10,9 @@ GitHubComparison _$GitHubComparisonFromJson(Map json) { return GitHubComparison( json['url'] as String?, json['status'] as String?, - json['aheadBy'] as int?, - json['behindBy'] as int?, - json['totalCommits'] as int?, + json['ahead_by'] as int?, + json['behind_by'] as int?, + json['total_commits'] as int?, ); } @@ -20,46 +20,50 @@ Repository _$RepositoryFromJson(Map json) { return Repository( name: json['name'] as String? ?? '', id: json['id'] as int? ?? 0, - fullName: json['fullName'] as String? ?? '', + fullName: json['full_name'] as String? ?? '', owner: json['owner'] == null ? null : UserInformation.fromJson(json['owner'] as Map), - htmlUrl: json['htmlUrl'] as String? ?? '', + htmlUrl: json['html_url'] as String? ?? '', description: json['description'] as String? ?? '', - cloneUrl: json['cloneUrl'] as String? ?? '', - gitUrl: json['gitUrl'] as String? ?? '', - sshUrl: json['sshUrl'] as String? ?? '', - svnUrl: json['svnUrl'] as String? ?? '', - defaultBranch: json['defaultBranch'] as String? ?? '', - createdAt: json['createdAt'] == null + cloneUrl: json['clone_url'] as String? ?? '', + gitUrl: json['git_url'] as String? ?? '', + sshUrl: json['ssh_url'] as String? ?? '', + svnUrl: json['svn_url'] as String? ?? '', + defaultBranch: json['default_branch'] as String? ?? '', + createdAt: json['created_at'] == null ? null - : DateTime.parse(json['createdAt'] as String), + : DateTime.parse(json['created_at'] as String), isPrivate: json['private'] as bool? ?? false, isFork: json['fork'] as bool? ?? false, - stargazersCount: json['stargazersCount'] as int? ?? 0, - watchersCount: json['watchersCount'] as int? ?? 0, + stargazersCount: json['stargazers_count'] as int? ?? 0, + watchersCount: json['watchers_count'] as int? ?? 0, language: json['language'] as String? ?? '', - hasWiki: json['hasWiki'] as bool? ?? false, - hasDownloads: json['hasDownloads'] as bool? ?? false, - forksCount: json['forksCount'] as int? ?? 0, - openIssuesCount: json['openIssuesCount'] as int? ?? 0, - subscribersCount: json['subscribersCount'] as int? ?? 0, - networkCount: json['networkCount'] as int? ?? 0, - hasIssues: json['hasIssues'] as bool? ?? false, + hasWiki: json['has_wiki'] as bool? ?? false, + hasDownloads: json['has_downloads'] as bool? ?? false, + forksCount: json['forks_count'] as int? ?? 0, + openIssuesCount: json['open_issues_count'] as int? ?? 0, + subscribersCount: json['subscribers_count'] as int? ?? 0, + networkCount: json['network_count'] as int? ?? 0, + hasIssues: json['has_issues'] as bool? ?? false, size: json['size'] as int? ?? 0, archived: json['archived'] as bool? ?? false, disabled: json['disabled'] as bool? ?? false, homepage: json['homepage'] as String? ?? '', - updatedAt: json['updatedAt'] == null + updatedAt: json['updated_at'] == null ? null - : DateTime.parse(json['updatedAt'] as String), - pushedAt: json['pushedAt'] == null + : DateTime.parse(json['updated_at'] as String), + pushedAt: json['pushed_at'] == null ? null - : DateTime.parse(json['pushedAt'] as String), + : DateTime.parse(json['pushed_at'] as String), license: json['license'] == null ? null : LicenseKind.fromJson(json['license'] as Map), - hasPages: json['hasPages'] as bool? ?? false, + hasPages: json['has_pages'] as bool? ?? false, + permissions: json['permissions'] == null + ? null + : RepositoryPermissions.fromJson( + json['permissions'] as Map), ); } @@ -67,36 +71,54 @@ Map _$RepositoryToJson(Repository instance) => { 'name': instance.name, 'id': instance.id, - 'fullName': instance.fullName, + 'full_name': instance.fullName, 'owner': instance.owner, 'private': instance.isPrivate, 'fork': instance.isFork, - 'htmlUrl': instance.htmlUrl, + 'html_url': instance.htmlUrl, 'description': instance.description, - 'cloneUrl': instance.cloneUrl, - 'sshUrl': instance.sshUrl, - 'svnUrl': instance.svnUrl, - 'gitUrl': instance.gitUrl, + 'clone_url': instance.cloneUrl, + 'ssh_url': instance.sshUrl, + 'svn_url': instance.svnUrl, + 'git_url': instance.gitUrl, 'homepage': instance.homepage, 'size': instance.size, - 'stargazersCount': instance.stargazersCount, - 'watchersCount': instance.watchersCount, + 'stargazers_count': instance.stargazersCount, + 'watchers_count': instance.watchersCount, 'language': instance.language, - 'hasIssues': instance.hasIssues, - 'hasWiki': instance.hasWiki, - 'hasDownloads': instance.hasDownloads, - 'hasPages': instance.hasPages, - 'forksCount': instance.forksCount, - 'openIssuesCount': instance.openIssuesCount, - 'defaultBranch': instance.defaultBranch, - 'subscribersCount': instance.subscribersCount, - 'networkCount': instance.networkCount, - 'createdAt': instance.createdAt?.toIso8601String(), - 'pushedAt': instance.pushedAt?.toIso8601String(), - 'updatedAt': instance.updatedAt?.toIso8601String(), + 'has_issues': instance.hasIssues, + 'has_wiki': instance.hasWiki, + 'has_downloads': instance.hasDownloads, + 'has_pages': instance.hasPages, + 'forks_count': instance.forksCount, + 'open_issues_count': instance.openIssuesCount, + 'default_branch': instance.defaultBranch, + 'subscribers_count': instance.subscribersCount, + 'network_count': instance.networkCount, + 'created_at': instance.createdAt?.toIso8601String(), + 'pushed_at': instance.pushedAt?.toIso8601String(), + 'updated_at': instance.updatedAt?.toIso8601String(), 'license': instance.license, 'archived': instance.archived, 'disabled': instance.disabled, + 'permissions': instance.permissions, + }; + +RepositoryPermissions _$RepositoryPermissionsFromJson( + Map json) { + return RepositoryPermissions( + admin: json['admin'] as bool? ?? false, + push: json['push'] as bool? ?? false, + pull: json['pull'] as bool? ?? false, + ); +} + +Map _$RepositoryPermissionsToJson( + RepositoryPermissions instance) => + { + 'admin': instance.admin, + 'push': instance.push, + 'pull': instance.pull, }; Tag _$TagFromJson(Map json) { @@ -115,8 +137,8 @@ CommitData _$CommitDataFromJson(Map json) { ? null : GitCommit.fromJson(json['commit'] as Map), json['url'] as String?, - json['htmlUrl'] as String?, - json['commentsUrl'] as String?, + json['html_url'] as String?, + json['comments_url'] as String?, json['author'] == null ? null : CommitDataUser.fromJson(json['author'] as Map), @@ -134,8 +156,8 @@ Map _$CommitDataToJson(CommitData instance) => 'sha': instance.sha, 'commit': instance.commit, 'url': instance.url, - 'htmlUrl': instance.htmlUrl, - 'commentsUrl': instance.commentsUrl, + 'html_url': instance.htmlUrl, + 'comments_url': instance.commentsUrl, 'author': instance.author, 'committer': instance.committer, 'parents': instance.parents, @@ -175,8 +197,8 @@ UserInformation _$UserInformationFromJson(Map json) { return UserInformation( json['login'] as String, json['id'] as int, - json['avatarUrl'] as String, - json['htmlUrl'] as String, + json['avatar_url'] as String, + json['html_url'] as String, ); } @@ -184,8 +206,8 @@ Map _$UserInformationToJson(UserInformation instance) => { 'login': instance.login, 'id': instance.id, - 'avatarUrl': instance.avatarUrl, - 'htmlUrl': instance.htmlUrl, + 'avatar_url': instance.avatarUrl, + 'html_url': instance.htmlUrl, }; RepositorySlug _$RepositorySlugFromJson(Map json) { @@ -207,13 +229,13 @@ CreateRepository _$CreateRepositoryFromJson(Map json) { description: json['description'] as String?, homepage: json['homepage'] as String?, private: json['private'] as bool?, - hasIssues: json['hasIssues'] as bool?, - hasDownloads: json['hasDownloads'] as bool?, - teamId: json['teamId'] as int?, - autoInit: json['autoInit'] as bool?, - gitignoreTemplate: json['gitignoreTemplate'] as String?, - licenseTemplate: json['licenseTemplate'] as String?, - hasWiki: json['hasWiki'] as bool?, + hasIssues: json['has_issues'] as bool?, + hasDownloads: json['has_downloads'] as bool?, + teamId: json['team_id'] as int?, + autoInit: json['auto_init'] as bool?, + gitignoreTemplate: json['gitignore_template'] as String?, + licenseTemplate: json['license_template'] as String?, + hasWiki: json['has_wiki'] as bool?, ); } @@ -223,13 +245,13 @@ Map _$CreateRepositoryToJson(CreateRepository instance) => 'description': instance.description, 'homepage': instance.homepage, 'private': instance.private, - 'hasIssues': instance.hasIssues, - 'hasWiki': instance.hasWiki, - 'hasDownloads': instance.hasDownloads, - 'teamId': instance.teamId, - 'autoInit': instance.autoInit, - 'gitignoreTemplate': instance.gitignoreTemplate, - 'licenseTemplate': instance.licenseTemplate, + 'has_issues': instance.hasIssues, + 'has_wiki': instance.hasWiki, + 'has_downloads': instance.hasDownloads, + 'team_id': instance.teamId, + 'auto_init': instance.autoInit, + 'gitignore_template': instance.gitignoreTemplate, + 'license_template': instance.licenseTemplate, }; Branch _$BranchFromJson(Map json) { @@ -254,11 +276,12 @@ LicenseDetails _$LicenseDetailsFromJson(Map json) { size: json['size'] as int?, url: json['url'] == null ? null : Uri.parse(json['url'] as String), htmlUrl: - json['htmlUrl'] == null ? null : Uri.parse(json['htmlUrl'] as String), - gitUrl: json['gitUrl'] == null ? null : Uri.parse(json['gitUrl'] as String), - downloadUrl: json['downloadUrl'] == null + json['html_url'] == null ? null : Uri.parse(json['html_url'] as String), + gitUrl: + json['git_url'] == null ? null : Uri.parse(json['git_url'] as String), + downloadUrl: json['download_url'] == null ? null - : Uri.parse(json['downloadUrl'] as String), + : Uri.parse(json['download_url'] as String), type: json['type'] as String?, content: json['content'] as String?, encoding: json['encoding'] as String?, @@ -278,9 +301,9 @@ Map _$LicenseDetailsToJson(LicenseDetails instance) => 'sha': instance.sha, 'size': instance.size, 'url': instance.url?.toString(), - 'htmlUrl': instance.htmlUrl?.toString(), - 'gitUrl': instance.gitUrl?.toString(), - 'downloadUrl': instance.downloadUrl?.toString(), + 'html_url': instance.htmlUrl?.toString(), + 'git_url': instance.gitUrl?.toString(), + 'download_url': instance.downloadUrl?.toString(), 'type': instance.type, 'content': instance.content, 'encoding': instance.encoding, @@ -292,9 +315,9 @@ LicenseKind _$LicenseKindFromJson(Map json) { return LicenseKind( key: json['key'] as String?, name: json['name'] as String?, - spdxId: json['spdxId'] as String?, + spdxId: json['spdx_id'] as String?, url: json['url'] == null ? null : Uri.parse(json['url'] as String), - nodeId: json['nodeId'] as String?, + nodeId: json['node_id'] as String?, ); } @@ -302,7 +325,7 @@ Map _$LicenseKindToJson(LicenseKind instance) => { 'key': instance.key, 'name': instance.name, - 'spdxId': instance.spdxId, + 'spdx_id': instance.spdxId, 'url': instance.url?.toString(), - 'nodeId': instance.nodeId, + 'node_id': instance.nodeId, }; diff --git a/lib/src/common/model/repos_commits.g.dart b/lib/src/common/model/repos_commits.g.dart index bdbbce85..ef794d22 100644 --- a/lib/src/common/model/repos_commits.g.dart +++ b/lib/src/common/model/repos_commits.g.dart @@ -94,14 +94,14 @@ CommitComment _$CommitCommentFromJson(Map json) { position: json['position'] as int?, path: json['path'] as String?, apiUrl: json['url'] as String?, - commitId: json['commitId'] as String?, - createdAt: json['createdAt'] == null + commitId: json['commit_id'] as String?, + createdAt: json['created_at'] == null ? null - : DateTime.parse(json['createdAt'] as String), - htmlUrl: json['htmlUrl'] as String?, - updatedAt: json['updatedAt'] == null + : DateTime.parse(json['created_at'] as String), + htmlUrl: json['html_url'] as String?, + updatedAt: json['updated_at'] == null ? null - : DateTime.parse(json['updatedAt'] as String), + : DateTime.parse(json['updated_at'] as String), body: json['body'] as String?, ); } @@ -112,10 +112,10 @@ Map _$CommitCommentToJson(CommitComment instance) => 'path': instance.path, 'line': instance.line, 'position': instance.position, - 'commitId': instance.commitId, - 'createdAt': instance.createdAt?.toIso8601String(), - 'updatedAt': instance.updatedAt?.toIso8601String(), - 'htmlUrl': instance.htmlUrl, + 'commit_id': instance.commitId, + 'created_at': instance.createdAt?.toIso8601String(), + 'updated_at': instance.updatedAt?.toIso8601String(), + 'html_url': instance.htmlUrl, 'url': instance.apiUrl, 'body': instance.body, }; diff --git a/lib/src/common/model/repos_contents.g.dart b/lib/src/common/model/repos_contents.g.dart index 30410b63..379b3ae6 100644 --- a/lib/src/common/model/repos_contents.g.dart +++ b/lib/src/common/model/repos_contents.g.dart @@ -21,10 +21,10 @@ GitHubFile _$GitHubFileFromJson(Map json) { links: json['_links'] == null ? null : Links.fromJson(json['_links'] as Map), - sourceRepository: json['sourceRepository'] == null + sourceRepository: json['source_repository'] == null ? null : RepositorySlug.fromJson( - json['sourceRepository'] as Map), + json['source_repository'] as Map), ); } @@ -41,7 +41,7 @@ Map _$GitHubFileToJson(GitHubFile instance) => 'git_url': instance.gitUrl, 'download_url': instance.downloadUrl, '_links': instance.links, - 'sourceRepository': instance.sourceRepository, + 'source_repository': instance.sourceRepository, }; Links _$LinksFromJson(Map json) { diff --git a/lib/src/common/model/repos_hooks.g.dart b/lib/src/common/model/repos_hooks.g.dart index 6730f655..d230f85c 100644 --- a/lib/src/common/model/repos_hooks.g.dart +++ b/lib/src/common/model/repos_hooks.g.dart @@ -14,13 +14,13 @@ Hook _$HookFromJson(Map json) { ..events = (json['events'] as List?)?.map((e) => e as String).toList() ..active = json['active'] as bool? - ..createdAt = json['createdAt'] == null + ..createdAt = json['created_at'] == null ? null - : DateTime.parse(json['createdAt'] as String) - ..updatedAt = json['updatedAt'] == null + : DateTime.parse(json['created_at'] as String) + ..updatedAt = json['updated_at'] == null ? null - : DateTime.parse(json['updatedAt'] as String) - ..repoName = json['repoName'] as String? + : DateTime.parse(json['updated_at'] as String) + ..repoName = json['repo_name'] as String? ..config = json['config'] == null ? null : HookConfig.fromJson(json['config'] as Map); @@ -31,27 +31,27 @@ Map _$HookToJson(Hook instance) => { 'name': instance.name, 'events': instance.events, 'active': instance.active, - 'createdAt': instance.createdAt?.toIso8601String(), - 'updatedAt': instance.updatedAt?.toIso8601String(), - 'repoName': instance.repoName, + 'created_at': instance.createdAt?.toIso8601String(), + 'updated_at': instance.updatedAt?.toIso8601String(), + 'repo_name': instance.repoName, 'config': instance.config, }; HookConfig _$HookConfigFromJson(Map json) { return HookConfig( url: json['url'] as String?, - contentType: json['contentType'] as String?, + contentType: json['content_type'] as String?, secret: json['secret'] as String?, - insecureSsl: json['insecureSsl'] as String?, + insecureSsl: json['insecure_ssl'] as String?, ); } Map _$HookConfigToJson(HookConfig instance) => { 'url': instance.url, - 'contentType': instance.contentType, + 'content_type': instance.contentType, 'secret': instance.secret, - 'insecureSsl': instance.insecureSsl, + 'insecure_ssl': instance.insecureSsl, }; CreateHook _$CreateHookFromJson(Map json) { diff --git a/lib/src/common/model/repos_merging.g.dart b/lib/src/common/model/repos_merging.g.dart index 901a94d0..d4fa2d4b 100644 --- a/lib/src/common/model/repos_merging.g.dart +++ b/lib/src/common/model/repos_merging.g.dart @@ -10,7 +10,7 @@ CreateMerge _$CreateMergeFromJson(Map json) { return CreateMerge( json['base'] as String?, json['head'] as String?, - commitMessage: json['commitMessage'] as String?, + commitMessage: json['commit_message'] as String?, ); } @@ -18,5 +18,5 @@ Map _$CreateMergeToJson(CreateMerge instance) => { 'base': instance.base, 'head': instance.head, - 'commitMessage': instance.commitMessage, + 'commit_message': instance.commitMessage, }; diff --git a/lib/src/common/model/repos_pages.g.dart b/lib/src/common/model/repos_pages.g.dart index 292c9765..8cdb0c34 100644 --- a/lib/src/common/model/repos_pages.g.dart +++ b/lib/src/common/model/repos_pages.g.dart @@ -33,12 +33,12 @@ PageBuild _$PageBuildFromJson(Map json) { : PageBuildPusher.fromJson(json['pusher'] as Map), commit: json['commit'] as String?, duration: json['duration'] as int?, - createdAt: json['createdAt'] == null + createdAt: json['created_at'] == null ? null - : DateTime.parse(json['createdAt'] as String), - updatedAt: json['updatedAt'] == null + : DateTime.parse(json['created_at'] as String), + updatedAt: json['updated_at'] == null ? null - : DateTime.parse(json['updatedAt'] as String), + : DateTime.parse(json['updated_at'] as String), ); } @@ -49,8 +49,8 @@ Map _$PageBuildToJson(PageBuild instance) => { 'pusher': instance.pusher, 'commit': instance.commit, 'duration': instance.duration, - 'createdAt': instance.createdAt?.toIso8601String(), - 'updatedAt': instance.updatedAt?.toIso8601String(), + 'created_at': instance.createdAt?.toIso8601String(), + 'updated_at': instance.updatedAt?.toIso8601String(), }; PageBuildPusher _$PageBuildPusherFromJson(Map json) { @@ -58,9 +58,9 @@ PageBuildPusher _$PageBuildPusherFromJson(Map json) { login: json['login'] as String?, id: json['id'] as int?, apiUrl: json['url'] as String?, - htmlUrl: json['htmlUrl'] as String?, + htmlUrl: json['html_url'] as String?, type: json['type'] as String?, - siteAdmin: json['siteAdmin'] as bool?, + siteAdmin: json['site_admin'] as bool?, ); } @@ -69,9 +69,9 @@ Map _$PageBuildPusherToJson(PageBuildPusher instance) => 'id': instance.id, 'login': instance.login, 'url': instance.apiUrl, - 'htmlUrl': instance.htmlUrl, + 'html_url': instance.htmlUrl, 'type': instance.type, - 'siteAdmin': instance.siteAdmin, + 'site_admin': instance.siteAdmin, }; PageBuildError _$PageBuildErrorFromJson(Map json) { diff --git a/lib/src/common/model/repos_releases.g.dart b/lib/src/common/model/repos_releases.g.dart index 00b3e59c..5b3b78e5 100644 --- a/lib/src/common/model/repos_releases.g.dart +++ b/lib/src/common/model/repos_releases.g.dart @@ -10,23 +10,23 @@ Release _$ReleaseFromJson(Map json) { return Release( id: json['id'] as int?, url: json['url'] as String?, - htmlUrl: json['htmlUrl'] as String?, - tarballUrl: json['tarballUrl'] as String?, - uploadUrl: json['uploadUrl'] as String?, - nodeId: json['nodeId'] as String?, - tagName: json['tagName'] as String?, - targetCommitish: json['targetCommitish'] as String?, + htmlUrl: json['html_url'] as String?, + tarballUrl: json['tarball_url'] as String?, + uploadUrl: json['upload_url'] as String?, + nodeId: json['node_id'] as String?, + tagName: json['tag_name'] as String?, + targetCommitish: json['target_commitish'] as String?, name: json['name'] as String?, body: json['body'] as String?, description: json['description'] as String?, isDraft: json['draft'] as bool?, isPrerelease: json['prerelease'] as bool?, - createdAt: json['createdAt'] == null + createdAt: json['created_at'] == null ? null - : DateTime.parse(json['createdAt'] as String), - publishedAt: json['publishedAt'] == null + : DateTime.parse(json['created_at'] as String), + publishedAt: json['published_at'] == null ? null - : DateTime.parse(json['publishedAt'] as String), + : DateTime.parse(json['published_at'] as String), author: json['author'] == null ? null : User.fromJson(json['author'] as Map), @@ -34,29 +34,29 @@ Release _$ReleaseFromJson(Map json) { ?.map((e) => ReleaseAsset.fromJson(e as Map)) .toList(), ) - ..zipballUrl = json['zipballUrl'] as String? - ..assetsUrl = json['assetsUrl'] as String? + ..zipballUrl = json['zipball_url'] as String? + ..assetsUrl = json['assets_url'] as String? ..errors = json['errors'] as List?; } Map _$ReleaseToJson(Release instance) => { 'url': instance.url, - 'htmlUrl': instance.htmlUrl, - 'tarballUrl': instance.tarballUrl, - 'zipballUrl': instance.zipballUrl, - 'uploadUrl': instance.uploadUrl, - 'assetsUrl': instance.assetsUrl, + 'html_url': instance.htmlUrl, + 'tarball_url': instance.tarballUrl, + 'zipball_url': instance.zipballUrl, + 'upload_url': instance.uploadUrl, + 'assets_url': instance.assetsUrl, 'id': instance.id, - 'nodeId': instance.nodeId, - 'tagName': instance.tagName, - 'targetCommitish': instance.targetCommitish, + 'node_id': instance.nodeId, + 'tag_name': instance.tagName, + 'target_commitish': instance.targetCommitish, 'name': instance.name, 'body': instance.body, 'description': instance.description, 'draft': instance.isDraft, 'prerelease': instance.isPrerelease, - 'createdAt': instance.createdAt?.toIso8601String(), - 'publishedAt': instance.publishedAt?.toIso8601String(), + 'created_at': instance.createdAt?.toIso8601String(), + 'published_at': instance.publishedAt?.toIso8601String(), 'author': instance.author, 'assets': instance.assets, 'errors': instance.errors, @@ -68,38 +68,38 @@ ReleaseAsset _$ReleaseAssetFromJson(Map json) { name: json['name'] as String?, label: json['label'] as String?, state: json['state'] as String?, - contentType: json['contentType'] as String?, + contentType: json['content_type'] as String?, size: json['size'] as int?, - downloadCount: json['downloadCount'] as int?, - browserDownloadUrl: json['browserDownloadUrl'] as String?, - createdAt: json['createdAt'] == null + downloadCount: json['download_count'] as int?, + browserDownloadUrl: json['browser_download_url'] as String?, + createdAt: json['created_at'] == null ? null - : DateTime.parse(json['createdAt'] as String), - updatedAt: json['updatedAt'] == null + : DateTime.parse(json['created_at'] as String), + updatedAt: json['updated_at'] == null ? null - : DateTime.parse(json['updatedAt'] as String), + : DateTime.parse(json['updated_at'] as String), ); } Map _$ReleaseAssetToJson(ReleaseAsset instance) => { - 'browserDownloadUrl': instance.browserDownloadUrl, + 'browser_download_url': instance.browserDownloadUrl, 'id': instance.id, 'name': instance.name, 'label': instance.label, 'state': instance.state, - 'contentType': instance.contentType, + 'content_type': instance.contentType, 'size': instance.size, - 'downloadCount': instance.downloadCount, - 'createdAt': instance.createdAt?.toIso8601String(), - 'updatedAt': instance.updatedAt?.toIso8601String(), + 'download_count': instance.downloadCount, + 'created_at': instance.createdAt?.toIso8601String(), + 'updated_at': instance.updatedAt?.toIso8601String(), }; CreateRelease _$CreateReleaseFromJson(Map json) { return CreateRelease( - json['tagName'] as String?, + json['tag_name'] as String?, ) - ..targetCommitish = json['targetCommitish'] as String? + ..targetCommitish = json['target_commitish'] as String? ..name = json['name'] as String? ..body = json['body'] as String? ..isDraft = json['draft'] as bool? @@ -108,8 +108,8 @@ CreateRelease _$CreateReleaseFromJson(Map json) { Map _$CreateReleaseToJson(CreateRelease instance) => { - 'tagName': instance.tagName, - 'targetCommitish': instance.targetCommitish, + 'tag_name': instance.tagName, + 'target_commitish': instance.targetCommitish, 'name': instance.name, 'body': instance.body, 'draft': instance.isDraft, diff --git a/lib/src/common/model/repos_statuses.g.dart b/lib/src/common/model/repos_statuses.g.dart index ea235d05..2938d369 100644 --- a/lib/src/common/model/repos_statuses.g.dart +++ b/lib/src/common/model/repos_statuses.g.dart @@ -11,7 +11,7 @@ CombinedRepositoryStatus _$CombinedRepositoryStatusFromJson( return CombinedRepositoryStatus( state: json['state'] as String?, sha: json['sha'] as String?, - totalCount: json['totalCount'] as int?, + totalCount: json['total_count'] as int?, statuses: (json['statuses'] as List?) ?.map((e) => RepositoryStatus.fromJson(e as Map)) .toList(), @@ -26,21 +26,21 @@ Map _$CombinedRepositoryStatusToJson( { 'state': instance.state, 'sha': instance.sha, - 'totalCount': instance.totalCount, + 'total_count': instance.totalCount, 'statuses': instance.statuses, 'repository': instance.repository, }; RepositoryStatus _$RepositoryStatusFromJson(Map json) { return RepositoryStatus( - createdAt: json['createdAt'] == null + createdAt: json['created_at'] == null ? null - : DateTime.parse(json['createdAt'] as String), - updatedAt: json['updatedAt'] == null + : DateTime.parse(json['created_at'] as String), + updatedAt: json['updated_at'] == null ? null - : DateTime.parse(json['updatedAt'] as String), + : DateTime.parse(json['updated_at'] as String), state: json['state'] as String?, - targetUrl: json['targetUrl'] as String?, + targetUrl: json['target_url'] as String?, description: json['description'] as String?, context: json['context'] as String?, ); @@ -48,10 +48,10 @@ RepositoryStatus _$RepositoryStatusFromJson(Map json) { Map _$RepositoryStatusToJson(RepositoryStatus instance) => { - 'createdAt': instance.createdAt?.toIso8601String(), - 'updatedAt': instance.updatedAt?.toIso8601String(), + 'created_at': instance.createdAt?.toIso8601String(), + 'updated_at': instance.updatedAt?.toIso8601String(), 'state': instance.state, - 'targetUrl': instance.targetUrl, + 'target_url': instance.targetUrl, 'description': instance.description, 'context': instance.context, }; diff --git a/lib/src/common/model/users.g.dart b/lib/src/common/model/users.g.dart index df0fdd0e..e9a20aaa 100644 --- a/lib/src/common/model/users.g.dart +++ b/lib/src/common/model/users.g.dart @@ -10,9 +10,9 @@ User _$UserFromJson(Map json) { return User( id: json['id'] as int?, login: json['login'] as String?, - avatarUrl: json['avatarUrl'] as String?, - htmlUrl: json['htmlUrl'] as String?, - siteAdmin: json['siteAdmin'] as bool?, + avatarUrl: json['avatar_url'] as String?, + htmlUrl: json['html_url'] as String?, + siteAdmin: json['site_admin'] as bool?, name: json['name'] as String?, company: json['company'] as String?, blog: json['blog'] as String?, @@ -24,21 +24,21 @@ User _$UserFromJson(Map json) { publicGistsCount: json['public_gists'] as int?, followersCount: json['followers'] as int?, followingCount: json['following'] as int?, - createdAt: json['createdAt'] == null + createdAt: json['created_at'] == null ? null - : DateTime.parse(json['createdAt'] as String), - updatedAt: json['updatedAt'] == null + : DateTime.parse(json['created_at'] as String), + updatedAt: json['updated_at'] == null ? null - : DateTime.parse(json['updatedAt'] as String), - )..twitterUsername = json['twitterUsername'] as String?; + : DateTime.parse(json['updated_at'] as String), + )..twitterUsername = json['twitter_username'] as String?; } Map _$UserToJson(User instance) => { 'login': instance.login, 'id': instance.id, - 'avatarUrl': instance.avatarUrl, - 'htmlUrl': instance.htmlUrl, - 'siteAdmin': instance.siteAdmin, + 'avatar_url': instance.avatarUrl, + 'html_url': instance.htmlUrl, + 'site_admin': instance.siteAdmin, 'name': instance.name, 'company': instance.company, 'blog': instance.blog, @@ -50,18 +50,18 @@ Map _$UserToJson(User instance) => { 'public_gists': instance.publicGistsCount, 'followers': instance.followersCount, 'following': instance.followingCount, - 'createdAt': instance.createdAt?.toIso8601String(), - 'updatedAt': instance.updatedAt?.toIso8601String(), - 'twitterUsername': instance.twitterUsername, + 'created_at': instance.createdAt?.toIso8601String(), + 'updated_at': instance.updatedAt?.toIso8601String(), + 'twitter_username': instance.twitterUsername, }; Collaborator _$CollaboratorFromJson(Map json) { return Collaborator( json['login'] as String?, json['id'] as int?, - json['htmlUrl'] as String?, + json['html_url'] as String?, json['type'] as String?, - json['siteAdmin'] as bool?, + json['site_admin'] as bool?, (json['permissions'] as Map?)?.map( (k, e) => MapEntry(k, e as bool), ), @@ -72,10 +72,10 @@ Contributor _$ContributorFromJson(Map json) { return Contributor( id: json['id'] as int?, login: json['login'] as String?, - avatarUrl: json['avatarUrl'] as String?, - htmlUrl: json['htmlUrl'] as String?, + avatarUrl: json['avatar_url'] as String?, + htmlUrl: json['html_url'] as String?, type: json['type'] as String?, - siteAdmin: json['siteAdmin'] as bool?, + siteAdmin: json['site_admin'] as bool?, contributions: json['contributions'] as int?, ); } @@ -84,10 +84,10 @@ Map _$ContributorToJson(Contributor instance) => { 'login': instance.login, 'id': instance.id, - 'avatarUrl': instance.avatarUrl, - 'htmlUrl': instance.htmlUrl, + 'avatar_url': instance.avatarUrl, + 'html_url': instance.htmlUrl, 'type': instance.type, - 'siteAdmin': instance.siteAdmin, + 'site_admin': instance.siteAdmin, 'contributions': instance.contributions, }; @@ -95,9 +95,9 @@ CurrentUser _$CurrentUserFromJson(Map json) { return CurrentUser() ..login = json['login'] as String? ..id = json['id'] as int? - ..avatarUrl = json['avatarUrl'] as String? - ..htmlUrl = json['htmlUrl'] as String? - ..siteAdmin = json['siteAdmin'] as bool? + ..avatarUrl = json['avatar_url'] as String? + ..htmlUrl = json['html_url'] as String? + ..siteAdmin = json['site_admin'] as bool? ..name = json['name'] as String? ..company = json['company'] as String? ..blog = json['blog'] as String? @@ -109,13 +109,13 @@ CurrentUser _$CurrentUserFromJson(Map json) { ..publicGistsCount = json['public_gists'] as int? ..followersCount = json['followers'] as int? ..followingCount = json['following'] as int? - ..createdAt = json['createdAt'] == null + ..createdAt = json['created_at'] == null ? null - : DateTime.parse(json['createdAt'] as String) - ..updatedAt = json['updatedAt'] == null + : DateTime.parse(json['created_at'] as String) + ..updatedAt = json['updated_at'] == null ? null - : DateTime.parse(json['updatedAt'] as String) - ..twitterUsername = json['twitterUsername'] as String? + : DateTime.parse(json['updated_at'] as String) + ..twitterUsername = json['twitter_username'] as String? ..privateReposCount = json['total_private_repos'] as int? ..ownedPrivateReposCount = json['owned_private_repos'] as int? ..diskUsage = json['disk_usage'] as int? @@ -128,9 +128,9 @@ Map _$CurrentUserToJson(CurrentUser instance) => { 'login': instance.login, 'id': instance.id, - 'avatarUrl': instance.avatarUrl, - 'htmlUrl': instance.htmlUrl, - 'siteAdmin': instance.siteAdmin, + 'avatar_url': instance.avatarUrl, + 'html_url': instance.htmlUrl, + 'site_admin': instance.siteAdmin, 'name': instance.name, 'company': instance.company, 'blog': instance.blog, @@ -142,9 +142,9 @@ Map _$CurrentUserToJson(CurrentUser instance) => 'public_gists': instance.publicGistsCount, 'followers': instance.followersCount, 'following': instance.followingCount, - 'createdAt': instance.createdAt?.toIso8601String(), - 'updatedAt': instance.updatedAt?.toIso8601String(), - 'twitterUsername': instance.twitterUsername, + 'created_at': instance.createdAt?.toIso8601String(), + 'updated_at': instance.updatedAt?.toIso8601String(), + 'twitter_username': instance.twitterUsername, 'total_private_repos': instance.privateReposCount, 'owned_private_repos': instance.ownedPrivateReposCount, 'disk_usage': instance.diskUsage, diff --git a/lib/src/server/hooks.g.dart b/lib/src/server/hooks.g.dart index 706cd44a..867b54ef 100644 --- a/lib/src/server/hooks.g.dart +++ b/lib/src/server/hooks.g.dart @@ -95,9 +95,9 @@ PullRequestEvent _$PullRequestEventFromJson(Map json) { return PullRequestEvent( action: json['action'] as String?, number: json['number'] as int?, - pullRequest: json['pullRequest'] == null + pullRequest: json['pull_request'] == null ? null - : PullRequest.fromJson(json['pullRequest'] as Map), + : PullRequest.fromJson(json['pull_request'] as Map), sender: json['sender'] == null ? null : User.fromJson(json['sender'] as Map), @@ -111,7 +111,7 @@ Map _$PullRequestEventToJson(PullRequestEvent instance) => { 'action': instance.action, 'number': instance.number, - 'pullRequest': instance.pullRequest, + 'pull_request': instance.pullRequest, 'sender': instance.sender, 'repository': instance.repository, }; From 061468c8451bd54128e1a1b006a69a90fcfe1844 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Mon, 1 Mar 2021 21:06:47 -0700 Subject: [PATCH 218/390] format --- example/repos.dart | 3 +- lib/src/common/model/repos.dart | 76 +++++++++++++++++---------------- lib/src/common/model/users.dart | 4 +- test/experiment/search.dart | 3 +- 4 files changed, 44 insertions(+), 42 deletions(-) diff --git a/example/repos.dart b/example/repos.dart index 7c8060ca..4fdd085c 100644 --- a/example/repos.dart +++ b/example/repos.dart @@ -11,8 +11,7 @@ List? repos; Map> sorts = { 'stars': (Repository a, Repository b) => b.stargazersCount.compareTo(a.stargazersCount), - 'forks': (Repository a, Repository b) => - b.forksCount.compareTo(a.forksCount), + 'forks': (Repository a, Repository b) => b.forksCount.compareTo(a.forksCount), 'created': (Repository a, Repository b) => b.createdAt!.compareTo(a.createdAt!), 'pushed': (Repository a, Repository b) => b.pushedAt!.compareTo(a.pushedAt!), diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart index 4737ed8a..a4bd5d3f 100644 --- a/lib/src/common/model/repos.dart +++ b/lib/src/common/model/repos.dart @@ -2,7 +2,9 @@ import 'package:github/src/common.dart'; import 'package:json_annotation/json_annotation.dart'; part 'repos.g.dart'; -@JsonSerializable(createToJson: false, ) +@JsonSerializable( + createToJson: false, +) class GitHubComparison { final String? url; final String? status; @@ -36,41 +38,40 @@ class GitHubComparison { /// Model class for a repository. @JsonSerializable() class Repository { - Repository({ - this.name = '', - this.id = 0, - this.fullName = '', - this.owner, - this.htmlUrl = '', - this.description = '', - this.cloneUrl = '', - this.gitUrl = '', - this.sshUrl = '', - this.svnUrl = '', - this.defaultBranch = '', - this.createdAt, - this.isPrivate = false, - this.isFork = false, - this.stargazersCount = 0, - this.watchersCount = 0, - this.language = '', - this.hasWiki = false, - this.hasDownloads = false, - this.forksCount = 0, - this.openIssuesCount = 0, - this.subscribersCount = 0, - this.networkCount = 0, - this.hasIssues = false, - this.size = 0, - this.archived = false, - this.disabled = false, - this.homepage = '', - this.updatedAt, - this.pushedAt, - this.license, - this.hasPages = false, - this.permissions - }); + Repository( + {this.name = '', + this.id = 0, + this.fullName = '', + this.owner, + this.htmlUrl = '', + this.description = '', + this.cloneUrl = '', + this.gitUrl = '', + this.sshUrl = '', + this.svnUrl = '', + this.defaultBranch = '', + this.createdAt, + this.isPrivate = false, + this.isFork = false, + this.stargazersCount = 0, + this.watchersCount = 0, + this.language = '', + this.hasWiki = false, + this.hasDownloads = false, + this.forksCount = 0, + this.openIssuesCount = 0, + this.subscribersCount = 0, + this.networkCount = 0, + this.hasIssues = false, + this.size = 0, + this.archived = false, + this.disabled = false, + this.homepage = '', + this.updatedAt, + this.pushedAt, + this.license, + this.hasPages = false, + this.permissions}); /// Repository Name @JsonKey(defaultValue: '') @@ -205,7 +206,8 @@ class Repository { /// Model class for repository permissions. @JsonSerializable() class RepositoryPermissions { - RepositoryPermissions({this.admin = false, this.push = false, this.pull = false}); + RepositoryPermissions( + {this.admin = false, this.push = false, this.pull = false}); /// Administrative Access @JsonKey(defaultValue: false) diff --git a/lib/src/common/model/users.dart b/lib/src/common/model/users.dart index abb0e024..4c3245a4 100644 --- a/lib/src/common/model/users.dart +++ b/lib/src/common/model/users.dart @@ -96,7 +96,9 @@ class User { /// The response from listing collaborators on a repo. // https://developer.github.com/v3/repos/collaborators/#response -@JsonSerializable(createToJson: false, ) +@JsonSerializable( + createToJson: false, +) class Collaborator { final String? login; final int? id; diff --git a/test/experiment/search.dart b/test/experiment/search.dart index 42779560..1fffe4dd 100755 --- a/test/experiment/search.dart +++ b/test/experiment/search.dart @@ -4,7 +4,6 @@ void main() { final github = GitHub(); github.search.repositories('github').listen((repo) { - print( - '${repo.fullName}: ${repo.description}'); + print('${repo.fullName}: ${repo.description}'); }).onDone(github.dispose); } From 78f23ef8e3e6015192cf49f3b75464ba8ca6e9ff Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sat, 6 Mar 2021 21:09:43 -0700 Subject: [PATCH 219/390] Allow start page, per_page, number of pages options to pagination helper --- CHANGELOG.md | 4 ++++ lib/src/common/repos_service.dart | 9 ++++----- lib/src/common/util/pagination.dart | 8 ++++---- pubspec.yaml | 2 +- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 54657751..aa4dc9ed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 8.0.0-nullsafe.2 + - Allow start page, per_page, number of pages options to pagination helper + - Allow page options for listTags + ## 8.0.0-nullsafe.1 - Update to null safety diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 5d773c49..9e9c0717 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -241,13 +241,12 @@ class RepositoriesService extends Service { /// Lists the tags of the specified repository. /// /// API docs: https://developer.github.com/v3/repos/#list-tags - Stream listTags(RepositorySlug slug) { + Stream listTags(RepositorySlug slug, + {int page = 1, int? pages, int perPage = 30}) { ArgumentError.checkNotNull(slug); return PaginationHelper(github).objects, Tag>( - 'GET', - '/repos/${slug.fullName}/tags', - (i) => Tag.fromJson(i), - ); + 'GET', '/repos/${slug.fullName}/tags', (i) => Tag.fromJson(i), + pages: pages, params: {'page': page, 'per_page': perPage}); } /// Lists the branches of the specified repository. diff --git a/lib/src/common/util/pagination.dart b/lib/src/common/util/pagination.dart index 8ed4090a..95d47107 100644 --- a/lib/src/common/util/pagination.dart +++ b/lib/src/common/util/pagination.dart @@ -27,7 +27,9 @@ class PaginationHelper { } else { params = Map.from(params); } - assert(!params.containsKey('page')); + + var page = params['page'] ?? 1; + params['page'] = page; // ignore: literal_only_boolean_expressions while (true) { @@ -69,9 +71,7 @@ class PaginationHelper { break; } - final nextUrl = Uri.parse(next); - final nextPageArg = nextUrl.queryParameters['page']!; - params['page'] = nextPageArg; + params['page'] = ++page; } } diff --git a/pubspec.yaml b/pubspec.yaml index 4e622285..4653c358 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 8.0.0-nullsafe.1 +version: 8.0.0-nullsafe.2 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From e3c00e1936535b1e9fddf4fe9ff78975230f677f Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sat, 6 Mar 2021 21:20:34 -0700 Subject: [PATCH 220/390] prep 8 release --- CHANGELOG.md | 2 +- pubspec.yaml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aa4dc9ed..041bc74c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## 8.0.0-nullsafe.2 +## 8.0.0 - Allow start page, per_page, number of pages options to pagination helper - Allow page options for listTags diff --git a/pubspec.yaml b/pubspec.yaml index 4653c358..52f04c89 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,10 +1,10 @@ name: github -version: 8.0.0-nullsafe.2 +version: 8.0.0 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart environment: - sdk: '>=2.12.0-259.12.beta <3.0.0' + sdk: '>=2.12.0 <3.0.0' dependencies: collection: ^1.15.0 @@ -18,7 +18,7 @@ dev_dependencies: build_test: any build_web_compilers: any json_serializable: ^4.0.0 - mockito: ^5.0.0-nullsafety.5 + mockito: ^5.0.0 pedantic: ^1.10.0 test: ^1.16.0 yaml: ^3.0.0 From 3649025d7f8385d9b5afac9acdfc4556c89dfb4e Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sat, 6 Mar 2021 21:21:54 -0700 Subject: [PATCH 221/390] fix CI to use stable dart 2.12 --- .github/workflows/dart.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dart.yml b/.github/workflows/dart.yml index bf092d26..c15ec991 100644 --- a/.github/workflows/dart.yml +++ b/.github/workflows/dart.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest container: - image: google/dart:2.12-beta + image: google/dart:2.12 steps: - uses: actions/checkout@v1 From 436618d5ee890b36792a67ab4d6485f70a52797e Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sat, 6 Mar 2021 21:29:02 -0700 Subject: [PATCH 222/390] update readme --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 90a42fc3..3d926c39 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,8 @@ This is a library for interacting with GitHub in Dart. It works on all platforms including web, server, and Flutter. Please submit issues and pull requests, help out, or just give encouragement. -**Notice**: We are looking for contributors. If you're interested or have questions, head over to discussions https://github.com/SpinlockLabs/github.dart/discussions +**Notice**: This is not an official Github project. It is maintained by volunteers. +We are looking for contributors. If you're interested or have questions, head over to discussions https://github.com/SpinlockLabs/github.dart/discussions ## Features @@ -30,4 +31,4 @@ See the examples in the example directory to learn how to use some of the featur ## Contacting Us -Post a question, idea, in the discussions group https://github.com/SpinlockLabs/github.dart/discussions +Post a question or idea: https://github.com/SpinlockLabs/github.dart/discussions From e620ff3b66dac3ccb7ea11bd1710f54f4cc0bee7 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sun, 7 Mar 2021 09:28:07 -0700 Subject: [PATCH 223/390] improve pub score --- CHANGELOG.md | 3 +++ README.md | 2 +- example/common.dart | 1 + lib/src/common/model/repos.dart | 2 ++ pubspec.yaml | 2 +- 5 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 041bc74c..6eabdc93 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## 8.0.1 + - Minor tweaks to improve pub score + ## 8.0.0 - Allow start page, per_page, number of pages options to pagination helper - Allow page options for listTags diff --git a/README.md b/README.md index 3d926c39..ccdb9ab2 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ We are looking for contributors. If you're interested or have questions, head ov ## Links -- [Library Demos](http://spinlocklabs.github.io/github.dart/) (based on the [sample code](https://github.com/SpinlockLabs/github.dart/tree/master/example)) +- [Library Demos](https://spinlocklabs.github.io/github.dart/) (based on the [sample code](https://github.com/SpinlockLabs/github.dart/tree/master/example)) - [Pub Package](https://pub.dartlang.org/packages/github) - [Wiki](https://github.com/SpinlockLabs/github.dart/wiki) - [Latest API reference](https://pub.dev/documentation/github/latest/) diff --git a/example/common.dart b/example/common.dart index d8983093..69663591 100644 --- a/example/common.dart +++ b/example/common.dart @@ -13,6 +13,7 @@ export 'package:github/browser_helper.dart'; Future initViewSourceButton(String script) async { // query the DOM for the view source button, handle clicks document.querySelector('#view-source')?.onClick.listen((_) { + // ignore: unsafe_html final popup = window.open('view_source.html?script=$script', 'View Source'); String? code; diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart index a4bd5d3f..80f16ec2 100644 --- a/lib/src/common/model/repos.dart +++ b/lib/src/common/model/repos.dart @@ -223,6 +223,8 @@ class RepositoryPermissions { factory RepositoryPermissions.fromJson(Map json) => _$RepositoryPermissionsFromJson(json); + + Map toJson() => _$RepositoryPermissionsToJson(this); } @JsonSerializable(createToJson: false) diff --git a/pubspec.yaml b/pubspec.yaml index 52f04c89..77f35d9e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 8.0.0 +version: 8.0.1 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From 70afac1269c84226a2acc7d7b6d7f786a4ab96a8 Mon Sep 17 00:00:00 2001 From: Casey Hillers Date: Thu, 25 Mar 2021 10:56:08 -0700 Subject: [PATCH 224/390] switch to rate_limit endpoint --- lib/src/common/misc_service.dart | 5 +++-- lib/src/common/model/misc.dart | 11 +++++++++++ pubspec.yaml | 2 +- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/lib/src/common/misc_service.dart b/lib/src/common/misc_service.dart index a0555360..f34a7964 100644 --- a/lib/src/common/misc_service.dart +++ b/lib/src/common/misc_service.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:convert'; import 'package:github/src/common.dart'; /// The [MiscService] handles communication with misc related methods of the @@ -61,8 +62,8 @@ class MiscService extends Service { /// /// API docs: https://developer.github.com/v3/rate_limit/ Future getRateLimit() { - return github.request('GET', '/').then((response) { - return RateLimit.fromHeaders(response.headers); + return github.request('GET', '/rate_limit').then((response) { + return RateLimit.fromRateLimitResponse(jsonDecode(response.body)); }); } diff --git a/lib/src/common/model/misc.dart b/lib/src/common/model/misc.dart index 68c34536..6ea7b136 100644 --- a/lib/src/common/model/misc.dart +++ b/lib/src/common/model/misc.dart @@ -39,6 +39,17 @@ class RateLimit { return RateLimit(limit, remaining, resets); } + /// Construct [RateLimit] from JSON response of /rate_limit. + /// + /// API docs: https://developer.github.com/v3/rate_limit/ + factory RateLimit.fromRateLimitResponse(Map response) { + final rateJson = response['rate'] as Map; + final limit = int.parse(rateJson['limit']!); + final remaining = int.parse(rateJson['remaining']!); + final resets = DateTime.fromMillisecondsSinceEpoch(rateJson['reset']!); + return RateLimit(limit, remaining, resets); + } + factory RateLimit.fromJson(Map input) => _$RateLimitFromJson(input); Map toJson() => _$RateLimitToJson(this); diff --git a/pubspec.yaml b/pubspec.yaml index 77f35d9e..287014c2 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 8.0.1 +version: 8.1.0 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From e086b6234b3a9232083a3aad71e68a6319149ced Mon Sep 17 00:00:00 2001 From: Casey Hillers Date: Mon, 29 Mar 2021 10:16:00 -0700 Subject: [PATCH 225/390] update changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6eabdc93..6468e3d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## 8.1.0 + - `RateLimit` queries `/rate_limit` and no longer uses quota + ## 8.0.1 - Minor tweaks to improve pub score From f2551ea68931edb240afa1d3889fd6f50363c800 Mon Sep 17 00:00:00 2001 From: Dym Sohin Date: Mon, 31 May 2021 03:55:02 +0200 Subject: [PATCH 226/390] view-source now navigates directly to github-repo --- example/common.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/common.dart b/example/common.dart index 69663591..7040e5f6 100644 --- a/example/common.dart +++ b/example/common.dart @@ -14,7 +14,7 @@ Future initViewSourceButton(String script) async { // query the DOM for the view source button, handle clicks document.querySelector('#view-source')?.onClick.listen((_) { // ignore: unsafe_html - final popup = window.open('view_source.html?script=$script', 'View Source'); + final popup = window.open('https://github.com/SpinlockLabs/github.dart/blob/master/example/$script', 'View Source'); String? code; var fetched = false; From d2705e4cfd9c4aac8234300580c330027ceb9895 Mon Sep 17 00:00:00 2001 From: Dym Sohin Date: Mon, 31 May 2021 04:35:04 +0200 Subject: [PATCH 227/390] pick an existing repo for examples/releases --- example/releases.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/releases.dart b/example/releases.dart index e7d236a4..62db5136 100644 --- a/example/releases.dart +++ b/example/releases.dart @@ -14,7 +14,7 @@ Future main() async { void loadReleases() { github.repositories - .listReleases(RepositorySlug('Workiva', 'wdesk')) + .listReleases(RepositorySlug('Workiva', 'w_common')) .take(10) .toList() .then((releases) { From f0e597d3da4623164baf9d376a9db2ff5f01c420 Mon Sep 17 00:00:00 2001 From: Dym Sohin Date: Mon, 31 May 2021 06:06:40 +0200 Subject: [PATCH 228/390] trim tripple-quotes from the license file --- LICENSE | 2 -- 1 file changed, 2 deletions(-) diff --git a/LICENSE b/LICENSE index 838d36d8..e4f06dbe 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,3 @@ -``` The MIT License (MIT) Copyright (c) 2014 DirectCode @@ -20,4 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` From 431e4becc92ac116eb864ca755570b2a19aa2dab Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Mon, 31 May 2021 14:21:39 -0600 Subject: [PATCH 229/390] prep 8.1.1 release --- CHANGELOG.md | 3 ++ example/view_source.html | 28 -------------- example/view_source.js | 81 ---------------------------------------- pubspec.yaml | 2 +- 4 files changed, 4 insertions(+), 110 deletions(-) delete mode 100755 example/view_source.html delete mode 100755 example/view_source.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 6468e3d4..d73f11b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## 8.1.1 + - Fix up examples and license file https://github.com/SpinlockLabs/github.dart/pull/255 https://github.com/SpinlockLabs/github.dart/pull/254 https://github.com/SpinlockLabs/github.dart/pull/253 + ## 8.1.0 - `RateLimit` queries `/rate_limit` and no longer uses quota diff --git a/example/view_source.html b/example/view_source.html deleted file mode 100755 index 38b4b3af..00000000 --- a/example/view_source.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - View Source - - - - - - - -
- - - - - - diff --git a/example/view_source.js b/example/view_source.js deleted file mode 100755 index 01ca35f1..00000000 --- a/example/view_source.js +++ /dev/null @@ -1,81 +0,0 @@ -var args = document.location.search.substring(1).split('&'); - -var opts = {}; - -for (var i = 0; i < args.length; i++) { - var arg = window.decodeURIComponent(args[i]); - - if (arg.indexOf('=') == -1) { - opts[arg.trim()] = true; - } else { - var kvp = arg.split('='); - opts[kvp[0].trim()] = kvp[1].trim(); - } -} - -function opt(name, def) { - if (Object.keys(opts).indexOf(name) !== -1) { - return opts[name]; - } else { - return def; - } -} - -function createEditor(code) { - var editor = ace.edit("editor"); - - editor.focus(); - editor.setReadOnly(opts['editable'] ? true : false); - - editor.commands.addCommand({ - name: 'saveFile', - bindKey: { - win: 'Ctrl-S', - mac: 'Command-S', - sender: 'editor|cli' - }, - exec: function() {} - }); - - editor.setTheme("ace/theme/" + opt("theme", "github")); - editor.getSession().setMode("ace/mode/" + opt("mode", "dart")); - editor.setShowPrintMargin(false); - editor.setValue(code, 0); - editor.clearSelection(); - editor.moveCursorTo(0, 0); - editor.setReadOnly(true); -} - -function receiveMessage(event) { - var msg = event.data; - - if (msg.command === "code") { - createEditor(msg.code); - } -} - -if (window.opener !== null) { - window.addEventListener("message", receiveMessage); -} else { - if (Object.keys(opts).indexOf("path") !== -1) { - var req = new XMLHttpRequest(); - req.open("GET", opts.path); - - req.onreadystatechange = function() { - if (req.readyState === XMLHttpRequest.DONE) { - if (req.status === 200) { - createEditor(req.responseText); - } else { - createEditor("ERROR: " + opts.path + " was not found."); - } - } - }; - req.send(); - } -} - -ready(function () { - if (window.opener) { - window.opener.postMessage({ "command": "ready" }, "*"); - } -}); \ No newline at end of file diff --git a/pubspec.yaml b/pubspec.yaml index 287014c2..457f271d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 8.1.0 +version: 8.1.1 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From 2042d693a5ca34bddb178361225dfed8aced1128 Mon Sep 17 00:00:00 2001 From: Viktor Benei Date: Mon, 5 Jul 2021 19:29:36 +0200 Subject: [PATCH 230/390] Doc comment fix - fixing #193 Fixing #193 --- lib/src/common/util/oauth2.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/common/util/oauth2.dart b/lib/src/common/util/oauth2.dart index b69559cf..5d3c9e59 100644 --- a/lib/src/common/util/oauth2.dart +++ b/lib/src/common/util/oauth2.dart @@ -8,7 +8,7 @@ import 'package:http/http.dart' as http; /// **Example**: /// /// var flow = new OAuth2Flow('ClientID', 'ClientSecret'); -/// var authUrl = flow.createAuthorizationURL(); +/// var authUrl = flow.createAuthorizeUrl(); /// // Display to the User and handle the redirect URI, and also get the code. /// flow.exchange(code).then((response) { /// var github = new GitHub(auth: new Authentication.withToken(response.token)); From d5ac9e2509f429adce08f9ba3b65f8f5b5b3b427 Mon Sep 17 00:00:00 2001 From: Pascal Welsch Date: Tue, 14 Sep 2021 17:52:03 +0200 Subject: [PATCH 231/390] Don't add state query param twice --- lib/src/common/pulls_service.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/common/pulls_service.dart b/lib/src/common/pulls_service.dart index 0f317745..9ca050e4 100644 --- a/lib/src/common/pulls_service.dart +++ b/lib/src/common/pulls_service.dart @@ -32,7 +32,7 @@ class PullRequestsService extends Service { return PaginationHelper(github).objects( 'GET', - '/repos/${slug.fullName}/pulls?state=$state', + '/repos/${slug.fullName}/pulls', (dynamic i) => PullRequest.fromJson(i), pages: pages, params: params); From c13d3d79c806bc8ce1e74e039b1ee4e6ef5c880a Mon Sep 17 00:00:00 2001 From: Aleksandr Mashchenko Date: Mon, 27 Sep 2021 23:48:41 +0300 Subject: [PATCH 232/390] Add per page parameter to stars related activities --- lib/src/common/activity_service.dart | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/src/common/activity_service.dart b/lib/src/common/activity_service.dart index 4145b0d1..12420eba 100644 --- a/lib/src/common/activity_service.dart +++ b/lib/src/common/activity_service.dart @@ -215,25 +215,28 @@ class ActivityService extends Service { /// Lists people who have starred the specified repo. /// /// API docs: https://developer.github.com/v3/activity/starring/#list-stargazers - Stream listStargazers(RepositorySlug slug) { + Stream listStargazers(RepositorySlug slug, {int perPage = 30}) { return PaginationHelper(github).objects('GET', - '/repos/${slug.fullName}/stargazers', (dynamic i) => User.fromJson(i)); + '/repos/${slug.fullName}/stargazers', (dynamic i) => User.fromJson(i), + params: {'per_page': perPage}); } /// Lists all the repos starred by a user. /// /// API docs: https://developer.github.com/v3/activity/starring/#list-repositories-being-starred - Stream listStarredByUser(String user) { + Stream listStarredByUser(String user, {int perPage = 30}) { return PaginationHelper(github).objects( - 'GET', '/users/$user/starred', (dynamic i) => Repository.fromJson(i)); + 'GET', '/users/$user/starred', (dynamic i) => Repository.fromJson(i), + params: {'per_page': perPage}); } /// Lists all the repos by the current user. /// /// API docs: https://developer.github.com/v3/activity/starring/#list-repositories-being-starred - Stream listStarred() { - return PaginationHelper(github) - .objects('GET', '/user/starred', (dynamic i) => Repository.fromJson(i)); + Stream listStarred({int perPage = 30}) { + return PaginationHelper(github).objects( + 'GET', '/user/starred', (dynamic i) => Repository.fromJson(i), + params: {'per_page': perPage}); } /// Checks if the currently authenticated user has starred the specified repository. From 8a879235a498b6fda07e64f19b50b9207bddf9e0 Mon Sep 17 00:00:00 2001 From: Casey Hillers Date: Mon, 27 Sep 2021 15:32:21 -0700 Subject: [PATCH 233/390] Fix ratelimit response --- CHANGELOG.md | 3 +++ lib/src/common/model/misc.dart | 4 ++-- pubspec.yaml | 2 +- test/unit/common/model/misc_test.dart | 26 ++++++++++++++++++++++++++ 4 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 test/unit/common/model/misc_test.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index d73f11b2..dcaa54f8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## 8.1.2 + - Fixes `RateLimit.fromRateLimitResponse` to not double cast int + ## 8.1.1 - Fix up examples and license file https://github.com/SpinlockLabs/github.dart/pull/255 https://github.com/SpinlockLabs/github.dart/pull/254 https://github.com/SpinlockLabs/github.dart/pull/253 diff --git a/lib/src/common/model/misc.dart b/lib/src/common/model/misc.dart index 6ea7b136..4f3166a9 100644 --- a/lib/src/common/model/misc.dart +++ b/lib/src/common/model/misc.dart @@ -44,8 +44,8 @@ class RateLimit { /// API docs: https://developer.github.com/v3/rate_limit/ factory RateLimit.fromRateLimitResponse(Map response) { final rateJson = response['rate'] as Map; - final limit = int.parse(rateJson['limit']!); - final remaining = int.parse(rateJson['remaining']!); + final limit = rateJson['limit'] as int?; + final remaining = rateJson['remaining'] as int?; final resets = DateTime.fromMillisecondsSinceEpoch(rateJson['reset']!); return RateLimit(limit, remaining, resets); } diff --git a/pubspec.yaml b/pubspec.yaml index 457f271d..551ee9d5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 8.1.1 +version: 8.1.2 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart diff --git a/test/unit/common/model/misc_test.dart b/test/unit/common/model/misc_test.dart new file mode 100644 index 00000000..0b18feb5 --- /dev/null +++ b/test/unit/common/model/misc_test.dart @@ -0,0 +1,26 @@ +import 'dart:convert'; + +import 'package:github/src/common/model/misc.dart'; +import 'package:test/test.dart'; + +void main() { + group('RateLimit', () { + test('fromRateLimitResponse', () { + // This is a truncated version of the response + const rateLimitJson = '''{ + "resources": { + "rate": { + "limit": 5000, + "remaining": 4999, + "reset": 1372700873, + "used": 1 + } + }'''; + final rateLimit = RateLimit.fromRateLimitResponse(jsonDecode(rateLimitJson)); + + expect(rateLimit.limit, 5000); + expect(rateLimit.remaining, 4999); + expect(rateLimit.resets, DateTime.fromMillisecondsSinceEpoch(1372700873)); + }); + }); +} From 401c04f40d6efe3271040d5965bc4460be6d4f2a Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Mon, 4 Oct 2021 08:10:36 -0600 Subject: [PATCH 234/390] Prep 8.1.3 - up version and changelog - tweak CI - dart format --- .github/workflows/dart.yml | 8 +++++--- CHANGELOG.md | 3 +++ example/common.dart | 4 +++- lib/src/common/model/checks.dart | 2 +- pubspec.yaml | 2 +- test/unit/common/model/misc_test.dart | 3 ++- 6 files changed, 15 insertions(+), 7 deletions(-) diff --git a/.github/workflows/dart.yml b/.github/workflows/dart.yml index c15ec991..7fc465e6 100644 --- a/.github/workflows/dart.yml +++ b/.github/workflows/dart.yml @@ -8,13 +8,15 @@ jobs: runs-on: ubuntu-latest container: - image: google/dart:2.12 + image: dart:2.13 steps: - uses: actions/checkout@v1 - name: Install dependencies run: pub get - name: Dart Analyzer - run: dartanalyzer . + run: dart analyze - name: Check Dart Format - run: dartfmt -n --set-exit-if-changed . + run: dart format --set-exit-if-changed -o none lib test tool example && echo Dart Format 👍 || echo Files needed Dart formatting 😢 + - name: Check if Publishable + run: dart pub publish --dry-run diff --git a/CHANGELOG.md b/CHANGELOG.md index dcaa54f8..c91a819c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## 8.1.3 + - Add per page parameter to stars related activities https://github.com/SpinlockLabs/github.dart/pull/265 + ## 8.1.2 - Fixes `RateLimit.fromRateLimitResponse` to not double cast int diff --git a/example/common.dart b/example/common.dart index 7040e5f6..fc1be97a 100644 --- a/example/common.dart +++ b/example/common.dart @@ -14,7 +14,9 @@ Future initViewSourceButton(String script) async { // query the DOM for the view source button, handle clicks document.querySelector('#view-source')?.onClick.listen((_) { // ignore: unsafe_html - final popup = window.open('https://github.com/SpinlockLabs/github.dart/blob/master/example/$script', 'View Source'); + final popup = window.open( + 'https://github.com/SpinlockLabs/github.dart/blob/master/example/$script', + 'View Source'); String? code; var fetched = false; diff --git a/lib/src/common/model/checks.dart b/lib/src/common/model/checks.dart index c0e3797e..e5433947 100644 --- a/lib/src/common/model/checks.dart +++ b/lib/src/common/model/checks.dart @@ -312,7 +312,7 @@ class CheckRunAction { required this.label, required this.description, required this.identifier, - }) : assert(label.length <= 20), + }) : assert(label.length <= 20), assert(description.length <= 40), assert(identifier.length <= 20); diff --git a/pubspec.yaml b/pubspec.yaml index 551ee9d5..e82f0270 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 8.1.2 +version: 8.1.3 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart diff --git a/test/unit/common/model/misc_test.dart b/test/unit/common/model/misc_test.dart index 0b18feb5..e5bb9a4d 100644 --- a/test/unit/common/model/misc_test.dart +++ b/test/unit/common/model/misc_test.dart @@ -16,7 +16,8 @@ void main() { "used": 1 } }'''; - final rateLimit = RateLimit.fromRateLimitResponse(jsonDecode(rateLimitJson)); + final rateLimit = + RateLimit.fromRateLimitResponse(jsonDecode(rateLimitJson)); expect(rateLimit.limit, 5000); expect(rateLimit.remaining, 4999); From d7feb338accfbb7f5eeb32314fef5157e7e46cc9 Mon Sep 17 00:00:00 2001 From: Kate Lovett Date: Fri, 8 Oct 2021 13:46:37 -0500 Subject: [PATCH 235/390] Add review information to PullRequest --- lib/src/common/model/pulls.dart | 8 ++++++++ lib/src/common/model/pulls.g.dart | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/lib/src/common/model/pulls.dart b/lib/src/common/model/pulls.dart index 2ba555bd..cb497051 100644 --- a/lib/src/common/model/pulls.dart +++ b/lib/src/common/model/pulls.dart @@ -35,6 +35,8 @@ class PullRequest { this.deletionsCount, this.changedFilesCount, this.labels, + this.requestedReviewers, + this.reviewCommentCount, }); /// Pull Request ID @@ -113,6 +115,12 @@ class PullRequest { /// Pull Request Labels List? labels; + /// Reviewers requested for this Pull Request. + List? requestedReviewers, + + /// The number of review comments on the Pull Request. + int? reviewCommentCount, + factory PullRequest.fromJson(Map input) => _$PullRequestFromJson(input); Map toJson() => _$PullRequestToJson(this); diff --git a/lib/src/common/model/pulls.g.dart b/lib/src/common/model/pulls.g.dart index 6c596cf7..015cb3ae 100644 --- a/lib/src/common/model/pulls.g.dart +++ b/lib/src/common/model/pulls.g.dart @@ -52,6 +52,10 @@ PullRequest _$PullRequestFromJson(Map json) { labels: (json['labels'] as List?) ?.map((e) => IssueLabel.fromJson(e as Map)) .toList(), + requestedReviewers: (json['requested_reviewers'] as List?) + ?.map((e) => User.fromJson(e as Map)) + .toList(), + reviewCommentCount: json['review_comments'] as int?, ); } @@ -83,6 +87,8 @@ Map _$PullRequestToJson(PullRequest instance) => 'deletions_count': instance.deletionsCount, 'changed_files_count': instance.changedFilesCount, 'labels': instance.labels, + 'requested_reviewers': instance.requestedReviewers, + 'review_comments': instance.reviewCommentCount, }; PullRequestMerge _$PullRequestMergeFromJson(Map json) { From 2d38dc5b64ecf97a9246332fe8a12caecd9a93ba Mon Sep 17 00:00:00 2001 From: Kate Lovett Date: Fri, 8 Oct 2021 15:11:32 -0500 Subject: [PATCH 236/390] Typos --- lib/src/common/model/pulls.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/src/common/model/pulls.dart b/lib/src/common/model/pulls.dart index cb497051..f7cdb05c 100644 --- a/lib/src/common/model/pulls.dart +++ b/lib/src/common/model/pulls.dart @@ -116,10 +116,10 @@ class PullRequest { List? labels; /// Reviewers requested for this Pull Request. - List? requestedReviewers, + List? requestedReviewers; /// The number of review comments on the Pull Request. - int? reviewCommentCount, + int? reviewCommentCount; factory PullRequest.fromJson(Map input) => _$PullRequestFromJson(input); From 28a3884f065ab7eb52b55c76ac17effe79e3869e Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Mon, 11 Oct 2021 15:32:38 -0600 Subject: [PATCH 237/390] Prep 8.2.0 --- CHANGELOG.md | 17 ++++++++++++++++ lib/src/common/model/pulls.dart | 34 +++++++++++++++++++++++++------ lib/src/common/model/pulls.g.dart | 32 ++++++++++++++++++++--------- pubspec.yaml | 2 +- 4 files changed, 68 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c91a819c..f3bf2166 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,20 @@ +## 8.2.0 + - add more fields to the PullRequest class and fixed JSON naming bugs + - Added: + - requestedReviewers + - reviewCommentCount + - milestone + - rebaseable + - mergeableState + - maintainerCanModify + - authorAssociation + - Fixed (these were previously always null) + - commentsCount + - commitsCount + - additionsCount + - deletionsCount + - changedFilesCount + ## 8.1.3 - Add per page parameter to stars related activities https://github.com/SpinlockLabs/github.dart/pull/265 diff --git a/lib/src/common/model/pulls.dart b/lib/src/common/model/pulls.dart index f7cdb05c..31a6014d 100644 --- a/lib/src/common/model/pulls.dart +++ b/lib/src/common/model/pulls.dart @@ -29,14 +29,19 @@ class PullRequest { this.merged, this.mergeable, this.mergedBy, - this.commentsCount, - this.commitsCount, - this.additionsCount, - this.deletionsCount, - this.changedFilesCount, + this.commentsCount = 0, + this.commitsCount = 0, + this.additionsCount = 0, + this.deletionsCount = 0, + this.changedFilesCount = 0, this.labels, this.requestedReviewers, - this.reviewCommentCount, + this.reviewCommentCount = 0, + this.milestone, + this.rebaseable = false, + this.mergeableState = '', + this.maintainerCanModify = false, + this.authorAssociation = '', }); /// Pull Request ID @@ -98,18 +103,23 @@ class PullRequest { User? mergedBy; /// Number of comments + @JsonKey(name: 'comments') int? commentsCount; /// Number of commits + @JsonKey(name: 'commits') int? commitsCount; /// Number of additions + @JsonKey(name: 'additions') int? additionsCount; /// Number of deletions + @JsonKey(name: 'deletions') int? deletionsCount; /// Number of changed files + @JsonKey(name: 'changed_files') int? changedFilesCount; /// Pull Request Labels @@ -119,8 +129,20 @@ class PullRequest { List? requestedReviewers; /// The number of review comments on the Pull Request. + @JsonKey(name: 'review_comments') int? reviewCommentCount; + Milestone? milestone; + + bool? rebaseable; + + String? mergeableState; + + bool? maintainerCanModify; + + /// Ex: CONTRIBUTOR, NONE, OWNER + String? authorAssociation; + factory PullRequest.fromJson(Map input) => _$PullRequestFromJson(input); Map toJson() => _$PullRequestToJson(this); diff --git a/lib/src/common/model/pulls.g.dart b/lib/src/common/model/pulls.g.dart index 015cb3ae..a341425d 100644 --- a/lib/src/common/model/pulls.g.dart +++ b/lib/src/common/model/pulls.g.dart @@ -44,11 +44,11 @@ PullRequest _$PullRequestFromJson(Map json) { mergedBy: json['merged_by'] == null ? null : User.fromJson(json['merged_by'] as Map), - commentsCount: json['comments_count'] as int?, - commitsCount: json['commits_count'] as int?, - additionsCount: json['additions_count'] as int?, - deletionsCount: json['deletions_count'] as int?, - changedFilesCount: json['changed_files_count'] as int?, + commentsCount: json['comments'] as int?, + commitsCount: json['commits'] as int?, + additionsCount: json['additions'] as int?, + deletionsCount: json['deletions'] as int?, + changedFilesCount: json['changed_files'] as int?, labels: (json['labels'] as List?) ?.map((e) => IssueLabel.fromJson(e as Map)) .toList(), @@ -56,6 +56,13 @@ PullRequest _$PullRequestFromJson(Map json) { ?.map((e) => User.fromJson(e as Map)) .toList(), reviewCommentCount: json['review_comments'] as int?, + milestone: json['milestone'] == null + ? null + : Milestone.fromJson(json['milestone'] as Map), + rebaseable: json['rebaseable'] as bool?, + mergeableState: json['mergeable_state'] as String?, + maintainerCanModify: json['maintainer_can_modify'] as bool?, + authorAssociation: json['author_association'] as String?, ); } @@ -81,14 +88,19 @@ Map _$PullRequestToJson(PullRequest instance) => 'merged': instance.merged, 'mergeable': instance.mergeable, 'merged_by': instance.mergedBy, - 'comments_count': instance.commentsCount, - 'commits_count': instance.commitsCount, - 'additions_count': instance.additionsCount, - 'deletions_count': instance.deletionsCount, - 'changed_files_count': instance.changedFilesCount, + 'comments': instance.commentsCount, + 'commits': instance.commitsCount, + 'additions': instance.additionsCount, + 'deletions': instance.deletionsCount, + 'changed_files': instance.changedFilesCount, 'labels': instance.labels, 'requested_reviewers': instance.requestedReviewers, 'review_comments': instance.reviewCommentCount, + 'milestone': instance.milestone, + 'rebaseable': instance.rebaseable, + 'mergeable_state': instance.mergeableState, + 'maintainer_can_modify': instance.maintainerCanModify, + 'author_association': instance.authorAssociation, }; PullRequestMerge _$PullRequestMergeFromJson(Map json) { diff --git a/pubspec.yaml b/pubspec.yaml index e82f0270..a5bc60ab 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 8.1.3 +version: 8.2.0 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From 8eadd0f29d508f85bc9fb45e4dae37c4cf7b2338 Mon Sep 17 00:00:00 2001 From: Casey Hillers Date: Tue, 12 Oct 2021 13:32:09 -0700 Subject: [PATCH 238/390] add checksuite and checkrun events --- lib/src/common/model/checks.dart | 24 ++ lib/src/server/hooks.dart | 37 +++ lib/src/server/hooks.g.dart | 46 +++ test/server/hooks_test.dart | 41 +++ test/server/hooks_test_data.dart | 550 +++++++++++++++++++++++++++++++ 5 files changed, 698 insertions(+) create mode 100644 test/server/hooks_test.dart create mode 100644 test/server/hooks_test_data.dart diff --git a/lib/src/common/model/checks.dart b/lib/src/common/model/checks.dart index e5433947..042e19d3 100644 --- a/lib/src/common/model/checks.dart +++ b/lib/src/common/model/checks.dart @@ -124,6 +124,21 @@ class CheckRun { startedAt: DateTime.parse(input['started_at']), ); } + + Map toJson() { + return { + 'name': name, + 'id': id, + 'external_id': externalId, + 'status': status, + 'head_sha': externalId, + 'check_suite': { + 'id': checkSuiteId, + }, + 'details_url': detailsUrl, + 'started_at': startedAt.toIso8601String(), + }; + } } @immutable @@ -325,6 +340,7 @@ class CheckRunAction { } } +/// API docs: https://docs.github.com/en/rest/reference/checks#check-suites @immutable class CheckSuite { final int? id; @@ -344,6 +360,14 @@ class CheckSuite { id: input['id'], ); } + + Map toJson() { + return { + 'conclusion': conclusion, + 'head_sha': headSha, + 'id': id, + }; + } } @immutable diff --git a/lib/src/server/hooks.dart b/lib/src/server/hooks.dart index b622cfd6..4d69d8f5 100644 --- a/lib/src/server/hooks.dart +++ b/lib/src/server/hooks.dart @@ -89,6 +89,43 @@ class UnknownHookEvent extends HookEvent { UnknownHookEvent(this.event, this.data); } +@JsonSerializable() +class CheckRunEvent extends HookEvent { + CheckRunEvent({ + this.action, + this.checkRun, + this.sender, + this.repository, + }); + + factory CheckRunEvent.fromJson(Map input) => _$CheckRunEventFromJson(input); + CheckRun? checkRun; + String? action; + User? sender; + Repository? repository; + + Map toJson() => _$CheckRunEventToJson(this); +} + +@JsonSerializable() +class CheckSuiteEvent extends HookEvent { + CheckSuiteEvent({ + this.action, + this.checkSuite, + this.repository, + this.sender, + }); + + String? action; + CheckSuite? checkSuite; + Repository? repository; + User? sender; + + factory CheckSuiteEvent.fromJson(Map input) => + _$CheckSuiteEventFromJson(input); + Map toJson() => _$CheckSuiteEventToJson(this); +} + @JsonSerializable() class RepositoryEvent extends HookEvent { RepositoryEvent({ diff --git a/lib/src/server/hooks.g.dart b/lib/src/server/hooks.g.dart index 867b54ef..361da9eb 100644 --- a/lib/src/server/hooks.g.dart +++ b/lib/src/server/hooks.g.dart @@ -6,6 +6,52 @@ part of 'hooks.dart'; // JsonSerializableGenerator // ************************************************************************** +CheckRunEvent _$CheckRunEventFromJson(Map json) { + return CheckRunEvent( + action: json['action'] as String?, + checkRun: json['check_run'] == null + ? null + : CheckRun.fromJson(json['check_run'] as Map), + sender: json['sender'] == null + ? null + : User.fromJson(json['sender'] as Map), + repository: json['repository'] == null + ? null + : Repository.fromJson(json['repository'] as Map), + ); +} + +Map _$CheckRunEventToJson(CheckRunEvent instance) => + { + 'check_run': instance.checkRun, + 'action': instance.action, + 'sender': instance.sender, + 'repository': instance.repository, + }; + +CheckSuiteEvent _$CheckSuiteEventFromJson(Map json) { + return CheckSuiteEvent( + action: json['action'] as String?, + checkSuite: json['check_suite'] == null + ? null + : CheckSuite.fromJson(json['check_suite'] as Map), + repository: json['repository'] == null + ? null + : Repository.fromJson(json['repository'] as Map), + sender: json['sender'] == null + ? null + : User.fromJson(json['sender'] as Map), + ); +} + +Map _$CheckSuiteEventToJson(CheckSuiteEvent instance) => + { + 'action': instance.action, + 'check_suite': instance.checkSuite, + 'repository': instance.repository, + 'sender': instance.sender, + }; + RepositoryEvent _$RepositoryEventFromJson(Map json) { return RepositoryEvent( action: json['action'] as String?, diff --git a/test/server/hooks_test.dart b/test/server/hooks_test.dart new file mode 100644 index 00000000..f66592ed --- /dev/null +++ b/test/server/hooks_test.dart @@ -0,0 +1,41 @@ +import 'dart:convert'; +import 'package:github/github.dart'; +import 'package:github/hooks.dart'; +import 'package:test/test.dart'; + +import 'hooks_test_data.dart'; + +void main() { + group('CheckSuiteEvent', () { + test('deserialize', () async { + final checkSuiteEvent = + CheckSuiteEvent.fromJson(json.decode(checkSuiteString) as Map); + // Top level properties. + expect(checkSuiteEvent.action, 'requested'); + expect(checkSuiteEvent.checkSuite, isA()); + // CheckSuite properties. + final suite = checkSuiteEvent.checkSuite!; + expect(suite.headSha, 'ec26c3e57ca3a959ca5aad62de7213c562f8c821'); + expect(suite.id, 118578147); + expect(suite.conclusion, CheckRunConclusion.success); + }); + }); + group('CheckRunEvent', () { + test('deserialize', () async { + final checkRunEvent = CheckRunEvent.fromJson(json.decode(checkRunString) as Map); + // Top level properties. + expect(checkRunEvent.action, 'created'); + expect(checkRunEvent.checkRun, isA()); + // CheckSuite properties. + final checkRun = checkRunEvent.checkRun!; + expect(checkRun.headSha, 'ec26c3e57ca3a959ca5aad62de7213c562f8c821'); + expect(checkRun.checkSuiteId, 118578147); + expect(checkRun.detailsUrl, 'https://octocoders.io'); + expect(checkRun.externalId, ''); + expect(checkRun.id, 128620228); + expect(checkRun.name, 'Octocoders-linter'); + expect(checkRun.startedAt, DateTime.utc(2019, 05, 15, 15, 21, 12)); + expect(checkRun.status, CheckRunStatus.queued); + }); + }); +} \ No newline at end of file diff --git a/test/server/hooks_test_data.dart b/test/server/hooks_test_data.dart new file mode 100644 index 00000000..858f15c4 --- /dev/null +++ b/test/server/hooks_test_data.dart @@ -0,0 +1,550 @@ +/// Json messages as dart string used for checks model tests. + +String checkSuiteString = checkSuiteTemplate('requested'); + +String checkSuiteTemplate(String action) => '''\ +{ + "action": "$action", + "check_suite": { + "id": 118578147, + "node_id": "MDEwOkNoZWNrU3VpdGUxMTg1NzgxNDc=", + "head_branch": "changes", + "head_sha": "ec26c3e57ca3a959ca5aad62de7213c562f8c821", + "status": "completed", + "conclusion": "success", + "url": "https://api.github.com/repos/Codertocat/Hello-World/check-suites/118578147", + "before": "6113728f27ae82c7b1a177c8d03f9e96e0adf246", + "after": "ec26c3e57ca3a959ca5aad62de7213c562f8c821", + "pull_requests": [ + { + "url": "https://api.github.com/repos/Codertocat/Hello-World/pulls/2", + "id": 279147437, + "number": 2, + "head": { + "ref": "changes", + "sha": "ec26c3e57ca3a959ca5aad62de7213c562f8c821", + "repo": { + "id": 186853002, + "url": "https://api.github.com/repos/Codertocat/Hello-World", + "name": "Hello-World" + } + }, + "base": { + "ref": "master", + "sha": "f95f852bd8fca8fcc58a9a2d6c842781e32a215e", + "repo": { + "id": 186853002, + "url": "https://api.github.com/repos/Codertocat/Hello-World", + "name": "Hello-World" + } + } + } + ], + "app": { + "id": 29310, + "node_id": "MDM6QXBwMjkzMTA=", + "owner": { + "login": "Octocoders", + "id": 38302899, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjM4MzAyODk5", + "avatar_url": "https://avatars1.githubusercontent.com/u/38302899?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Octocoders", + "html_url": "https://github.com/Octocoders", + "followers_url": "https://api.github.com/users/Octocoders/followers", + "following_url": "https://api.github.com/users/Octocoders/following{/other_user}", + "gists_url": "https://api.github.com/users/Octocoders/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Octocoders/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Octocoders/subscriptions", + "organizations_url": "https://api.github.com/users/Octocoders/orgs", + "repos_url": "https://api.github.com/users/Octocoders/repos", + "events_url": "https://api.github.com/users/Octocoders/events{/privacy}", + "received_events_url": "https://api.github.com/users/Octocoders/received_events", + "type": "Organization", + "site_admin": false + }, + "name": "octocoders-linter", + "description": "", + "external_url": "https://octocoders.io", + "html_url": "https://github.com/apps/octocoders-linter", + "created_at": "2019-04-19T19:36:24Z", + "updated_at": "2019-04-19T19:36:56Z", + "permissions": { + "administration": "write", + "checks": "write", + "contents": "write", + "deployments": "write", + "issues": "write", + "members": "write", + "metadata": "read", + "organization_administration": "write", + "organization_hooks": "write", + "organization_plan": "read", + "organization_projects": "write", + "organization_user_blocking": "write", + "pages": "write", + "pull_requests": "write", + "repository_hooks": "write", + "repository_projects": "write", + "statuses": "write", + "team_discussions": "write", + "vulnerability_alerts": "read" + }, + "events": [] + }, + "created_at": "2019-05-15T15:20:31Z", + "updated_at": "2019-05-15T15:21:14Z", + "latest_check_runs_count": 1, + "check_runs_url": "https://api.github.com/repos/Codertocat/Hello-World/check-suites/118578147/check-runs", + "head_commit": { + "id": "ec26c3e57ca3a959ca5aad62de7213c562f8c821", + "tree_id": "31b122c26a97cf9af023e9ddab94a82c6e77b0ea", + "message": "Update README.md", + "timestamp": "2019-05-15T15:20:30Z", + "author": { + "name": "Codertocat", + "email": "21031067+Codertocat@users.noreply.github.com" + }, + "committer": { + "name": "Codertocat", + "email": "21031067+Codertocat@users.noreply.github.com" + } + } + }, + "repository": { + "id": 186853002, + "node_id": "MDEwOlJlcG9zaXRvcnkxODY4NTMwMDI=", + "name": "Hello-World", + "full_name": "Codertocat/Hello-World", + "private": false, + "owner": { + "login": "Codertocat", + "id": 21031067, + "node_id": "MDQ6VXNlcjIxMDMxMDY3", + "avatar_url": "https://avatars1.githubusercontent.com/u/21031067?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Codertocat", + "html_url": "https://github.com/Codertocat", + "followers_url": "https://api.github.com/users/Codertocat/followers", + "following_url": "https://api.github.com/users/Codertocat/following{/other_user}", + "gists_url": "https://api.github.com/users/Codertocat/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Codertocat/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Codertocat/subscriptions", + "organizations_url": "https://api.github.com/users/Codertocat/orgs", + "repos_url": "https://api.github.com/users/Codertocat/repos", + "events_url": "https://api.github.com/users/Codertocat/events{/privacy}", + "received_events_url": "https://api.github.com/users/Codertocat/received_events", + "type": "User", + "site_admin": false + }, + "html_url": "https://github.com/Codertocat/Hello-World", + "description": null, + "fork": false, + "url": "https://api.github.com/repos/Codertocat/Hello-World", + "forks_url": "https://api.github.com/repos/Codertocat/Hello-World/forks", + "keys_url": "https://api.github.com/repos/Codertocat/Hello-World/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/Codertocat/Hello-World/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/Codertocat/Hello-World/teams", + "hooks_url": "https://api.github.com/repos/Codertocat/Hello-World/hooks", + "issue_events_url": "https://api.github.com/repos/Codertocat/Hello-World/issues/events{/number}", + "events_url": "https://api.github.com/repos/Codertocat/Hello-World/events", + "assignees_url": "https://api.github.com/repos/Codertocat/Hello-World/assignees{/user}", + "branches_url": "https://api.github.com/repos/Codertocat/Hello-World/branches{/branch}", + "tags_url": "https://api.github.com/repos/Codertocat/Hello-World/tags", + "blobs_url": "https://api.github.com/repos/Codertocat/Hello-World/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/Codertocat/Hello-World/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/Codertocat/Hello-World/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/Codertocat/Hello-World/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/Codertocat/Hello-World/statuses/{sha}", + "languages_url": "https://api.github.com/repos/Codertocat/Hello-World/languages", + "stargazers_url": "https://api.github.com/repos/Codertocat/Hello-World/stargazers", + "contributors_url": "https://api.github.com/repos/Codertocat/Hello-World/contributors", + "subscribers_url": "https://api.github.com/repos/Codertocat/Hello-World/subscribers", + "subscription_url": "https://api.github.com/repos/Codertocat/Hello-World/subscription", + "commits_url": "https://api.github.com/repos/Codertocat/Hello-World/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/Codertocat/Hello-World/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/Codertocat/Hello-World/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/Codertocat/Hello-World/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/Codertocat/Hello-World/contents/{+path}", + "compare_url": "https://api.github.com/repos/Codertocat/Hello-World/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/Codertocat/Hello-World/merges", + "archive_url": "https://api.github.com/repos/Codertocat/Hello-World/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/Codertocat/Hello-World/downloads", + "issues_url": "https://api.github.com/repos/Codertocat/Hello-World/issues{/number}", + "pulls_url": "https://api.github.com/repos/Codertocat/Hello-World/pulls{/number}", + "milestones_url": "https://api.github.com/repos/Codertocat/Hello-World/milestones{/number}", + "notifications_url": "https://api.github.com/repos/Codertocat/Hello-World/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/Codertocat/Hello-World/labels{/name}", + "releases_url": "https://api.github.com/repos/Codertocat/Hello-World/releases{/id}", + "deployments_url": "https://api.github.com/repos/Codertocat/Hello-World/deployments", + "created_at": "2019-05-15T15:19:25Z", + "updated_at": "2019-05-15T15:21:14Z", + "pushed_at": "2019-05-15T15:20:57Z", + "git_url": "git://github.com/Codertocat/Hello-World.git", + "ssh_url": "git@github.com:Codertocat/Hello-World.git", + "clone_url": "https://github.com/Codertocat/Hello-World.git", + "svn_url": "https://github.com/Codertocat/Hello-World", + "homepage": null, + "size": 0, + "stargazers_count": 0, + "watchers_count": 0, + "language": "Ruby", + "has_issues": true, + "has_projects": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": true, + "forks_count": 0, + "mirror_url": null, + "archived": false, + "disabled": false, + "open_issues_count": 2, + "license": null, + "forks": 0, + "open_issues": 2, + "watchers": 0, + "default_branch": "master" + }, + "sender": { + "login": "Codertocat", + "id": 21031067, + "node_id": "MDQ6VXNlcjIxMDMxMDY3", + "avatar_url": "https://avatars1.githubusercontent.com/u/21031067?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Codertocat", + "html_url": "https://github.com/Codertocat", + "followers_url": "https://api.github.com/users/Codertocat/followers", + "following_url": "https://api.github.com/users/Codertocat/following{/other_user}", + "gists_url": "https://api.github.com/users/Codertocat/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Codertocat/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Codertocat/subscriptions", + "organizations_url": "https://api.github.com/users/Codertocat/orgs", + "repos_url": "https://api.github.com/users/Codertocat/repos", + "events_url": "https://api.github.com/users/Codertocat/events{/privacy}", + "received_events_url": "https://api.github.com/users/Codertocat/received_events", + "type": "User", + "site_admin": false + } +} +'''; + +const String checkRunString = ''' +{ + "action": "created", + "check_run": { + "id": 128620228, + "node_id": "MDg6Q2hlY2tSdW4xMjg2MjAyMjg=", + "head_sha": "ec26c3e57ca3a959ca5aad62de7213c562f8c821", + "external_id": "", + "url": "https://api.github.com/repos/Codertocat/Hello-World/check-runs/128620228", + "html_url": "https://github.com/Codertocat/Hello-World/runs/128620228", + "details_url": "https://octocoders.io", + "status": "queued", + "conclusion": null, + "started_at": "2019-05-15T15:21:12Z", + "completed_at": null, + "output": { + "title": null, + "summary": null, + "text": null, + "annotations_count": 0, + "annotations_url": "https://api.github.com/repos/Codertocat/Hello-World/check-runs/128620228/annotations" + }, + "name": "Octocoders-linter", + "check_suite": { + "id": 118578147, + "node_id": "MDEwOkNoZWNrU3VpdGUxMTg1NzgxNDc=", + "head_branch": "changes", + "head_sha": "ec26c3e57ca3a959ca5aad62de7213c562f8c821", + "status": "queued", + "conclusion": null, + "url": "https://api.github.com/repos/Codertocat/Hello-World/check-suites/118578147", + "before": "6113728f27ae82c7b1a177c8d03f9e96e0adf246", + "after": "ec26c3e57ca3a959ca5aad62de7213c562f8c821", + "pull_requests": [ + { + "url": "https://api.github.com/repos/Codertocat/Hello-World/pulls/2", + "id": 279147437, + "number": 2, + "head": { + "ref": "changes", + "sha": "ec26c3e57ca3a959ca5aad62de7213c562f8c821", + "repo": { + "id": 186853002, + "url": "https://api.github.com/repos/Codertocat/Hello-World", + "name": "Hello-World" + } + }, + "base": { + "ref": "master", + "sha": "f95f852bd8fca8fcc58a9a2d6c842781e32a215e", + "repo": { + "id": 186853002, + "url": "https://api.github.com/repos/Codertocat/Hello-World", + "name": "Hello-World" + } + } + } + ], + "app": { + "id": 29310, + "node_id": "MDM6QXBwMjkzMTA=", + "owner": { + "login": "Octocoders", + "id": 38302899, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjM4MzAyODk5", + "avatar_url": "https://avatars1.githubusercontent.com/u/38302899?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Octocoders", + "html_url": "https://github.com/Octocoders", + "followers_url": "https://api.github.com/users/Octocoders/followers", + "following_url": "https://api.github.com/users/Octocoders/following{/other_user}", + "gists_url": "https://api.github.com/users/Octocoders/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Octocoders/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Octocoders/subscriptions", + "organizations_url": "https://api.github.com/users/Octocoders/orgs", + "repos_url": "https://api.github.com/users/Octocoders/repos", + "events_url": "https://api.github.com/users/Octocoders/events{/privacy}", + "received_events_url": "https://api.github.com/users/Octocoders/received_events", + "type": "Organization", + "site_admin": false + }, + "name": "octocoders-linter", + "description": "", + "external_url": "https://octocoders.io", + "html_url": "https://github.com/apps/octocoders-linter", + "created_at": "2019-04-19T19:36:24Z", + "updated_at": "2019-04-19T19:36:56Z", + "permissions": { + "administration": "write", + "checks": "write", + "contents": "write", + "deployments": "write", + "issues": "write", + "members": "write", + "metadata": "read", + "organization_administration": "write", + "organization_hooks": "write", + "organization_plan": "read", + "organization_projects": "write", + "organization_user_blocking": "write", + "pages": "write", + "pull_requests": "write", + "repository_hooks": "write", + "repository_projects": "write", + "statuses": "write", + "team_discussions": "write", + "vulnerability_alerts": "read" + }, + "events": [] + }, + "created_at": "2019-05-15T15:20:31Z", + "updated_at": "2019-05-15T15:20:31Z" + }, + "app": { + "id": 29310, + "node_id": "MDM6QXBwMjkzMTA=", + "owner": { + "login": "Octocoders", + "id": 38302899, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjM4MzAyODk5", + "avatar_url": "https://avatars1.githubusercontent.com/u/38302899?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Octocoders", + "html_url": "https://github.com/Octocoders", + "followers_url": "https://api.github.com/users/Octocoders/followers", + "following_url": "https://api.github.com/users/Octocoders/following{/other_user}", + "gists_url": "https://api.github.com/users/Octocoders/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Octocoders/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Octocoders/subscriptions", + "organizations_url": "https://api.github.com/users/Octocoders/orgs", + "repos_url": "https://api.github.com/users/Octocoders/repos", + "events_url": "https://api.github.com/users/Octocoders/events{/privacy}", + "received_events_url": "https://api.github.com/users/Octocoders/received_events", + "type": "Organization", + "site_admin": false + }, + "name": "octocoders-linter", + "description": "", + "external_url": "https://octocoders.io", + "html_url": "https://github.com/apps/octocoders-linter", + "created_at": "2019-04-19T19:36:24Z", + "updated_at": "2019-04-19T19:36:56Z", + "permissions": { + "administration": "write", + "checks": "write", + "contents": "write", + "deployments": "write", + "issues": "write", + "members": "write", + "metadata": "read", + "organization_administration": "write", + "organization_hooks": "write", + "organization_plan": "read", + "organization_projects": "write", + "organization_user_blocking": "write", + "pages": "write", + "pull_requests": "write", + "repository_hooks": "write", + "repository_projects": "write", + "statuses": "write", + "team_discussions": "write", + "vulnerability_alerts": "read" + }, + "events": [] + }, + "pull_requests": [ + { + "url": "https://api.github.com/repos/Codertocat/Hello-World/pulls/2", + "id": 279147437, + "number": 2, + "head": { + "ref": "changes", + "sha": "ec26c3e57ca3a959ca5aad62de7213c562f8c821", + "repo": { + "id": 186853002, + "url": "https://api.github.com/repos/Codertocat/Hello-World", + "name": "Hello-World" + } + }, + "base": { + "ref": "master", + "sha": "f95f852bd8fca8fcc58a9a2d6c842781e32a215e", + "repo": { + "id": 186853002, + "url": "https://api.github.com/repos/Codertocat/Hello-World", + "name": "Hello-World" + } + } + } + ], + "deployment": { + "url": "https://api.github.com/repos/Codertocat/Hello-World/deployments/326191728", + "id": 326191728, + "node_id": "MDEwOkRlcGxveW1lbnQzMjYxOTE3Mjg=", + "task": "deploy", + "original_environment": "lab", + "environment": "lab", + "description": null, + "created_at": "2021-02-18T08:22:48Z", + "updated_at": "2021-02-18T09:47:16Z", + "statuses_url": "https://api.github.com/repos/Codertocat/Hello-World/deployments/326191728/statuses", + "repository_url": "https://api.github.com/repos/Codertocat/Hello-World" + } + }, + "repository": { + "id": 186853002, + "node_id": "MDEwOlJlcG9zaXRvcnkxODY4NTMwMDI=", + "name": "Hello-World", + "full_name": "Codertocat/Hello-World", + "private": false, + "owner": { + "login": "Codertocat", + "id": 21031067, + "node_id": "MDQ6VXNlcjIxMDMxMDY3", + "avatar_url": "https://avatars1.githubusercontent.com/u/21031067?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Codertocat", + "html_url": "https://github.com/Codertocat", + "followers_url": "https://api.github.com/users/Codertocat/followers", + "following_url": "https://api.github.com/users/Codertocat/following{/other_user}", + "gists_url": "https://api.github.com/users/Codertocat/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Codertocat/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Codertocat/subscriptions", + "organizations_url": "https://api.github.com/users/Codertocat/orgs", + "repos_url": "https://api.github.com/users/Codertocat/repos", + "events_url": "https://api.github.com/users/Codertocat/events{/privacy}", + "received_events_url": "https://api.github.com/users/Codertocat/received_events", + "type": "User", + "site_admin": false + }, + "html_url": "https://github.com/Codertocat/Hello-World", + "description": null, + "fork": false, + "url": "https://api.github.com/repos/Codertocat/Hello-World", + "forks_url": "https://api.github.com/repos/Codertocat/Hello-World/forks", + "keys_url": "https://api.github.com/repos/Codertocat/Hello-World/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/Codertocat/Hello-World/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/Codertocat/Hello-World/teams", + "hooks_url": "https://api.github.com/repos/Codertocat/Hello-World/hooks", + "issue_events_url": "https://api.github.com/repos/Codertocat/Hello-World/issues/events{/number}", + "events_url": "https://api.github.com/repos/Codertocat/Hello-World/events", + "assignees_url": "https://api.github.com/repos/Codertocat/Hello-World/assignees{/user}", + "branches_url": "https://api.github.com/repos/Codertocat/Hello-World/branches{/branch}", + "tags_url": "https://api.github.com/repos/Codertocat/Hello-World/tags", + "blobs_url": "https://api.github.com/repos/Codertocat/Hello-World/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/Codertocat/Hello-World/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/Codertocat/Hello-World/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/Codertocat/Hello-World/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/Codertocat/Hello-World/statuses/{sha}", + "languages_url": "https://api.github.com/repos/Codertocat/Hello-World/languages", + "stargazers_url": "https://api.github.com/repos/Codertocat/Hello-World/stargazers", + "contributors_url": "https://api.github.com/repos/Codertocat/Hello-World/contributors", + "subscribers_url": "https://api.github.com/repos/Codertocat/Hello-World/subscribers", + "subscription_url": "https://api.github.com/repos/Codertocat/Hello-World/subscription", + "commits_url": "https://api.github.com/repos/Codertocat/Hello-World/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/Codertocat/Hello-World/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/Codertocat/Hello-World/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/Codertocat/Hello-World/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/Codertocat/Hello-World/contents/{+path}", + "compare_url": "https://api.github.com/repos/Codertocat/Hello-World/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/Codertocat/Hello-World/merges", + "archive_url": "https://api.github.com/repos/Codertocat/Hello-World/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/Codertocat/Hello-World/downloads", + "issues_url": "https://api.github.com/repos/Codertocat/Hello-World/issues{/number}", + "pulls_url": "https://api.github.com/repos/Codertocat/Hello-World/pulls{/number}", + "milestones_url": "https://api.github.com/repos/Codertocat/Hello-World/milestones{/number}", + "notifications_url": "https://api.github.com/repos/Codertocat/Hello-World/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/Codertocat/Hello-World/labels{/name}", + "releases_url": "https://api.github.com/repos/Codertocat/Hello-World/releases{/id}", + "deployments_url": "https://api.github.com/repos/Codertocat/Hello-World/deployments", + "created_at": "2019-05-15T15:19:25Z", + "updated_at": "2019-05-15T15:21:03Z", + "pushed_at": "2019-05-15T15:20:57Z", + "git_url": "git://github.com/Codertocat/Hello-World.git", + "ssh_url": "git@github.com:Codertocat/Hello-World.git", + "clone_url": "https://github.com/Codertocat/Hello-World.git", + "svn_url": "https://github.com/Codertocat/Hello-World", + "homepage": null, + "size": 0, + "stargazers_count": 0, + "watchers_count": 0, + "language": "Ruby", + "has_issues": true, + "has_projects": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": true, + "forks_count": 1, + "mirror_url": null, + "archived": false, + "disabled": false, + "open_issues_count": 2, + "license": null, + "forks": 1, + "open_issues": 2, + "watchers": 0, + "default_branch": "master" + }, + "sender": { + "login": "Codertocat", + "id": 21031067, + "node_id": "MDQ6VXNlcjIxMDMxMDY3", + "avatar_url": "https://avatars1.githubusercontent.com/u/21031067?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/Codertocat", + "html_url": "https://github.com/Codertocat", + "followers_url": "https://api.github.com/users/Codertocat/followers", + "following_url": "https://api.github.com/users/Codertocat/following{/other_user}", + "gists_url": "https://api.github.com/users/Codertocat/gists{/gist_id}", + "starred_url": "https://api.github.com/users/Codertocat/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Codertocat/subscriptions", + "organizations_url": "https://api.github.com/users/Codertocat/orgs", + "repos_url": "https://api.github.com/users/Codertocat/repos", + "events_url": "https://api.github.com/users/Codertocat/events{/privacy}", + "received_events_url": "https://api.github.com/users/Codertocat/received_events", + "type": "User", + "site_admin": false + } +} +'''; \ No newline at end of file From af9c2b6ae7931a3b3f8263474737c3983103b9e7 Mon Sep 17 00:00:00 2001 From: Casey Hillers Date: Tue, 12 Oct 2021 13:34:26 -0700 Subject: [PATCH 239/390] add changelog + increment version --- CHANGELOG.md | 3 +++ pubspec.yaml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f3bf2166..212e8718 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## 8.2.1 +- Add `CheckSuiteEvent` and `CheckRunEvent` + ## 8.2.0 - add more fields to the PullRequest class and fixed JSON naming bugs - Added: diff --git a/pubspec.yaml b/pubspec.yaml index a5bc60ab..228ae7e1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 8.2.0 +version: 8.2.1 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From af0f14dcbf8d8f4b5b777b59d274b9f736a42161 Mon Sep 17 00:00:00 2001 From: Casey Hillers Date: Tue, 12 Oct 2021 13:36:41 -0700 Subject: [PATCH 240/390] formatting --- test/server/hooks_test.dart | 2 +- test/server/hooks_test_data.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/server/hooks_test.dart b/test/server/hooks_test.dart index f66592ed..d1b9f5ee 100644 --- a/test/server/hooks_test.dart +++ b/test/server/hooks_test.dart @@ -38,4 +38,4 @@ void main() { expect(checkRun.status, CheckRunStatus.queued); }); }); -} \ No newline at end of file +} diff --git a/test/server/hooks_test_data.dart b/test/server/hooks_test_data.dart index 858f15c4..6d780d51 100644 --- a/test/server/hooks_test_data.dart +++ b/test/server/hooks_test_data.dart @@ -547,4 +547,4 @@ const String checkRunString = ''' "site_admin": false } } -'''; \ No newline at end of file +'''; From 6afa774741246d03fd634a89259687d49b6830e0 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Mon, 18 Oct 2021 08:40:21 -0700 Subject: [PATCH 241/390] Bump to latest json_* packages, require Dart 2.14 --- .github/workflows/dart.yml | 6 +- CHANGELOG.md | 2 + lib/src/common/model/activity.g.dart | 55 ++-- lib/src/common/model/authorizations.g.dart | 77 +++-- lib/src/common/model/gists.g.dart | 160 +++++----- lib/src/common/model/git.g.dart | 248 +++++++-------- lib/src/common/model/issues.dart | 18 +- lib/src/common/model/issues.g.dart | 220 +++++++------ lib/src/common/model/keys.g.dart | 23 +- lib/src/common/model/misc.g.dart | 45 ++- lib/src/common/model/notifications.g.dart | 56 ++-- lib/src/common/model/orgs.g.dart | 99 +++--- lib/src/common/model/pulls.g.dart | 264 ++++++++-------- lib/src/common/model/reaction.g.dart | 24 +- lib/src/common/model/repos.dart | 33 +- lib/src/common/model/repos.g.dart | 342 ++++++++++----------- lib/src/common/model/repos_commits.g.dart | 120 ++++---- lib/src/common/model/repos_contents.g.dart | 120 ++++---- lib/src/common/model/repos_forks.g.dart | 8 +- lib/src/common/model/repos_hooks.g.dart | 72 ++--- lib/src/common/model/repos_merging.g.dart | 12 +- lib/src/common/model/repos_pages.g.dart | 79 +++-- lib/src/common/model/repos_releases.g.dart | 115 ++++--- lib/src/common/model/repos_stats.g.dart | 88 +++--- lib/src/common/model/repos_statuses.g.dart | 66 ++-- lib/src/common/model/search.g.dart | 34 +- lib/src/common/model/users.g.dart | 178 +++++------ lib/src/server/hooks.g.dart | 181 ++++++----- pubspec.yaml | 9 +- 29 files changed, 1277 insertions(+), 1477 deletions(-) diff --git a/.github/workflows/dart.yml b/.github/workflows/dart.yml index 7fc465e6..250e2000 100644 --- a/.github/workflows/dart.yml +++ b/.github/workflows/dart.yml @@ -6,10 +6,10 @@ jobs: build: runs-on: ubuntu-latest - + container: - image: dart:2.13 - + image: dart:2.14 + steps: - uses: actions/checkout@v1 - name: Install dependencies diff --git a/CHANGELOG.md b/CHANGELOG.md index 212e8718..c2e9df56 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,5 @@ +## 8.2.2-dev + ## 8.2.1 - Add `CheckSuiteEvent` and `CheckRunEvent` diff --git a/lib/src/common/model/activity.g.dart b/lib/src/common/model/activity.g.dart index bc8d3251..9638fc87 100644 --- a/lib/src/common/model/activity.g.dart +++ b/lib/src/common/model/activity.g.dart @@ -6,25 +6,23 @@ part of 'activity.dart'; // JsonSerializableGenerator // ************************************************************************** -Event _$EventFromJson(Map json) { - return Event( - id: json['id'] as String?, - type: json['type'] as String?, - repo: json['repo'] == null - ? null - : Repository.fromJson(json['repo'] as Map), - actor: json['actor'] == null - ? null - : User.fromJson(json['actor'] as Map), - org: json['org'] == null - ? null - : Organization.fromJson(json['org'] as Map), - payload: json['payload'] as Map?, - createdAt: json['created_at'] == null - ? null - : DateTime.parse(json['created_at'] as String), - ); -} +Event _$EventFromJson(Map json) => Event( + id: json['id'] as String?, + type: json['type'] as String?, + repo: json['repo'] == null + ? null + : Repository.fromJson(json['repo'] as Map), + actor: json['actor'] == null + ? null + : User.fromJson(json['actor'] as Map), + org: json['org'] == null + ? null + : Organization.fromJson(json['org'] as Map), + payload: json['payload'] as Map?, + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + ); Map _$EventToJson(Event instance) => { 'id': instance.id, @@ -37,16 +35,15 @@ Map _$EventToJson(Event instance) => { }; RepositorySubscription _$RepositorySubscriptionFromJson( - Map json) { - return RepositorySubscription( - subscribed: json['subscribed'] as bool?, - ignored: json['ignored'] as bool?, - reason: json['reason'] as String?, - createdAt: json['created_at'] == null - ? null - : DateTime.parse(json['created_at'] as String), - ); -} + Map json) => + RepositorySubscription( + subscribed: json['subscribed'] as bool?, + ignored: json['ignored'] as bool?, + reason: json['reason'] as String?, + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + ); Map _$RepositorySubscriptionToJson( RepositorySubscription instance) => diff --git a/lib/src/common/model/authorizations.g.dart b/lib/src/common/model/authorizations.g.dart index 932857b3..7c3a2e73 100644 --- a/lib/src/common/model/authorizations.g.dart +++ b/lib/src/common/model/authorizations.g.dart @@ -6,29 +6,28 @@ part of 'authorizations.dart'; // JsonSerializableGenerator // ************************************************************************** -Authorization _$AuthorizationFromJson(Map json) { - return Authorization( - id: json['id'] as int?, - scopes: - (json['scopes'] as List?)?.map((e) => e as String).toList(), - token: json['token'] as String?, - app: json['app'] == null - ? null - : AuthorizationApplication.fromJson( - json['app'] as Map), - note: json['note'] as String?, - noteUrl: json['note_url'] as String?, - createdAt: json['created_at'] == null - ? null - : DateTime.parse(json['created_at'] as String), - updatedAt: json['updated_at'] == null - ? null - : DateTime.parse(json['updated_at'] as String), - user: json['user'] == null - ? null - : User.fromJson(json['user'] as Map), - ); -} +Authorization _$AuthorizationFromJson(Map json) => + Authorization( + id: json['id'] as int?, + scopes: + (json['scopes'] as List?)?.map((e) => e as String).toList(), + token: json['token'] as String?, + app: json['app'] == null + ? null + : AuthorizationApplication.fromJson( + json['app'] as Map), + note: json['note'] as String?, + noteUrl: json['note_url'] as String?, + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + updatedAt: json['updated_at'] == null + ? null + : DateTime.parse(json['updated_at'] as String), + user: json['user'] == null + ? null + : User.fromJson(json['user'] as Map), + ); Map _$AuthorizationToJson(Authorization instance) => { @@ -44,13 +43,12 @@ Map _$AuthorizationToJson(Authorization instance) => }; AuthorizationApplication _$AuthorizationApplicationFromJson( - Map json) { - return AuthorizationApplication( - url: json['url'] as String?, - name: json['name'] as String?, - clientId: json['client_id'] as String?, - ); -} + Map json) => + AuthorizationApplication( + url: json['url'] as String?, + name: json['name'] as String?, + clientId: json['client_id'] as String?, + ); Map _$AuthorizationApplicationToJson( AuthorizationApplication instance) => @@ -60,16 +58,15 @@ Map _$AuthorizationApplicationToJson( 'client_id': instance.clientId, }; -CreateAuthorization _$CreateAuthorizationFromJson(Map json) { - return CreateAuthorization( - json['note'] as String?, - scopes: - (json['scopes'] as List?)?.map((e) => e as String).toList(), - noteUrl: json['note_url'] as String?, - clientId: json['client_id'] as String?, - clientSecret: json['client_secret'] as String?, - ); -} +CreateAuthorization _$CreateAuthorizationFromJson(Map json) => + CreateAuthorization( + json['note'] as String?, + scopes: + (json['scopes'] as List?)?.map((e) => e as String).toList(), + noteUrl: json['note_url'] as String?, + clientId: json['client_id'] as String?, + clientSecret: json['client_secret'] as String?, + ); Map _$CreateAuthorizationToJson( CreateAuthorization instance) => diff --git a/lib/src/common/model/gists.g.dart b/lib/src/common/model/gists.g.dart index 982181f1..15f648b0 100644 --- a/lib/src/common/model/gists.g.dart +++ b/lib/src/common/model/gists.g.dart @@ -6,90 +6,81 @@ part of 'gists.dart'; // JsonSerializableGenerator // ************************************************************************** -Gist _$GistFromJson(Map json) { - return Gist( - id: json['id'] as String?, - description: json['description'] as String?, - public: json['public'] as bool?, - owner: json['owner'] == null - ? null - : User.fromJson(json['owner'] as Map), - user: json['user'] == null - ? null - : User.fromJson(json['user'] as Map), - files: (json['files'] as List?) - ?.map((e) => GistFile.fromJson(e as Map)) - .toList(), - htmlUrl: json['html_url'] as String?, - commentsCount: json['comments'] as int?, - gitPullUrl: json['git_pull_url'] as String?, - gitPushUrl: json['git_push_url'] as String?, - createdAt: json['created_at'] == null - ? null - : DateTime.parse(json['created_at'] as String), - updatedAt: json['updated_at'] == null - ? null - : DateTime.parse(json['updated_at'] as String), - ); -} +Gist _$GistFromJson(Map json) => Gist( + id: json['id'] as String?, + description: json['description'] as String?, + public: json['public'] as bool?, + owner: json['owner'] == null + ? null + : User.fromJson(json['owner'] as Map), + user: json['user'] == null + ? null + : User.fromJson(json['user'] as Map), + files: (json['files'] as List?) + ?.map((e) => GistFile.fromJson(e as Map)) + .toList(), + htmlUrl: json['html_url'] as String?, + commentsCount: json['comments'] as int?, + gitPullUrl: json['git_pull_url'] as String?, + gitPushUrl: json['git_push_url'] as String?, + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + updatedAt: json['updated_at'] == null + ? null + : DateTime.parse(json['updated_at'] as String), + ); -GistFile _$GistFileFromJson(Map json) { - return GistFile( - name: json['name'] as String?, - size: json['size'] as int?, - rawUrl: json['raw_url'] as String?, - type: json['type'] as String?, - language: json['language'] as String?, - truncated: json['truncated'] as bool?, - content: json['content'] as String?, - ); -} +GistFile _$GistFileFromJson(Map json) => GistFile( + name: json['name'] as String?, + size: json['size'] as int?, + rawUrl: json['raw_url'] as String?, + type: json['type'] as String?, + language: json['language'] as String?, + truncated: json['truncated'] as bool?, + content: json['content'] as String?, + ); -GistFork _$GistForkFromJson(Map json) { - return GistFork( - user: json['user'] == null - ? null - : User.fromJson(json['user'] as Map), - id: json['id'] as int?, - createdAt: json['created_at'] == null - ? null - : DateTime.parse(json['created_at'] as String), - updatedAt: json['updated_at'] == null - ? null - : DateTime.parse(json['updated_at'] as String), - ); -} +GistFork _$GistForkFromJson(Map json) => GistFork( + user: json['user'] == null + ? null + : User.fromJson(json['user'] as Map), + id: json['id'] as int?, + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + updatedAt: json['updated_at'] == null + ? null + : DateTime.parse(json['updated_at'] as String), + ); -GistHistoryEntry _$GistHistoryEntryFromJson(Map json) { - return GistHistoryEntry( - version: json['version'] as String?, - user: json['user'] == null - ? null - : User.fromJson(json['user'] as Map), - deletions: json['change_status/deletions'] as int?, - additions: json['change_status/additions'] as int?, - totalChanges: json['change_status/total'] as int?, - committedAt: json['committed_at'] == null - ? null - : DateTime.parse(json['committed_at'] as String), - ); -} +GistHistoryEntry _$GistHistoryEntryFromJson(Map json) => + GistHistoryEntry( + version: json['version'] as String?, + user: json['user'] == null + ? null + : User.fromJson(json['user'] as Map), + deletions: json['change_status/deletions'] as int?, + additions: json['change_status/additions'] as int?, + totalChanges: json['change_status/total'] as int?, + committedAt: json['committed_at'] == null + ? null + : DateTime.parse(json['committed_at'] as String), + ); -GistComment _$GistCommentFromJson(Map json) { - return GistComment( - id: json['id'] as int?, - user: json['user'] == null - ? null - : User.fromJson(json['user'] as Map), - createdAt: json['created_at'] == null - ? null - : DateTime.parse(json['created_at'] as String), - updatedAt: json['updated_at'] == null - ? null - : DateTime.parse(json['updated_at'] as String), - body: json['body'] as String?, - ); -} +GistComment _$GistCommentFromJson(Map json) => GistComment( + id: json['id'] as int?, + user: json['user'] == null + ? null + : User.fromJson(json['user'] as Map), + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + updatedAt: json['updated_at'] == null + ? null + : DateTime.parse(json['updated_at'] as String), + body: json['body'] as String?, + ); Map _$GistCommentToJson(GistComment instance) => { @@ -100,11 +91,10 @@ Map _$GistCommentToJson(GistComment instance) => 'body': instance.body, }; -CreateGistComment _$CreateGistCommentFromJson(Map json) { - return CreateGistComment( - json['body'] as String?, - ); -} +CreateGistComment _$CreateGistCommentFromJson(Map json) => + CreateGistComment( + json['body'] as String?, + ); Map _$CreateGistCommentToJson(CreateGistComment instance) => { diff --git a/lib/src/common/model/git.g.dart b/lib/src/common/model/git.g.dart index d596e7cb..61d5fc44 100644 --- a/lib/src/common/model/git.g.dart +++ b/lib/src/common/model/git.g.dart @@ -6,15 +6,13 @@ part of 'git.dart'; // JsonSerializableGenerator // ************************************************************************** -GitBlob _$GitBlobFromJson(Map json) { - return GitBlob( - content: json['content'] as String?, - encoding: json['encoding'] as String?, - url: json['url'] as String?, - sha: json['sha'] as String?, - size: json['size'] as int?, - ); -} +GitBlob _$GitBlobFromJson(Map json) => GitBlob( + content: json['content'] as String?, + encoding: json['encoding'] as String?, + url: json['url'] as String?, + sha: json['sha'] as String?, + size: json['size'] as int?, + ); Map _$GitBlobToJson(GitBlob instance) => { 'content': instance.content, @@ -24,12 +22,11 @@ Map _$GitBlobToJson(GitBlob instance) => { 'size': instance.size, }; -CreateGitBlob _$CreateGitBlobFromJson(Map json) { - return CreateGitBlob( - json['content'] as String?, - json['encoding'] as String?, - ); -} +CreateGitBlob _$CreateGitBlobFromJson(Map json) => + CreateGitBlob( + json['content'] as String?, + json['encoding'] as String?, + ); Map _$CreateGitBlobToJson(CreateGitBlob instance) => { @@ -37,26 +34,24 @@ Map _$CreateGitBlobToJson(CreateGitBlob instance) => 'encoding': instance.encoding, }; -GitCommit _$GitCommitFromJson(Map json) { - return GitCommit( - sha: json['sha'] as String?, - url: json['url'] as String?, - author: json['author'] == null - ? null - : GitCommitUser.fromJson(json['author'] as Map), - committer: json['committer'] == null - ? null - : GitCommitUser.fromJson(json['committer'] as Map), - message: json['message'] as String?, - tree: json['tree'] == null - ? null - : GitTree.fromJson(json['tree'] as Map), - parents: (json['parents'] as List?) - ?.map((e) => GitCommit.fromJson(e as Map)) - .toList(), - commentCount: json['comment_count'] as int?, - ); -} +GitCommit _$GitCommitFromJson(Map json) => GitCommit( + sha: json['sha'] as String?, + url: json['url'] as String?, + author: json['author'] == null + ? null + : GitCommitUser.fromJson(json['author'] as Map), + committer: json['committer'] == null + ? null + : GitCommitUser.fromJson(json['committer'] as Map), + message: json['message'] as String?, + tree: json['tree'] == null + ? null + : GitTree.fromJson(json['tree'] as Map), + parents: (json['parents'] as List?) + ?.map((e) => GitCommit.fromJson(e as Map)) + .toList(), + commentCount: json['comment_count'] as int?, + ); Map _$GitCommitToJson(GitCommit instance) => { 'sha': instance.sha, @@ -69,20 +64,20 @@ Map _$GitCommitToJson(GitCommit instance) => { 'comment_count': instance.commentCount, }; -CreateGitCommit _$CreateGitCommitFromJson(Map json) { - return CreateGitCommit( - json['message'] as String?, - json['tree'] as String?, - parents: - (json['parents'] as List?)?.map((e) => e as String?).toList(), - committer: json['committer'] == null - ? null - : GitCommitUser.fromJson(json['committer'] as Map), - author: json['author'] == null - ? null - : GitCommitUser.fromJson(json['author'] as Map), - ); -} +CreateGitCommit _$CreateGitCommitFromJson(Map json) => + CreateGitCommit( + json['message'] as String?, + json['tree'] as String?, + parents: (json['parents'] as List?) + ?.map((e) => e as String?) + .toList(), + committer: json['committer'] == null + ? null + : GitCommitUser.fromJson(json['committer'] as Map), + author: json['author'] == null + ? null + : GitCommitUser.fromJson(json['author'] as Map), + ); Map _$CreateGitCommitToJson(CreateGitCommit instance) => { @@ -93,13 +88,12 @@ Map _$CreateGitCommitToJson(CreateGitCommit instance) => 'author': instance.author, }; -GitCommitUser _$GitCommitUserFromJson(Map json) { - return GitCommitUser( - json['name'] as String?, - json['email'] as String?, - json['date'] == null ? null : DateTime.parse(json['date'] as String), - ); -} +GitCommitUser _$GitCommitUserFromJson(Map json) => + GitCommitUser( + json['name'] as String?, + json['email'] as String?, + json['date'] == null ? null : DateTime.parse(json['date'] as String), + ); Map _$GitCommitUserToJson(GitCommitUser instance) { final val = {}; @@ -116,16 +110,14 @@ Map _$GitCommitUserToJson(GitCommitUser instance) { return val; } -GitTree _$GitTreeFromJson(Map json) { - return GitTree( - json['sha'] as String?, - json['url'] as String?, - json['truncated'] as bool?, - (json['tree'] as List?) - ?.map((e) => GitTreeEntry.fromJson(e as Map)) - .toList(), - ); -} +GitTree _$GitTreeFromJson(Map json) => GitTree( + json['sha'] as String?, + json['url'] as String?, + json['truncated'] as bool?, + (json['tree'] as List?) + ?.map((e) => GitTreeEntry.fromJson(e as Map)) + .toList(), + ); Map _$GitTreeToJson(GitTree instance) => { 'sha': instance.sha, @@ -134,16 +126,14 @@ Map _$GitTreeToJson(GitTree instance) => { 'tree': instance.entries, }; -GitTreeEntry _$GitTreeEntryFromJson(Map json) { - return GitTreeEntry( - json['path'] as String?, - json['mode'] as String?, - json['type'] as String?, - json['size'] as int?, - json['sha'] as String?, - json['url'] as String?, - ); -} +GitTreeEntry _$GitTreeEntryFromJson(Map json) => GitTreeEntry( + json['path'] as String?, + json['mode'] as String?, + json['type'] as String?, + json['size'] as int?, + json['sha'] as String?, + json['url'] as String?, + ); Map _$GitTreeEntryToJson(GitTreeEntry instance) => { @@ -155,14 +145,13 @@ Map _$GitTreeEntryToJson(GitTreeEntry instance) => 'url': instance.url, }; -CreateGitTree _$CreateGitTreeFromJson(Map json) { - return CreateGitTree( - (json['tree'] as List?) - ?.map((e) => CreateGitTreeEntry.fromJson(e as Map)) - .toList(), - baseTree: json['base_tree'] as String?, - ); -} +CreateGitTree _$CreateGitTreeFromJson(Map json) => + CreateGitTree( + (json['tree'] as List?) + ?.map((e) => CreateGitTreeEntry.fromJson(e as Map)) + .toList(), + baseTree: json['base_tree'] as String?, + ); Map _$CreateGitTreeToJson(CreateGitTree instance) => { @@ -170,15 +159,14 @@ Map _$CreateGitTreeToJson(CreateGitTree instance) => 'tree': instance.entries, }; -CreateGitTreeEntry _$CreateGitTreeEntryFromJson(Map json) { - return CreateGitTreeEntry( - json['path'] as String?, - json['mode'] as String?, - json['type'] as String?, - sha: json['sha'] as String?, - content: json['content'] as String?, - ); -} +CreateGitTreeEntry _$CreateGitTreeEntryFromJson(Map json) => + CreateGitTreeEntry( + json['path'] as String?, + json['mode'] as String?, + json['type'] as String?, + sha: json['sha'] as String?, + content: json['content'] as String?, + ); Map _$CreateGitTreeEntryToJson(CreateGitTreeEntry instance) => { @@ -189,15 +177,13 @@ Map _$CreateGitTreeEntryToJson(CreateGitTreeEntry instance) => 'content': instance.content, }; -GitReference _$GitReferenceFromJson(Map json) { - return GitReference( - ref: json['ref'] as String?, - url: json['url'] as String?, - object: json['object'] == null - ? null - : GitObject.fromJson(json['object'] as Map), - ); -} +GitReference _$GitReferenceFromJson(Map json) => GitReference( + ref: json['ref'] as String?, + url: json['url'] as String?, + object: json['object'] == null + ? null + : GitObject.fromJson(json['object'] as Map), + ); Map _$GitReferenceToJson(GitReference instance) => { @@ -206,20 +192,18 @@ Map _$GitReferenceToJson(GitReference instance) => 'object': instance.object, }; -GitTag _$GitTagFromJson(Map json) { - return GitTag( - tag: json['tag'] as String?, - sha: json['sha'] as String?, - url: json['url'] as String?, - message: json['message'] as String?, - tagger: json['tagger'] == null - ? null - : GitCommitUser.fromJson(json['tagger'] as Map), - object: json['object'] == null - ? null - : GitObject.fromJson(json['object'] as Map), - ); -} +GitTag _$GitTagFromJson(Map json) => GitTag( + tag: json['tag'] as String?, + sha: json['sha'] as String?, + url: json['url'] as String?, + message: json['message'] as String?, + tagger: json['tagger'] == null + ? null + : GitCommitUser.fromJson(json['tagger'] as Map), + object: json['object'] == null + ? null + : GitObject.fromJson(json['object'] as Map), + ); Map _$GitTagToJson(GitTag instance) => { 'tag': instance.tag, @@ -230,17 +214,15 @@ Map _$GitTagToJson(GitTag instance) => { 'object': instance.object, }; -CreateGitTag _$CreateGitTagFromJson(Map json) { - return CreateGitTag( - json['tag'] as String?, - json['message'] as String?, - json['object'] as String?, - json['type'] as String?, - json['tagger'] == null - ? null - : GitCommitUser.fromJson(json['tagger'] as Map), - ); -} +CreateGitTag _$CreateGitTagFromJson(Map json) => CreateGitTag( + json['tag'] as String?, + json['message'] as String?, + json['object'] as String?, + json['type'] as String?, + json['tagger'] == null + ? null + : GitCommitUser.fromJson(json['tagger'] as Map), + ); Map _$CreateGitTagToJson(CreateGitTag instance) => { @@ -251,13 +233,11 @@ Map _$CreateGitTagToJson(CreateGitTag instance) => 'tagger': instance.tagger, }; -GitObject _$GitObjectFromJson(Map json) { - return GitObject( - json['type'] as String?, - json['sha'] as String?, - json['url'] as String?, - ); -} +GitObject _$GitObjectFromJson(Map json) => GitObject( + json['type'] as String?, + json['sha'] as String?, + json['url'] as String?, + ); Map _$GitObjectToJson(GitObject instance) => { 'type': instance.type, diff --git a/lib/src/common/model/issues.dart b/lib/src/common/model/issues.dart index c565b90c..914c1acb 100644 --- a/lib/src/common/model/issues.dart +++ b/lib/src/common/model/issues.dart @@ -5,7 +5,7 @@ import 'package:json_annotation/json_annotation.dart'; part 'issues.g.dart'; /// Model class for an issue on the tracker. -@JsonSerializable() +@JsonSerializable(fieldRename: FieldRename.snake) class Issue { Issue({ this.id = 0, @@ -31,27 +31,21 @@ class Issue { } } - @JsonKey(defaultValue: 0) int id; /// The api url. - @JsonKey(defaultValue: '') String url; /// Url to the Issue Page - @JsonKey(defaultValue: '') String htmlUrl; /// Issue Number - @JsonKey(defaultValue: 0) int number; /// Issue State - @JsonKey(defaultValue: '') String state; /// Issue Title - @JsonKey(defaultValue: '') String title; /// User who created the issue. @@ -68,30 +62,24 @@ class Issue { Milestone? milestone; /// Number of Comments - @JsonKey(name: 'comments', defaultValue: 0) + @JsonKey(name: 'comments') int commentsCount; /// A Pull Request - @JsonKey(name: 'pull_request') IssuePullRequest? pullRequest; /// Time that the issue was created at - @JsonKey(name: 'created_at') DateTime? createdAt; /// The time that the issue was closed at - @JsonKey(name: 'closed_at') DateTime? closedAt; /// The time that the issue was updated at - @JsonKey(name: 'updated_at') DateTime? updatedAt; - @JsonKey(defaultValue: '') String body; /// The user who closed the issue - @JsonKey(name: 'closed_by') User? closedBy; bool get isOpen => state == 'open'; @@ -178,10 +166,8 @@ class IssueLabel { this.color = '', }); - @JsonKey(defaultValue: '') String name; - @JsonKey(defaultValue: '') String color; factory IssueLabel.fromJson(Map input) => diff --git a/lib/src/common/model/issues.g.dart b/lib/src/common/model/issues.g.dart index 0e2d0a8b..30f1048a 100644 --- a/lib/src/common/model/issues.g.dart +++ b/lib/src/common/model/issues.g.dart @@ -6,47 +6,45 @@ part of 'issues.dart'; // JsonSerializableGenerator // ************************************************************************** -Issue _$IssueFromJson(Map json) { - return Issue( - id: json['id'] as int? ?? 0, - url: json['url'] as String? ?? '', - htmlUrl: json['html_url'] as String? ?? '', - number: json['number'] as int? ?? 0, - state: json['state'] as String? ?? '', - title: json['title'] as String? ?? '', - user: json['user'] == null - ? null - : User.fromJson(json['user'] as Map), - labels: (json['labels'] as List?) - ?.map((e) => IssueLabel.fromJson(e as Map)) - .toList() ?? - [], - assignee: json['assignee'] == null - ? null - : User.fromJson(json['assignee'] as Map), - milestone: json['milestone'] == null - ? null - : Milestone.fromJson(json['milestone'] as Map), - commentsCount: json['comments'] as int? ?? 0, - pullRequest: json['pull_request'] == null - ? null - : IssuePullRequest.fromJson( - json['pull_request'] as Map), - createdAt: json['created_at'] == null - ? null - : DateTime.parse(json['created_at'] as String), - closedAt: json['closed_at'] == null - ? null - : DateTime.parse(json['closed_at'] as String), - updatedAt: json['updated_at'] == null - ? null - : DateTime.parse(json['updated_at'] as String), - body: json['body'] as String? ?? '', - closedBy: json['closed_by'] == null - ? null - : User.fromJson(json['closed_by'] as Map), - ); -} +Issue _$IssueFromJson(Map json) => Issue( + id: json['id'] as int? ?? 0, + url: json['url'] as String? ?? '', + htmlUrl: json['html_url'] as String? ?? '', + number: json['number'] as int? ?? 0, + state: json['state'] as String? ?? '', + title: json['title'] as String? ?? '', + user: json['user'] == null + ? null + : User.fromJson(json['user'] as Map), + labels: (json['labels'] as List?) + ?.map((e) => IssueLabel.fromJson(e as Map)) + .toList() ?? + [], + assignee: json['assignee'] == null + ? null + : User.fromJson(json['assignee'] as Map), + milestone: json['milestone'] == null + ? null + : Milestone.fromJson(json['milestone'] as Map), + commentsCount: json['comments'] as int? ?? 0, + pullRequest: json['pull_request'] == null + ? null + : IssuePullRequest.fromJson( + json['pull_request'] as Map), + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + closedAt: json['closed_at'] == null + ? null + : DateTime.parse(json['closed_at'] as String), + updatedAt: json['updated_at'] == null + ? null + : DateTime.parse(json['updated_at'] as String), + body: json['body'] as String? ?? '', + closedBy: json['closed_by'] == null + ? null + : User.fromJson(json['closed_by'] as Map), + ); Map _$IssueToJson(Issue instance) => { 'id': instance.id, @@ -68,17 +66,15 @@ Map _$IssueToJson(Issue instance) => { 'closed_by': instance.closedBy, }; -IssueRequest _$IssueRequestFromJson(Map json) { - return IssueRequest( - title: json['title'] as String?, - body: json['body'] as String?, - labels: - (json['labels'] as List?)?.map((e) => e as String).toList(), - assignee: json['assignee'] as String?, - state: json['state'] as String?, - milestone: json['milestone'] as int?, - ); -} +IssueRequest _$IssueRequestFromJson(Map json) => IssueRequest( + title: json['title'] as String?, + body: json['body'] as String?, + labels: + (json['labels'] as List?)?.map((e) => e as String).toList(), + assignee: json['assignee'] as String?, + state: json['state'] as String?, + milestone: json['milestone'] as int?, + ); Map _$IssueRequestToJson(IssueRequest instance) => { @@ -90,13 +86,12 @@ Map _$IssueRequestToJson(IssueRequest instance) => 'milestone': instance.milestone, }; -IssuePullRequest _$IssuePullRequestFromJson(Map json) { - return IssuePullRequest( - htmlUrl: json['html_url'] as String?, - diffUrl: json['diff_url'] as String?, - patchUrl: json['patch_url'] as String?, - ); -} +IssuePullRequest _$IssuePullRequestFromJson(Map json) => + IssuePullRequest( + htmlUrl: json['html_url'] as String?, + diffUrl: json['diff_url'] as String?, + patchUrl: json['patch_url'] as String?, + ); Map _$IssuePullRequestToJson(IssuePullRequest instance) => { @@ -105,24 +100,22 @@ Map _$IssuePullRequestToJson(IssuePullRequest instance) => 'patch_url': instance.patchUrl, }; -IssueComment _$IssueCommentFromJson(Map json) { - return IssueComment( - id: json['id'] as int?, - body: json['body'] as String?, - user: json['user'] == null - ? null - : User.fromJson(json['user'] as Map), - createdAt: json['created_at'] == null - ? null - : DateTime.parse(json['created_at'] as String), - updatedAt: json['updated_at'] == null - ? null - : DateTime.parse(json['updated_at'] as String), - url: json['url'] as String?, - htmlUrl: json['html_url'] as String?, - issueUrl: json['issue_url'] as String?, - ); -} +IssueComment _$IssueCommentFromJson(Map json) => IssueComment( + id: json['id'] as int?, + body: json['body'] as String?, + user: json['user'] == null + ? null + : User.fromJson(json['user'] as Map), + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + updatedAt: json['updated_at'] == null + ? null + : DateTime.parse(json['updated_at'] as String), + url: json['url'] as String?, + htmlUrl: json['html_url'] as String?, + issueUrl: json['issue_url'] as String?, + ); Map _$IssueCommentToJson(IssueComment instance) => { @@ -136,12 +129,10 @@ Map _$IssueCommentToJson(IssueComment instance) => 'issue_url': instance.issueUrl, }; -IssueLabel _$IssueLabelFromJson(Map json) { - return IssueLabel( - name: json['name'] as String? ?? '', - color: json['color'] as String? ?? '', - ); -} +IssueLabel _$IssueLabelFromJson(Map json) => IssueLabel( + name: json['name'] as String? ?? '', + color: json['color'] as String? ?? '', + ); Map _$IssueLabelToJson(IssueLabel instance) => { @@ -149,29 +140,27 @@ Map _$IssueLabelToJson(IssueLabel instance) => 'color': instance.color, }; -Milestone _$MilestoneFromJson(Map json) { - return Milestone( - id: json['id'] as int?, - number: json['number'] as int?, - state: json['state'] as String?, - title: json['title'] as String?, - description: json['description'] as String?, - creator: json['creator'] == null - ? null - : User.fromJson(json['creator'] as Map), - openIssuesCount: json['open_issues'] as int?, - closedIssuesCount: json['closed_issues'] as int?, - createdAt: json['created_at'] == null - ? null - : DateTime.parse(json['created_at'] as String), - updatedAt: json['updated_at'] == null - ? null - : DateTime.parse(json['updated_at'] as String), - dueOn: json['due_on'] == null - ? null - : DateTime.parse(json['due_on'] as String), - ); -} +Milestone _$MilestoneFromJson(Map json) => Milestone( + id: json['id'] as int?, + number: json['number'] as int?, + state: json['state'] as String?, + title: json['title'] as String?, + description: json['description'] as String?, + creator: json['creator'] == null + ? null + : User.fromJson(json['creator'] as Map), + openIssuesCount: json['open_issues'] as int?, + closedIssuesCount: json['closed_issues'] as int?, + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + updatedAt: json['updated_at'] == null + ? null + : DateTime.parse(json['updated_at'] as String), + dueOn: json['due_on'] == null + ? null + : DateTime.parse(json['due_on'] as String), + ); Map _$MilestoneToJson(Milestone instance) => { 'id': instance.id, @@ -187,16 +176,15 @@ Map _$MilestoneToJson(Milestone instance) => { 'due_on': instance.dueOn?.toIso8601String(), }; -CreateMilestone _$CreateMilestoneFromJson(Map json) { - return CreateMilestone( - json['title'] as String?, - state: json['state'] as String?, - description: json['description'] as String?, - dueOn: json['due_on'] == null - ? null - : DateTime.parse(json['due_on'] as String), - ); -} +CreateMilestone _$CreateMilestoneFromJson(Map json) => + CreateMilestone( + json['title'] as String?, + state: json['state'] as String?, + description: json['description'] as String?, + dueOn: json['due_on'] == null + ? null + : DateTime.parse(json['due_on'] as String), + ); Map _$CreateMilestoneToJson(CreateMilestone instance) => { diff --git a/lib/src/common/model/keys.g.dart b/lib/src/common/model/keys.g.dart index b1c956a8..1db24c87 100644 --- a/lib/src/common/model/keys.g.dart +++ b/lib/src/common/model/keys.g.dart @@ -6,13 +6,11 @@ part of 'keys.dart'; // JsonSerializableGenerator // ************************************************************************** -PublicKey _$PublicKeyFromJson(Map json) { - return PublicKey( - id: json['id'] as int?, - key: json['key'] as String?, - title: json['title'] as String?, - ); -} +PublicKey _$PublicKeyFromJson(Map json) => PublicKey( + id: json['id'] as int?, + key: json['key'] as String?, + title: json['title'] as String?, + ); Map _$PublicKeyToJson(PublicKey instance) => { 'id': instance.id, @@ -20,12 +18,11 @@ Map _$PublicKeyToJson(PublicKey instance) => { 'title': instance.title, }; -CreatePublicKey _$CreatePublicKeyFromJson(Map json) { - return CreatePublicKey( - json['title'] as String?, - json['key'] as String?, - ); -} +CreatePublicKey _$CreatePublicKeyFromJson(Map json) => + CreatePublicKey( + json['title'] as String?, + json['key'] as String?, + ); Map _$CreatePublicKeyToJson(CreatePublicKey instance) => { diff --git a/lib/src/common/model/misc.g.dart b/lib/src/common/model/misc.g.dart index a47d7ff9..fc40fa65 100644 --- a/lib/src/common/model/misc.g.dart +++ b/lib/src/common/model/misc.g.dart @@ -6,20 +6,17 @@ part of 'misc.dart'; // JsonSerializableGenerator // ************************************************************************** -GitignoreTemplate _$GitignoreTemplateFromJson(Map json) { - return GitignoreTemplate( - name: json['name'] as String?, - source: json['source'] as String?, - ); -} +GitignoreTemplate _$GitignoreTemplateFromJson(Map json) => + GitignoreTemplate( + name: json['name'] as String?, + source: json['source'] as String?, + ); -RateLimit _$RateLimitFromJson(Map json) { - return RateLimit( - json['limit'] as int?, - json['remaining'] as int?, - json['resets'] == null ? null : DateTime.parse(json['resets'] as String), - ); -} +RateLimit _$RateLimitFromJson(Map json) => RateLimit( + json['limit'] as int?, + json['remaining'] as int?, + json['resets'] == null ? null : DateTime.parse(json['resets'] as String), + ); Map _$RateLimitToJson(RateLimit instance) => { 'limit': instance.limit, @@ -27,18 +24,16 @@ Map _$RateLimitToJson(RateLimit instance) => { 'resets': instance.resets?.toIso8601String(), }; -APIStatus _$APIStatusFromJson(Map json) { - return APIStatus( - status: json['status'] as String?, - lastUpdatedAt: json['last_updated'] == null - ? null - : DateTime.parse(json['last_updated'] as String), - createdOn: json['created_on'] == null - ? null - : DateTime.parse(json['created_on'] as String), - message: json['body'] as String?, - ); -} +APIStatus _$APIStatusFromJson(Map json) => APIStatus( + status: json['status'] as String?, + lastUpdatedAt: json['last_updated'] == null + ? null + : DateTime.parse(json['last_updated'] as String), + createdOn: json['created_on'] == null + ? null + : DateTime.parse(json['created_on'] as String), + message: json['body'] as String?, + ); Map _$APIStatusToJson(APIStatus instance) => { 'status': instance.status, diff --git a/lib/src/common/model/notifications.g.dart b/lib/src/common/model/notifications.g.dart index 83c9ae84..82c74573 100644 --- a/lib/src/common/model/notifications.g.dart +++ b/lib/src/common/model/notifications.g.dart @@ -6,33 +6,31 @@ part of 'notifications.dart'; // JsonSerializableGenerator // ************************************************************************** -Notification _$NotificationFromJson(Map json) { - return Notification( - id: json['id'] as String?, - repository: json['repository'] == null - ? null - : Repository.fromJson(json['repository'] as Map), - subject: json['subject'] == null - ? null - : NotificationSubject.fromJson(json['subject'] as Map), - reason: json['reason'] as String?, - unread: json['unread'] as bool?, - updatedAt: json['updated_at'] == null - ? null - : DateTime.parse(json['updated_at'] as String), - lastReadAt: json['last_read_at'] == null - ? null - : DateTime.parse(json['last_read_at'] as String), - url: json['url'] as String?, - subscriptionUrl: json['subscription_url'] as String?, - ); -} +Notification _$NotificationFromJson(Map json) => Notification( + id: json['id'] as String?, + repository: json['repository'] == null + ? null + : Repository.fromJson(json['repository'] as Map), + subject: json['subject'] == null + ? null + : NotificationSubject.fromJson( + json['subject'] as Map), + reason: json['reason'] as String?, + unread: json['unread'] as bool?, + updatedAt: json['updated_at'] == null + ? null + : DateTime.parse(json['updated_at'] as String), + lastReadAt: json['last_read_at'] == null + ? null + : DateTime.parse(json['last_read_at'] as String), + url: json['url'] as String?, + subscriptionUrl: json['subscription_url'] as String?, + ); -NotificationSubject _$NotificationSubjectFromJson(Map json) { - return NotificationSubject( - title: json['title'] as String?, - type: json['type'] as String?, - url: json['url'] as String?, - latestCommentUrl: json['latest_comment_url'] as String?, - ); -} +NotificationSubject _$NotificationSubjectFromJson(Map json) => + NotificationSubject( + title: json['title'] as String?, + type: json['type'] as String?, + url: json['url'] as String?, + latestCommentUrl: json['latest_comment_url'] as String?, + ); diff --git a/lib/src/common/model/orgs.g.dart b/lib/src/common/model/orgs.g.dart index e411fc07..52ffea0d 100644 --- a/lib/src/common/model/orgs.g.dart +++ b/lib/src/common/model/orgs.g.dart @@ -6,29 +6,27 @@ part of 'orgs.dart'; // JsonSerializableGenerator // ************************************************************************** -Organization _$OrganizationFromJson(Map json) { - return Organization( - login: json['login'] as String?, - id: json['id'] as int?, - htmlUrl: json['html_url'] as String?, - avatarUrl: json['avatar_url'] as String?, - name: json['name'] as String?, - company: json['company'] as String?, - blog: json['blog'] as String?, - location: json['location'] as String?, - email: json['email'] as String?, - publicReposCount: json['public_repos'] as int?, - publicGistsCount: json['public_gists'] as int?, - followersCount: json['followers'] as int?, - followingCount: json['following'] as int?, - createdAt: json['created_at'] == null - ? null - : DateTime.parse(json['created_at'] as String), - updatedAt: json['updated_at'] == null - ? null - : DateTime.parse(json['updated_at'] as String), - ); -} +Organization _$OrganizationFromJson(Map json) => Organization( + login: json['login'] as String?, + id: json['id'] as int?, + htmlUrl: json['html_url'] as String?, + avatarUrl: json['avatar_url'] as String?, + name: json['name'] as String?, + company: json['company'] as String?, + blog: json['blog'] as String?, + location: json['location'] as String?, + email: json['email'] as String?, + publicReposCount: json['public_repos'] as int?, + publicGistsCount: json['public_gists'] as int?, + followersCount: json['followers'] as int?, + followingCount: json['following'] as int?, + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + updatedAt: json['updated_at'] == null + ? null + : DateTime.parse(json['updated_at'] as String), + ); Map _$OrganizationToJson(Organization instance) => { @@ -50,35 +48,30 @@ Map _$OrganizationToJson(Organization instance) => }; OrganizationMembership _$OrganizationMembershipFromJson( - Map json) { - return OrganizationMembership( - state: json['state'] as String?, - organization: json['organization'] == null - ? null - : Organization.fromJson(json['organization'] as Map), - ); -} + Map json) => + OrganizationMembership( + state: json['state'] as String?, + organization: json['organization'] == null + ? null + : Organization.fromJson(json['organization'] as Map), + ); -Team _$TeamFromJson(Map json) { - return Team( - name: json['name'] as String?, - id: json['id'] as int?, - permission: json['permission'] as String?, - membersCount: json['members_count'] as int?, - reposCount: json['repos_count'] as int?, - organization: json['organization'] == null - ? null - : Organization.fromJson(json['organization'] as Map), - ); -} +Team _$TeamFromJson(Map json) => Team( + name: json['name'] as String?, + id: json['id'] as int?, + permission: json['permission'] as String?, + membersCount: json['members_count'] as int?, + reposCount: json['repos_count'] as int?, + organization: json['organization'] == null + ? null + : Organization.fromJson(json['organization'] as Map), + ); -TeamMember _$TeamMemberFromJson(Map json) { - return TeamMember( - login: json['login'] as String?, - id: json['id'] as int?, - avatarUrl: json['avatar_url'] as String?, - type: json['type'] as String?, - siteAdmin: json['site_admin'] as bool?, - htmlUrl: json['html_url'] as String?, - ); -} +TeamMember _$TeamMemberFromJson(Map json) => TeamMember( + login: json['login'] as String?, + id: json['id'] as int?, + avatarUrl: json['avatar_url'] as String?, + type: json['type'] as String?, + siteAdmin: json['site_admin'] as bool?, + htmlUrl: json['html_url'] as String?, + ); diff --git a/lib/src/common/model/pulls.g.dart b/lib/src/common/model/pulls.g.dart index a341425d..359911f0 100644 --- a/lib/src/common/model/pulls.g.dart +++ b/lib/src/common/model/pulls.g.dart @@ -6,65 +6,63 @@ part of 'pulls.dart'; // JsonSerializableGenerator // ************************************************************************** -PullRequest _$PullRequestFromJson(Map json) { - return PullRequest( - id: json['id'] as int?, - htmlUrl: json['html_url'] as String?, - diffUrl: json['diff_url'] as String?, - patchUrl: json['patch_url'] as String?, - number: json['number'] as int?, - state: json['state'] as String?, - title: json['title'] as String?, - body: json['body'] as String?, - createdAt: json['created_at'] == null - ? null - : DateTime.parse(json['created_at'] as String), - updatedAt: json['updated_at'] == null - ? null - : DateTime.parse(json['updated_at'] as String), - closedAt: json['closed_at'] == null - ? null - : DateTime.parse(json['closed_at'] as String), - mergedAt: json['merged_at'] == null - ? null - : DateTime.parse(json['merged_at'] as String), - head: json['head'] == null - ? null - : PullRequestHead.fromJson(json['head'] as Map), - base: json['base'] == null - ? null - : PullRequestHead.fromJson(json['base'] as Map), - user: json['user'] == null - ? null - : User.fromJson(json['user'] as Map), - draft: json['draft'] as bool?, - mergeCommitSha: json['merge_commit_sha'] as String?, - merged: json['merged'] as bool?, - mergeable: json['mergeable'] as bool?, - mergedBy: json['merged_by'] == null - ? null - : User.fromJson(json['merged_by'] as Map), - commentsCount: json['comments'] as int?, - commitsCount: json['commits'] as int?, - additionsCount: json['additions'] as int?, - deletionsCount: json['deletions'] as int?, - changedFilesCount: json['changed_files'] as int?, - labels: (json['labels'] as List?) - ?.map((e) => IssueLabel.fromJson(e as Map)) - .toList(), - requestedReviewers: (json['requested_reviewers'] as List?) - ?.map((e) => User.fromJson(e as Map)) - .toList(), - reviewCommentCount: json['review_comments'] as int?, - milestone: json['milestone'] == null - ? null - : Milestone.fromJson(json['milestone'] as Map), - rebaseable: json['rebaseable'] as bool?, - mergeableState: json['mergeable_state'] as String?, - maintainerCanModify: json['maintainer_can_modify'] as bool?, - authorAssociation: json['author_association'] as String?, - ); -} +PullRequest _$PullRequestFromJson(Map json) => PullRequest( + id: json['id'] as int?, + htmlUrl: json['html_url'] as String?, + diffUrl: json['diff_url'] as String?, + patchUrl: json['patch_url'] as String?, + number: json['number'] as int?, + state: json['state'] as String?, + title: json['title'] as String?, + body: json['body'] as String?, + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + updatedAt: json['updated_at'] == null + ? null + : DateTime.parse(json['updated_at'] as String), + closedAt: json['closed_at'] == null + ? null + : DateTime.parse(json['closed_at'] as String), + mergedAt: json['merged_at'] == null + ? null + : DateTime.parse(json['merged_at'] as String), + head: json['head'] == null + ? null + : PullRequestHead.fromJson(json['head'] as Map), + base: json['base'] == null + ? null + : PullRequestHead.fromJson(json['base'] as Map), + user: json['user'] == null + ? null + : User.fromJson(json['user'] as Map), + draft: json['draft'] as bool?, + mergeCommitSha: json['merge_commit_sha'] as String?, + merged: json['merged'] as bool?, + mergeable: json['mergeable'] as bool?, + mergedBy: json['merged_by'] == null + ? null + : User.fromJson(json['merged_by'] as Map), + commentsCount: json['comments'] as int? ?? 0, + commitsCount: json['commits'] as int? ?? 0, + additionsCount: json['additions'] as int? ?? 0, + deletionsCount: json['deletions'] as int? ?? 0, + changedFilesCount: json['changed_files'] as int? ?? 0, + labels: (json['labels'] as List?) + ?.map((e) => IssueLabel.fromJson(e as Map)) + .toList(), + requestedReviewers: (json['requested_reviewers'] as List?) + ?.map((e) => User.fromJson(e as Map)) + .toList(), + reviewCommentCount: json['review_comments'] as int? ?? 0, + milestone: json['milestone'] == null + ? null + : Milestone.fromJson(json['milestone'] as Map), + rebaseable: json['rebaseable'] as bool? ?? false, + mergeableState: json['mergeable_state'] as String? ?? '', + maintainerCanModify: json['maintainer_can_modify'] as bool? ?? false, + authorAssociation: json['author_association'] as String? ?? '', + ); Map _$PullRequestToJson(PullRequest instance) => { @@ -103,13 +101,12 @@ Map _$PullRequestToJson(PullRequest instance) => 'author_association': instance.authorAssociation, }; -PullRequestMerge _$PullRequestMergeFromJson(Map json) { - return PullRequestMerge( - merged: json['merged'] as bool?, - sha: json['sha'] as String?, - message: json['message'] as String?, - ); -} +PullRequestMerge _$PullRequestMergeFromJson(Map json) => + PullRequestMerge( + merged: json['merged'] as bool?, + sha: json['sha'] as String?, + message: json['message'] as String?, + ); Map _$PullRequestMergeToJson(PullRequestMerge instance) => { @@ -118,19 +115,18 @@ Map _$PullRequestMergeToJson(PullRequestMerge instance) => 'message': instance.message, }; -PullRequestHead _$PullRequestHeadFromJson(Map json) { - return PullRequestHead( - label: json['label'] as String?, - ref: json['ref'] as String?, - sha: json['sha'] as String?, - user: json['user'] == null - ? null - : User.fromJson(json['user'] as Map), - repo: json['repo'] == null - ? null - : Repository.fromJson(json['repo'] as Map), - ); -} +PullRequestHead _$PullRequestHeadFromJson(Map json) => + PullRequestHead( + label: json['label'] as String?, + ref: json['ref'] as String?, + sha: json['sha'] as String?, + user: json['user'] == null + ? null + : User.fromJson(json['user'] as Map), + repo: json['repo'] == null + ? null + : Repository.fromJson(json['repo'] as Map), + ); Map _$PullRequestHeadToJson(PullRequestHead instance) => { @@ -141,15 +137,14 @@ Map _$PullRequestHeadToJson(PullRequestHead instance) => 'repo': instance.repo, }; -CreatePullRequest _$CreatePullRequestFromJson(Map json) { - return CreatePullRequest( - json['title'] as String?, - json['head'] as String?, - json['base'] as String?, - draft: json['draft'] as bool?, - body: json['body'] as String?, - ); -} +CreatePullRequest _$CreatePullRequestFromJson(Map json) => + CreatePullRequest( + json['title'] as String?, + json['head'] as String?, + json['base'] as String?, + draft: json['draft'] as bool? ?? false, + body: json['body'] as String?, + ); Map _$CreatePullRequestToJson(CreatePullRequest instance) => { @@ -160,32 +155,31 @@ Map _$CreatePullRequestToJson(CreatePullRequest instance) => 'body': instance.body, }; -PullRequestComment _$PullRequestCommentFromJson(Map json) { - return PullRequestComment( - id: json['id'] as int?, - diffHunk: json['diff_hunk'] as String?, - path: json['path'] as String?, - position: json['position'] as int?, - originalPosition: json['original_position'] as int?, - commitId: json['commit_id'] as String?, - originalCommitId: json['original_commit_id'] as String?, - user: json['user'] == null - ? null - : User.fromJson(json['user'] as Map), - body: json['body'] as String?, - createdAt: json['created_at'] == null - ? null - : DateTime.parse(json['created_at'] as String), - updatedAt: json['updated_at'] == null - ? null - : DateTime.parse(json['updated_at'] as String), - url: json['url'] as String?, - pullRequestUrl: json['pull_request_url'] as String?, - links: json['_links'] == null - ? null - : Links.fromJson(json['_links'] as Map), - ); -} +PullRequestComment _$PullRequestCommentFromJson(Map json) => + PullRequestComment( + id: json['id'] as int?, + diffHunk: json['diff_hunk'] as String?, + path: json['path'] as String?, + position: json['position'] as int?, + originalPosition: json['original_position'] as int?, + commitId: json['commit_id'] as String?, + originalCommitId: json['original_commit_id'] as String?, + user: json['user'] == null + ? null + : User.fromJson(json['user'] as Map), + body: json['body'] as String?, + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + updatedAt: json['updated_at'] == null + ? null + : DateTime.parse(json['updated_at'] as String), + url: json['url'] as String?, + pullRequestUrl: json['pull_request_url'] as String?, + links: json['_links'] == null + ? null + : Links.fromJson(json['_links'] as Map), + ); Map _$PullRequestCommentToJson(PullRequestComment instance) => { @@ -206,14 +200,13 @@ Map _$PullRequestCommentToJson(PullRequestComment instance) => }; CreatePullRequestComment _$CreatePullRequestCommentFromJson( - Map json) { - return CreatePullRequestComment( - json['body'] as String?, - json['commit_id'] as String?, - json['path'] as String?, - json['position'] as int?, - ); -} + Map json) => + CreatePullRequestComment( + json['body'] as String?, + json['commit_id'] as String?, + json['path'] as String?, + json['position'] as int?, + ); Map _$CreatePullRequestCommentToJson( CreatePullRequestComment instance) => @@ -224,20 +217,19 @@ Map _$CreatePullRequestCommentToJson( 'position': instance.position, }; -PullRequestFile _$PullRequestFileFromJson(Map json) { - return PullRequestFile( - sha: json['sha'] as String?, - filename: json['filename'] as String?, - status: json['status'] as String?, - additionsCount: json['additions'] as int?, - deletionsCount: json['deletions'] as int?, - changesCount: json['changes'] as int?, - blobUrl: json['blob_url'] as String?, - rawUrl: json['raw_url'] as String?, - contentsUrl: json['contents_url'] as String?, - patch: json['patch'] as String?, - ); -} +PullRequestFile _$PullRequestFileFromJson(Map json) => + PullRequestFile( + sha: json['sha'] as String?, + filename: json['filename'] as String?, + status: json['status'] as String?, + additionsCount: json['additions'] as int?, + deletionsCount: json['deletions'] as int?, + changesCount: json['changes'] as int?, + blobUrl: json['blob_url'] as String?, + rawUrl: json['raw_url'] as String?, + contentsUrl: json['contents_url'] as String?, + patch: json['patch'] as String?, + ); Map _$PullRequestFileToJson(PullRequestFile instance) => { diff --git a/lib/src/common/model/reaction.g.dart b/lib/src/common/model/reaction.g.dart index 9c26c58b..dc2ff705 100644 --- a/lib/src/common/model/reaction.g.dart +++ b/lib/src/common/model/reaction.g.dart @@ -6,19 +6,17 @@ part of 'reaction.dart'; // JsonSerializableGenerator // ************************************************************************** -Reaction _$ReactionFromJson(Map json) { - return Reaction( - id: json['id'] as int?, - nodeId: json['node_id'] as String?, - user: json['user'] == null - ? null - : User.fromJson(json['user'] as Map), - content: json['content'] as String?, - createdAt: json['created_at'] == null - ? null - : DateTime.parse(json['created_at'] as String), - ); -} +Reaction _$ReactionFromJson(Map json) => Reaction( + id: json['id'] as int?, + nodeId: json['node_id'] as String?, + user: json['user'] == null + ? null + : User.fromJson(json['user'] as Map), + content: json['content'] as String?, + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + ); Map _$ReactionToJson(Reaction instance) => { 'id': instance.id, diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart index 80f16ec2..6d9c5dda 100644 --- a/lib/src/common/model/repos.dart +++ b/lib/src/common/model/repos.dart @@ -1,5 +1,6 @@ import 'package:github/src/common.dart'; import 'package:json_annotation/json_annotation.dart'; + part 'repos.g.dart'; @JsonSerializable( @@ -74,15 +75,12 @@ class Repository { this.permissions}); /// Repository Name - @JsonKey(defaultValue: '') final String name; /// Repository ID - @JsonKey(defaultValue: 0) final int id; /// Full Repository Name - @JsonKey(defaultValue: '') final String fullName; /// Repository Owner @@ -90,88 +88,68 @@ class Repository { final UserInformation? owner; /// If the Repository is Private - @JsonKey(name: 'private', defaultValue: false) + @JsonKey(name: 'private') final bool isPrivate; /// If the Repository is a fork - @JsonKey(name: 'fork', defaultValue: false) + @JsonKey(name: 'fork') final bool isFork; /// Url to the GitHub Repository Page - @JsonKey(defaultValue: '') final String htmlUrl; /// Repository Description - @JsonKey(defaultValue: '') final String description; // https clone URL - @JsonKey(defaultValue: '') final String cloneUrl; - @JsonKey(defaultValue: '') final String sshUrl; - @JsonKey(defaultValue: '') final String svnUrl; - @JsonKey(defaultValue: '') final String gitUrl; /// Url to the Repository Homepage - @JsonKey(defaultValue: '') final String homepage; /// Repository Size - @JsonKey(defaultValue: 0) final int size; /// Repository Stars - @JsonKey(defaultValue: 0) final int stargazersCount; /// Repository Watchers - @JsonKey(defaultValue: 0) final int watchersCount; /// Repository Language - @JsonKey(defaultValue: '') final String language; /// If the Repository has Issues Enabled - @JsonKey(defaultValue: false) final bool hasIssues; /// If the Repository has the Wiki Enabled - @JsonKey(defaultValue: false) final bool hasWiki; /// If the Repository has any Downloads - @JsonKey(defaultValue: false) final bool hasDownloads; /// If the Repository has any Github Pages - @JsonKey(defaultValue: false) final bool hasPages; /// Number of Forks - @JsonKey(defaultValue: 0) final int forksCount; /// Number of Open Issues - @JsonKey(defaultValue: 0) final int openIssuesCount; /// Repository Default Branch - @JsonKey(defaultValue: '') final String defaultBranch; /// Number of Subscribers - @JsonKey(defaultValue: 0) final int subscribersCount; /// Number of users in the network - @JsonKey(defaultValue: 0) final int networkCount; /// The time the repository was created at @@ -184,10 +162,8 @@ class Repository { final LicenseKind? license; - @JsonKey(defaultValue: false) final bool archived; - @JsonKey(defaultValue: false) final bool disabled; RepositoryPermissions? permissions; @@ -210,15 +186,12 @@ class RepositoryPermissions { {this.admin = false, this.push = false, this.pull = false}); /// Administrative Access - @JsonKey(defaultValue: false) final bool admin; /// Push Access - @JsonKey(defaultValue: false) final bool push; /// Pull Access - @JsonKey(defaultValue: false) final bool pull; factory RepositoryPermissions.fromJson(Map json) => diff --git a/lib/src/common/model/repos.g.dart b/lib/src/common/model/repos.g.dart index 944df226..9809a166 100644 --- a/lib/src/common/model/repos.g.dart +++ b/lib/src/common/model/repos.g.dart @@ -6,66 +6,63 @@ part of 'repos.dart'; // JsonSerializableGenerator // ************************************************************************** -GitHubComparison _$GitHubComparisonFromJson(Map json) { - return GitHubComparison( - json['url'] as String?, - json['status'] as String?, - json['ahead_by'] as int?, - json['behind_by'] as int?, - json['total_commits'] as int?, - ); -} +GitHubComparison _$GitHubComparisonFromJson(Map json) => + GitHubComparison( + json['url'] as String?, + json['status'] as String?, + json['ahead_by'] as int?, + json['behind_by'] as int?, + json['total_commits'] as int?, + ); -Repository _$RepositoryFromJson(Map json) { - return Repository( - name: json['name'] as String? ?? '', - id: json['id'] as int? ?? 0, - fullName: json['full_name'] as String? ?? '', - owner: json['owner'] == null - ? null - : UserInformation.fromJson(json['owner'] as Map), - htmlUrl: json['html_url'] as String? ?? '', - description: json['description'] as String? ?? '', - cloneUrl: json['clone_url'] as String? ?? '', - gitUrl: json['git_url'] as String? ?? '', - sshUrl: json['ssh_url'] as String? ?? '', - svnUrl: json['svn_url'] as String? ?? '', - defaultBranch: json['default_branch'] as String? ?? '', - createdAt: json['created_at'] == null - ? null - : DateTime.parse(json['created_at'] as String), - isPrivate: json['private'] as bool? ?? false, - isFork: json['fork'] as bool? ?? false, - stargazersCount: json['stargazers_count'] as int? ?? 0, - watchersCount: json['watchers_count'] as int? ?? 0, - language: json['language'] as String? ?? '', - hasWiki: json['has_wiki'] as bool? ?? false, - hasDownloads: json['has_downloads'] as bool? ?? false, - forksCount: json['forks_count'] as int? ?? 0, - openIssuesCount: json['open_issues_count'] as int? ?? 0, - subscribersCount: json['subscribers_count'] as int? ?? 0, - networkCount: json['network_count'] as int? ?? 0, - hasIssues: json['has_issues'] as bool? ?? false, - size: json['size'] as int? ?? 0, - archived: json['archived'] as bool? ?? false, - disabled: json['disabled'] as bool? ?? false, - homepage: json['homepage'] as String? ?? '', - updatedAt: json['updated_at'] == null - ? null - : DateTime.parse(json['updated_at'] as String), - pushedAt: json['pushed_at'] == null - ? null - : DateTime.parse(json['pushed_at'] as String), - license: json['license'] == null - ? null - : LicenseKind.fromJson(json['license'] as Map), - hasPages: json['has_pages'] as bool? ?? false, - permissions: json['permissions'] == null - ? null - : RepositoryPermissions.fromJson( - json['permissions'] as Map), - ); -} +Repository _$RepositoryFromJson(Map json) => Repository( + name: json['name'] as String? ?? '', + id: json['id'] as int? ?? 0, + fullName: json['full_name'] as String? ?? '', + owner: json['owner'] == null + ? null + : UserInformation.fromJson(json['owner'] as Map), + htmlUrl: json['html_url'] as String? ?? '', + description: json['description'] as String? ?? '', + cloneUrl: json['clone_url'] as String? ?? '', + gitUrl: json['git_url'] as String? ?? '', + sshUrl: json['ssh_url'] as String? ?? '', + svnUrl: json['svn_url'] as String? ?? '', + defaultBranch: json['default_branch'] as String? ?? '', + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + isPrivate: json['private'] as bool? ?? false, + isFork: json['fork'] as bool? ?? false, + stargazersCount: json['stargazers_count'] as int? ?? 0, + watchersCount: json['watchers_count'] as int? ?? 0, + language: json['language'] as String? ?? '', + hasWiki: json['has_wiki'] as bool? ?? false, + hasDownloads: json['has_downloads'] as bool? ?? false, + forksCount: json['forks_count'] as int? ?? 0, + openIssuesCount: json['open_issues_count'] as int? ?? 0, + subscribersCount: json['subscribers_count'] as int? ?? 0, + networkCount: json['network_count'] as int? ?? 0, + hasIssues: json['has_issues'] as bool? ?? false, + size: json['size'] as int? ?? 0, + archived: json['archived'] as bool? ?? false, + disabled: json['disabled'] as bool? ?? false, + homepage: json['homepage'] as String? ?? '', + updatedAt: json['updated_at'] == null + ? null + : DateTime.parse(json['updated_at'] as String), + pushedAt: json['pushed_at'] == null + ? null + : DateTime.parse(json['pushed_at'] as String), + license: json['license'] == null + ? null + : LicenseKind.fromJson(json['license'] as Map), + hasPages: json['has_pages'] as bool? ?? false, + permissions: json['permissions'] == null + ? null + : RepositoryPermissions.fromJson( + json['permissions'] as Map), + ); Map _$RepositoryToJson(Repository instance) => { @@ -105,13 +102,12 @@ Map _$RepositoryToJson(Repository instance) => }; RepositoryPermissions _$RepositoryPermissionsFromJson( - Map json) { - return RepositoryPermissions( - admin: json['admin'] as bool? ?? false, - push: json['push'] as bool? ?? false, - pull: json['pull'] as bool? ?? false, - ); -} + Map json) => + RepositoryPermissions( + admin: json['admin'] as bool? ?? false, + push: json['push'] as bool? ?? false, + pull: json['pull'] as bool? ?? false, + ); Map _$RepositoryPermissionsToJson( RepositoryPermissions instance) => @@ -121,35 +117,31 @@ Map _$RepositoryPermissionsToJson( 'pull': instance.pull, }; -Tag _$TagFromJson(Map json) { - return Tag( - json['name'] as String, - CommitInfo.fromJson(json['commit'] as Map), - json['zipball_url'] as String, - json['tarball_url'] as String, - ); -} +Tag _$TagFromJson(Map json) => Tag( + json['name'] as String, + CommitInfo.fromJson(json['commit'] as Map), + json['zipball_url'] as String, + json['tarball_url'] as String, + ); -CommitData _$CommitDataFromJson(Map json) { - return CommitData( - json['sha'] as String?, - json['commit'] == null - ? null - : GitCommit.fromJson(json['commit'] as Map), - json['url'] as String?, - json['html_url'] as String?, - json['comments_url'] as String?, - json['author'] == null - ? null - : CommitDataUser.fromJson(json['author'] as Map), - json['committer'] == null - ? null - : CommitDataUser.fromJson(json['committer'] as Map), - (json['parents'] as List?) - ?.map((e) => e as Map) - .toList(), - ); -} +CommitData _$CommitDataFromJson(Map json) => CommitData( + json['sha'] as String?, + json['commit'] == null + ? null + : GitCommit.fromJson(json['commit'] as Map), + json['url'] as String?, + json['html_url'] as String?, + json['comments_url'] as String?, + json['author'] == null + ? null + : CommitDataUser.fromJson(json['author'] as Map), + json['committer'] == null + ? null + : CommitDataUser.fromJson(json['committer'] as Map), + (json['parents'] as List?) + ?.map((e) => e as Map) + .toList(), + ); Map _$CommitDataToJson(CommitData instance) => { @@ -163,13 +155,12 @@ Map _$CommitDataToJson(CommitData instance) => 'parents': instance.parents, }; -CommitDataUser _$CommitDataUserFromJson(Map json) { - return CommitDataUser( - json['login'] as String?, - json['id'] as int?, - json['type'] as String?, - ); -} +CommitDataUser _$CommitDataUserFromJson(Map json) => + CommitDataUser( + json['login'] as String?, + json['id'] as int?, + json['type'] as String?, + ); Map _$CommitDataUserToJson(CommitDataUser instance) => { @@ -178,14 +169,12 @@ Map _$CommitDataUserToJson(CommitDataUser instance) => 'id': instance.id, }; -CommitInfo _$CommitInfoFromJson(Map json) { - return CommitInfo( - json['sha'] as String?, - json['tree'] == null - ? null - : GitTree.fromJson(json['tree'] as Map), - ); -} +CommitInfo _$CommitInfoFromJson(Map json) => CommitInfo( + json['sha'] as String?, + json['tree'] == null + ? null + : GitTree.fromJson(json['tree'] as Map), + ); Map _$CommitInfoToJson(CommitInfo instance) => { @@ -193,14 +182,13 @@ Map _$CommitInfoToJson(CommitInfo instance) => 'tree': instance.tree, }; -UserInformation _$UserInformationFromJson(Map json) { - return UserInformation( - json['login'] as String, - json['id'] as int, - json['avatar_url'] as String, - json['html_url'] as String, - ); -} +UserInformation _$UserInformationFromJson(Map json) => + UserInformation( + json['login'] as String, + json['id'] as int, + json['avatar_url'] as String, + json['html_url'] as String, + ); Map _$UserInformationToJson(UserInformation instance) => { @@ -210,12 +198,11 @@ Map _$UserInformationToJson(UserInformation instance) => 'html_url': instance.htmlUrl, }; -RepositorySlug _$RepositorySlugFromJson(Map json) { - return RepositorySlug( - json['owner'] as String, - json['name'] as String, - ); -} +RepositorySlug _$RepositorySlugFromJson(Map json) => + RepositorySlug( + json['owner'] as String, + json['name'] as String, + ); Map _$RepositorySlugToJson(RepositorySlug instance) => { @@ -223,21 +210,20 @@ Map _$RepositorySlugToJson(RepositorySlug instance) => 'name': instance.name, }; -CreateRepository _$CreateRepositoryFromJson(Map json) { - return CreateRepository( - json['name'] as String?, - description: json['description'] as String?, - homepage: json['homepage'] as String?, - private: json['private'] as bool?, - hasIssues: json['has_issues'] as bool?, - hasDownloads: json['has_downloads'] as bool?, - teamId: json['team_id'] as int?, - autoInit: json['auto_init'] as bool?, - gitignoreTemplate: json['gitignore_template'] as String?, - licenseTemplate: json['license_template'] as String?, - hasWiki: json['has_wiki'] as bool?, - ); -} +CreateRepository _$CreateRepositoryFromJson(Map json) => + CreateRepository( + json['name'] as String?, + description: json['description'] as String?, + homepage: json['homepage'] as String?, + private: json['private'] as bool?, + hasIssues: json['has_issues'] as bool?, + hasDownloads: json['has_downloads'] as bool?, + teamId: json['team_id'] as int?, + autoInit: json['auto_init'] as bool?, + gitignoreTemplate: json['gitignore_template'] as String?, + licenseTemplate: json['license_template'] as String?, + hasWiki: json['has_wiki'] as bool?, + ); Map _$CreateRepositoryToJson(CreateRepository instance) => { @@ -254,45 +240,43 @@ Map _$CreateRepositoryToJson(CreateRepository instance) => 'license_template': instance.licenseTemplate, }; -Branch _$BranchFromJson(Map json) { - return Branch( - json['name'] as String?, - json['commit'] == null - ? null - : CommitData.fromJson(json['commit'] as Map), - ); -} +Branch _$BranchFromJson(Map json) => Branch( + json['name'] as String?, + json['commit'] == null + ? null + : CommitData.fromJson(json['commit'] as Map), + ); Map _$BranchToJson(Branch instance) => { 'name': instance.name, 'commit': instance.commit, }; -LicenseDetails _$LicenseDetailsFromJson(Map json) { - return LicenseDetails( - name: json['name'] as String?, - path: json['path'] as String?, - sha: json['sha'] as String?, - size: json['size'] as int?, - url: json['url'] == null ? null : Uri.parse(json['url'] as String), - htmlUrl: - json['html_url'] == null ? null : Uri.parse(json['html_url'] as String), - gitUrl: - json['git_url'] == null ? null : Uri.parse(json['git_url'] as String), - downloadUrl: json['download_url'] == null - ? null - : Uri.parse(json['download_url'] as String), - type: json['type'] as String?, - content: json['content'] as String?, - encoding: json['encoding'] as String?, - links: json['_links'] == null - ? null - : Links.fromJson(json['_links'] as Map), - license: json['license'] == null - ? null - : LicenseKind.fromJson(json['license'] as Map), - ); -} +LicenseDetails _$LicenseDetailsFromJson(Map json) => + LicenseDetails( + name: json['name'] as String?, + path: json['path'] as String?, + sha: json['sha'] as String?, + size: json['size'] as int?, + url: json['url'] == null ? null : Uri.parse(json['url'] as String), + htmlUrl: json['html_url'] == null + ? null + : Uri.parse(json['html_url'] as String), + gitUrl: + json['git_url'] == null ? null : Uri.parse(json['git_url'] as String), + downloadUrl: json['download_url'] == null + ? null + : Uri.parse(json['download_url'] as String), + type: json['type'] as String?, + content: json['content'] as String?, + encoding: json['encoding'] as String?, + links: json['_links'] == null + ? null + : Links.fromJson(json['_links'] as Map), + license: json['license'] == null + ? null + : LicenseKind.fromJson(json['license'] as Map), + ); Map _$LicenseDetailsToJson(LicenseDetails instance) => { @@ -311,15 +295,13 @@ Map _$LicenseDetailsToJson(LicenseDetails instance) => 'license': instance.license, }; -LicenseKind _$LicenseKindFromJson(Map json) { - return LicenseKind( - key: json['key'] as String?, - name: json['name'] as String?, - spdxId: json['spdx_id'] as String?, - url: json['url'] == null ? null : Uri.parse(json['url'] as String), - nodeId: json['node_id'] as String?, - ); -} +LicenseKind _$LicenseKindFromJson(Map json) => LicenseKind( + key: json['key'] as String?, + name: json['name'] as String?, + spdxId: json['spdx_id'] as String?, + url: json['url'] == null ? null : Uri.parse(json['url'] as String), + nodeId: json['node_id'] as String?, + ); Map _$LicenseKindToJson(LicenseKind instance) => { diff --git a/lib/src/common/model/repos_commits.g.dart b/lib/src/common/model/repos_commits.g.dart index ef794d22..c91901fc 100644 --- a/lib/src/common/model/repos_commits.g.dart +++ b/lib/src/common/model/repos_commits.g.dart @@ -6,32 +6,31 @@ part of 'repos_commits.dart'; // JsonSerializableGenerator // ************************************************************************** -RepositoryCommit _$RepositoryCommitFromJson(Map json) { - return RepositoryCommit( - url: json['url'] as String?, - sha: json['sha'] as String?, - htmlUrl: json['html_url'] as String?, - commentsUrl: json['comments_url'] as String?, - commit: json['commit'] == null - ? null - : GitCommit.fromJson(json['commit'] as Map), - author: json['author'] == null - ? null - : User.fromJson(json['author'] as Map), - committer: json['committer'] == null - ? null - : User.fromJson(json['committer'] as Map), - parents: (json['parents'] as List?) - ?.map((e) => GitCommit.fromJson(e as Map)) - .toList(), - stats: json['stats'] == null - ? null - : CommitStats.fromJson(json['stats'] as Map), - files: (json['files'] as List?) - ?.map((e) => CommitFile.fromJson(e as Map)) - .toList(), - ); -} +RepositoryCommit _$RepositoryCommitFromJson(Map json) => + RepositoryCommit( + url: json['url'] as String?, + sha: json['sha'] as String?, + htmlUrl: json['html_url'] as String?, + commentsUrl: json['comments_url'] as String?, + commit: json['commit'] == null + ? null + : GitCommit.fromJson(json['commit'] as Map), + author: json['author'] == null + ? null + : User.fromJson(json['author'] as Map), + committer: json['committer'] == null + ? null + : User.fromJson(json['committer'] as Map), + parents: (json['parents'] as List?) + ?.map((e) => GitCommit.fromJson(e as Map)) + .toList(), + stats: json['stats'] == null + ? null + : CommitStats.fromJson(json['stats'] as Map), + files: (json['files'] as List?) + ?.map((e) => CommitFile.fromJson(e as Map)) + .toList(), + ); Map _$RepositoryCommitToJson(RepositoryCommit instance) => { @@ -47,13 +46,11 @@ Map _$RepositoryCommitToJson(RepositoryCommit instance) => 'files': instance.files, }; -CommitStats _$CommitStatsFromJson(Map json) { - return CommitStats( - additions: json['additions'] as int?, - deletions: json['deletions'] as int?, - total: json['total'] as int?, - ); -} +CommitStats _$CommitStatsFromJson(Map json) => CommitStats( + additions: json['additions'] as int?, + deletions: json['deletions'] as int?, + total: json['total'] as int?, + ); Map _$CommitStatsToJson(CommitStats instance) => { @@ -62,18 +59,16 @@ Map _$CommitStatsToJson(CommitStats instance) => 'total': instance.total, }; -CommitFile _$CommitFileFromJson(Map json) { - return CommitFile( - name: json['filename'] as String?, - additions: json['additions'] as int?, - deletions: json['deletions'] as int?, - changes: json['changes'] as int?, - status: json['status'] as String?, - rawUrl: json['raw_url'] as String?, - blobUrl: json['blob_url'] as String?, - patch: json['patch'] as String?, - ); -} +CommitFile _$CommitFileFromJson(Map json) => CommitFile( + name: json['filename'] as String?, + additions: json['additions'] as int?, + deletions: json['deletions'] as int?, + changes: json['changes'] as int?, + status: json['status'] as String?, + rawUrl: json['raw_url'] as String?, + blobUrl: json['blob_url'] as String?, + patch: json['patch'] as String?, + ); Map _$CommitFileToJson(CommitFile instance) => { @@ -87,24 +82,23 @@ Map _$CommitFileToJson(CommitFile instance) => 'patch': instance.patch, }; -CommitComment _$CommitCommentFromJson(Map json) { - return CommitComment( - id: json['id'] as int?, - line: json['line'] as int?, - position: json['position'] as int?, - path: json['path'] as String?, - apiUrl: json['url'] as String?, - commitId: json['commit_id'] as String?, - createdAt: json['created_at'] == null - ? null - : DateTime.parse(json['created_at'] as String), - htmlUrl: json['html_url'] as String?, - updatedAt: json['updated_at'] == null - ? null - : DateTime.parse(json['updated_at'] as String), - body: json['body'] as String?, - ); -} +CommitComment _$CommitCommentFromJson(Map json) => + CommitComment( + id: json['id'] as int?, + line: json['line'] as int?, + position: json['position'] as int?, + path: json['path'] as String?, + apiUrl: json['url'] as String?, + commitId: json['commit_id'] as String?, + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + htmlUrl: json['html_url'] as String?, + updatedAt: json['updated_at'] == null + ? null + : DateTime.parse(json['updated_at'] as String), + body: json['body'] as String?, + ); Map _$CommitCommentToJson(CommitComment instance) => { diff --git a/lib/src/common/model/repos_contents.g.dart b/lib/src/common/model/repos_contents.g.dart index 379b3ae6..96f92749 100644 --- a/lib/src/common/model/repos_contents.g.dart +++ b/lib/src/common/model/repos_contents.g.dart @@ -6,27 +6,25 @@ part of 'repos_contents.dart'; // JsonSerializableGenerator // ************************************************************************** -GitHubFile _$GitHubFileFromJson(Map json) { - return GitHubFile( - type: json['type'] as String?, - encoding: json['encoding'] as String?, - size: json['size'] as int?, - name: json['name'] as String?, - path: json['path'] as String?, - content: json['content'] as String?, - sha: json['sha'] as String?, - htmlUrl: json['html_url'] as String?, - gitUrl: json['git_url'] as String?, - downloadUrl: json['download_url'] as String?, - links: json['_links'] == null - ? null - : Links.fromJson(json['_links'] as Map), - sourceRepository: json['source_repository'] == null - ? null - : RepositorySlug.fromJson( - json['source_repository'] as Map), - ); -} +GitHubFile _$GitHubFileFromJson(Map json) => GitHubFile( + type: json['type'] as String?, + encoding: json['encoding'] as String?, + size: json['size'] as int?, + name: json['name'] as String?, + path: json['path'] as String?, + content: json['content'] as String?, + sha: json['sha'] as String?, + htmlUrl: json['html_url'] as String?, + gitUrl: json['git_url'] as String?, + downloadUrl: json['download_url'] as String?, + links: json['_links'] == null + ? null + : Links.fromJson(json['_links'] as Map), + sourceRepository: json['source_repository'] == null + ? null + : RepositorySlug.fromJson( + json['source_repository'] as Map), + ); Map _$GitHubFileToJson(GitHubFile instance) => { @@ -44,13 +42,11 @@ Map _$GitHubFileToJson(GitHubFile instance) => 'source_repository': instance.sourceRepository, }; -Links _$LinksFromJson(Map json) { - return Links( - git: json['git'] == null ? null : Uri.parse(json['git'] as String), - self: json['self'] == null ? null : Uri.parse(json['self'] as String), - html: json['html'] == null ? null : Uri.parse(json['html'] as String), - ); -} +Links _$LinksFromJson(Map json) => Links( + git: json['git'] == null ? null : Uri.parse(json['git'] as String), + self: json['self'] == null ? null : Uri.parse(json['self'] as String), + html: json['html'] == null ? null : Uri.parse(json['html'] as String), + ); Map _$LinksToJson(Links instance) => { 'self': instance.self?.toString(), @@ -58,16 +54,15 @@ Map _$LinksToJson(Links instance) => { 'html': instance.html?.toString(), }; -RepositoryContents _$RepositoryContentsFromJson(Map json) { - return RepositoryContents( - file: json['file'] == null - ? null - : GitHubFile.fromJson(json['file'] as Map), - tree: (json['tree'] as List?) - ?.map((e) => GitHubFile.fromJson(e as Map)) - .toList(), - ); -} +RepositoryContents _$RepositoryContentsFromJson(Map json) => + RepositoryContents( + file: json['file'] == null + ? null + : GitHubFile.fromJson(json['file'] as Map), + tree: (json['tree'] as List?) + ?.map((e) => GitHubFile.fromJson(e as Map)) + .toList(), + ); Map _$RepositoryContentsToJson(RepositoryContents instance) => { @@ -75,17 +70,15 @@ Map _$RepositoryContentsToJson(RepositoryContents instance) => 'tree': instance.tree, }; -CreateFile _$CreateFileFromJson(Map json) { - return CreateFile( - path: json['path'] as String?, - content: json['content'] as String?, - message: json['message'] as String?, - branch: json['branch'] as String?, - committer: json['committer'] == null - ? null - : CommitUser.fromJson(json['committer'] as Map), - ); -} +CreateFile _$CreateFileFromJson(Map json) => CreateFile( + path: json['path'] as String?, + content: json['content'] as String?, + message: json['message'] as String?, + branch: json['branch'] as String?, + committer: json['committer'] == null + ? null + : CommitUser.fromJson(json['committer'] as Map), + ); Map _$CreateFileToJson(CreateFile instance) => { @@ -96,12 +89,10 @@ Map _$CreateFileToJson(CreateFile instance) => 'committer': instance.committer, }; -CommitUser _$CommitUserFromJson(Map json) { - return CommitUser( - json['name'] as String?, - json['email'] as String?, - ); -} +CommitUser _$CommitUserFromJson(Map json) => CommitUser( + json['name'] as String?, + json['email'] as String?, + ); Map _$CommitUserToJson(CommitUser instance) => { @@ -109,16 +100,15 @@ Map _$CommitUserToJson(CommitUser instance) => 'email': instance.email, }; -ContentCreation _$ContentCreationFromJson(Map json) { - return ContentCreation( - json['commit'] == null - ? null - : RepositoryCommit.fromJson(json['commit'] as Map), - json['content'] == null - ? null - : GitHubFile.fromJson(json['content'] as Map), - ); -} +ContentCreation _$ContentCreationFromJson(Map json) => + ContentCreation( + json['commit'] == null + ? null + : RepositoryCommit.fromJson(json['commit'] as Map), + json['content'] == null + ? null + : GitHubFile.fromJson(json['content'] as Map), + ); Map _$ContentCreationToJson(ContentCreation instance) => { diff --git a/lib/src/common/model/repos_forks.g.dart b/lib/src/common/model/repos_forks.g.dart index 31eda0a1..0d41f4e9 100644 --- a/lib/src/common/model/repos_forks.g.dart +++ b/lib/src/common/model/repos_forks.g.dart @@ -6,11 +6,9 @@ part of 'repos_forks.dart'; // JsonSerializableGenerator // ************************************************************************** -CreateFork _$CreateForkFromJson(Map json) { - return CreateFork( - json['organization'] as String?, - ); -} +CreateFork _$CreateForkFromJson(Map json) => CreateFork( + json['organization'] as String?, + ); Map _$CreateForkToJson(CreateFork instance) => { diff --git a/lib/src/common/model/repos_hooks.g.dart b/lib/src/common/model/repos_hooks.g.dart index d230f85c..c199f2ea 100644 --- a/lib/src/common/model/repos_hooks.g.dart +++ b/lib/src/common/model/repos_hooks.g.dart @@ -6,25 +6,23 @@ part of 'repos_hooks.dart'; // JsonSerializableGenerator // ************************************************************************** -Hook _$HookFromJson(Map json) { - return Hook( - id: json['id'] as int?, - name: json['name'] as String?, - ) - ..events = - (json['events'] as List?)?.map((e) => e as String).toList() - ..active = json['active'] as bool? - ..createdAt = json['created_at'] == null - ? null - : DateTime.parse(json['created_at'] as String) - ..updatedAt = json['updated_at'] == null - ? null - : DateTime.parse(json['updated_at'] as String) - ..repoName = json['repo_name'] as String? - ..config = json['config'] == null - ? null - : HookConfig.fromJson(json['config'] as Map); -} +Hook _$HookFromJson(Map json) => Hook( + id: json['id'] as int?, + name: json['name'] as String?, + ) + ..events = + (json['events'] as List?)?.map((e) => e as String).toList() + ..active = json['active'] as bool? + ..createdAt = json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String) + ..updatedAt = json['updated_at'] == null + ? null + : DateTime.parse(json['updated_at'] as String) + ..repoName = json['repo_name'] as String? + ..config = json['config'] == null + ? null + : HookConfig.fromJson(json['config'] as Map); Map _$HookToJson(Hook instance) => { 'id': instance.id, @@ -37,14 +35,12 @@ Map _$HookToJson(Hook instance) => { 'config': instance.config, }; -HookConfig _$HookConfigFromJson(Map json) { - return HookConfig( - url: json['url'] as String?, - contentType: json['content_type'] as String?, - secret: json['secret'] as String?, - insecureSsl: json['insecure_ssl'] as String?, - ); -} +HookConfig _$HookConfigFromJson(Map json) => HookConfig( + url: json['url'] as String?, + contentType: json['content_type'] as String?, + secret: json['secret'] as String?, + insecureSsl: json['insecure_ssl'] as String?, + ); Map _$HookConfigToJson(HookConfig instance) => { @@ -54,17 +50,17 @@ Map _$HookConfigToJson(HookConfig instance) => 'insecure_ssl': instance.insecureSsl, }; -CreateHook _$CreateHookFromJson(Map json) { - return CreateHook( - json['name'] as String?, - json['config'] == null - ? null - : HookConfig.fromJson(json['config'] as Map), - events: - (json['events'] as List?)?.map((e) => e as String).toList(), - active: json['active'] as bool?, - ); -} +CreateHook _$CreateHookFromJson(Map json) => CreateHook( + json['name'] as String?, + json['config'] == null + ? null + : HookConfig.fromJson(json['config'] as Map), + events: (json['events'] as List?) + ?.map((e) => e as String) + .toList() ?? + const ['push'], + active: json['active'] as bool? ?? true, + ); Map _$CreateHookToJson(CreateHook instance) => { diff --git a/lib/src/common/model/repos_merging.g.dart b/lib/src/common/model/repos_merging.g.dart index d4fa2d4b..be3777c0 100644 --- a/lib/src/common/model/repos_merging.g.dart +++ b/lib/src/common/model/repos_merging.g.dart @@ -6,13 +6,11 @@ part of 'repos_merging.dart'; // JsonSerializableGenerator // ************************************************************************** -CreateMerge _$CreateMergeFromJson(Map json) { - return CreateMerge( - json['base'] as String?, - json['head'] as String?, - commitMessage: json['commit_message'] as String?, - ); -} +CreateMerge _$CreateMergeFromJson(Map json) => CreateMerge( + json['base'] as String?, + json['head'] as String?, + commitMessage: json['commit_message'] as String?, + ); Map _$CreateMergeToJson(CreateMerge instance) => { diff --git a/lib/src/common/model/repos_pages.g.dart b/lib/src/common/model/repos_pages.g.dart index 8cdb0c34..a550ad75 100644 --- a/lib/src/common/model/repos_pages.g.dart +++ b/lib/src/common/model/repos_pages.g.dart @@ -6,13 +6,12 @@ part of 'repos_pages.dart'; // JsonSerializableGenerator // ************************************************************************** -RepositoryPages _$RepositoryPagesFromJson(Map json) { - return RepositoryPages( - cname: json['cname'] as String?, - status: json['status'] as String?, - hasCustom404: json['custom_404'] as bool?, - ); -} +RepositoryPages _$RepositoryPagesFromJson(Map json) => + RepositoryPages( + cname: json['cname'] as String?, + status: json['status'] as String?, + hasCustom404: json['custom_404'] as bool?, + ); Map _$RepositoryPagesToJson(RepositoryPages instance) => { @@ -21,26 +20,24 @@ Map _$RepositoryPagesToJson(RepositoryPages instance) => 'custom_404': instance.hasCustom404, }; -PageBuild _$PageBuildFromJson(Map json) { - return PageBuild( - url: json['url'] as String?, - status: json['status'] as String?, - error: json['error'] == null - ? null - : PageBuildError.fromJson(json['error'] as Map), - pusher: json['pusher'] == null - ? null - : PageBuildPusher.fromJson(json['pusher'] as Map), - commit: json['commit'] as String?, - duration: json['duration'] as int?, - createdAt: json['created_at'] == null - ? null - : DateTime.parse(json['created_at'] as String), - updatedAt: json['updated_at'] == null - ? null - : DateTime.parse(json['updated_at'] as String), - ); -} +PageBuild _$PageBuildFromJson(Map json) => PageBuild( + url: json['url'] as String?, + status: json['status'] as String?, + error: json['error'] == null + ? null + : PageBuildError.fromJson(json['error'] as Map), + pusher: json['pusher'] == null + ? null + : PageBuildPusher.fromJson(json['pusher'] as Map), + commit: json['commit'] as String?, + duration: json['duration'] as int?, + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + updatedAt: json['updated_at'] == null + ? null + : DateTime.parse(json['updated_at'] as String), + ); Map _$PageBuildToJson(PageBuild instance) => { 'url': instance.url, @@ -53,16 +50,15 @@ Map _$PageBuildToJson(PageBuild instance) => { 'updated_at': instance.updatedAt?.toIso8601String(), }; -PageBuildPusher _$PageBuildPusherFromJson(Map json) { - return PageBuildPusher( - login: json['login'] as String?, - id: json['id'] as int?, - apiUrl: json['url'] as String?, - htmlUrl: json['html_url'] as String?, - type: json['type'] as String?, - siteAdmin: json['site_admin'] as bool?, - ); -} +PageBuildPusher _$PageBuildPusherFromJson(Map json) => + PageBuildPusher( + login: json['login'] as String?, + id: json['id'] as int?, + apiUrl: json['url'] as String?, + htmlUrl: json['html_url'] as String?, + type: json['type'] as String?, + siteAdmin: json['site_admin'] as bool?, + ); Map _$PageBuildPusherToJson(PageBuildPusher instance) => { @@ -74,11 +70,10 @@ Map _$PageBuildPusherToJson(PageBuildPusher instance) => 'site_admin': instance.siteAdmin, }; -PageBuildError _$PageBuildErrorFromJson(Map json) { - return PageBuildError( - message: json['message'] as String?, - ); -} +PageBuildError _$PageBuildErrorFromJson(Map json) => + PageBuildError( + message: json['message'] as String?, + ); Map _$PageBuildErrorToJson(PageBuildError instance) => { diff --git a/lib/src/common/model/repos_releases.g.dart b/lib/src/common/model/repos_releases.g.dart index 5b3b78e5..faf4db03 100644 --- a/lib/src/common/model/repos_releases.g.dart +++ b/lib/src/common/model/repos_releases.g.dart @@ -6,38 +6,36 @@ part of 'repos_releases.dart'; // JsonSerializableGenerator // ************************************************************************** -Release _$ReleaseFromJson(Map json) { - return Release( - id: json['id'] as int?, - url: json['url'] as String?, - htmlUrl: json['html_url'] as String?, - tarballUrl: json['tarball_url'] as String?, - uploadUrl: json['upload_url'] as String?, - nodeId: json['node_id'] as String?, - tagName: json['tag_name'] as String?, - targetCommitish: json['target_commitish'] as String?, - name: json['name'] as String?, - body: json['body'] as String?, - description: json['description'] as String?, - isDraft: json['draft'] as bool?, - isPrerelease: json['prerelease'] as bool?, - createdAt: json['created_at'] == null - ? null - : DateTime.parse(json['created_at'] as String), - publishedAt: json['published_at'] == null - ? null - : DateTime.parse(json['published_at'] as String), - author: json['author'] == null - ? null - : User.fromJson(json['author'] as Map), - assets: (json['assets'] as List?) - ?.map((e) => ReleaseAsset.fromJson(e as Map)) - .toList(), - ) - ..zipballUrl = json['zipball_url'] as String? - ..assetsUrl = json['assets_url'] as String? - ..errors = json['errors'] as List?; -} +Release _$ReleaseFromJson(Map json) => Release( + id: json['id'] as int?, + url: json['url'] as String?, + htmlUrl: json['html_url'] as String?, + tarballUrl: json['tarball_url'] as String?, + uploadUrl: json['upload_url'] as String?, + nodeId: json['node_id'] as String?, + tagName: json['tag_name'] as String?, + targetCommitish: json['target_commitish'] as String?, + name: json['name'] as String?, + body: json['body'] as String?, + description: json['description'] as String?, + isDraft: json['draft'] as bool?, + isPrerelease: json['prerelease'] as bool?, + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + publishedAt: json['published_at'] == null + ? null + : DateTime.parse(json['published_at'] as String), + author: json['author'] == null + ? null + : User.fromJson(json['author'] as Map), + assets: (json['assets'] as List?) + ?.map((e) => ReleaseAsset.fromJson(e as Map)) + .toList(), + ) + ..zipballUrl = json['zipball_url'] as String? + ..assetsUrl = json['assets_url'] as String? + ..errors = json['errors'] as List?; Map _$ReleaseToJson(Release instance) => { 'url': instance.url, @@ -62,24 +60,22 @@ Map _$ReleaseToJson(Release instance) => { 'errors': instance.errors, }; -ReleaseAsset _$ReleaseAssetFromJson(Map json) { - return ReleaseAsset( - id: json['id'] as int?, - name: json['name'] as String?, - label: json['label'] as String?, - state: json['state'] as String?, - contentType: json['content_type'] as String?, - size: json['size'] as int?, - downloadCount: json['download_count'] as int?, - browserDownloadUrl: json['browser_download_url'] as String?, - createdAt: json['created_at'] == null - ? null - : DateTime.parse(json['created_at'] as String), - updatedAt: json['updated_at'] == null - ? null - : DateTime.parse(json['updated_at'] as String), - ); -} +ReleaseAsset _$ReleaseAssetFromJson(Map json) => ReleaseAsset( + id: json['id'] as int?, + name: json['name'] as String?, + label: json['label'] as String?, + state: json['state'] as String?, + contentType: json['content_type'] as String?, + size: json['size'] as int?, + downloadCount: json['download_count'] as int?, + browserDownloadUrl: json['browser_download_url'] as String?, + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + updatedAt: json['updated_at'] == null + ? null + : DateTime.parse(json['updated_at'] as String), + ); Map _$ReleaseAssetToJson(ReleaseAsset instance) => { @@ -95,16 +91,15 @@ Map _$ReleaseAssetToJson(ReleaseAsset instance) => 'updated_at': instance.updatedAt?.toIso8601String(), }; -CreateRelease _$CreateReleaseFromJson(Map json) { - return CreateRelease( - json['tag_name'] as String?, - ) - ..targetCommitish = json['target_commitish'] as String? - ..name = json['name'] as String? - ..body = json['body'] as String? - ..isDraft = json['draft'] as bool? - ..isPrerelease = json['prerelease'] as bool?; -} +CreateRelease _$CreateReleaseFromJson(Map json) => + CreateRelease( + json['tag_name'] as String?, + ) + ..targetCommitish = json['target_commitish'] as String? + ..name = json['name'] as String? + ..body = json['body'] as String? + ..isDraft = json['draft'] as bool? + ..isPrerelease = json['prerelease'] as bool?; Map _$CreateReleaseToJson(CreateRelease instance) => { diff --git a/lib/src/common/model/repos_stats.g.dart b/lib/src/common/model/repos_stats.g.dart index d832e1bc..12a609a5 100644 --- a/lib/src/common/model/repos_stats.g.dart +++ b/lib/src/common/model/repos_stats.g.dart @@ -7,18 +7,17 @@ part of 'repos_stats.dart'; // ************************************************************************** ContributorStatistics _$ContributorStatisticsFromJson( - Map json) { - return ContributorStatistics( - json['author'] == null - ? null - : User.fromJson(json['author'] as Map), - json['total'] as int?, - (json['weeks'] as List?) - ?.map((e) => - ContributorWeekStatistics.fromJson(e as Map)) - .toList(), - ); -} + Map json) => + ContributorStatistics( + json['author'] == null + ? null + : User.fromJson(json['author'] as Map), + json['total'] as int?, + (json['weeks'] as List?) + ?.map((e) => + ContributorWeekStatistics.fromJson(e as Map)) + .toList(), + ); Map _$ContributorStatisticsToJson( ContributorStatistics instance) => @@ -29,14 +28,13 @@ Map _$ContributorStatisticsToJson( }; ContributorWeekStatistics _$ContributorWeekStatisticsFromJson( - Map json) { - return ContributorWeekStatistics( - json['w'] as int?, - json['a'] as int?, - json['d'] as int?, - json['c'] as int?, - ); -} + Map json) => + ContributorWeekStatistics( + json['w'] as int?, + json['a'] as int?, + json['d'] as int?, + json['c'] as int?, + ); Map _$ContributorWeekStatisticsToJson( ContributorWeekStatistics instance) => @@ -48,12 +46,11 @@ Map _$ContributorWeekStatisticsToJson( }; ContributorParticipation _$ContributorParticipationFromJson( - Map json) { - return ContributorParticipation( - all: (json['all'] as List?)?.map((e) => e as int).toList(), - owner: (json['owner'] as List?)?.map((e) => e as int).toList(), - ); -} + Map json) => + ContributorParticipation( + all: (json['all'] as List?)?.map((e) => e as int).toList(), + owner: (json['owner'] as List?)?.map((e) => e as int).toList(), + ); Map _$ContributorParticipationToJson( ContributorParticipation instance) => @@ -62,13 +59,12 @@ Map _$ContributorParticipationToJson( 'owner': instance.owner, }; -YearCommitCountWeek _$YearCommitCountWeekFromJson(Map json) { - return YearCommitCountWeek( - days: (json['days'] as List?)?.map((e) => e as int).toList(), - total: json['total'] as int?, - timestamp: json['timestamp'] as int?, - ); -} +YearCommitCountWeek _$YearCommitCountWeekFromJson(Map json) => + YearCommitCountWeek( + days: (json['days'] as List?)?.map((e) => e as int).toList(), + total: json['total'] as int?, + timestamp: json['timestamp'] as int?, + ); Map _$YearCommitCountWeekToJson( YearCommitCountWeek instance) => @@ -78,13 +74,12 @@ Map _$YearCommitCountWeekToJson( 'timestamp': instance.timestamp, }; -WeeklyChangesCount _$WeeklyChangesCountFromJson(Map json) { - return WeeklyChangesCount( - timestamp: json['timestamp'] as int?, - additions: json['additions'] as int?, - deletions: json['deletions'] as int?, - ); -} +WeeklyChangesCount _$WeeklyChangesCountFromJson(Map json) => + WeeklyChangesCount( + timestamp: json['timestamp'] as int?, + additions: json['additions'] as int?, + deletions: json['deletions'] as int?, + ); Map _$WeeklyChangesCountToJson(WeeklyChangesCount instance) => { @@ -93,13 +88,12 @@ Map _$WeeklyChangesCountToJson(WeeklyChangesCount instance) => 'deletions': instance.deletions, }; -PunchcardEntry _$PunchcardEntryFromJson(Map json) { - return PunchcardEntry( - weekday: json['weekday'] as int?, - hour: json['hour'] as int?, - commits: json['commits'] as int?, - ); -} +PunchcardEntry _$PunchcardEntryFromJson(Map json) => + PunchcardEntry( + weekday: json['weekday'] as int?, + hour: json['hour'] as int?, + commits: json['commits'] as int?, + ); Map _$PunchcardEntryToJson(PunchcardEntry instance) => { diff --git a/lib/src/common/model/repos_statuses.g.dart b/lib/src/common/model/repos_statuses.g.dart index 2938d369..6cb7c947 100644 --- a/lib/src/common/model/repos_statuses.g.dart +++ b/lib/src/common/model/repos_statuses.g.dart @@ -7,19 +7,18 @@ part of 'repos_statuses.dart'; // ************************************************************************** CombinedRepositoryStatus _$CombinedRepositoryStatusFromJson( - Map json) { - return CombinedRepositoryStatus( - state: json['state'] as String?, - sha: json['sha'] as String?, - totalCount: json['total_count'] as int?, - statuses: (json['statuses'] as List?) - ?.map((e) => RepositoryStatus.fromJson(e as Map)) - .toList(), - repository: json['repository'] == null - ? null - : Repository.fromJson(json['repository'] as Map), - ); -} + Map json) => + CombinedRepositoryStatus( + state: json['state'] as String?, + sha: json['sha'] as String?, + totalCount: json['total_count'] as int?, + statuses: (json['statuses'] as List?) + ?.map((e) => RepositoryStatus.fromJson(e as Map)) + .toList(), + repository: json['repository'] == null + ? null + : Repository.fromJson(json['repository'] as Map), + ); Map _$CombinedRepositoryStatusToJson( CombinedRepositoryStatus instance) => @@ -31,20 +30,19 @@ Map _$CombinedRepositoryStatusToJson( 'repository': instance.repository, }; -RepositoryStatus _$RepositoryStatusFromJson(Map json) { - return RepositoryStatus( - createdAt: json['created_at'] == null - ? null - : DateTime.parse(json['created_at'] as String), - updatedAt: json['updated_at'] == null - ? null - : DateTime.parse(json['updated_at'] as String), - state: json['state'] as String?, - targetUrl: json['target_url'] as String?, - description: json['description'] as String?, - context: json['context'] as String?, - ); -} +RepositoryStatus _$RepositoryStatusFromJson(Map json) => + RepositoryStatus( + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + updatedAt: json['updated_at'] == null + ? null + : DateTime.parse(json['updated_at'] as String), + state: json['state'] as String?, + targetUrl: json['target_url'] as String?, + description: json['description'] as String?, + context: json['context'] as String?, + ); Map _$RepositoryStatusToJson(RepositoryStatus instance) => { @@ -56,14 +54,12 @@ Map _$RepositoryStatusToJson(RepositoryStatus instance) => 'context': instance.context, }; -CreateStatus _$CreateStatusFromJson(Map json) { - return CreateStatus( - json['state'] as String?, - targetUrl: json['target_url'] as String?, - description: json['description'] as String?, - context: json['context'] as String?, - ); -} +CreateStatus _$CreateStatusFromJson(Map json) => CreateStatus( + json['state'] as String?, + targetUrl: json['target_url'] as String?, + description: json['description'] as String?, + context: json['context'] as String?, + ); Map _$CreateStatusToJson(CreateStatus instance) => { diff --git a/lib/src/common/model/search.g.dart b/lib/src/common/model/search.g.dart index be89b80c..e50161a6 100644 --- a/lib/src/common/model/search.g.dart +++ b/lib/src/common/model/search.g.dart @@ -6,22 +6,20 @@ part of 'search.dart'; // JsonSerializableGenerator // ************************************************************************** -CodeSearchResults _$CodeSearchResultsFromJson(Map json) { - return CodeSearchResults() - ..totalCount = json['total_count'] as int? - ..incompleteResults = json['incomplete_results'] as bool? - ..items = CodeSearchItem.fromJsonList(json['items'] as List); -} +CodeSearchResults _$CodeSearchResultsFromJson(Map json) => + CodeSearchResults() + ..totalCount = json['total_count'] as int? + ..incompleteResults = json['incomplete_results'] as bool? + ..items = CodeSearchItem.fromJsonList(json['items'] as List); -CodeSearchItem _$CodeSearchItemFromJson(Map json) { - return CodeSearchItem() - ..name = json['name'] as String? - ..path = json['path'] as String? - ..sha = json['sha'] as String? - ..url = Uri.parse(json['url'] as String) - ..gitUrl = Uri.parse(json['git_url'] as String) - ..htmlUrl = Uri.parse(json['html_url'] as String) - ..repository = json['repository'] == null - ? null - : Repository.fromJson(json['repository'] as Map); -} +CodeSearchItem _$CodeSearchItemFromJson(Map json) => + CodeSearchItem() + ..name = json['name'] as String? + ..path = json['path'] as String? + ..sha = json['sha'] as String? + ..url = Uri.parse(json['url'] as String) + ..gitUrl = Uri.parse(json['git_url'] as String) + ..htmlUrl = Uri.parse(json['html_url'] as String) + ..repository = json['repository'] == null + ? null + : Repository.fromJson(json['repository'] as Map); diff --git a/lib/src/common/model/users.g.dart b/lib/src/common/model/users.g.dart index e9a20aaa..fde0c3cf 100644 --- a/lib/src/common/model/users.g.dart +++ b/lib/src/common/model/users.g.dart @@ -6,32 +6,30 @@ part of 'users.dart'; // JsonSerializableGenerator // ************************************************************************** -User _$UserFromJson(Map json) { - return User( - id: json['id'] as int?, - login: json['login'] as String?, - avatarUrl: json['avatar_url'] as String?, - htmlUrl: json['html_url'] as String?, - siteAdmin: json['site_admin'] as bool?, - name: json['name'] as String?, - company: json['company'] as String?, - blog: json['blog'] as String?, - location: json['location'] as String?, - email: json['email'] as String?, - hirable: json['hirable'] as bool?, - bio: json['bio'] as String?, - publicReposCount: json['public_repos'] as int?, - publicGistsCount: json['public_gists'] as int?, - followersCount: json['followers'] as int?, - followingCount: json['following'] as int?, - createdAt: json['created_at'] == null - ? null - : DateTime.parse(json['created_at'] as String), - updatedAt: json['updated_at'] == null - ? null - : DateTime.parse(json['updated_at'] as String), - )..twitterUsername = json['twitter_username'] as String?; -} +User _$UserFromJson(Map json) => User( + id: json['id'] as int?, + login: json['login'] as String?, + avatarUrl: json['avatar_url'] as String?, + htmlUrl: json['html_url'] as String?, + siteAdmin: json['site_admin'] as bool?, + name: json['name'] as String?, + company: json['company'] as String?, + blog: json['blog'] as String?, + location: json['location'] as String?, + email: json['email'] as String?, + hirable: json['hirable'] as bool?, + bio: json['bio'] as String?, + publicReposCount: json['public_repos'] as int?, + publicGistsCount: json['public_gists'] as int?, + followersCount: json['followers'] as int?, + followingCount: json['following'] as int?, + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + updatedAt: json['updated_at'] == null + ? null + : DateTime.parse(json['updated_at'] as String), + )..twitterUsername = json['twitter_username'] as String?; Map _$UserToJson(User instance) => { 'login': instance.login, @@ -55,30 +53,26 @@ Map _$UserToJson(User instance) => { 'twitter_username': instance.twitterUsername, }; -Collaborator _$CollaboratorFromJson(Map json) { - return Collaborator( - json['login'] as String?, - json['id'] as int?, - json['html_url'] as String?, - json['type'] as String?, - json['site_admin'] as bool?, - (json['permissions'] as Map?)?.map( - (k, e) => MapEntry(k, e as bool), - ), - ); -} +Collaborator _$CollaboratorFromJson(Map json) => Collaborator( + json['login'] as String?, + json['id'] as int?, + json['html_url'] as String?, + json['type'] as String?, + json['site_admin'] as bool?, + (json['permissions'] as Map?)?.map( + (k, e) => MapEntry(k, e as bool), + ), + ); -Contributor _$ContributorFromJson(Map json) { - return Contributor( - id: json['id'] as int?, - login: json['login'] as String?, - avatarUrl: json['avatar_url'] as String?, - htmlUrl: json['html_url'] as String?, - type: json['type'] as String?, - siteAdmin: json['site_admin'] as bool?, - contributions: json['contributions'] as int?, - ); -} +Contributor _$ContributorFromJson(Map json) => Contributor( + id: json['id'] as int?, + login: json['login'] as String?, + avatarUrl: json['avatar_url'] as String?, + htmlUrl: json['html_url'] as String?, + type: json['type'] as String?, + siteAdmin: json['site_admin'] as bool?, + contributions: json['contributions'] as int?, + ); Map _$ContributorToJson(Contributor instance) => { @@ -91,38 +85,36 @@ Map _$ContributorToJson(Contributor instance) => 'contributions': instance.contributions, }; -CurrentUser _$CurrentUserFromJson(Map json) { - return CurrentUser() - ..login = json['login'] as String? - ..id = json['id'] as int? - ..avatarUrl = json['avatar_url'] as String? - ..htmlUrl = json['html_url'] as String? - ..siteAdmin = json['site_admin'] as bool? - ..name = json['name'] as String? - ..company = json['company'] as String? - ..blog = json['blog'] as String? - ..location = json['location'] as String? - ..email = json['email'] as String? - ..hirable = json['hirable'] as bool? - ..bio = json['bio'] as String? - ..publicReposCount = json['public_repos'] as int? - ..publicGistsCount = json['public_gists'] as int? - ..followersCount = json['followers'] as int? - ..followingCount = json['following'] as int? - ..createdAt = json['created_at'] == null - ? null - : DateTime.parse(json['created_at'] as String) - ..updatedAt = json['updated_at'] == null - ? null - : DateTime.parse(json['updated_at'] as String) - ..twitterUsername = json['twitter_username'] as String? - ..privateReposCount = json['total_private_repos'] as int? - ..ownedPrivateReposCount = json['owned_private_repos'] as int? - ..diskUsage = json['disk_usage'] as int? - ..plan = json['plan'] == null - ? null - : UserPlan.fromJson(json['plan'] as Map); -} +CurrentUser _$CurrentUserFromJson(Map json) => CurrentUser() + ..login = json['login'] as String? + ..id = json['id'] as int? + ..avatarUrl = json['avatar_url'] as String? + ..htmlUrl = json['html_url'] as String? + ..siteAdmin = json['site_admin'] as bool? + ..name = json['name'] as String? + ..company = json['company'] as String? + ..blog = json['blog'] as String? + ..location = json['location'] as String? + ..email = json['email'] as String? + ..hirable = json['hirable'] as bool? + ..bio = json['bio'] as String? + ..publicReposCount = json['public_repos'] as int? + ..publicGistsCount = json['public_gists'] as int? + ..followersCount = json['followers'] as int? + ..followingCount = json['following'] as int? + ..createdAt = json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String) + ..updatedAt = json['updated_at'] == null + ? null + : DateTime.parse(json['updated_at'] as String) + ..twitterUsername = json['twitter_username'] as String? + ..privateReposCount = json['total_private_repos'] as int? + ..ownedPrivateReposCount = json['owned_private_repos'] as int? + ..diskUsage = json['disk_usage'] as int? + ..plan = json['plan'] == null + ? null + : UserPlan.fromJson(json['plan'] as Map); Map _$CurrentUserToJson(CurrentUser instance) => { @@ -151,13 +143,11 @@ Map _$CurrentUserToJson(CurrentUser instance) => 'plan': instance.plan, }; -UserPlan _$UserPlanFromJson(Map json) { - return UserPlan() - ..name = json['name'] as String? - ..space = json['space'] as int? - ..privateReposCount = json['private_repos'] as int? - ..collaboratorsCount = json['collaborators'] as int?; -} +UserPlan _$UserPlanFromJson(Map json) => UserPlan() + ..name = json['name'] as String? + ..space = json['space'] as int? + ..privateReposCount = json['private_repos'] as int? + ..collaboratorsCount = json['collaborators'] as int?; Map _$UserPlanToJson(UserPlan instance) => { 'name': instance.name, @@ -166,13 +156,11 @@ Map _$UserPlanToJson(UserPlan instance) => { 'collaborators': instance.collaboratorsCount, }; -UserEmail _$UserEmailFromJson(Map json) { - return UserEmail( - email: json['email'] as String?, - verified: json['verified'] as bool?, - primary: json['primary'] as bool?, - ); -} +UserEmail _$UserEmailFromJson(Map json) => UserEmail( + email: json['email'] as String?, + verified: json['verified'] as bool?, + primary: json['primary'] as bool?, + ); Map _$UserEmailToJson(UserEmail instance) => { 'email': instance.email, diff --git a/lib/src/server/hooks.g.dart b/lib/src/server/hooks.g.dart index 361da9eb..108b0e7a 100644 --- a/lib/src/server/hooks.g.dart +++ b/lib/src/server/hooks.g.dart @@ -6,20 +6,19 @@ part of 'hooks.dart'; // JsonSerializableGenerator // ************************************************************************** -CheckRunEvent _$CheckRunEventFromJson(Map json) { - return CheckRunEvent( - action: json['action'] as String?, - checkRun: json['check_run'] == null - ? null - : CheckRun.fromJson(json['check_run'] as Map), - sender: json['sender'] == null - ? null - : User.fromJson(json['sender'] as Map), - repository: json['repository'] == null - ? null - : Repository.fromJson(json['repository'] as Map), - ); -} +CheckRunEvent _$CheckRunEventFromJson(Map json) => + CheckRunEvent( + action: json['action'] as String?, + checkRun: json['check_run'] == null + ? null + : CheckRun.fromJson(json['check_run'] as Map), + sender: json['sender'] == null + ? null + : User.fromJson(json['sender'] as Map), + repository: json['repository'] == null + ? null + : Repository.fromJson(json['repository'] as Map), + ); Map _$CheckRunEventToJson(CheckRunEvent instance) => { @@ -29,20 +28,19 @@ Map _$CheckRunEventToJson(CheckRunEvent instance) => 'repository': instance.repository, }; -CheckSuiteEvent _$CheckSuiteEventFromJson(Map json) { - return CheckSuiteEvent( - action: json['action'] as String?, - checkSuite: json['check_suite'] == null - ? null - : CheckSuite.fromJson(json['check_suite'] as Map), - repository: json['repository'] == null - ? null - : Repository.fromJson(json['repository'] as Map), - sender: json['sender'] == null - ? null - : User.fromJson(json['sender'] as Map), - ); -} +CheckSuiteEvent _$CheckSuiteEventFromJson(Map json) => + CheckSuiteEvent( + action: json['action'] as String?, + checkSuite: json['check_suite'] == null + ? null + : CheckSuite.fromJson(json['check_suite'] as Map), + repository: json['repository'] == null + ? null + : Repository.fromJson(json['repository'] as Map), + sender: json['sender'] == null + ? null + : User.fromJson(json['sender'] as Map), + ); Map _$CheckSuiteEventToJson(CheckSuiteEvent instance) => { @@ -52,17 +50,16 @@ Map _$CheckSuiteEventToJson(CheckSuiteEvent instance) => 'sender': instance.sender, }; -RepositoryEvent _$RepositoryEventFromJson(Map json) { - return RepositoryEvent( - action: json['action'] as String?, - repository: json['repository'] == null - ? null - : Repository.fromJson(json['repository'] as Map), - sender: json['sender'] == null - ? null - : User.fromJson(json['sender'] as Map), - ); -} +RepositoryEvent _$RepositoryEventFromJson(Map json) => + RepositoryEvent( + action: json['action'] as String?, + repository: json['repository'] == null + ? null + : Repository.fromJson(json['repository'] as Map), + sender: json['sender'] == null + ? null + : User.fromJson(json['sender'] as Map), + ); Map _$RepositoryEventToJson(RepositoryEvent instance) => { @@ -71,17 +68,16 @@ Map _$RepositoryEventToJson(RepositoryEvent instance) => 'sender': instance.sender, }; -IssueCommentEvent _$IssueCommentEventFromJson(Map json) { - return IssueCommentEvent( - action: json['action'] as String?, - issue: json['issue'] == null - ? null - : Issue.fromJson(json['issue'] as Map), - comment: json['comment'] == null - ? null - : IssueComment.fromJson(json['comment'] as Map), - ); -} +IssueCommentEvent _$IssueCommentEventFromJson(Map json) => + IssueCommentEvent( + action: json['action'] as String?, + issue: json['issue'] == null + ? null + : Issue.fromJson(json['issue'] as Map), + comment: json['comment'] == null + ? null + : IssueComment.fromJson(json['comment'] as Map), + ); Map _$IssueCommentEventToJson(IssueCommentEvent instance) => { @@ -90,42 +86,38 @@ Map _$IssueCommentEventToJson(IssueCommentEvent instance) => 'comment': instance.comment, }; -ForkEvent _$ForkEventFromJson(Map json) { - return ForkEvent( - forkee: json['forkee'] == null - ? null - : Repository.fromJson(json['forkee'] as Map), - sender: json['sender'] == null - ? null - : User.fromJson(json['sender'] as Map), - ); -} +ForkEvent _$ForkEventFromJson(Map json) => ForkEvent( + forkee: json['forkee'] == null + ? null + : Repository.fromJson(json['forkee'] as Map), + sender: json['sender'] == null + ? null + : User.fromJson(json['sender'] as Map), + ); Map _$ForkEventToJson(ForkEvent instance) => { 'forkee': instance.forkee, 'sender': instance.sender, }; -IssueEvent _$IssueEventFromJson(Map json) { - return IssueEvent( - action: json['action'] as String?, - assignee: json['assignee'] == null - ? null - : User.fromJson(json['assignee'] as Map), - label: json['label'] == null - ? null - : IssueLabel.fromJson(json['label'] as Map), - issue: json['issue'] == null - ? null - : Issue.fromJson(json['issue'] as Map), - sender: json['sender'] == null - ? null - : User.fromJson(json['sender'] as Map), - repository: json['repository'] == null - ? null - : Repository.fromJson(json['repository'] as Map), - ); -} +IssueEvent _$IssueEventFromJson(Map json) => IssueEvent( + action: json['action'] as String?, + assignee: json['assignee'] == null + ? null + : User.fromJson(json['assignee'] as Map), + label: json['label'] == null + ? null + : IssueLabel.fromJson(json['label'] as Map), + issue: json['issue'] == null + ? null + : Issue.fromJson(json['issue'] as Map), + sender: json['sender'] == null + ? null + : User.fromJson(json['sender'] as Map), + repository: json['repository'] == null + ? null + : Repository.fromJson(json['repository'] as Map), + ); Map _$IssueEventToJson(IssueEvent instance) => { @@ -137,21 +129,20 @@ Map _$IssueEventToJson(IssueEvent instance) => 'repository': instance.repository, }; -PullRequestEvent _$PullRequestEventFromJson(Map json) { - return PullRequestEvent( - action: json['action'] as String?, - number: json['number'] as int?, - pullRequest: json['pull_request'] == null - ? null - : PullRequest.fromJson(json['pull_request'] as Map), - sender: json['sender'] == null - ? null - : User.fromJson(json['sender'] as Map), - repository: json['repository'] == null - ? null - : Repository.fromJson(json['repository'] as Map), - ); -} +PullRequestEvent _$PullRequestEventFromJson(Map json) => + PullRequestEvent( + action: json['action'] as String?, + number: json['number'] as int?, + pullRequest: json['pull_request'] == null + ? null + : PullRequest.fromJson(json['pull_request'] as Map), + sender: json['sender'] == null + ? null + : User.fromJson(json['sender'] as Map), + repository: json['repository'] == null + ? null + : Repository.fromJson(json['repository'] as Map), + ); Map _$PullRequestEventToJson(PullRequestEvent instance) => { diff --git a/pubspec.yaml b/pubspec.yaml index 228ae7e1..45e44cd8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,25 +1,24 @@ name: github -version: 8.2.1 +version: 8.2.2-dev description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart environment: - sdk: '>=2.12.0 <3.0.0' + sdk: '>=2.14.0 <3.0.0' dependencies: collection: ^1.15.0 http: ^0.13.0 http_parser: ^4.0.0 - json_annotation: ^4.0.0 + json_annotation: ^4.3.0 meta: ^1.3.0 dev_dependencies: build_runner: any build_test: any build_web_compilers: any - json_serializable: ^4.0.0 + json_serializable: ^6.0.0 mockito: ^5.0.0 pedantic: ^1.10.0 test: ^1.16.0 yaml: ^3.0.0 - \ No newline at end of file From 9c060eae5e11fecfc0428b4af8ead9dc009b6086 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Mon, 18 Oct 2021 15:21:09 -0700 Subject: [PATCH 242/390] Update lib/src/common/model/issues.dart Co-authored-by: Rob Becker --- lib/src/common/model/issues.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/common/model/issues.dart b/lib/src/common/model/issues.dart index 914c1acb..4138e9d4 100644 --- a/lib/src/common/model/issues.dart +++ b/lib/src/common/model/issues.dart @@ -5,7 +5,7 @@ import 'package:json_annotation/json_annotation.dart'; part 'issues.g.dart'; /// Model class for an issue on the tracker. -@JsonSerializable(fieldRename: FieldRename.snake) +@JsonSerializable() class Issue { Issue({ this.id = 0, From aff1acec2ff4956bfa447165b93383819cad4cd1 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Mon, 18 Oct 2021 18:49:06 -0600 Subject: [PATCH 243/390] Prep 8.2.2 --- CHANGELOG.md | 5 ++++- pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c2e9df56..afa44789 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,7 @@ -## 8.2.2-dev +## 8.2.2 +- Up minimum json_serializable to ^6.0.0, json_annotation to ^4.3.0 +- Cleanup and regenerate generated files +- Require Dart SDK 2.14 ## 8.2.1 - Add `CheckSuiteEvent` and `CheckRunEvent` diff --git a/pubspec.yaml b/pubspec.yaml index 45e44cd8..ab59f896 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 8.2.2-dev +version: 8.2.2 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From c3aef952826115b8e07fd3929df1d7813952c0c1 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Wed, 20 Oct 2021 21:47:52 -0600 Subject: [PATCH 244/390] Add auto-release notes --- lib/src/common/model/repos_releases.dart | 58 ++++++++++++++++++---- lib/src/common/model/repos_releases.g.dart | 37 +++++++++++++- lib/src/common/repos_service.dart | 16 ++++++ lib/src/server/hooks.dart | 3 +- test/server/hooks_test.dart | 7 +-- 5 files changed, 106 insertions(+), 15 deletions(-) diff --git a/lib/src/common/model/repos_releases.dart b/lib/src/common/model/repos_releases.dart index 3259ff1e..4656dd1c 100644 --- a/lib/src/common/model/repos_releases.dart +++ b/lib/src/common/model/repos_releases.dart @@ -173,16 +173,21 @@ class CreateRelease { @JsonKey(name: 'prerelease') bool? isPrerelease; + String? discussionCategoryName; + + bool generateReleaseNotes = false; + CreateRelease(this.tagName); - CreateRelease.from({ - required this.tagName, - required this.name, - required this.targetCommitish, - required this.isDraft, - required this.isPrerelease, - this.body, - }); + CreateRelease.from( + {required this.tagName, + required this.name, + required this.targetCommitish, + required this.isDraft, + required this.isPrerelease, + this.body, + this.discussionCategoryName, + this.generateReleaseNotes = false}); @override bool operator ==(Object other) => @@ -194,7 +199,9 @@ class CreateRelease { name == other.name && body == other.body && isDraft == other.isDraft && - isPrerelease == other.isPrerelease; + isPrerelease == other.isPrerelease && + generateReleaseNotes == other.generateReleaseNotes && + discussionCategoryName == other.discussionCategoryName; @override int get hashCode => @@ -203,7 +210,9 @@ class CreateRelease { name.hashCode ^ body.hashCode ^ isDraft.hashCode ^ - isPrerelease.hashCode; + isPrerelease.hashCode ^ + discussionCategoryName.hashCode ^ + generateReleaseNotes.hashCode; factory CreateRelease.fromJson(Map input) => _$CreateReleaseFromJson(input); @@ -236,3 +245,32 @@ class CreateReleaseAsset { /// GitHub expects the asset data in its raw binary form, rather than JSON. Uint8List assetData; } + +/// Holds release notes information +@JsonSerializable() +class ReleaseNotes { + ReleaseNotes(this.name, this.body); + String name; + String body; + + factory ReleaseNotes.fromJson(Map input) => + _$ReleaseNotesFromJson(input); + Map toJson() => _$ReleaseNotesToJson(this); +} + +@JsonSerializable() +class CreateReleaseNotes { + CreateReleaseNotes(this.owner, this.repo, this.tagName, + {this.targetCommitish, this.previousTagName, this.configurationFilePath}); + + String owner; + String repo; + String tagName; + String? targetCommitish; + String? previousTagName; + String? configurationFilePath; + + factory CreateReleaseNotes.fromJson(Map input) => + _$CreateReleaseNotesFromJson(input); + Map toJson() => _$CreateReleaseNotesToJson(this); +} diff --git a/lib/src/common/model/repos_releases.g.dart b/lib/src/common/model/repos_releases.g.dart index faf4db03..bcaec1ee 100644 --- a/lib/src/common/model/repos_releases.g.dart +++ b/lib/src/common/model/repos_releases.g.dart @@ -99,7 +99,9 @@ CreateRelease _$CreateReleaseFromJson(Map json) => ..name = json['name'] as String? ..body = json['body'] as String? ..isDraft = json['draft'] as bool? - ..isPrerelease = json['prerelease'] as bool?; + ..isPrerelease = json['prerelease'] as bool? + ..discussionCategoryName = json['discussion_category_name'] as String? + ..generateReleaseNotes = json['generate_release_notes'] as bool; Map _$CreateReleaseToJson(CreateRelease instance) => { @@ -109,4 +111,37 @@ Map _$CreateReleaseToJson(CreateRelease instance) => 'body': instance.body, 'draft': instance.isDraft, 'prerelease': instance.isPrerelease, + 'discussion_category_name': instance.discussionCategoryName, + 'generate_release_notes': instance.generateReleaseNotes, + }; + +ReleaseNotes _$ReleaseNotesFromJson(Map json) => ReleaseNotes( + json['name'] as String, + json['body'] as String, + ); + +Map _$ReleaseNotesToJson(ReleaseNotes instance) => + { + 'name': instance.name, + 'body': instance.body, + }; + +CreateReleaseNotes _$CreateReleaseNotesFromJson(Map json) => + CreateReleaseNotes( + json['owner'] as String, + json['repo'] as String, + json['tag_name'] as String, + targetCommitish: json['target_commitish'] as String?, + previousTagName: json['previous_tag_name'] as String?, + configurationFilePath: json['configuration_file_path'] as String?, + ); + +Map _$CreateReleaseNotesToJson(CreateReleaseNotes instance) => + { + 'owner': instance.owner, + 'repo': instance.repo, + 'tag_name': instance.tagName, + 'target_commitish': instance.targetCommitish, + 'previous_tag_name': instance.previousTagName, + 'configuration_file_path': instance.configurationFilePath, }; diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 9e9c0717..16e573f8 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -1276,4 +1276,20 @@ class RepositoriesService extends Service { statusCode: StatusCodes.OK, ); } + + /// Generate a name and body describing a release. The body content will be + /// markdown formatted and contain information like the changes since last + /// release and users who contributed. The generated release notes are not + /// saved anywhere. They are intended to be generated and used when + /// creating a new release. + /// + /// API docs: https://docs.github.com/en/rest/reference/repos#generate-release-notes-content-for-a-release + Future generateReleaseNotes(CreateReleaseNotes crn) async { + return github.postJSON, ReleaseNotes>( + '/repos/${crn.owner}/${crn.repo}/releases/generate-notes', + body: GitHubJson.encode(crn), + statusCode: StatusCodes.OK, + convert: (i) => ReleaseNotes.fromJson(i), + ); + } } diff --git a/lib/src/server/hooks.dart b/lib/src/server/hooks.dart index 4d69d8f5..8c8ac396 100644 --- a/lib/src/server/hooks.dart +++ b/lib/src/server/hooks.dart @@ -98,7 +98,8 @@ class CheckRunEvent extends HookEvent { this.repository, }); - factory CheckRunEvent.fromJson(Map input) => _$CheckRunEventFromJson(input); + factory CheckRunEvent.fromJson(Map input) => + _$CheckRunEventFromJson(input); CheckRun? checkRun; String? action; User? sender; diff --git a/test/server/hooks_test.dart b/test/server/hooks_test.dart index d1b9f5ee..b9d87e65 100644 --- a/test/server/hooks_test.dart +++ b/test/server/hooks_test.dart @@ -8,8 +8,8 @@ import 'hooks_test_data.dart'; void main() { group('CheckSuiteEvent', () { test('deserialize', () async { - final checkSuiteEvent = - CheckSuiteEvent.fromJson(json.decode(checkSuiteString) as Map); + final checkSuiteEvent = CheckSuiteEvent.fromJson( + json.decode(checkSuiteString) as Map); // Top level properties. expect(checkSuiteEvent.action, 'requested'); expect(checkSuiteEvent.checkSuite, isA()); @@ -22,7 +22,8 @@ void main() { }); group('CheckRunEvent', () { test('deserialize', () async { - final checkRunEvent = CheckRunEvent.fromJson(json.decode(checkRunString) as Map); + final checkRunEvent = CheckRunEvent.fromJson( + json.decode(checkRunString) as Map); // Top level properties. expect(checkRunEvent.action, 'created'); expect(checkRunEvent.checkRun, isA()); From 2eecc00d1c07cc9fcdd68eea8c55430bd8b94e1b Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Wed, 20 Oct 2021 21:53:09 -0600 Subject: [PATCH 245/390] prep 8.2.3 --- CHANGELOG.md | 4 ++++ pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index afa44789..8ce2f14f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 8.2.3 +- Added `generateReleaseNotes` boolean to CreateRelase class to have github auto-create release notes +- Added `generateReleaseNotes` method to RepositoriesService to have github create release notes + between to tags (without creating a release) and return the name and body. This is helpful when you want to add the release notes to a CHANGELOG.md before making the actual release ## 8.2.2 - Up minimum json_serializable to ^6.0.0, json_annotation to ^4.3.0 - Cleanup and regenerate generated files diff --git a/pubspec.yaml b/pubspec.yaml index ab59f896..cad01e51 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 8.2.2 +version: 8.2.3 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From 0db8e04e684b84396b2ed33bbf0c0f471ef0b0af Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Tue, 26 Oct 2021 15:21:06 -0600 Subject: [PATCH 246/390] fix lint --- example/common.dart | 2 +- example/languages.dart | 2 +- lib/github.dart | 3 +-- test/data_object_test.dart | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/example/common.dart b/example/common.dart index fc1be97a..1564a6c3 100644 --- a/example/common.dart +++ b/example/common.dart @@ -3,8 +3,8 @@ import 'dart:html'; import 'package:github/github.dart'; -export 'package:github/github.dart'; export 'package:github/browser_helper.dart'; +export 'package:github/github.dart'; /// Wires up a listener to a button with an id of view-source, /// if it exists, to show the script source diff --git a/example/languages.dart b/example/languages.dart index 56276f62..79961cf0 100644 --- a/example/languages.dart +++ b/example/languages.dart @@ -18,7 +18,7 @@ Future loadRepository() async { var user = params['user'] ?? 'dart-lang'; var reponame = params['repo'] ?? 'sdk'; - document.getElementById('name')!.setInnerHtml('$user/$reponame'); + document.getElementById('name')!.text = '$user/$reponame'; final repo = RepositorySlug(user, reponame); breakdown = await github.repositories.listLanguages(repo); diff --git a/lib/github.dart b/lib/github.dart index 03396535..4135651a 100644 --- a/lib/github.dart +++ b/lib/github.dart @@ -1,7 +1,6 @@ +export 'package:github/src/common.dart'; /// Do a conditional export of the right cross platform pieces depending on /// if dart.html or dart.io is available. export 'package:github/src/common/xplat_common.dart' if (dart.library.html) 'package:github/src/browser/xplat_browser.dart' if (dart.library.io) 'package:github/src/server/xplat_server.dart'; - -export 'package:github/src/common.dart'; diff --git a/test/data_object_test.dart b/test/data_object_test.dart index 2f2012a7..f1d1d5db 100644 --- a/test/data_object_test.dart +++ b/test/data_object_test.dart @@ -1,7 +1,7 @@ import 'dart:convert'; -import 'package:test/test.dart'; import 'package:github/github.dart'; +import 'package:test/test.dart'; const _licenseJson = r''' { "name": "LICENSE", From c72b46031fcd326820cbc5bb0c3b4b1c15e075e4 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Tue, 26 Oct 2021 15:27:40 -0600 Subject: [PATCH 247/390] update examples --- example/index.html | 1 + example/pr.dart | 18 ++++++++++++++++ example/pr.html | 23 +++++++++++++++++++++ test/experiment/generate_release_notes.dart | 11 ++++++++++ 4 files changed, 53 insertions(+) create mode 100644 example/pr.dart create mode 100644 example/pr.html create mode 100755 test/experiment/generate_release_notes.dart diff --git a/example/index.html b/example/index.html index a2ee2782..81e054e8 100644 --- a/example/index.html +++ b/example/index.html @@ -34,6 +34,7 @@

GitHub for Dart - Demos

User Information Language Breakdown Releases + Pull Request Stars Code Search Emoji diff --git a/example/pr.dart b/example/pr.dart new file mode 100644 index 00000000..2805646a --- /dev/null +++ b/example/pr.dart @@ -0,0 +1,18 @@ +import 'dart:async'; +import 'dart:html'; + +import 'package:github/github.dart'; + +import 'common.dart'; + +Future main() async { + await initViewSourceButton('pr.dart'); + var pr = await github.pullRequests + .get(RepositorySlug('flutter', 'flutter'), 90295); + renderPr(pr); +} + +void renderPr(PullRequest pr) { + var prDiv = querySelector('#pr')!; + prDiv.innerText = pr.toJson().toString(); +} diff --git a/example/pr.html b/example/pr.html new file mode 100644 index 00000000..d9973493 --- /dev/null +++ b/example/pr.html @@ -0,0 +1,23 @@ + + + + + GitHub for Dart - Pull Request + + + +
+

GitHub for Dart - Pull Request

+ + +

+
+ + Pull Request JSON: +

+
+  
+
+
+
+
\ No newline at end of file
diff --git a/test/experiment/generate_release_notes.dart b/test/experiment/generate_release_notes.dart
new file mode 100755
index 00000000..44b77190
--- /dev/null
+++ b/test/experiment/generate_release_notes.dart
@@ -0,0 +1,11 @@
+import 'package:github/github.dart';
+
+Future main() async {
+  final github = GitHub(auth: findAuthenticationFromEnvironment());
+
+  var notes = await github.repositories.generateReleaseNotes(
+      CreateReleaseNotes('Spinlocklabs', 'github.dart', '1.0.1',
+      targetCommitish: '1.0.1', previousTagName: '1.0.0'));
+  print(notes.name);
+  print(notes.body);
+}

From 665fdaf3ec3409154493723beba9b5aec02137d3 Mon Sep 17 00:00:00 2001
From: Casey Hillers 
Date: Mon, 8 Nov 2021 10:51:59 -0800
Subject: [PATCH 248/390] Make CheckRunConclusion nullable (#276)

---
 CHANGELOG.md                     | 3 +++
 lib/src/common/model/checks.dart | 6 +++++-
 lib/src/common/util/utils.dart   | 6 +++---
 pubspec.yaml                     | 2 +-
 4 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8ce2f14f..fb15210e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,6 @@
+## 8.2.4
+- Make CheckRunConclusion nullable
+
 ## 8.2.3
 - Added `generateReleaseNotes` boolean to CreateRelase class to have github auto-create release notes
 - Added `generateReleaseNotes` method to RepositoriesService to have github create release notes
diff --git a/lib/src/common/model/checks.dart b/lib/src/common/model/checks.dart
index 042e19d3..4222df82 100644
--- a/lib/src/common/model/checks.dart
+++ b/lib/src/common/model/checks.dart
@@ -45,10 +45,14 @@ class CheckRunConclusion extends EnumWithValue {
   static const cancelled = CheckRunConclusion._('cancelled');
   static const timedOut = CheckRunConclusion._('timed_out');
   static const actionRequired = CheckRunConclusion._('action_required');
+  static const empty = CheckRunConclusion._(null);
 
-  const CheckRunConclusion._(String value) : super(value);
+  const CheckRunConclusion._(String? value) : super(value);
 
   factory CheckRunConclusion._fromValue(String? value) {
+    if (value == null) {
+      return empty;
+    }
     for (final level in const [
       success,
       failure,
diff --git a/lib/src/common/util/utils.dart b/lib/src/common/util/utils.dart
index 655404bd..ad668902 100644
--- a/lib/src/common/util/utils.dart
+++ b/lib/src/common/util/utils.dart
@@ -5,17 +5,17 @@ import 'package:meta/meta.dart';
 /// but with a String value that is used for serialization.
 @immutable
 abstract class EnumWithValue {
-  final String value;
+  final String? value;
 
   /// The value will be used when [toJson] or [toString] will be called.
   /// It will also be used to check if two [EnumWithValue] are equal.
   const EnumWithValue(this.value);
 
   @override
-  String toString() => value;
+  String toString() => value ?? 'null';
 
   /// Returns the String value of this.
-  String toJson() => value;
+  String toJson() => value ?? 'null';
 
   /// True iff [other] is an [EnumWithValue] with the same value as this object.
   @override
diff --git a/pubspec.yaml b/pubspec.yaml
index cad01e51..7998f667 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: github
-version: 8.2.3
+version: 8.2.4
 description: A high-level GitHub API Client Library that uses Github's v3 API
 homepage: https://github.com/SpinlockLabs/github.dart
 

From 57dd829e82e961b44ae59930fb6e4b154b563197 Mon Sep 17 00:00:00 2001
From: Casey Hillers 
Date: Mon, 8 Nov 2021 16:01:18 -0800
Subject: [PATCH 249/390] Run format and analyze on presubmit/postsubmit (#275)

---
 .github/workflows/tests.yml                   |  22 ++
 example/languages.dart                        |   1 +
 .../git_integration_test.dart                 |   0
 lib/browser_helper.dart                       |   1 +
 lib/github.dart                               |   1 +
 lib/src/common/model/checks.dart              |   9 +
 lib/src/common/util/utils.dart                |   1 +
 test/experiment/generate_release_notes.dart   |   4 +-
 test/git_test.dart                            |  15 +-
 test/src/mocks.dart                           |   5 +
 test/src/mocks.mocks.dart                     | 242 ++++++++++++++++++
 11 files changed, 291 insertions(+), 10 deletions(-)
 create mode 100644 .github/workflows/tests.yml
 rename {test => integration_test}/git_integration_test.dart (100%)
 create mode 100644 test/src/mocks.dart
 create mode 100644 test/src/mocks.mocks.dart

diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
new file mode 100644
index 00000000..7fc5a1d6
--- /dev/null
+++ b/.github/workflows/tests.yml
@@ -0,0 +1,22 @@
+name: Tests
+on:
+  push:
+    branches: [ master ]
+  pull_request:
+    branches: [ master ]
+jobs:
+  test:
+    runs-on: ubuntu-latest
+    steps:
+    - uses: actions/checkout@v2
+    - uses: dart-lang/setup-dart@v1
+    - name: Install dependencies
+      run: dart pub get
+    - name: Format
+      run: dart format --output=none --set-exit-if-changed .
+    - name: Analyze
+      run: dart analyze
+    # - name: Unit tests
+    #   run: dart test test
+    # - name: Integration tests
+    #   run: dart test integration_test
diff --git a/example/languages.dart b/example/languages.dart
index 79961cf0..526950ed 100644
--- a/example/languages.dart
+++ b/example/languages.dart
@@ -35,6 +35,7 @@ void reloadTable({int accuracy = 4}) {
   isReloadingTable = true;
   final md = generateMarkdown(accuracy);
   github.misc.renderMarkdown(md).then((html) {
+    // ignore: unsafe_html
     tableDiv!.setInnerHtml(html, treeSanitizer: NodeTreeSanitizer.trusted);
     isReloadingTable = false;
   });
diff --git a/test/git_integration_test.dart b/integration_test/git_integration_test.dart
similarity index 100%
rename from test/git_integration_test.dart
rename to integration_test/git_integration_test.dart
diff --git a/lib/browser_helper.dart b/lib/browser_helper.dart
index 2f610e77..0d9af0f1 100644
--- a/lib/browser_helper.dart
+++ b/lib/browser_helper.dart
@@ -24,6 +24,7 @@ void renderMarkdown(GitHub github, String selector, {int indent = 4}) {
       e.hidden = false;
       e.setAttribute('rendered', '');
       e.classes.add('markdown-body');
+      // ignore: unsafe_html
       e.setInnerHtml(html, treeSanitizer: NodeTreeSanitizer.trusted);
     });
   }
diff --git a/lib/github.dart b/lib/github.dart
index 4135651a..6b79e1c4 100644
--- a/lib/github.dart
+++ b/lib/github.dart
@@ -1,4 +1,5 @@
 export 'package:github/src/common.dart';
+
 /// Do a conditional export of the right cross platform pieces depending on
 /// if dart.html or dart.io is available.
 export 'package:github/src/common/xplat_common.dart'
diff --git a/lib/src/common/model/checks.dart b/lib/src/common/model/checks.dart
index 4222df82..848a3bec 100644
--- a/lib/src/common/model/checks.dart
+++ b/lib/src/common/model/checks.dart
@@ -1,3 +1,4 @@
+import 'package:github/src/common/model/pulls.dart';
 import 'package:github/src/common/util/utils.dart';
 import 'package:meta/meta.dart';
 
@@ -350,18 +351,26 @@ class CheckSuite {
   final int? id;
   final String? headSha;
   final CheckRunConclusion conclusion;
+  final List pullRequests;
 
   const CheckSuite({
     required this.conclusion,
     required this.headSha,
     required this.id,
+    required this.pullRequests,
   });
 
   factory CheckSuite.fromJson(Map input) {
+    var pullRequestsJson = input['pull_requests'] as List;
+    var pullRequests = pullRequestsJson
+        .map((dynamic json) =>
+            PullRequest.fromJson(json as Map))
+        .toList();
     return CheckSuite(
       conclusion: CheckRunConclusion._fromValue(input['conclusion']),
       headSha: input['head_sha'],
       id: input['id'],
+      pullRequests: pullRequests,
     );
   }
 
diff --git a/lib/src/common/util/utils.dart b/lib/src/common/util/utils.dart
index ad668902..23dd5307 100644
--- a/lib/src/common/util/utils.dart
+++ b/lib/src/common/util/utils.dart
@@ -60,6 +60,7 @@ RepositorySlug slugFromAPIUrl(String url) {
   return RepositorySlug(parts[0], parts[1]);
 }
 
+// ignore: avoid_classes_with_only_static_members
 abstract class StatusCodes {
   static const int OK = 200;
   static const int CREATED = 201;
diff --git a/test/experiment/generate_release_notes.dart b/test/experiment/generate_release_notes.dart
index 44b77190..8d0e7a1e 100755
--- a/test/experiment/generate_release_notes.dart
+++ b/test/experiment/generate_release_notes.dart
@@ -3,8 +3,8 @@ import 'package:github/github.dart';
 Future main() async {
   final github = GitHub(auth: findAuthenticationFromEnvironment());
 
-  var notes = await github.repositories.generateReleaseNotes(
-      CreateReleaseNotes('Spinlocklabs', 'github.dart', '1.0.1',
+  var notes = await github.repositories.generateReleaseNotes(CreateReleaseNotes(
+      'Spinlocklabs', 'github.dart', '1.0.1',
       targetCommitish: '1.0.1', previousTagName: '1.0.0'));
   print(notes.name);
   print(notes.body);
diff --git a/test/git_test.dart b/test/git_test.dart
index 86abf2b0..d6e19bdb 100644
--- a/test/git_test.dart
+++ b/test/git_test.dart
@@ -6,7 +6,7 @@ import 'package:http/http.dart' as http;
 import 'package:mockito/mockito.dart';
 import 'package:test/test.dart';
 
-class MockGitHub extends Mock implements GitHub {}
+import 'src/mocks.mocks.dart';
 
 void main() {
   late MockGitHub github;
@@ -137,7 +137,7 @@ void main() {
       // given
       final expectedResponse = http.Response('{}', 200);
 
-      when(github.request(any!, any!, body: any, headers: any))
+      when(github.request(any, any, body: any, headers: any))
           .thenReturn(Future.value(expectedResponse));
 
       // when
@@ -151,7 +151,7 @@ void main() {
     test('creates valid JSON body', () {
       // given
       final expectedResponse = http.Response('{}', 200);
-      when(github.request(any!, any!, body: any, headers: any))
+      when(github.request(any, any, body: any, headers: any))
           .thenReturn(Future.value(expectedResponse));
 
       // when
@@ -159,8 +159,8 @@ void main() {
 
       // then
       final captured = verify(github.request(
-        any!,
-        any!,
+        any,
+        any,
         body: captureAny,
         headers: captureAny,
       )).captured;
@@ -178,8 +178,7 @@ void main() {
     test('constructs correct path', () {
       // given
       final expectedResponse = http.Response('{}', 200);
-      when(github.request(any!, any!))
-          .thenReturn(Future.value(expectedResponse));
+      when(github.request(any, any)).thenReturn(Future.value(expectedResponse));
 
       // when
       git.deleteReference(repo, 'heads/b');
@@ -300,7 +299,7 @@ void main() {
 
 Map? captureSentBody(MockGitHub github) {
   final bodyString = verify(github.postJSON(
-    any!,
+    any,
     convert: any,
     statusCode: any,
     body: captureAny,
diff --git a/test/src/mocks.dart b/test/src/mocks.dart
new file mode 100644
index 00000000..8add5505
--- /dev/null
+++ b/test/src/mocks.dart
@@ -0,0 +1,5 @@
+import 'package:github/src/common.dart';
+import 'package:mockito/annotations.dart';
+
+@GenerateMocks([GitHub])
+void main() {}
diff --git a/test/src/mocks.mocks.dart b/test/src/mocks.mocks.dart
new file mode 100644
index 00000000..f8647b26
--- /dev/null
+++ b/test/src/mocks.mocks.dart
@@ -0,0 +1,242 @@
+// Mocks generated by Mockito 5.0.16 from annotations
+// in github/test/src/mocks.dart.
+// Do not manually edit this file.
+
+import 'dart:async' as _i4;
+
+import 'package:github/src/common.dart' as _i3;
+import 'package:http/http.dart' as _i2;
+import 'package:mockito/mockito.dart' as _i1;
+
+// ignore_for_file: avoid_redundant_argument_values
+// ignore_for_file: avoid_setters_without_getters
+// ignore_for_file: comment_references
+// ignore_for_file: implementation_imports
+// ignore_for_file: invalid_use_of_visible_for_testing_member
+// ignore_for_file: prefer_const_constructors
+// ignore_for_file: unnecessary_overrides
+// ignore_for_file: unnecessary_parenthesis
+// ignore_for_file: camel_case_types
+
+class _FakeClient_0 extends _i1.Fake implements _i2.Client {}
+
+class _FakeActivityService_1 extends _i1.Fake implements _i3.ActivityService {}
+
+class _FakeAuthorizationsService_2 extends _i1.Fake
+    implements _i3.AuthorizationsService {}
+
+class _FakeGistsService_3 extends _i1.Fake implements _i3.GistsService {}
+
+class _FakeGitService_4 extends _i1.Fake implements _i3.GitService {}
+
+class _FakeIssuesService_5 extends _i1.Fake implements _i3.IssuesService {}
+
+class _FakeMiscService_6 extends _i1.Fake implements _i3.MiscService {}
+
+class _FakeOrganizationsService_7 extends _i1.Fake
+    implements _i3.OrganizationsService {}
+
+class _FakePullRequestsService_8 extends _i1.Fake
+    implements _i3.PullRequestsService {}
+
+class _FakeRepositoriesService_9 extends _i1.Fake
+    implements _i3.RepositoriesService {}
+
+class _FakeSearchService_10 extends _i1.Fake implements _i3.SearchService {}
+
+class _FakeUrlShortenerService_11 extends _i1.Fake
+    implements _i3.UrlShortenerService {}
+
+class _FakeUsersService_12 extends _i1.Fake implements _i3.UsersService {}
+
+class _FakeChecksService_13 extends _i1.Fake implements _i3.ChecksService {}
+
+class _FakeResponse_14 extends _i1.Fake implements _i2.Response {}
+
+/// A class which mocks [GitHub].
+///
+/// See the documentation for Mockito's code generation for more information.
+class MockGitHub extends _i1.Mock implements _i3.GitHub {
+  MockGitHub() {
+    _i1.throwOnMissingStub(this);
+  }
+
+  @override
+  set auth(_i3.Authentication? _auth) =>
+      super.noSuchMethod(Invocation.setter(#auth, _auth),
+          returnValueForMissingStub: null);
+  @override
+  String get endpoint =>
+      (super.noSuchMethod(Invocation.getter(#endpoint), returnValue: '')
+          as String);
+  @override
+  _i2.Client get client => (super.noSuchMethod(Invocation.getter(#client),
+      returnValue: _FakeClient_0()) as _i2.Client);
+  @override
+  _i3.ActivityService get activity =>
+      (super.noSuchMethod(Invocation.getter(#activity),
+          returnValue: _FakeActivityService_1()) as _i3.ActivityService);
+  @override
+  _i3.AuthorizationsService get authorizations =>
+      (super.noSuchMethod(Invocation.getter(#authorizations),
+              returnValue: _FakeAuthorizationsService_2())
+          as _i3.AuthorizationsService);
+  @override
+  _i3.GistsService get gists => (super.noSuchMethod(Invocation.getter(#gists),
+      returnValue: _FakeGistsService_3()) as _i3.GistsService);
+  @override
+  _i3.GitService get git => (super.noSuchMethod(Invocation.getter(#git),
+      returnValue: _FakeGitService_4()) as _i3.GitService);
+  @override
+  _i3.IssuesService get issues =>
+      (super.noSuchMethod(Invocation.getter(#issues),
+          returnValue: _FakeIssuesService_5()) as _i3.IssuesService);
+  @override
+  _i3.MiscService get misc => (super.noSuchMethod(Invocation.getter(#misc),
+      returnValue: _FakeMiscService_6()) as _i3.MiscService);
+  @override
+  _i3.OrganizationsService get organizations => (super.noSuchMethod(
+      Invocation.getter(#organizations),
+      returnValue: _FakeOrganizationsService_7()) as _i3.OrganizationsService);
+  @override
+  _i3.PullRequestsService get pullRequests => (super.noSuchMethod(
+      Invocation.getter(#pullRequests),
+      returnValue: _FakePullRequestsService_8()) as _i3.PullRequestsService);
+  @override
+  _i3.RepositoriesService get repositories => (super.noSuchMethod(
+      Invocation.getter(#repositories),
+      returnValue: _FakeRepositoriesService_9()) as _i3.RepositoriesService);
+  @override
+  _i3.SearchService get search =>
+      (super.noSuchMethod(Invocation.getter(#search),
+          returnValue: _FakeSearchService_10()) as _i3.SearchService);
+  @override
+  _i3.UrlShortenerService get urlShortener => (super.noSuchMethod(
+      Invocation.getter(#urlShortener),
+      returnValue: _FakeUrlShortenerService_11()) as _i3.UrlShortenerService);
+  @override
+  _i3.UsersService get users => (super.noSuchMethod(Invocation.getter(#users),
+      returnValue: _FakeUsersService_12()) as _i3.UsersService);
+  @override
+  _i3.ChecksService get checks =>
+      (super.noSuchMethod(Invocation.getter(#checks),
+          returnValue: _FakeChecksService_13()) as _i3.ChecksService);
+  @override
+  _i4.Future getJSON(String? path,
+          {int? statusCode,
+          void Function(_i2.Response)? fail,
+          Map? headers,
+          Map? params,
+          _i3.JSONConverter? convert,
+          String? preview}) =>
+      (super.noSuchMethod(
+          Invocation.method(#getJSON, [
+            path
+          ], {
+            #statusCode: statusCode,
+            #fail: fail,
+            #headers: headers,
+            #params: params,
+            #convert: convert,
+            #preview: preview
+          }),
+          returnValue: Future.value(null)) as _i4.Future);
+  @override
+  _i4.Future postJSON(String? path,
+          {int? statusCode,
+          void Function(_i2.Response)? fail,
+          Map? headers,
+          Map? params,
+          _i3.JSONConverter? convert,
+          dynamic body,
+          String? preview}) =>
+      (super.noSuchMethod(
+          Invocation.method(#postJSON, [
+            path
+          ], {
+            #statusCode: statusCode,
+            #fail: fail,
+            #headers: headers,
+            #params: params,
+            #convert: convert,
+            #body: body,
+            #preview: preview
+          }),
+          returnValue: Future.value(null)) as _i4.Future);
+  @override
+  _i4.Future putJSON(String? path,
+          {int? statusCode,
+          void Function(_i2.Response)? fail,
+          Map? headers,
+          Map? params,
+          _i3.JSONConverter? convert,
+          dynamic body,
+          String? preview}) =>
+      (super.noSuchMethod(
+          Invocation.method(#putJSON, [
+            path
+          ], {
+            #statusCode: statusCode,
+            #fail: fail,
+            #headers: headers,
+            #params: params,
+            #convert: convert,
+            #body: body,
+            #preview: preview
+          }),
+          returnValue: Future.value(null)) as _i4.Future);
+  @override
+  _i4.Future requestJson(String? method, String? path,
+          {int? statusCode,
+          void Function(_i2.Response)? fail,
+          Map? headers,
+          Map? params,
+          _i3.JSONConverter? convert,
+          dynamic body,
+          String? preview}) =>
+      (super.noSuchMethod(
+          Invocation.method(#requestJson, [
+            method,
+            path
+          ], {
+            #statusCode: statusCode,
+            #fail: fail,
+            #headers: headers,
+            #params: params,
+            #convert: convert,
+            #body: body,
+            #preview: preview
+          }),
+          returnValue: Future.value(null)) as _i4.Future);
+  @override
+  _i4.Future<_i2.Response> request(String? method, String? path,
+          {Map? headers,
+          Map? params,
+          dynamic body,
+          int? statusCode,
+          void Function(_i2.Response)? fail,
+          String? preview}) =>
+      (super.noSuchMethod(
+              Invocation.method(#request, [
+                method,
+                path
+              ], {
+                #headers: headers,
+                #params: params,
+                #body: body,
+                #statusCode: statusCode,
+                #fail: fail,
+                #preview: preview
+              }),
+              returnValue: Future<_i2.Response>.value(_FakeResponse_14()))
+          as _i4.Future<_i2.Response>);
+  @override
+  void handleStatusCode(_i2.Response? response) =>
+      super.noSuchMethod(Invocation.method(#handleStatusCode, [response]),
+          returnValueForMissingStub: null);
+  @override
+  void dispose() => super.noSuchMethod(Invocation.method(#dispose, []),
+      returnValueForMissingStub: null);
+  @override
+  String toString() => super.toString();
+}

From 2e983ad5a82ef7e22cd544081da49577bdf91ee0 Mon Sep 17 00:00:00 2001
From: Rob Becker 
Date: Tue, 9 Nov 2021 21:33:11 -0700
Subject: [PATCH 250/390] add auto publish github action

---
 .github/workflows/publish_release.yml | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)
 create mode 100644 .github/workflows/publish_release.yml

diff --git a/.github/workflows/publish_release.yml b/.github/workflows/publish_release.yml
new file mode 100644
index 00000000..3d6f125f
--- /dev/null
+++ b/.github/workflows/publish_release.yml
@@ -0,0 +1,21 @@
+name: Publish to pub
+
+on:
+  release:
+    types: [published]
+
+jobs:
+  publish:
+
+    runs-on: ubuntu-latest
+
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v1
+      - name: Publish
+        uses: sakebook/actions-flutter-pub-publisher@v1.3.1
+        with:
+          credential: ${{ secrets.CREDENTIAL_JSON }}
+          flutter_package: false
+          skip_test: true
+          dry_run: false
\ No newline at end of file

From 5a36400692927299989b2b85e064148d9b5c5c21 Mon Sep 17 00:00:00 2001
From: Rob Becker 
Date: Tue, 9 Nov 2021 21:36:02 -0700
Subject: [PATCH 251/390] 8.2.5

---
 CHANGELOG.md | 4 ++++
 pubspec.yaml | 2 +-
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index fb15210e..8822a493 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 8.2.5
+- no library code changes
+- Add auto pub publish on new releases
+
 ## 8.2.4
 - Make CheckRunConclusion nullable
 
diff --git a/pubspec.yaml b/pubspec.yaml
index 7998f667..3fdffd75 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: github
-version: 8.2.4
+version: 8.2.5
 description: A high-level GitHub API Client Library that uses Github's v3 API
 homepage: https://github.com/SpinlockLabs/github.dart
 

From 2afd0b39291ca32143b7501499ef0be1a618426b Mon Sep 17 00:00:00 2001
From: Rob Becker 
Date: Sun, 28 Nov 2021 08:06:30 -0700
Subject: [PATCH 252/390] fix github action to use renamed triage label

---
 .github/workflows/triage.yml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/.github/workflows/triage.yml b/.github/workflows/triage.yml
index 46249cf2..7c89b22c 100644
--- a/.github/workflows/triage.yml
+++ b/.github/workflows/triage.yml
@@ -9,7 +9,7 @@ jobs:
     runs-on: ubuntu-latest
     steps:
       - uses: actions/checkout@master
-      - name: Apply triage label
+      - name: Apply untriaged label
         uses: actions/github-script@v3
         with:
           github-token: ${{secrets.GITHUB_TOKEN}}
@@ -18,7 +18,7 @@ jobs:
               issue_number: context.issue.number,
               owner: context.repo.owner,
               repo: context.repo.repo,
-              labels: ['triage']
+              labels: ['untriaged']
             })
       - name: Comment On New Issues
         uses: actions/github-script@v3

From e631e50e4067ca96f0e471d00355e85e092149a8 Mon Sep 17 00:00:00 2001
From: keyonghan <54558023+keyonghan@users.noreply.github.com>
Date: Thu, 16 Dec 2021 09:18:46 -0800
Subject: [PATCH 253/390] Add files field in Git commit comparison (#285)

---
 CHANGELOG.md                      | 3 +++
 lib/src/common/model/repos.dart   | 5 +++--
 lib/src/common/model/repos.g.dart | 3 +++
 pubspec.yaml                      | 2 +-
 test/src/mocks.mocks.dart         | 1 -
 5 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8822a493..0a4d48c0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,6 @@
+## 8.3.0
+- Support `files` field in class `GitHubComparison`
+
 ## 8.2.5
 - no library code changes
 - Add auto pub publish on new releases
diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart
index 6d9c5dda..f7140e13 100644
--- a/lib/src/common/model/repos.dart
+++ b/lib/src/common/model/repos.dart
@@ -12,9 +12,10 @@ class GitHubComparison {
   final int? aheadBy;
   final int? behindBy;
   final int? totalCommits;
+  final List? files;
 
-  GitHubComparison(
-      this.url, this.status, this.aheadBy, this.behindBy, this.totalCommits);
+  GitHubComparison(this.url, this.status, this.aheadBy, this.behindBy,
+      this.totalCommits, this.files);
 
   factory GitHubComparison.fromJson(Map json) =>
       _$GitHubComparisonFromJson(json);
diff --git a/lib/src/common/model/repos.g.dart b/lib/src/common/model/repos.g.dart
index 9809a166..c3f9cec8 100644
--- a/lib/src/common/model/repos.g.dart
+++ b/lib/src/common/model/repos.g.dart
@@ -13,6 +13,9 @@ GitHubComparison _$GitHubComparisonFromJson(Map json) =>
       json['ahead_by'] as int?,
       json['behind_by'] as int?,
       json['total_commits'] as int?,
+      (json['files'] as List?)
+          ?.map((e) => CommitFile.fromJson(e as Map))
+          .toList(),
     );
 
 Repository _$RepositoryFromJson(Map json) => Repository(
diff --git a/pubspec.yaml b/pubspec.yaml
index 3fdffd75..594ed886 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: github
-version: 8.2.5
+version: 8.3.0
 description: A high-level GitHub API Client Library that uses Github's v3 API
 homepage: https://github.com/SpinlockLabs/github.dart
 
diff --git a/test/src/mocks.mocks.dart b/test/src/mocks.mocks.dart
index f8647b26..3400efad 100644
--- a/test/src/mocks.mocks.dart
+++ b/test/src/mocks.mocks.dart
@@ -14,7 +14,6 @@ import 'package:mockito/mockito.dart' as _i1;
 // ignore_for_file: implementation_imports
 // ignore_for_file: invalid_use_of_visible_for_testing_member
 // ignore_for_file: prefer_const_constructors
-// ignore_for_file: unnecessary_overrides
 // ignore_for_file: unnecessary_parenthesis
 // ignore_for_file: camel_case_types
 

From 038001e77d840cfc341244b093fa147d7eb046bc Mon Sep 17 00:00:00 2001
From: Dmitry Krutskikh 
Date: Fri, 17 Dec 2021 20:37:13 +0300
Subject: [PATCH 254/390] feat: update an issue comment

---
 lib/src/common/github.dart         | 43 ++++++++++++++++++++++++++++++
 lib/src/common/issues_service.dart | 13 ++++++++-
 2 files changed, 55 insertions(+), 1 deletion(-)

diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart
index f69288a6..b92749f0 100644
--- a/lib/src/common/github.dart
+++ b/lib/src/common/github.dart
@@ -1,5 +1,6 @@
 import 'dart:async';
 import 'dart:convert';
+
 import 'package:github/src/common.dart';
 import 'package:github/src/common/util/utils.dart';
 import 'package:http/http.dart' as http;
@@ -245,6 +246,48 @@ class GitHub {
         preview: preview,
       );
 
+  /// Handles PATCH Requests that respond with JSON
+  ///
+  /// [path] can either be a path like '/repos' or a full url.
+  /// [statusCode] is the expected status code. If it is null, it is ignored.
+  /// If the status code that the response returns is not the status code you provide
+  /// then the [fail] function will be called with the HTTP Response.
+  ///
+  /// If you don't throw an error or break out somehow, it will go into some error checking
+  /// that throws exceptions when it finds a 404 or 401. If it doesn't find a general HTTP Status Code
+  /// for errors, it throws an Unknown Error.
+  ///
+  /// [headers] are HTTP Headers. If it doesn't exist, the 'Accept' and 'Authorization' headers are added.
+  /// [params] are query string parameters.
+  /// [convert] is a simple function that is passed this [GitHub] instance and a JSON object.
+  ///
+  /// The future will pass the object returned from this function to the then method.
+  /// The default [convert] function returns the input object.
+  /// [body] is the data to send to the server. Pass in a List if you want to post binary body data. Everything else will have .toString() called on it and set as text content
+  /// [S] represents the input type.
+  /// [T] represents the type return from this function after conversion
+  Future patchJSON(
+    String path, {
+    int? statusCode,
+    void Function(http.Response response)? fail,
+    Map? headers,
+    Map? params,
+    JSONConverter? convert,
+    dynamic body,
+    String? preview,
+  }) =>
+      requestJson(
+        'PATCH',
+        path,
+        statusCode: statusCode,
+        fail: fail,
+        headers: headers,
+        params: params,
+        convert: convert,
+        body: body,
+        preview: preview,
+      );
+
   Future requestJson(
     String method,
     String path, {
diff --git a/lib/src/common/issues_service.dart b/lib/src/common/issues_service.dart
index 448da36f..8fcc9a1a 100644
--- a/lib/src/common/issues_service.dart
+++ b/lib/src/common/issues_service.dart
@@ -251,7 +251,18 @@ class IssuesService extends Service {
     );
   }
 
-  // TODO: Implement editComment: https://developer.github.com/v3/issues/comments/#edit-a-comment
+  /// Update an issue comment.
+  ///
+  /// API docs: https://docs.github.com/en/rest/reference/issues#update-an-issue-comment
+  Future updateComment(RepositorySlug slug, int id, String body) {
+    final it = GitHubJson.encode({'body': body});
+    return github.postJSON(
+      '/repos/${slug.fullName}/issues/comments/$id',
+      body: it,
+      convert: (dynamic i) => IssueComment.fromJson(i),
+      statusCode: StatusCodes.OK,
+    );
+  }
 
   /// Deletes an issue comment.
   ///

From 3ef3fbda58c02a30d49571a641a9d7117987cda3 Mon Sep 17 00:00:00 2001
From: Rob Becker 
Date: Sun, 19 Dec 2021 13:04:29 -0700
Subject: [PATCH 255/390] prep 8.4.0

---
 CHANGELOG.md | 3 +++
 pubspec.yaml | 2 +-
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0a4d48c0..8f2f7474 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,6 @@
+## 8.4.0
+- added `updateComment` to update issue comments https://github.com/SpinlockLabs/github.dart/pull/286
+
 ## 8.3.0
 - Support `files` field in class `GitHubComparison`
 
diff --git a/pubspec.yaml b/pubspec.yaml
index 594ed886..fa792e79 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: github
-version: 8.3.0
+version: 8.4.0
 description: A high-level GitHub API Client Library that uses Github's v3 API
 homepage: https://github.com/SpinlockLabs/github.dart
 

From 8d50289828816a323f1ac580d24d0140b39190f8 Mon Sep 17 00:00:00 2001
From: Rob Becker 
Date: Sun, 19 Dec 2021 13:16:48 -0700
Subject: [PATCH 256/390] require semver label on PRs

---
 .github/workflows/require_semver_label.yml | 13 +++++++++++++
 1 file changed, 13 insertions(+)
 create mode 100644 .github/workflows/require_semver_label.yml

diff --git a/.github/workflows/require_semver_label.yml b/.github/workflows/require_semver_label.yml
new file mode 100644
index 00000000..5de414a6
--- /dev/null
+++ b/.github/workflows/require_semver_label.yml
@@ -0,0 +1,13 @@
+name: Require Semver Pull Request Label
+on:
+  pull_request:
+    types: [opened, labeled, unlabeled, synchronize]
+jobs:
+  label:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: mheap/github-action-required-labels@v1
+        with:
+          mode: exactly
+          count: 1
+          labels: "semver:patch, semver:minor, semver:major"
\ No newline at end of file

From a8e59521e910b8978d5ec7f0b15c9a9599ffce50 Mon Sep 17 00:00:00 2001
From: Rob Becker 
Date: Thu, 23 Dec 2021 16:42:48 -0700
Subject: [PATCH 257/390] Fixes

---
 lib/src/common/model/pulls.dart   | 44 +++++++++++++++++++++++++
 lib/src/common/model/pulls.g.dart | 53 ++++++++++++++++++++++++++++++-
 lib/src/common/orgs_service.dart  |  8 +++++
 lib/src/common/pulls_service.dart | 22 +++++++++++++
 test/src/mocks.mocks.dart         | 25 +++++++++++++--
 5 files changed, 149 insertions(+), 3 deletions(-)

diff --git a/lib/src/common/model/pulls.dart b/lib/src/common/model/pulls.dart
index 31a6014d..456e5a39 100644
--- a/lib/src/common/model/pulls.dart
+++ b/lib/src/common/model/pulls.dart
@@ -143,6 +143,8 @@ class PullRequest {
   /// Ex: CONTRIBUTOR, NONE, OWNER
   String? authorAssociation;
 
+  Repository? repo;
+
   factory PullRequest.fromJson(Map input) =>
       _$PullRequestFromJson(input);
   Map toJson() => _$PullRequestToJson(this);
@@ -297,3 +299,45 @@ class PullRequestFile {
       _$PullRequestFileFromJson(input);
   Map toJson() => _$PullRequestFileToJson(this);
 }
+
+@JsonSerializable()
+class PullRequestReview {
+  PullRequestReview(
+      {required this.id,
+      required this.user,
+      this.body,
+      this.state,
+      this.htmlUrl,
+      this.pullRequestUrl});
+  int id;
+  User user;
+  String? body;
+  String? state;
+  String? htmlUrl;
+  String? pullRequestUrl;
+  DateTime? submittedAt;
+  String? authorAssociation;
+  String? commitId;
+
+  factory PullRequestReview.fromJson(Map input) =>
+      _$PullRequestReviewFromJson(input);
+  Map toJson() => _$PullRequestReviewToJson(this);
+}
+
+@JsonSerializable()
+class CreatePullRequestReview {
+  CreatePullRequestReview(this.owner, this.repo, this.pullNumber, this.event,
+      {this.body});
+
+  String owner;
+  String repo;
+  String event;
+  String? body;
+  int pullNumber;
+  // TODO List comments;
+
+  factory CreatePullRequestReview.fromJson(Map input) =>
+      _$CreatePullRequestReviewFromJson(input);
+  Map toJson() => _$CreatePullRequestReviewToJson(this);
+}
+// TODO  PullRequestReviewComment https://docs.github.com/en/rest/reference/pulls#create-a-review-for-a-pull-request
diff --git a/lib/src/common/model/pulls.g.dart b/lib/src/common/model/pulls.g.dart
index 359911f0..62d2bba6 100644
--- a/lib/src/common/model/pulls.g.dart
+++ b/lib/src/common/model/pulls.g.dart
@@ -62,7 +62,9 @@ PullRequest _$PullRequestFromJson(Map json) => PullRequest(
       mergeableState: json['mergeable_state'] as String? ?? '',
       maintainerCanModify: json['maintainer_can_modify'] as bool? ?? false,
       authorAssociation: json['author_association'] as String? ?? '',
-    );
+    )..repo = json['repo'] == null
+        ? null
+        : Repository.fromJson(json['repo'] as Map);
 
 Map _$PullRequestToJson(PullRequest instance) =>
     {
@@ -99,6 +101,7 @@ Map _$PullRequestToJson(PullRequest instance) =>
       'mergeable_state': instance.mergeableState,
       'maintainer_can_modify': instance.maintainerCanModify,
       'author_association': instance.authorAssociation,
+      'repo': instance.repo,
     };
 
 PullRequestMerge _$PullRequestMergeFromJson(Map json) =>
@@ -244,3 +247,51 @@ Map _$PullRequestFileToJson(PullRequestFile instance) =>
       'contents_url': instance.contentsUrl,
       'patch': instance.patch,
     };
+
+PullRequestReview _$PullRequestReviewFromJson(Map json) =>
+    PullRequestReview(
+      id: json['id'] as int,
+      user: User.fromJson(json['user'] as Map),
+      body: json['body'] as String?,
+      state: json['state'] as String?,
+      htmlUrl: json['html_url'] as String?,
+      pullRequestUrl: json['pull_request_url'] as String?,
+    )
+      ..submittedAt = json['submitted_at'] == null
+          ? null
+          : DateTime.parse(json['submitted_at'] as String)
+      ..authorAssociation = json['author_association'] as String?
+      ..commitId = json['commit_id'] as String?;
+
+Map _$PullRequestReviewToJson(PullRequestReview instance) =>
+    {
+      'id': instance.id,
+      'user': instance.user,
+      'body': instance.body,
+      'state': instance.state,
+      'html_url': instance.htmlUrl,
+      'pull_request_url': instance.pullRequestUrl,
+      'submitted_at': instance.submittedAt?.toIso8601String(),
+      'author_association': instance.authorAssociation,
+      'commit_id': instance.commitId,
+    };
+
+CreatePullRequestReview _$CreatePullRequestReviewFromJson(
+        Map json) =>
+    CreatePullRequestReview(
+      json['owner'] as String,
+      json['repo'] as String,
+      json['pull_number'] as int,
+      json['event'] as String,
+      body: json['body'] as String?,
+    );
+
+Map _$CreatePullRequestReviewToJson(
+        CreatePullRequestReview instance) =>
+    {
+      'owner': instance.owner,
+      'repo': instance.repo,
+      'event': instance.event,
+      'body': instance.body,
+      'pull_number': instance.pullNumber,
+    };
diff --git a/lib/src/common/orgs_service.dart b/lib/src/common/orgs_service.dart
index 86ebc0b6..a8a54b25 100644
--- a/lib/src/common/orgs_service.dart
+++ b/lib/src/common/orgs_service.dart
@@ -238,6 +238,14 @@ class OrganizationsService extends Service {
         .objects('GET', '/user/teams', (dynamic i) => Team.fromJson(i));
   }
 
+  /// Lists all of the users in an organization
+  ///
+  /// API docs: https://developer.github.com/v3/orgs/teams/#list-user-teams
+  Stream listUsers(String org) {
+    return PaginationHelper(github)
+        .objects('GET', '/orgs/$org/members', (dynamic i) => User.fromJson(i));
+  }
+
   /// Lists the hooks for the specified organization.
   ///
   /// API docs: https://developer.github.com/v3/orgs/hooks/#list-hooks
diff --git a/lib/src/common/pulls_service.dart b/lib/src/common/pulls_service.dart
index 0f317745..01f51722 100644
--- a/lib/src/common/pulls_service.dart
+++ b/lib/src/common/pulls_service.dart
@@ -100,6 +100,16 @@ class PullRequestsService extends Service {
         (dynamic i) => PullRequestFile.fromJson(i));
   }
 
+  /// Lists the reviews for a pull request.
+  ///
+  /// API docs: https://docs.github.com/en/rest/reference/pulls#list-reviews-for-a-pull-request
+  Stream listReviews(RepositorySlug slug, int number) {
+    return PaginationHelper(github).objects(
+        'GET',
+        '/repos/${slug.fullName}/pulls/$number/reviews',
+        (dynamic i) => PullRequestReview.fromJson(i));
+  }
+
   Future isMerged(RepositorySlug slug, int number) {
     return github
         .request('GET', '/repos/${slug.fullName}/pulls/$number/merge')
@@ -165,4 +175,16 @@ class PullRequestsService extends Service {
 
   // TODO: Implement editComment: https://developer.github.com/v3/pulls/comments/#edit-a-comment
   // TODO: Implement deleteComment: https://developer.github.com/v3/pulls/comments/#delete-a-comment
+
+  /// Creates a new pull request comment.
+  ///
+  /// API docs: https://developer.github.com/v3/pulls/comments/#create-a-comment
+  Future createReview(
+      RepositorySlug slug, CreatePullRequestReview review) {
+    return github.postJSON(
+            '/repos/${slug.fullName}/pulls/${review.pullNumber}/reviews',
+            body: GitHubJson.encode(review),
+            convert: (dynamic i) => PullRequestReview.fromJson(i))
+        as Future;
+  }
 }
diff --git a/test/src/mocks.mocks.dart b/test/src/mocks.mocks.dart
index 3400efad..6a673895 100644
--- a/test/src/mocks.mocks.dart
+++ b/test/src/mocks.mocks.dart
@@ -1,4 +1,4 @@
-// Mocks generated by Mockito 5.0.16 from annotations
+// Mocks generated by Mockito 5.0.15 from annotations
 // in github/test/src/mocks.dart.
 // Do not manually edit this file.
 
@@ -15,7 +15,6 @@ import 'package:mockito/mockito.dart' as _i1;
 // ignore_for_file: invalid_use_of_visible_for_testing_member
 // ignore_for_file: prefer_const_constructors
 // ignore_for_file: unnecessary_parenthesis
-// ignore_for_file: camel_case_types
 
 class _FakeClient_0 extends _i1.Fake implements _i2.Client {}
 
@@ -185,6 +184,28 @@ class MockGitHub extends _i1.Mock implements _i3.GitHub {
           }),
           returnValue: Future.value(null)) as _i4.Future);
   @override
+  _i4.Future patchJSON(String? path,
+          {int? statusCode,
+          void Function(_i2.Response)? fail,
+          Map? headers,
+          Map? params,
+          _i3.JSONConverter? convert,
+          dynamic body,
+          String? preview}) =>
+      (super.noSuchMethod(
+          Invocation.method(#patchJSON, [
+            path
+          ], {
+            #statusCode: statusCode,
+            #fail: fail,
+            #headers: headers,
+            #params: params,
+            #convert: convert,
+            #body: body,
+            #preview: preview
+          }),
+          returnValue: Future.value(null)) as _i4.Future);
+  @override
   _i4.Future requestJson(String? method, String? path,
           {int? statusCode,
           void Function(_i2.Response)? fail,

From b9665927cf1e597e9b8f6a9c2ea6193b0d09cb79 Mon Sep 17 00:00:00 2001
From: Rob Becker 
Date: Thu, 23 Dec 2021 16:52:59 -0700
Subject: [PATCH 258/390] renamed Dart CI

---
 .github/workflows/dart.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/dart.yml b/.github/workflows/dart.yml
index 250e2000..0a4012c0 100644
--- a/.github/workflows/dart.yml
+++ b/.github/workflows/dart.yml
@@ -1,4 +1,4 @@
-name: Dart CI
+name: Dart Checks (analyze,format,publishable)
 
 on: [push]
 

From d4325c1fe9b2a1db26c0595283d6042d1e6a48e7 Mon Sep 17 00:00:00 2001
From: Rob Becker 
Date: Thu, 23 Dec 2021 17:14:29 -0700
Subject: [PATCH 259/390] auto prep 8.5.0

---
 CHANGELOG.md | 7 +++++++
 pubspec.yaml | 2 +-
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8f2f7474..fd6470b5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,10 @@
+## 8.5.0
+
+* Adds listing and creating PR Reviews, listing users in an org by @robrbecker in https://github.com/SpinlockLabs/github.dart/pull/287
+
+
+**Full Changelog**: https://github.com/SpinlockLabs/github.dart/compare/8.4.0...8.5.0
+
 ## 8.4.0
 - added `updateComment` to update issue comments https://github.com/SpinlockLabs/github.dart/pull/286
 
diff --git a/pubspec.yaml b/pubspec.yaml
index fa792e79..8dba5227 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: github
-version: 8.4.0
+version: 8.5.0
 description: A high-level GitHub API Client Library that uses Github's v3 API
 homepage: https://github.com/SpinlockLabs/github.dart
 

From 0a1db651bc28f6c1f735b210619be75bceb617dd Mon Sep 17 00:00:00 2001
From: Scott Horn 
Date: Mon, 3 Jan 2022 08:48:43 +0100
Subject: [PATCH 260/390] Added assignees to Issue model

---
 lib/src/common/model/issues.dart   | 6 ++++++
 lib/src/common/model/issues.g.dart | 8 ++++++++
 pubspec.yaml                       | 2 +-
 test/src/mocks.mocks.dart          | 5 ++---
 4 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/lib/src/common/model/issues.dart b/lib/src/common/model/issues.dart
index 4138e9d4..4a86f62b 100644
--- a/lib/src/common/model/issues.dart
+++ b/lib/src/common/model/issues.dart
@@ -17,6 +17,7 @@ class Issue {
     this.user,
     List? labels,
     this.assignee,
+    this.assignees,
     this.milestone,
     this.commentsCount = 0,
     this.pullRequest,
@@ -58,6 +59,9 @@ class Issue {
   /// The User that the issue is assigned to
   User? assignee;
 
+  /// The User that the issue is assigned to
+  List? assignees;
+
   /// The Milestone
   Milestone? milestone;
 
@@ -97,12 +101,14 @@ class IssueRequest {
       this.body,
       this.labels,
       this.assignee,
+      this.assignees,
       this.state,
       this.milestone});
   String? title;
   String? body;
   List? labels;
   String? assignee;
+  List? assignees;
   String? state;
   int? milestone;
 
diff --git a/lib/src/common/model/issues.g.dart b/lib/src/common/model/issues.g.dart
index 30f1048a..0b6b8a3f 100644
--- a/lib/src/common/model/issues.g.dart
+++ b/lib/src/common/model/issues.g.dart
@@ -23,6 +23,9 @@ Issue _$IssueFromJson(Map json) => Issue(
       assignee: json['assignee'] == null
           ? null
           : User.fromJson(json['assignee'] as Map),
+      assignees: (json['assignees'] as List?)
+          ?.map((e) => User.fromJson(e as Map))
+          .toList(),
       milestone: json['milestone'] == null
           ? null
           : Milestone.fromJson(json['milestone'] as Map),
@@ -56,6 +59,7 @@ Map _$IssueToJson(Issue instance) => {
       'user': instance.user,
       'labels': instance.labels,
       'assignee': instance.assignee,
+      'assignees': instance.assignees,
       'milestone': instance.milestone,
       'comments': instance.commentsCount,
       'pull_request': instance.pullRequest,
@@ -72,6 +76,9 @@ IssueRequest _$IssueRequestFromJson(Map json) => IssueRequest(
       labels:
           (json['labels'] as List?)?.map((e) => e as String).toList(),
       assignee: json['assignee'] as String?,
+      assignees: (json['assignees'] as List?)
+          ?.map((e) => e as String)
+          .toList(),
       state: json['state'] as String?,
       milestone: json['milestone'] as int?,
     );
@@ -82,6 +89,7 @@ Map _$IssueRequestToJson(IssueRequest instance) =>
       'body': instance.body,
       'labels': instance.labels,
       'assignee': instance.assignee,
+      'assignees': instance.assignees,
       'state': instance.state,
       'milestone': instance.milestone,
     };
diff --git a/pubspec.yaml b/pubspec.yaml
index 8dba5227..19575c71 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -10,7 +10,7 @@ dependencies:
   collection: ^1.15.0
   http: ^0.13.0
   http_parser: ^4.0.0
-  json_annotation: ^4.3.0
+  json_annotation: ^4.4.0
   meta: ^1.3.0
 
 dev_dependencies:
diff --git a/test/src/mocks.mocks.dart b/test/src/mocks.mocks.dart
index 6a673895..0b3d8735 100644
--- a/test/src/mocks.mocks.dart
+++ b/test/src/mocks.mocks.dart
@@ -1,4 +1,4 @@
-// Mocks generated by Mockito 5.0.15 from annotations
+// Mocks generated by Mockito 5.0.17 from annotations
 // in github/test/src/mocks.dart.
 // Do not manually edit this file.
 
@@ -15,6 +15,7 @@ import 'package:mockito/mockito.dart' as _i1;
 // ignore_for_file: invalid_use_of_visible_for_testing_member
 // ignore_for_file: prefer_const_constructors
 // ignore_for_file: unnecessary_parenthesis
+// ignore_for_file: camel_case_types
 
 class _FakeClient_0 extends _i1.Fake implements _i2.Client {}
 
@@ -257,6 +258,4 @@ class MockGitHub extends _i1.Mock implements _i3.GitHub {
   @override
   void dispose() => super.noSuchMethod(Invocation.method(#dispose, []),
       returnValueForMissingStub: null);
-  @override
-  String toString() => super.toString();
 }

From 2710c7f5b623b321ef4a9ac38243ffbe364344d0 Mon Sep 17 00:00:00 2001
From: Rob Becker 
Date: Fri, 7 Jan 2022 08:44:35 -0600
Subject: [PATCH 261/390] Fix getting gists

---
 lib/src/common/model/gists.dart           | 18 ++++----
 lib/src/common/model/gists.g.dart         | 50 +++++++++++++++++++++--
 lib/src/common/model/misc.dart            |  3 +-
 lib/src/common/model/misc.g.dart          |  6 +++
 lib/src/common/model/notifications.dart   |  6 ++-
 lib/src/common/model/notifications.g.dart | 22 ++++++++++
 lib/src/common/model/orgs.dart            |  9 ++--
 lib/src/common/model/orgs.g.dart          | 26 ++++++++++++
 lib/src/common/model/repos.dart           | 10 ++---
 lib/src/common/model/repos.g.dart         | 17 ++++++++
 lib/src/common/model/search.dart          | 10 +++--
 lib/src/common/model/search.g.dart        | 18 ++++++++
 lib/src/common/model/users.dart           |  5 +--
 lib/src/common/model/users.g.dart         | 10 +++++
 14 files changed, 179 insertions(+), 31 deletions(-)

diff --git a/lib/src/common/model/gists.dart b/lib/src/common/model/gists.dart
index dc225eb4..cd89deac 100644
--- a/lib/src/common/model/gists.dart
+++ b/lib/src/common/model/gists.dart
@@ -5,7 +5,7 @@ import 'package:json_annotation/json_annotation.dart';
 part 'gists.g.dart';
 
 /// Model class for gists.
-@JsonSerializable(createToJson: false)
+@JsonSerializable()
 class Gist {
   Gist({
     this.id,
@@ -26,7 +26,7 @@ class Gist {
   bool? public;
   User? owner;
   User? user;
-  List? files;
+  Map? files;
 
   @JsonKey(name: 'html_url')
   String? htmlUrl;
@@ -50,10 +50,10 @@ class Gist {
 }
 
 /// Model class for a gist file.
-@JsonSerializable(createToJson: false)
+@JsonSerializable()
 class GistFile {
   GistFile({
-    this.name,
+    this.filename,
     this.size,
     this.rawUrl,
     this.type,
@@ -61,10 +61,9 @@ class GistFile {
     this.truncated,
     this.content,
   });
-  String? name;
-  int? size;
 
-  @JsonKey(name: 'raw_url')
+  String? filename;
+  int? size;
   String? rawUrl;
   String? type;
   String? language;
@@ -73,10 +72,11 @@ class GistFile {
 
   factory GistFile.fromJson(Map input) =>
       _$GistFileFromJson(input);
+  Map toJson() => _$GistFileToJson(this);
 }
 
 /// Model class for a gist fork.
-@JsonSerializable(createToJson: false)
+@JsonSerializable()
 class GistFork {
   GistFork({this.user, this.id, this.createdAt, this.updatedAt});
   User? user;
@@ -93,7 +93,7 @@ class GistFork {
 }
 
 /// Model class for a gits history entry.
-@JsonSerializable(createToJson: false)
+@JsonSerializable()
 class GistHistoryEntry {
   GistHistoryEntry({
     this.version,
diff --git a/lib/src/common/model/gists.g.dart b/lib/src/common/model/gists.g.dart
index 15f648b0..e1d6db23 100644
--- a/lib/src/common/model/gists.g.dart
+++ b/lib/src/common/model/gists.g.dart
@@ -16,9 +16,9 @@ Gist _$GistFromJson(Map json) => Gist(
       user: json['user'] == null
           ? null
           : User.fromJson(json['user'] as Map),
-      files: (json['files'] as List?)
-          ?.map((e) => GistFile.fromJson(e as Map))
-          .toList(),
+      files: (json['files'] as Map?)?.map(
+        (k, e) => MapEntry(k, GistFile.fromJson(e as Map)),
+      ),
       htmlUrl: json['html_url'] as String?,
       commentsCount: json['comments'] as int?,
       gitPullUrl: json['git_pull_url'] as String?,
@@ -31,8 +31,23 @@ Gist _$GistFromJson(Map json) => Gist(
           : DateTime.parse(json['updated_at'] as String),
     );
 
+Map _$GistToJson(Gist instance) => {
+      'id': instance.id,
+      'description': instance.description,
+      'public': instance.public,
+      'owner': instance.owner,
+      'user': instance.user,
+      'files': instance.files,
+      'html_url': instance.htmlUrl,
+      'comments': instance.commentsCount,
+      'git_pull_url': instance.gitPullUrl,
+      'git_push_url': instance.gitPushUrl,
+      'created_at': instance.createdAt?.toIso8601String(),
+      'updated_at': instance.updatedAt?.toIso8601String(),
+    };
+
 GistFile _$GistFileFromJson(Map json) => GistFile(
-      name: json['name'] as String?,
+      filename: json['filename'] as String?,
       size: json['size'] as int?,
       rawUrl: json['raw_url'] as String?,
       type: json['type'] as String?,
@@ -41,6 +56,16 @@ GistFile _$GistFileFromJson(Map json) => GistFile(
       content: json['content'] as String?,
     );
 
+Map _$GistFileToJson(GistFile instance) => {
+      'filename': instance.filename,
+      'size': instance.size,
+      'raw_url': instance.rawUrl,
+      'type': instance.type,
+      'language': instance.language,
+      'truncated': instance.truncated,
+      'content': instance.content,
+    };
+
 GistFork _$GistForkFromJson(Map json) => GistFork(
       user: json['user'] == null
           ? null
@@ -54,6 +79,13 @@ GistFork _$GistForkFromJson(Map json) => GistFork(
           : DateTime.parse(json['updated_at'] as String),
     );
 
+Map _$GistForkToJson(GistFork instance) => {
+      'user': instance.user,
+      'id': instance.id,
+      'created_at': instance.createdAt?.toIso8601String(),
+      'updated_at': instance.updatedAt?.toIso8601String(),
+    };
+
 GistHistoryEntry _$GistHistoryEntryFromJson(Map json) =>
     GistHistoryEntry(
       version: json['version'] as String?,
@@ -68,6 +100,16 @@ GistHistoryEntry _$GistHistoryEntryFromJson(Map json) =>
           : DateTime.parse(json['committed_at'] as String),
     );
 
+Map _$GistHistoryEntryToJson(GistHistoryEntry instance) =>
+    {
+      'version': instance.version,
+      'user': instance.user,
+      'change_status/deletions': instance.deletions,
+      'change_status/additions': instance.additions,
+      'change_status/total': instance.totalChanges,
+      'committed_at': instance.committedAt?.toIso8601String(),
+    };
+
 GistComment _$GistCommentFromJson(Map json) => GistComment(
       id: json['id'] as int?,
       user: json['user'] == null
diff --git a/lib/src/common/model/misc.dart b/lib/src/common/model/misc.dart
index 4f3166a9..ad693d34 100644
--- a/lib/src/common/model/misc.dart
+++ b/lib/src/common/model/misc.dart
@@ -3,7 +3,7 @@ import 'package:json_annotation/json_annotation.dart';
 part 'misc.g.dart';
 
 /// Model class for a Gitignore Template.
-@JsonSerializable(createToJson: false)
+@JsonSerializable()
 class GitignoreTemplate {
   GitignoreTemplate({this.name, this.source});
 
@@ -15,6 +15,7 @@ class GitignoreTemplate {
 
   factory GitignoreTemplate.fromJson(Map input) =>
       _$GitignoreTemplateFromJson(input);
+  Map toJson() => _$GitignoreTemplateToJson(this);
 }
 
 /// Model class for GitHub Rate Limit Information.
diff --git a/lib/src/common/model/misc.g.dart b/lib/src/common/model/misc.g.dart
index fc40fa65..34362c50 100644
--- a/lib/src/common/model/misc.g.dart
+++ b/lib/src/common/model/misc.g.dart
@@ -12,6 +12,12 @@ GitignoreTemplate _$GitignoreTemplateFromJson(Map json) =>
       source: json['source'] as String?,
     );
 
+Map _$GitignoreTemplateToJson(GitignoreTemplate instance) =>
+    {
+      'name': instance.name,
+      'source': instance.source,
+    };
+
 RateLimit _$RateLimitFromJson(Map json) => RateLimit(
       json['limit'] as int?,
       json['remaining'] as int?,
diff --git a/lib/src/common/model/notifications.dart b/lib/src/common/model/notifications.dart
index 6032549b..0fd0477a 100644
--- a/lib/src/common/model/notifications.dart
+++ b/lib/src/common/model/notifications.dart
@@ -4,7 +4,7 @@ import 'package:json_annotation/json_annotation.dart';
 part 'notifications.g.dart';
 
 /// Model class for notifications.
-@JsonSerializable(createToJson: false)
+@JsonSerializable()
 class Notification {
   Notification({
     this.id,
@@ -36,10 +36,11 @@ class Notification {
 
   factory Notification.fromJson(Map input) =>
       _$NotificationFromJson(input);
+  Map toJson() => _$NotificationToJson(this);
 }
 
 /// Model class for a notification subject.
-@JsonSerializable(createToJson: false)
+@JsonSerializable()
 class NotificationSubject {
   NotificationSubject({this.title, this.type, this.url, this.latestCommentUrl});
   final String? title;
@@ -51,4 +52,5 @@ class NotificationSubject {
 
   factory NotificationSubject.fromJson(Map input) =>
       _$NotificationSubjectFromJson(input);
+  Map toJson() => _$NotificationSubjectToJson(this);
 }
diff --git a/lib/src/common/model/notifications.g.dart b/lib/src/common/model/notifications.g.dart
index 82c74573..70dfde07 100644
--- a/lib/src/common/model/notifications.g.dart
+++ b/lib/src/common/model/notifications.g.dart
@@ -27,6 +27,19 @@ Notification _$NotificationFromJson(Map json) => Notification(
       subscriptionUrl: json['subscription_url'] as String?,
     );
 
+Map _$NotificationToJson(Notification instance) =>
+    {
+      'id': instance.id,
+      'repository': instance.repository,
+      'subject': instance.subject,
+      'reason': instance.reason,
+      'unread': instance.unread,
+      'updated_at': instance.updatedAt?.toIso8601String(),
+      'last_read_at': instance.lastReadAt?.toIso8601String(),
+      'url': instance.url,
+      'subscription_url': instance.subscriptionUrl,
+    };
+
 NotificationSubject _$NotificationSubjectFromJson(Map json) =>
     NotificationSubject(
       title: json['title'] as String?,
@@ -34,3 +47,12 @@ NotificationSubject _$NotificationSubjectFromJson(Map json) =>
       url: json['url'] as String?,
       latestCommentUrl: json['latest_comment_url'] as String?,
     );
+
+Map _$NotificationSubjectToJson(
+        NotificationSubject instance) =>
+    {
+      'title': instance.title,
+      'type': instance.type,
+      'url': instance.url,
+      'latest_comment_url': instance.latestCommentUrl,
+    };
diff --git a/lib/src/common/model/orgs.dart b/lib/src/common/model/orgs.dart
index 0a28ea42..21f7b417 100644
--- a/lib/src/common/model/orgs.dart
+++ b/lib/src/common/model/orgs.dart
@@ -82,7 +82,7 @@ class Organization {
 }
 
 /// Model class for organization membership.
-@JsonSerializable(createToJson: false)
+@JsonSerializable()
 class OrganizationMembership {
   OrganizationMembership({
     this.state,
@@ -94,10 +94,11 @@ class OrganizationMembership {
   factory OrganizationMembership.fromJson(Map input) {
     return _$OrganizationMembershipFromJson(input);
   }
+  Map toJson() => _$OrganizationMembershipToJson(this);
 }
 
 /// Model class for a GitHub team.
-@JsonSerializable(createToJson: false)
+@JsonSerializable()
 class Team {
   Team({
     this.name,
@@ -131,6 +132,7 @@ class Team {
   factory Team.fromJson(Map input) {
     return _$TeamFromJson(input);
   }
+  Map toJson() => _$TeamToJson(this);
 }
 
 /// Model class for the team membership state.
@@ -145,7 +147,7 @@ class TeamMembershipState {
 }
 
 /// Model class for a team member.
-@JsonSerializable(createToJson: false)
+@JsonSerializable()
 class TeamMember {
   TeamMember(
       {this.login,
@@ -179,4 +181,5 @@ class TeamMember {
   factory TeamMember.fromJson(Map input) {
     return _$TeamMemberFromJson(input);
   }
+  Map toJson() => _$TeamMemberToJson(this);
 }
diff --git a/lib/src/common/model/orgs.g.dart b/lib/src/common/model/orgs.g.dart
index 52ffea0d..0e19f2cf 100644
--- a/lib/src/common/model/orgs.g.dart
+++ b/lib/src/common/model/orgs.g.dart
@@ -56,6 +56,13 @@ OrganizationMembership _$OrganizationMembershipFromJson(
           : Organization.fromJson(json['organization'] as Map),
     );
 
+Map _$OrganizationMembershipToJson(
+        OrganizationMembership instance) =>
+    {
+      'state': instance.state,
+      'organization': instance.organization,
+    };
+
 Team _$TeamFromJson(Map json) => Team(
       name: json['name'] as String?,
       id: json['id'] as int?,
@@ -67,6 +74,15 @@ Team _$TeamFromJson(Map json) => Team(
           : Organization.fromJson(json['organization'] as Map),
     );
 
+Map _$TeamToJson(Team instance) => {
+      'name': instance.name,
+      'id': instance.id,
+      'permission': instance.permission,
+      'members_count': instance.membersCount,
+      'repos_count': instance.reposCount,
+      'organization': instance.organization,
+    };
+
 TeamMember _$TeamMemberFromJson(Map json) => TeamMember(
       login: json['login'] as String?,
       id: json['id'] as int?,
@@ -75,3 +91,13 @@ TeamMember _$TeamMemberFromJson(Map json) => TeamMember(
       siteAdmin: json['site_admin'] as bool?,
       htmlUrl: json['html_url'] as String?,
     );
+
+Map _$TeamMemberToJson(TeamMember instance) =>
+    {
+      'login': instance.login,
+      'id': instance.id,
+      'avatar_url': instance.avatarUrl,
+      'type': instance.type,
+      'site_admin': instance.siteAdmin,
+      'html_url': instance.htmlUrl,
+    };
diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart
index f7140e13..4a3c65e3 100644
--- a/lib/src/common/model/repos.dart
+++ b/lib/src/common/model/repos.dart
@@ -3,9 +3,7 @@ import 'package:json_annotation/json_annotation.dart';
 
 part 'repos.g.dart';
 
-@JsonSerializable(
-  createToJson: false,
-)
+@JsonSerializable()
 class GitHubComparison {
   final String? url;
   final String? status;
@@ -19,6 +17,7 @@ class GitHubComparison {
 
   factory GitHubComparison.fromJson(Map json) =>
       _$GitHubComparisonFromJson(json);
+  Map toJson() => _$GitHubComparisonToJson(this);
 
   @override
   String toString() {
@@ -201,7 +200,7 @@ class RepositoryPermissions {
   Map toJson() => _$RepositoryPermissionsToJson(this);
 }
 
-@JsonSerializable(createToJson: false)
+@JsonSerializable()
 class Tag {
   final String name;
   final CommitInfo commit;
@@ -213,7 +212,8 @@ class Tag {
   Tag(this.name, this.commit, this.zipUrl, this.tarUrl);
 
   factory Tag.fromJson(Map input) => _$TagFromJson(input);
-
+  Map toJson() => _$TagToJson(this);
+  
   @override
   String toString() => 'Tag: $name';
 }
diff --git a/lib/src/common/model/repos.g.dart b/lib/src/common/model/repos.g.dart
index c3f9cec8..78184d6f 100644
--- a/lib/src/common/model/repos.g.dart
+++ b/lib/src/common/model/repos.g.dart
@@ -18,6 +18,16 @@ GitHubComparison _$GitHubComparisonFromJson(Map json) =>
           .toList(),
     );
 
+Map _$GitHubComparisonToJson(GitHubComparison instance) =>
+    {
+      'url': instance.url,
+      'status': instance.status,
+      'ahead_by': instance.aheadBy,
+      'behind_by': instance.behindBy,
+      'total_commits': instance.totalCommits,
+      'files': instance.files,
+    };
+
 Repository _$RepositoryFromJson(Map json) => Repository(
       name: json['name'] as String? ?? '',
       id: json['id'] as int? ?? 0,
@@ -127,6 +137,13 @@ Tag _$TagFromJson(Map json) => Tag(
       json['tarball_url'] as String,
     );
 
+Map _$TagToJson(Tag instance) => {
+      'name': instance.name,
+      'commit': instance.commit,
+      'zipball_url': instance.zipUrl,
+      'tarball_url': instance.tarUrl,
+    };
+
 CommitData _$CommitDataFromJson(Map json) => CommitData(
       json['sha'] as String?,
       json['commit'] == null
diff --git a/lib/src/common/model/search.dart b/lib/src/common/model/search.dart
index 1735a465..532551f6 100644
--- a/lib/src/common/model/search.dart
+++ b/lib/src/common/model/search.dart
@@ -9,7 +9,7 @@ abstract class SearchResults {
   List? items;
 }
 
-@JsonSerializable(createToJson: false)
+@JsonSerializable()
 class CodeSearchResults implements SearchResults {
   @JsonKey(name: 'total_count')
   @override
@@ -25,9 +25,10 @@ class CodeSearchResults implements SearchResults {
 
   static CodeSearchResults fromJson(Map input) =>
       _$CodeSearchResultsFromJson(input);
+  Map toJson() => _$CodeSearchResultsToJson(this);
 }
 
-@JsonSerializable(createToJson: false)
+@JsonSerializable()
 class CodeSearchItem {
   String? name;
   String? path;
@@ -57,11 +58,12 @@ class CodeSearchItem {
     }
     return result;
   }
+  Map toJson() => _$CodeSearchItemToJson(this);
 }
 
 // TODO: Issue Search
-// @JsonSerializable(createToJson: false)
+// @JsonSerializable()
 // class IssueSearchResults extends SearchResults {}
 
-// @JsonSerializable(createToJson: false)
+// @JsonSerializable()
 // class IssueSearchItem {}
diff --git a/lib/src/common/model/search.g.dart b/lib/src/common/model/search.g.dart
index e50161a6..d24fa9cb 100644
--- a/lib/src/common/model/search.g.dart
+++ b/lib/src/common/model/search.g.dart
@@ -12,6 +12,13 @@ CodeSearchResults _$CodeSearchResultsFromJson(Map json) =>
       ..incompleteResults = json['incomplete_results'] as bool?
       ..items = CodeSearchItem.fromJsonList(json['items'] as List);
 
+Map _$CodeSearchResultsToJson(CodeSearchResults instance) =>
+    {
+      'total_count': instance.totalCount,
+      'incomplete_results': instance.incompleteResults,
+      'items': instance.items,
+    };
+
 CodeSearchItem _$CodeSearchItemFromJson(Map json) =>
     CodeSearchItem()
       ..name = json['name'] as String?
@@ -23,3 +30,14 @@ CodeSearchItem _$CodeSearchItemFromJson(Map json) =>
       ..repository = json['repository'] == null
           ? null
           : Repository.fromJson(json['repository'] as Map);
+
+Map _$CodeSearchItemToJson(CodeSearchItem instance) =>
+    {
+      'name': instance.name,
+      'path': instance.path,
+      'sha': instance.sha,
+      'url': instance.url?.toString(),
+      'git_url': instance.gitUrl?.toString(),
+      'html_url': instance.htmlUrl?.toString(),
+      'repository': instance.repository,
+    };
diff --git a/lib/src/common/model/users.dart b/lib/src/common/model/users.dart
index 4c3245a4..766f6185 100644
--- a/lib/src/common/model/users.dart
+++ b/lib/src/common/model/users.dart
@@ -96,9 +96,7 @@ class User {
 
 /// The response from listing collaborators on a repo.
 // https://developer.github.com/v3/repos/collaborators/#response
-@JsonSerializable(
-  createToJson: false,
-)
+@JsonSerializable()
 class Collaborator {
   final String? login;
   final int? id;
@@ -118,6 +116,7 @@ class Collaborator {
 
   factory Collaborator.fromJson(Map json) =>
       _$CollaboratorFromJson(json);
+  Map toJson() => _$CollaboratorToJson(this);
 }
 
 /// The response from listing contributors on a repo.
diff --git a/lib/src/common/model/users.g.dart b/lib/src/common/model/users.g.dart
index fde0c3cf..2713125a 100644
--- a/lib/src/common/model/users.g.dart
+++ b/lib/src/common/model/users.g.dart
@@ -64,6 +64,16 @@ Collaborator _$CollaboratorFromJson(Map json) => Collaborator(
       ),
     );
 
+Map _$CollaboratorToJson(Collaborator instance) =>
+    {
+      'login': instance.login,
+      'id': instance.id,
+      'html_url': instance.htmlUrl,
+      'type': instance.type,
+      'site_admin': instance.siteAdmin,
+      'permissions': instance.permissions,
+    };
+
 Contributor _$ContributorFromJson(Map json) => Contributor(
       id: json['id'] as int?,
       login: json['login'] as String?,

From 027ca8e03ca7ce8e1f45580278131c41daeb02fe Mon Sep 17 00:00:00 2001
From: Rob Becker 
Date: Sat, 8 Jan 2022 16:35:29 -0700
Subject: [PATCH 262/390] format

---
 lib/src/common/model/repos.dart  | 2 +-
 lib/src/common/model/search.dart | 1 +
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart
index 4a3c65e3..0a00f26a 100644
--- a/lib/src/common/model/repos.dart
+++ b/lib/src/common/model/repos.dart
@@ -213,7 +213,7 @@ class Tag {
 
   factory Tag.fromJson(Map input) => _$TagFromJson(input);
   Map toJson() => _$TagToJson(this);
-  
+
   @override
   String toString() => 'Tag: $name';
 }
diff --git a/lib/src/common/model/search.dart b/lib/src/common/model/search.dart
index 532551f6..c61f39e5 100644
--- a/lib/src/common/model/search.dart
+++ b/lib/src/common/model/search.dart
@@ -58,6 +58,7 @@ class CodeSearchItem {
     }
     return result;
   }
+
   Map toJson() => _$CodeSearchItemToJson(this);
 }
 

From 5f4a2212b485149fe1e63a03d8ed3ea1bf7dabaf Mon Sep 17 00:00:00 2001
From: Rob Becker 
Date: Sat, 8 Jan 2022 17:24:37 -0700
Subject: [PATCH 263/390] add a few more toJson methods

---
 lib/src/common/model/gists.dart | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/lib/src/common/model/gists.dart b/lib/src/common/model/gists.dart
index cd89deac..e5360d70 100644
--- a/lib/src/common/model/gists.dart
+++ b/lib/src/common/model/gists.dart
@@ -47,6 +47,7 @@ class Gist {
   DateTime? updatedAt;
 
   factory Gist.fromJson(Map input) => _$GistFromJson(input);
+  Map toJson() => _$GistToJson(this);
 }
 
 /// Model class for a gist file.
@@ -90,6 +91,7 @@ class GistFork {
 
   factory GistFork.fromJson(Map input) =>
       _$GistForkFromJson(input);
+  Map toJson() => _$GistForkToJson(this);
 }
 
 /// Model class for a gits history entry.
@@ -121,6 +123,7 @@ class GistHistoryEntry {
 
   factory GistHistoryEntry.fromJson(Map input) =>
       _$GistHistoryEntryFromJson(input);
+  Map toJson() => _$GistHistoryEntryToJson(this);
 }
 
 /// Model class for gist comments.

From 71f9e1e502f820ad18846e3d653651dc91dee5f7 Mon Sep 17 00:00:00 2001
From: Rob Becker 
Date: Sat, 8 Jan 2022 17:33:56 -0700
Subject: [PATCH 264/390] prep 9.0.0 changelog

---
 CHANGELOG.md | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index fd6470b5..568d2082 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,20 @@
+## 9.0.0
+
+**Breaking change:** In the Gist class, the old type of files was
+```dart
+List? files;
+```
+and the new type is
+```dart
+Map? files;
+```
+
+**Breaking change:** In the GistFile class, the name property is now filename
+
+* Fix getting gists by @robrbecker in https://github.com/SpinlockLabs/github.dart/pull/294
+
+**Full Changelog**: https://github.com/SpinlockLabs/github.dart/compare/8.5.0...9.0.0
+
 ## 8.5.0
 
 * Adds listing and creating PR Reviews, listing users in an org by @robrbecker in https://github.com/SpinlockLabs/github.dart/pull/287

From 45df396df11691af02a9a0045371bbd8c50e02fe Mon Sep 17 00:00:00 2001
From: Rob Becker 
Date: Sat, 8 Jan 2022 17:38:35 -0700
Subject: [PATCH 265/390] update pubspec to 9.0.0

---
 pubspec.yaml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pubspec.yaml b/pubspec.yaml
index 8dba5227..f8b3ebf4 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: github
-version: 8.5.0
+version: 9.0.0
 description: A high-level GitHub API Client Library that uses Github's v3 API
 homepage: https://github.com/SpinlockLabs/github.dart
 

From 1722442e9f8eb4f2f705c3c06e83b7ffc653b5e8 Mon Sep 17 00:00:00 2001
From: Kristin Bi 
Date: Wed, 9 Mar 2022 11:03:45 -0800
Subject: [PATCH 266/390] upstream checkRun to include conclusion

---
 lib/src/common/model/checks.dart | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/lib/src/common/model/checks.dart b/lib/src/common/model/checks.dart
index 848a3bec..8d497540 100644
--- a/lib/src/common/model/checks.dart
+++ b/lib/src/common/model/checks.dart
@@ -94,6 +94,7 @@ class CheckRun {
   final int? checkSuiteId;
   final String? detailsUrl;
   final DateTime startedAt;
+  final CheckRunConclusion conclusion;
 
   const CheckRun._({
     required this.id,
@@ -104,6 +105,7 @@ class CheckRun {
     required this.name,
     required this.detailsUrl,
     required this.startedAt,
+    required this.conclusion,
   });
 
   factory CheckRun.fromJson(Map input) {
@@ -127,6 +129,7 @@ class CheckRun {
       checkSuiteId: input['check_suite']['id'],
       detailsUrl: input['details_url'],
       startedAt: DateTime.parse(input['started_at']),
+      conclusion: CheckRunConclusion._fromValue(input['conclusion']),
     );
   }
 
@@ -142,6 +145,7 @@ class CheckRun {
       },
       'details_url': detailsUrl,
       'started_at': startedAt.toIso8601String(),
+      'conclusion': conclusion,
     };
   }
 }

From c99a357a89d422f45551b99aa6ce1a2283237c1b Mon Sep 17 00:00:00 2001
From: Kristin Bi 
Date: Wed, 9 Mar 2022 11:23:34 -0800
Subject: [PATCH 267/390] update changelog

---
 CHANGELOG.md | 3 +++
 pubspec.yaml | 2 +-
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 568d2082..85c3a591 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -15,6 +15,9 @@ Map? files;
 
 **Full Changelog**: https://github.com/SpinlockLabs/github.dart/compare/8.5.0...9.0.0
 
+## 9.0.1
+- Add `conclusion` property in class `CheckRun`
+
 ## 8.5.0
 
 * Adds listing and creating PR Reviews, listing users in an org by @robrbecker in https://github.com/SpinlockLabs/github.dart/pull/287
diff --git a/pubspec.yaml b/pubspec.yaml
index f8b3ebf4..6c039ca0 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: github
-version: 9.0.0
+version: 9.0.1
 description: A high-level GitHub API Client Library that uses Github's v3 API
 homepage: https://github.com/SpinlockLabs/github.dart
 

From 8c9b5b0321eb82b29e595116b19dd995ded54369 Mon Sep 17 00:00:00 2001
From: Kristin Bi 
Date: Wed, 9 Mar 2022 13:47:08 -0800
Subject: [PATCH 268/390] add check test

---
 test/unit/checks_test.dart | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)
 create mode 100644 test/unit/checks_test.dart

diff --git a/test/unit/checks_test.dart b/test/unit/checks_test.dart
new file mode 100644
index 00000000..498285ad
--- /dev/null
+++ b/test/unit/checks_test.dart
@@ -0,0 +1,30 @@
+import 'dart:convert';
+
+import 'package:github/src/common/model/checks.dart';
+import 'package:test/test.dart';
+
+void main() {
+  group('Check run', () {
+    test('CheckRun fromJson', () {
+      // This is a truncated version of the response
+      const checkRunJson = '''{
+        "id": 4,
+        "head_sha": "ce587453ced02b1526dfb4cb910479d431683101",
+        "external_id": "",
+        "details_url": "https://example.com",
+        "status": "completed",
+        "conclusion": "neutral",
+        "started_at": "2018-05-04T01:14:52Z",
+        "name": "mighty_readme",
+        "check_suite": {
+          "id": 5
+        }
+      }''';
+      final checkRun = CheckRun.fromJson(jsonDecode(checkRunJson));
+
+      expect(checkRun.id, 4);
+      expect(checkRun.name, 'mighty_readme');
+      expect(checkRun.conclusion, CheckRunConclusion.neutral);
+    });
+  });
+}

From 6595153e89ee7012c86e51fcbc652bbe27c0a0d2 Mon Sep 17 00:00:00 2001
From: Kristin Bi 
Date: Wed, 9 Mar 2022 13:54:56 -0800
Subject: [PATCH 269/390] use official value

---
 test/unit/checks_test.dart | 83 +++++++++++++++++++++++++++++++++++++-
 1 file changed, 81 insertions(+), 2 deletions(-)

diff --git a/test/unit/checks_test.dart b/test/unit/checks_test.dart
index 498285ad..15c8f9d8 100644
--- a/test/unit/checks_test.dart
+++ b/test/unit/checks_test.dart
@@ -6,19 +6,98 @@ import 'package:test/test.dart';
 void main() {
   group('Check run', () {
     test('CheckRun fromJson', () {
-      // This is a truncated version of the response
+      /// The checkRun Json is the official Github values
+      ///
+      /// Github api url: https://docs.github.com/en/rest/reference/checks#get-a-check-run
       const checkRunJson = '''{
         "id": 4,
         "head_sha": "ce587453ced02b1526dfb4cb910479d431683101",
+        "node_id": "MDg6Q2hlY2tSdW40",
         "external_id": "",
+        "url": "https://api.github.com/repos/github/hello-world/check-runs/4",
+        "html_url": "https://github.com/github/hello-world/runs/4",
         "details_url": "https://example.com",
         "status": "completed",
         "conclusion": "neutral",
         "started_at": "2018-05-04T01:14:52Z",
+        "completed_at": "2018-05-04T01:14:52Z",
+        "output": {
+          "title": "Mighty Readme report",
+          "summary": "There are 0 failures, 2 warnings, and 1 notice.",
+          "text": "You may have some misspelled words on lines 2 and 4. You also may want to add a section in your README about how to install your app.",
+          "annotations_count": 2,
+          "annotations_url": "https://api.github.com/repos/github/hello-world/check-runs/4/annotations"
+        },
         "name": "mighty_readme",
         "check_suite": {
           "id": 5
-        }
+        },
+        "app": {
+          "id": 1,
+          "slug": "octoapp",
+          "node_id": "MDExOkludGVncmF0aW9uMQ==",
+          "owner": {
+            "login": "github",
+            "id": 1,
+            "node_id": "MDEyOk9yZ2FuaXphdGlvbjE=",
+            "url": "https://api.github.com/orgs/github",
+            "repos_url": "https://api.github.com/orgs/github/repos",
+            "events_url": "https://api.github.com/orgs/github/events",
+            "avatar_url": "https://github.com/images/error/octocat_happy.gif",
+            "gravatar_id": "",
+            "html_url": "https://github.com/octocat",
+            "followers_url": "https://api.github.com/users/octocat/followers",
+            "following_url": "https://api.github.com/users/octocat/following{/other_user}",
+            "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
+            "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
+            "subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
+            "organizations_url": "https://api.github.com/users/octocat/orgs",
+            "received_events_url": "https://api.github.com/users/octocat/received_events",
+            "type": "User",
+            "site_admin": true
+          },
+          "name": "Octocat App",
+          "description": "",
+          "external_url": "https://example.com",
+          "html_url": "https://github.com/apps/octoapp",
+          "created_at": "2017-07-08T16:18:44-04:00",
+          "updated_at": "2017-07-08T16:18:44-04:00",
+          "permissions": {
+            "metadata": "read",
+            "contents": "read",
+            "issues": "write",
+            "single_file": "write"
+          },
+          "events": [
+            "push",
+            "pull_request"
+          ]
+        },
+        "pull_requests": [
+          {
+            "url": "https://api.github.com/repos/github/hello-world/pulls/1",
+            "id": 1934,
+            "number": 3956,
+            "head": {
+              "ref": "say-hello",
+              "sha": "3dca65fa3e8d4b3da3f3d056c59aee1c50f41390",
+              "repo": {
+                "id": 526,
+                "url": "https://api.github.com/repos/github/hello-world",
+                "name": "hello-world"
+              }
+            },
+            "base": {
+              "ref": "master",
+              "sha": "e7fdf7640066d71ad16a86fbcbb9c6a10a18af4f",
+              "repo": {
+                "id": 526,
+                "url": "https://api.github.com/repos/github/hello-world",
+                "name": "hello-world"
+              }
+            }
+          }
+        ]
       }''';
       final checkRun = CheckRun.fromJson(jsonDecode(checkRunJson));
 

From c7f0bb30caceb75f0a4736ca2fc99008b48da1aa Mon Sep 17 00:00:00 2001
From: Kevin Moore 
Date: Thu, 27 Jan 2022 10:31:32 -0800
Subject: [PATCH 270/390] Move to pkg:lints

---
 CHANGELOG.md                               |  8 +++++---
 analysis_options.yaml                      |  2 +-
 example/languages.dart                     | 15 ++++++++-------
 example/organization.dart                  |  1 -
 example/pr.dart                            |  2 --
 example/readme.dart                        |  2 --
 example/releases.dart                      |  2 --
 example/repos.dart                         |  6 ++----
 example/stars.dart                         |  1 -
 example/user_info.dart                     |  1 -
 example/users.dart                         |  2 --
 lib/src/common/activity_service.dart       |  4 +---
 lib/src/common/authorizations_service.dart |  2 +-
 lib/src/common/checks_service.dart         |  1 -
 lib/src/common/gists_service.dart          |  2 +-
 lib/src/common/git_service.dart            |  2 +-
 lib/src/common/github.dart                 |  1 -
 lib/src/common/issues_service.dart         |  2 --
 lib/src/common/model/activity.dart         |  1 -
 lib/src/common/model/git.dart              |  1 -
 lib/src/common/model/pulls.dart            |  1 -
 lib/src/common/model/repos.dart            |  4 ++--
 lib/src/common/model/repos_commits.dart    |  1 -
 lib/src/common/orgs_service.dart           |  3 +--
 lib/src/common/pulls_service.dart          | 11 +++++------
 lib/src/common/repos_service.dart          |  5 +----
 lib/src/common/search_service.dart         |  3 +--
 lib/src/common/users_service.dart          |  4 +---
 lib/src/common/util/utils.dart             |  2 ++
 lib/src/const/token_env_keys.dart          |  1 +
 pubspec.yaml                               |  4 ++--
 test/experiment/limit_pager.dart           | 10 +++++-----
 test/src/mocks.mocks.dart                  |  2 ++
 33 files changed, 43 insertions(+), 66 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 85c3a591..19f36604 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 9.0.2-dev
+
+## 9.0.1
+- Add `conclusion` property in class `CheckRun`
+
 ## 9.0.0
 
 **Breaking change:** In the Gist class, the old type of files was
@@ -15,9 +20,6 @@ Map? files;
 
 **Full Changelog**: https://github.com/SpinlockLabs/github.dart/compare/8.5.0...9.0.0
 
-## 9.0.1
-- Add `conclusion` property in class `CheckRun`
-
 ## 8.5.0
 
 * Adds listing and creating PR Reviews, listing users in an org by @robrbecker in https://github.com/SpinlockLabs/github.dart/pull/287
diff --git a/analysis_options.yaml b/analysis_options.yaml
index 442b7c0c..1b107aa5 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -1,4 +1,4 @@
-include: package:pedantic/analysis_options.yaml
+include: package:lints/recommended.yaml
 
 analyzer:
   strong-mode:
diff --git a/example/languages.dart b/example/languages.dart
index 526950ed..02da85e0 100644
--- a/example/languages.dart
+++ b/example/languages.dart
@@ -1,6 +1,5 @@
 import 'dart:html';
 
-import 'package:github/github.dart';
 import 'common.dart';
 
 DivElement? tableDiv;
@@ -49,15 +48,17 @@ String generateMarkdown(int accuracy) {
   final total = totalBytes(breakdown);
   final data = breakdown.toList();
 
-  var md = '|Name|Bytes|Percentage|\n';
-  md += '|-----|-----|-----|\n';
+  var md = StringBuffer('''
+|Name|Bytes|Percentage|
+|-----|-----|-----|
+''');
   data.sort((a, b) => b[1].compareTo(a[1]));
 
-  data.forEach((info) {
+  for (final info in data) {
     final String? name = info[0];
     final int bytes = info[1];
     final num percentage = (bytes / total) * 100;
-    md += '|$name|$bytes|${percentage.toStringAsFixed(accuracy)}|\n';
-  });
-  return md;
+    md.writeln('|$name|$bytes|${percentage.toStringAsFixed(accuracy)}|');
+  }
+  return md.toString();
 }
diff --git a/example/organization.dart b/example/organization.dart
index fdea07d3..ef7135f8 100644
--- a/example/organization.dart
+++ b/example/organization.dart
@@ -1,7 +1,6 @@
 import 'dart:async';
 import 'dart:html';
 
-import 'package:github/github.dart';
 import 'common.dart';
 
 DivElement? $output;
diff --git a/example/pr.dart b/example/pr.dart
index 2805646a..15e18180 100644
--- a/example/pr.dart
+++ b/example/pr.dart
@@ -1,8 +1,6 @@
 import 'dart:async';
 import 'dart:html';
 
-import 'package:github/github.dart';
-
 import 'common.dart';
 
 Future main() async {
diff --git a/example/readme.dart b/example/readme.dart
index fb6c29e0..ad9ec300 100644
--- a/example/readme.dart
+++ b/example/readme.dart
@@ -1,7 +1,5 @@
 import 'dart:html';
 
-import 'package:github/github.dart';
-
 import 'common.dart';
 
 Future main() async {
diff --git a/example/releases.dart b/example/releases.dart
index 62db5136..ddd19570 100644
--- a/example/releases.dart
+++ b/example/releases.dart
@@ -1,7 +1,5 @@
 import 'dart:html';
 
-import 'package:github/github.dart';
-
 import 'common.dart';
 
 DivElement? releasesDiv;
diff --git a/example/repos.dart b/example/repos.dart
index 4fdd085c..e7b21da4 100644
--- a/example/repos.dart
+++ b/example/repos.dart
@@ -1,8 +1,6 @@
 import 'dart:async';
 import 'dart:html';
 
-import 'package:github/github.dart';
-
 import 'common.dart';
 
 DivElement? repositoriesDiv;
@@ -29,14 +27,14 @@ Future main() async {
     loadRepos();
   });
 
-  sorts.keys.forEach((name) {
+  for (final name in sorts.keys) {
     querySelector('#sort-$name')!.onClick.listen((event) {
       if (_reposCache == null) {
         loadRepos(sorts[name]);
       }
       updateRepos(_reposCache!, sorts[name]);
     });
-  });
+  }
 }
 
 List? _reposCache;
diff --git a/example/stars.dart b/example/stars.dart
index 16767cfe..a7c96bc4 100644
--- a/example/stars.dart
+++ b/example/stars.dart
@@ -1,6 +1,5 @@
 import 'dart:html';
 
-import 'package:github/github.dart';
 import 'common.dart';
 
 DivElement? $stars;
diff --git a/example/user_info.dart b/example/user_info.dart
index 074f645c..a5113646 100644
--- a/example/user_info.dart
+++ b/example/user_info.dart
@@ -1,6 +1,5 @@
 import 'dart:html';
 
-import 'package:github/github.dart';
 import 'common.dart';
 
 DivElement? info;
diff --git a/example/users.dart b/example/users.dart
index 7f9428c8..ab75a061 100644
--- a/example/users.dart
+++ b/example/users.dart
@@ -1,8 +1,6 @@
 import 'dart:async';
 import 'dart:html';
 
-import 'package:github/github.dart';
-
 import 'common.dart';
 
 DivElement? usersDiv;
diff --git a/lib/src/common/activity_service.dart b/lib/src/common/activity_service.dart
index 12420eba..16b7b84a 100644
--- a/lib/src/common/activity_service.dart
+++ b/lib/src/common/activity_service.dart
@@ -1,9 +1,7 @@
 import 'dart:async';
 import 'dart:convert';
+
 import 'package:github/src/common.dart';
-import 'package:github/src/common/model/users.dart';
-import 'package:github/src/common/util/pagination.dart';
-import 'package:github/src/common/util/utils.dart';
 import 'package:http/http.dart' as http;
 
 /// The [ActivityService] handles communication with activity related methods
diff --git a/lib/src/common/authorizations_service.dart b/lib/src/common/authorizations_service.dart
index 5673001f..7e714afb 100644
--- a/lib/src/common/authorizations_service.dart
+++ b/lib/src/common/authorizations_service.dart
@@ -1,6 +1,6 @@
 import 'dart:async';
+
 import 'package:github/src/common.dart';
-import 'package:github/src/common/util/pagination.dart';
 
 /// The [AuthorizationsService] handles communication with authorizations related methods
 /// of the GitHub API.
diff --git a/lib/src/common/checks_service.dart b/lib/src/common/checks_service.dart
index b0a269ee..d3b63f77 100644
--- a/lib/src/common/checks_service.dart
+++ b/lib/src/common/checks_service.dart
@@ -1,7 +1,6 @@
 import 'dart:convert';
 
 import 'package:github/github.dart';
-import 'package:github/src/common/util/utils.dart';
 
 const _previewHeader = 'application/vnd.github.antiope-preview+json';
 
diff --git a/lib/src/common/gists_service.dart b/lib/src/common/gists_service.dart
index dc0f7316..9f64717e 100644
--- a/lib/src/common/gists_service.dart
+++ b/lib/src/common/gists_service.dart
@@ -1,7 +1,7 @@
 import 'dart:async';
 import 'dart:convert';
+
 import 'package:github/src/common.dart';
-import 'package:github/src/common/util/pagination.dart';
 
 /// The [GistsService] handles communication with gist
 /// methods of the GitHub API.
diff --git a/lib/src/common/git_service.dart b/lib/src/common/git_service.dart
index d3541ed8..1165eeb0 100644
--- a/lib/src/common/git_service.dart
+++ b/lib/src/common/git_service.dart
@@ -1,7 +1,7 @@
 import 'dart:async';
 import 'dart:convert';
+
 import 'package:github/src/common.dart';
-import 'package:github/src/common/util/pagination.dart';
 
 /// The [GitService] handles communication with git related methods of the
 /// GitHub API.
diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart
index b92749f0..31605c91 100644
--- a/lib/src/common/github.dart
+++ b/lib/src/common/github.dart
@@ -2,7 +2,6 @@ import 'dart:async';
 import 'dart:convert';
 
 import 'package:github/src/common.dart';
-import 'package:github/src/common/util/utils.dart';
 import 'package:http/http.dart' as http;
 import 'package:http_parser/http_parser.dart' as http_parser;
 import 'package:meta/meta.dart';
diff --git a/lib/src/common/issues_service.dart b/lib/src/common/issues_service.dart
index 8fcc9a1a..b20d809a 100644
--- a/lib/src/common/issues_service.dart
+++ b/lib/src/common/issues_service.dart
@@ -2,8 +2,6 @@ import 'dart:async';
 import 'dart:convert';
 
 import 'package:github/src/common.dart';
-import 'package:github/src/common/model/users.dart';
-import 'package:github/src/common/util/pagination.dart';
 
 /// The [IssuesService] handles communication with issues related methods of the
 /// GitHub API.
diff --git a/lib/src/common/model/activity.dart b/lib/src/common/model/activity.dart
index ee517ed5..cdb873ec 100644
--- a/lib/src/common/model/activity.dart
+++ b/lib/src/common/model/activity.dart
@@ -1,5 +1,4 @@
 import 'package:github/src/common.dart';
-import 'package:github/src/common/model/users.dart';
 import 'package:json_annotation/json_annotation.dart';
 
 part 'activity.g.dart';
diff --git a/lib/src/common/model/git.dart b/lib/src/common/model/git.dart
index 861a7028..136c01c4 100644
--- a/lib/src/common/model/git.dart
+++ b/lib/src/common/model/git.dart
@@ -1,5 +1,4 @@
 import 'package:github/src/common.dart';
-import 'package:github/src/common/model/users.dart';
 import 'package:json_annotation/json_annotation.dart';
 
 part 'git.g.dart';
diff --git a/lib/src/common/model/pulls.dart b/lib/src/common/model/pulls.dart
index 456e5a39..fd6e8d70 100644
--- a/lib/src/common/model/pulls.dart
+++ b/lib/src/common/model/pulls.dart
@@ -1,5 +1,4 @@
 import 'package:github/src/common.dart';
-import 'package:github/src/common/model/users.dart';
 import 'package:json_annotation/json_annotation.dart';
 import 'package:meta/meta.dart';
 
diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart
index 0a00f26a..739d6ca2 100644
--- a/lib/src/common/model/repos.dart
+++ b/lib/src/common/model/repos.dart
@@ -309,8 +309,8 @@ class RepositorySlug {
   String get fullName => '$owner/$name';
 
   @override
-  bool operator ==(Object obj) =>
-      obj is RepositorySlug && obj.fullName == fullName;
+  bool operator ==(Object other) =>
+      other is RepositorySlug && other.fullName == fullName;
 
   @override
   int get hashCode => fullName.hashCode;
diff --git a/lib/src/common/model/repos_commits.dart b/lib/src/common/model/repos_commits.dart
index e3698663..940917ab 100644
--- a/lib/src/common/model/repos_commits.dart
+++ b/lib/src/common/model/repos_commits.dart
@@ -1,5 +1,4 @@
 import 'package:github/src/common.dart';
-import 'package:github/src/common/model/users.dart';
 import 'package:json_annotation/json_annotation.dart';
 
 part 'repos_commits.g.dart';
diff --git a/lib/src/common/orgs_service.dart b/lib/src/common/orgs_service.dart
index a8a54b25..f72f93b1 100644
--- a/lib/src/common/orgs_service.dart
+++ b/lib/src/common/orgs_service.dart
@@ -1,8 +1,7 @@
 import 'dart:async';
 import 'dart:convert';
+
 import 'package:github/src/common.dart';
-import 'package:github/src/common/util/pagination.dart';
-import 'package:github/src/common/util/utils.dart';
 import 'package:http/http.dart' as http;
 
 /// The [OrganizationsService] handles communication with organization
diff --git a/lib/src/common/pulls_service.dart b/lib/src/common/pulls_service.dart
index 01f51722..8c1d3633 100644
--- a/lib/src/common/pulls_service.dart
+++ b/lib/src/common/pulls_service.dart
@@ -1,8 +1,7 @@
 import 'dart:async';
 import 'dart:convert';
+
 import 'package:github/src/common.dart';
-import 'package:github/src/common/util/pagination.dart';
-import 'package:github/src/common/util/utils.dart';
 
 /// The [PullRequestsService] handles communication with pull request
 /// methods of the GitHub API.
@@ -182,9 +181,9 @@ class PullRequestsService extends Service {
   Future createReview(
       RepositorySlug slug, CreatePullRequestReview review) {
     return github.postJSON(
-            '/repos/${slug.fullName}/pulls/${review.pullNumber}/reviews',
-            body: GitHubJson.encode(review),
-            convert: (dynamic i) => PullRequestReview.fromJson(i))
-        as Future;
+      '/repos/${slug.fullName}/pulls/${review.pullNumber}/reviews',
+      body: GitHubJson.encode(review),
+      convert: (dynamic i) => PullRequestReview.fromJson(i),
+    );
   }
 }
diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart
index 16e573f8..04163260 100644
--- a/lib/src/common/repos_service.dart
+++ b/lib/src/common/repos_service.dart
@@ -1,10 +1,7 @@
 import 'dart:async';
 import 'dart:convert';
+
 import 'package:github/src/common.dart';
-import 'package:github/src/common/model/repos_releases.dart';
-import 'package:github/src/common/model/users.dart';
-import 'package:github/src/common/util/pagination.dart';
-import 'package:github/src/common/util/utils.dart';
 import 'package:http/http.dart' as http;
 
 /// The [RepositoriesService] handles communication with repository related
diff --git a/lib/src/common/search_service.dart b/lib/src/common/search_service.dart
index 72da0465..e98344a6 100644
--- a/lib/src/common/search_service.dart
+++ b/lib/src/common/search_service.dart
@@ -1,8 +1,7 @@
 import 'dart:async';
 import 'dart:convert';
+
 import 'package:github/src/common.dart';
-import 'package:github/src/common/model/users.dart';
-import 'package:github/src/common/util/pagination.dart';
 
 /// The [SearchService] handles communication with search related methods of
 /// the GitHub API.
diff --git a/lib/src/common/users_service.dart b/lib/src/common/users_service.dart
index ac19ae69..3a469401 100644
--- a/lib/src/common/users_service.dart
+++ b/lib/src/common/users_service.dart
@@ -1,8 +1,6 @@
 import 'dart:async';
+
 import 'package:github/src/common.dart';
-import 'package:github/src/common/model/users.dart';
-import 'package:github/src/common/util/pagination.dart';
-import 'package:github/src/common/util/utils.dart';
 import 'package:http/http.dart' as http;
 
 /// The [UsersService] handles communication with user related methods of the
diff --git a/lib/src/common/util/utils.dart b/lib/src/common/util/utils.dart
index 23dd5307..57bd6712 100644
--- a/lib/src/common/util/utils.dart
+++ b/lib/src/common/util/utils.dart
@@ -1,3 +1,5 @@
+// ignore_for_file: constant_identifier_names
+
 import 'package:github/src/common.dart';
 import 'package:meta/meta.dart';
 
diff --git a/lib/src/const/token_env_keys.dart b/lib/src/const/token_env_keys.dart
index 15d23a83..7a65804e 100644
--- a/lib/src/const/token_env_keys.dart
+++ b/lib/src/const/token_env_keys.dart
@@ -1,3 +1,4 @@
+// ignore: constant_identifier_names
 const List COMMON_GITHUB_TOKEN_ENV_KEYS = [
   'GITHUB_ADMIN_TOKEN',
   'GITHUB_DART_TOKEN',
diff --git a/pubspec.yaml b/pubspec.yaml
index 6c039ca0..5ca5bfbd 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: github
-version: 9.0.1
+version: 9.0.2-dev
 description: A high-level GitHub API Client Library that uses Github's v3 API
 homepage: https://github.com/SpinlockLabs/github.dart
 
@@ -18,7 +18,7 @@ dev_dependencies:
   build_test: any
   build_web_compilers: any
   json_serializable: ^6.0.0
+  lints: ^1.0.0
   mockito: ^5.0.0
-  pedantic: ^1.10.0
   test: ^1.16.0
   yaml: ^3.0.0
diff --git a/test/experiment/limit_pager.dart b/test/experiment/limit_pager.dart
index c8b14739..05654bfa 100755
--- a/test/experiment/limit_pager.dart
+++ b/test/experiment/limit_pager.dart
@@ -5,8 +5,8 @@ void main() {
   print(solve(201));
 }
 
-const int MAX_PER_PAGE = 100;
-const int ACCURACY_RANGE = 5;
+const int maxPerPage = 100;
+const int accuracyRange = 5;
 
 /// Solves the most efficient way to fetch the number of objects [limit] with the least requests.
 PaginationInformation solve(int limit) {
@@ -14,12 +14,12 @@ PaginationInformation solve(int limit) {
     throw RangeError('limit cannot be less than zero (was $limit)');
   }
 
-  if (limit < MAX_PER_PAGE) {
+  if (limit < maxPerPage) {
     return PaginationInformation(limit, 1, limit);
   }
 
-  if ((limit % MAX_PER_PAGE) == 0) {
-    return PaginationInformation(limit, limit ~/ MAX_PER_PAGE, MAX_PER_PAGE);
+  if ((limit % maxPerPage) == 0) {
+    return PaginationInformation(limit, limit ~/ maxPerPage, maxPerPage);
   }
 
   const itemsPerPage = 100;
diff --git a/test/src/mocks.mocks.dart b/test/src/mocks.mocks.dart
index 6a673895..bd1c1b8c 100644
--- a/test/src/mocks.mocks.dart
+++ b/test/src/mocks.mocks.dart
@@ -10,10 +10,12 @@ import 'package:mockito/mockito.dart' as _i1;
 
 // ignore_for_file: avoid_redundant_argument_values
 // ignore_for_file: avoid_setters_without_getters
+// ignore_for_file: camel_case_types
 // ignore_for_file: comment_references
 // ignore_for_file: implementation_imports
 // ignore_for_file: invalid_use_of_visible_for_testing_member
 // ignore_for_file: prefer_const_constructors
+// ignore_for_file: unnecessary_overrides
 // ignore_for_file: unnecessary_parenthesis
 
 class _FakeClient_0 extends _i1.Fake implements _i2.Client {}

From e91bdd823fe28de7c521b4632208d98fba717e8d Mon Sep 17 00:00:00 2001
From: Rob Becker 
Date: Sun, 13 Mar 2022 08:42:44 -0600
Subject: [PATCH 271/390] prep 9.0.2

---
 CHANGELOG.md | 3 ++-
 pubspec.yaml | 2 +-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 19f36604..afffef1d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,5 @@
-## 9.0.2-dev
+## 9.0.2
+- Switched to use the lints package instead of pedantic https://github.com/SpinlockLabs/github.dart/pull/301
 
 ## 9.0.1
 - Add `conclusion` property in class `CheckRun`
diff --git a/pubspec.yaml b/pubspec.yaml
index 5ca5bfbd..4a035a95 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: github
-version: 9.0.2-dev
+version: 9.0.2
 description: A high-level GitHub API Client Library that uses Github's v3 API
 homepage: https://github.com/SpinlockLabs/github.dart
 

From e6057d6a5a525b797b708459812294001b71bae9 Mon Sep 17 00:00:00 2001
From: Rob Becker 
Date: Sun, 13 Mar 2022 22:33:04 -0600
Subject: [PATCH 272/390] Adding auto-release on PR merge

---
 .github/workflows/auto_release_on_merge.yml |  33 ++++++
 tool/auto_release_on_merge.dart             | 113 ++++++++++++++++++++
 2 files changed, 146 insertions(+)
 create mode 100644 .github/workflows/auto_release_on_merge.yml
 create mode 100644 tool/auto_release_on_merge.dart

diff --git a/.github/workflows/auto_release_on_merge.yml b/.github/workflows/auto_release_on_merge.yml
new file mode 100644
index 00000000..21a6f293
--- /dev/null
+++ b/.github/workflows/auto_release_on_merge.yml
@@ -0,0 +1,33 @@
+name: Auto-Release on PR Merge
+
+# Runs when a PR merges. See https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#running-your-workflow-when-a-pull-request-merges
+on:
+  pull_request:
+    types:
+      - closed
+
+jobs:
+  release:
+    if: github.event.pull_request.merged == true
+    permissions:
+      contents: write
+    runs-on: ubuntu-latest
+    container: dart:2.14.4
+
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v3
+        with:
+          fetch-depth: 2
+          ref: master
+      - name: Release
+        run: |
+          git config --global user.name ${{ secrets.USER_NAME }}
+          git config --global user.email ${{ secrets.USER_EMAIL }}
+          export PATH="$PATH":"$HOME/.pub-cache/bin"
+          export GITHUB_TOKEN=${{secrets.GITHUB_TOKEN}}
+          export MACHINE_GITHUB_API_TOKEN=${{secrets.MACHINE_GITHUB_API_TOKEN}}
+          pub get
+          pub global activate cider
+          dart tool/auto_release_on_merge.dart ${{github.repository}} ${{github.event.pull_request.number}}
+          
\ No newline at end of file
diff --git a/tool/auto_release_on_merge.dart b/tool/auto_release_on_merge.dart
new file mode 100644
index 00000000..8510229a
--- /dev/null
+++ b/tool/auto_release_on_merge.dart
@@ -0,0 +1,113 @@
+import 'dart:io';
+import 'package:github/github.dart';
+import 'package:yaml/yaml.dart';
+
+const semvers = ['major', 'minor', 'patch'];
+
+/// Meant to be run from the github workflow.
+/// Expected arguments of:
+/// [repo] the full repo owner/name format
+/// [pr number] PR number of which to release
+/// the semver label is expected to be on the PR
+void main(List args) async {
+  if (args.length < 2) {
+    print('Usage: dart tool/auto_release_on_merge owner_and_repo pull_number');
+    exit(1);
+  }
+
+  final fullrepo = args[0];
+  final pullnumber = int.parse(args[1]);
+  final currentVersion = getVersion();
+  var slug = RepositorySlug.full(fullrepo);
+  var gh = GitHub(auth: findAuthenticationFromEnvironment());
+
+  print('Loading PR $pullnumber from $slug');
+  var pr = await gh.pullRequests.get(slug, pullnumber);
+  if (!(pr.merged ?? false)) {
+    print('PR not merged. skipping.');
+    exit(0);
+  }
+  print('PR $pullnumber loaded');
+
+  var labels = pr.labels ?? [];
+  var semverLabel = labels
+      .map((e) => e.name)
+      .firstWhere((label) => label.startsWith('semver'), orElse: () => '');
+  if (semverLabel.isEmpty) {
+    print('No semver label found');
+    exit(2);
+  }
+  semverLabel = semverLabel.toLowerCase().replaceAll('semver:', '').trim();
+  // ensure the semver label is valid
+  if (!semvers.contains(semverLabel)) {
+    print('semver label [$semverLabel] is not one of $semvers');
+    exit(3);
+  }
+  print('Semver label: $semverLabel');
+
+
+  run('cider bump $semverLabel');
+  var newVersion = getVersion();
+  print('Current Version: $currentVersion');
+  print('New Version    : $newVersion');
+
+  var rn = await gh.repositories.generateReleaseNotes(CreateReleaseNotes(
+      slug.owner, slug.name, newVersion,
+      previousTagName: currentVersion));
+
+  var releaseNotes = rn.body.replaceFirst('## What\'s Changed','');
+  releaseNotes = '## $newVersion\n$releaseNotes';
+  
+  print(releaseNotes);
+
+  var log = File('CHANGELOG.md');
+  var logdata = log.existsSync() ? log.readAsStringSync() : '';
+  log.writeAsStringSync('${releaseNotes}\n\n$logdata');
+  
+  run('git add pubspec.yaml CHANGELOG.md');
+  run('git', rest: ['commit', '-m', 'prep $newVersion']);
+  run('git push');
+  // var commit = run('git rev-parse HEAD');
+  // print('autoprep commit: $commit');
+
+  var release = await gh.repositories.createRelease(
+      slug,
+      CreateRelease.from(
+          tagName: newVersion,
+          name: newVersion,
+          generateReleaseNotes: true,
+          targetCommitish: 'master',
+          isDraft: false,
+          isPrerelease: false));
+
+  print('$newVersion release created at ${release.createdAt}');
+  exit(0);
+}
+
+String getVersion() {
+  var y = loadYaml(File('pubspec.yaml').readAsStringSync());
+  var newVersion = y['version'].toString();
+  return newVersion;
+}
+
+String run(String cmd, {List? rest}) {
+  var args = [];
+  if (rest != null) {
+    args = rest;
+  } else {
+    args = cmd.split(' ');
+    if (args.isEmpty) return '';
+    cmd = args.removeAt(0);
+  }
+  var result = Process.runSync(cmd, args);
+  if (result.exitCode != 0) {
+    print('Command failed');
+  }
+  if (result.stdout != null) print(result.stdout);
+  if (result.stderr != null) print(result.stderr);
+  if (result.exitCode != 0) {
+    exit(6);
+  }
+
+  return result.stdout;
+}
\ No newline at end of file

From c4ac82fae50e17743e66fb0686d21b946db52781 Mon Sep 17 00:00:00 2001
From: Rob Becker 
Date: Sun, 13 Mar 2022 22:35:45 -0600
Subject: [PATCH 273/390] dart format

---
 tool/auto_release_on_merge.dart | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/tool/auto_release_on_merge.dart b/tool/auto_release_on_merge.dart
index 8510229a..2b762bd0 100644
--- a/tool/auto_release_on_merge.dart
+++ b/tool/auto_release_on_merge.dart
@@ -45,7 +45,6 @@ void main(List args) async {
   }
   print('Semver label: $semverLabel');
 
-
   run('cider bump $semverLabel');
   var newVersion = getVersion();
   print('Current Version: $currentVersion');
@@ -55,15 +54,15 @@ void main(List args) async {
       slug.owner, slug.name, newVersion,
       previousTagName: currentVersion));
 
-  var releaseNotes = rn.body.replaceFirst('## What\'s Changed','');
+  var releaseNotes = rn.body.replaceFirst('## What\'s Changed', '');
   releaseNotes = '## $newVersion\n$releaseNotes';
-  
+
   print(releaseNotes);
 
   var log = File('CHANGELOG.md');
   var logdata = log.existsSync() ? log.readAsStringSync() : '';
   log.writeAsStringSync('${releaseNotes}\n\n$logdata');
-  
+
   run('git add pubspec.yaml CHANGELOG.md');
   run('git', rest: ['commit', '-m', 'prep $newVersion']);
   run('git push');
@@ -110,4 +109,4 @@ String run(String cmd, {List? rest}) {
   }
 
   return result.stdout;
-}
\ No newline at end of file
+}

From 92711184caf18d83b315f8c2f33fb3eba28b2c55 Mon Sep 17 00:00:00 2001
From: Rob Becker 
Date: Sun, 13 Mar 2022 22:42:53 -0600
Subject: [PATCH 274/390] Update Language Colors March 13th 2022

---
 lib/src/const/language_color.dart | 359 +++++++++++++++++-------------
 1 file changed, 206 insertions(+), 153 deletions(-)

diff --git a/lib/src/const/language_color.dart b/lib/src/const/language_color.dart
index d3546670..95bfc175 100644
--- a/lib/src/const/language_color.dart
+++ b/lib/src/const/language_color.dart
@@ -1,13 +1,15 @@
 // GENERATED CODE - DO NOT MODIFY BY HAND
-// VERSION OF 2021-02-14T13:29:43.072192
+// VERSION OF 2022-03-13T22:39:42.882755
 
 const languageColors = {
   '1C Enterprise': '#814CCC',
-  '4D': '#EDEDED',
+  '2-Dimensional Array': '#38761D',
+  '4D': '#004289',
   'ABAP': '#E8274B',
   'ABAP CDS': '#555E25',
   'ABNF': '#EDEDED',
   'AGS Script': '#B9D9FF',
+  'AIDL': '#34EB6B',
   'AL': '#3AA2B5',
   'AMPL': '#E6EFBB',
   'ANTLR': '#9DC3FF',
@@ -19,73 +21,81 @@ const languageColors = {
   'ATS': '#1AC620',
   'ActionScript': '#882B0F',
   'Ada': '#02F88C',
-  'Adobe Font Metrics': '#EDEDED',
+  'Adobe Font Metrics': '#FA0F00',
   'Agda': '#315665',
   'Alloy': '#64C800',
-  'Alpine Abuild': '#EDEDED',
-  'Altium Designer': '#EDEDED',
+  'Alpine Abuild': '#0D597F',
+  'Altium Designer': '#A89663',
   'AngelScript': '#C7D7DC',
-  'Ant Build System': '#EDEDED',
-  'ApacheConf': '#EDEDED',
+  'Ant Build System': '#A9157E',
+  'ApacheConf': '#D12127',
   'Apex': '#1797C0',
   'Apollo Guidance Computer': '#0B3D91',
   'AppleScript': '#101F1F',
   'Arc': '#AA2AFE',
-  'AsciiDoc': '#EDEDED',
+  'AsciiDoc': '#73A0C5',
   'AspectJ': '#A957B0',
   'Assembly': '#6E4C13',
+  'Astro': '#FF5A03',
   'Asymptote': '#FF0000',
-  'Augeas': '#EDEDED',
+  'Augeas': '#9CC134',
   'AutoHotkey': '#6594B9',
   'AutoIt': '#1C3552',
-  'Avro IDL': '#EDEDED',
-  'Awk': '#EDEDED',
+  'Avro IDL': '#0040FF',
+  'Awk': '#C30E9B',
+  'BASIC': '#FF0000',
   'Ballerina': '#FF5000',
   'Batchfile': '#C1F12E',
   'Beef': '#A52F4E',
   'Befunge': '#EDEDED',
-  'BibTeX': '#EDEDED',
+  'BibTeX': '#778899',
+  'Bicep': '#519ABA',
   'Bison': '#6A463F',
-  'BitBake': '#EDEDED',
+  'BitBake': '#00BCE4',
   'Blade': '#F7523F',
-  'BlitzBasic': '#EDEDED',
+  'BlitzBasic': '#00FFAE',
   'BlitzMax': '#CD6400',
-  'Bluespec': '#EDEDED',
+  'Bluespec': '#12223C',
   'Boo': '#D4BEC1',
   'Boogie': '#C80FA0',
   'Brainfuck': '#2F2530',
-  'Brightscript': '#EDEDED',
+  'Brightscript': '#662D91',
   'Browserslist': '#FFD539',
   'C': '#555555',
   'C#': '#178600',
   'C++': '#F34B7D',
   'C-ObjDump': '#EDEDED',
   'C2hs Haskell': '#EDEDED',
-  'CLIPS': '#EDEDED',
-  'CMake': '#EDEDED',
+  'CIL': '#EDEDED',
+  'CLIPS': '#00A300',
+  'CMake': '#DA3434',
   'COBOL': '#EDEDED',
-  'COLLADA': '#EDEDED',
+  'CODEOWNERS': '#EDEDED',
+  'COLLADA': '#F1A42B',
   'CSON': '#244776',
   'CSS': '#563D7C',
-  'CSV': '#EDEDED',
-  'CWeb': '#EDEDED',
-  'Cabal Config': '#EDEDED',
-  'Cap\'n Proto': '#EDEDED',
+  'CSV': '#237346',
+  'CUE': '#5886E1',
+  'CWeb': '#00007A',
+  'Cabal Config': '#483465',
+  'Cairo': '#FF4A48',
+  'Cap\'n Proto': '#C42727',
   'CartoCSS': '#EDEDED',
   'Ceylon': '#DFA535',
   'Chapel': '#8DC63F',
   'Charity': '#EDEDED',
-  'ChucK': '#EDEDED',
+  'ChucK': '#3F8000',
   'Cirru': '#CCCCFF',
   'Clarion': '#DB901E',
+  'Clarity': '#5546FF',
   'Classic ASP': '#6A40FD',
   'Clean': '#3F85AF',
   'Click': '#E4E6F3',
   'Clojure': '#DB5855',
   'Closure Templates': '#0D948F',
-  'Cloud Firestore Security Rules': '#EDEDED',
+  'Cloud Firestore Security Rules': '#FFA000',
   'CoNLL-U': '#EDEDED',
-  'CodeQL': '#EDEDED',
+  'CodeQL': '#140F46',
   'CoffeeScript': '#244776',
   'ColdFusion': '#ED2CD6',
   'ColdFusion CFC': '#ED2CD6',
@@ -93,16 +103,18 @@ const languageColors = {
   'Common Workflow Language': '#B5314C',
   'Component Pascal': '#B0CE4E',
   'Cool': '#EDEDED',
-  'Coq': '#EDEDED',
+  'Coq': '#D0B68C',
   'Cpp-ObjDump': '#EDEDED',
   'Creole': '#EDEDED',
   'Crystal': '#000100',
-  'Csound': '#EDEDED',
-  'Csound Document': '#EDEDED',
-  'Csound Score': '#EDEDED',
+  'Csound': '#1A1A1A',
+  'Csound Document': '#1A1A1A',
+  'Csound Score': '#1A1A1A',
   'Cuda': '#3A4E3A',
+  'Cue Sheet': '#EDEDED',
+  'Curry': '#531242',
   'Cycript': '#EDEDED',
-  'Cython': '#EDEDED',
+  'Cython': '#FEDF5B',
   'D': '#BA595E',
   'D-ObjDump': '#EDEDED',
   'DIGITAL Command Language': '#EDEDED',
@@ -110,26 +122,29 @@ const languageColors = {
   'DNS Zone': '#EDEDED',
   'DTrace': '#EDEDED',
   'Dafny': '#FFEC25',
-  'Darcs Patch': '#EDEDED',
+  'Darcs Patch': '#8EFF23',
   'Dart': '#00B4AB',
   'DataWeave': '#003A52',
+  'Debian Package Control File': '#D70751',
+  'DenizenScript': '#FBEE96',
   'Dhall': '#DFAFFF',
   'Diff': '#EDEDED',
-  'DirectX 3D File': '#EDEDED',
+  'DirectX 3D File': '#AACE60',
   'Dockerfile': '#384D54',
   'Dogescript': '#CCA760',
   'Dylan': '#6C616E',
   'E': '#CCCE35',
+  'E-mail': '#EDEDED',
   'EBNF': '#EDEDED',
   'ECL': '#8A1267',
-  'ECLiPSe': '#EDEDED',
+  'ECLiPSe': '#001D9D',
   'EJS': '#A91E50',
-  'EML': '#EDEDED',
   'EQ': '#A78649',
   'Eagle': '#EDEDED',
-  'Easybuild': '#EDEDED',
-  'Ecere Projects': '#EDEDED',
-  'EditorConfig': '#EDEDED',
+  'Earthly': '#2AF0FF',
+  'Easybuild': '#069406',
+  'Ecere Projects': '#913960',
+  'EditorConfig': '#FFF1F2',
   'Edje Data Collection': '#EDEDED',
   'Eiffel': '#4D6977',
   'Elixir': '#6E4A7E',
@@ -137,69 +152,77 @@ const languageColors = {
   'Emacs Lisp': '#C065DB',
   'EmberScript': '#FFF4F3',
   'Erlang': '#B83998',
+  'Euphoria': '#FF790B',
   'F#': '#B845FC',
   'F*': '#572E30',
-  'FIGlet Font': '#EDEDED',
+  'FIGlet Font': '#FFDDBB',
   'FLUX': '#88CCFF',
   'Factor': '#636746',
   'Fancy': '#7B9DB4',
   'Fantom': '#14253C',
   'Faust': '#C37240',
-  'Filebench WML': '#EDEDED',
+  'Fennel': '#FFF3D7',
+  'Filebench WML': '#F6B900',
   'Filterscript': '#EDEDED',
+  'Fluent': '#FFCC33',
   'Formatted': '#EDEDED',
   'Forth': '#341708',
   'Fortran': '#4D41B1',
-  'Fortran Free Form': '#EDEDED',
+  'Fortran Free Form': '#4D41B1',
+  'FreeBasic': '#867DB1',
   'FreeMarker': '#0050B2',
   'Frege': '#00CAFE',
   'Futhark': '#5F021F',
   'G-code': '#D08CF2',
   'GAML': '#FFC766',
-  'GAMS': '#EDEDED',
-  'GAP': '#EDEDED',
-  'GCC Machine Description': '#EDEDED',
+  'GAMS': '#F49A22',
+  'GAP': '#0000CC',
+  'GCC Machine Description': '#FFCFAB',
   'GDB': '#EDEDED',
   'GDScript': '#355570',
-  'GEDCOM': '#EDEDED',
-  'GLSL': '#EDEDED',
+  'GEDCOM': '#003058',
+  'GLSL': '#5686A5',
   'GN': '#EDEDED',
+  'GSC': '#FF6800',
   'Game Maker Language': '#71B417',
+  'Gemfile.lock': '#701516',
   'Genie': '#FB855D',
-  'Genshi': '#EDEDED',
-  'Gentoo Ebuild': '#EDEDED',
-  'Gentoo Eclass': '#EDEDED',
-  'Gerber Image': '#EDEDED',
+  'Genshi': '#951531',
+  'Gentoo Ebuild': '#9400FF',
+  'Gentoo Eclass': '#9400FF',
+  'Gerber Image': '#D20B00',
   'Gettext Catalog': '#EDEDED',
   'Gherkin': '#5B2063',
-  'Git Attributes': '#EDEDED',
-  'Git Config': '#EDEDED',
+  'Git Attributes': '#F44D27',
+  'Git Config': '#F44D27',
+  'Gleam': '#FFAFF3',
   'Glyph': '#C1AC7F',
   'Glyph Bitmap Distribution Format': '#EDEDED',
   'Gnuplot': '#F0A9F0',
   'Go': '#00ADD8',
+  'Go Checksums': '#00ADD8',
+  'Go Module': '#00ADD8',
   'Golo': '#88562A',
   'Gosu': '#82937F',
-  'Grace': '#EDEDED',
-  'Gradle': '#EDEDED',
+  'Grace': '#615F8B',
+  'Gradle': '#02303A',
   'Grammatical Framework': '#FF0000',
   'Graph Modeling Language': '#EDEDED',
   'GraphQL': '#E10098',
-  'Graphviz (DOT)': '#EDEDED',
-  'Groovy': '#E69F56',
-  'Groovy Server Pages': '#EDEDED',
-  'HAProxy': '#EDEDED',
+  'Graphviz (DOT)': '#2596BE',
+  'Groovy': '#4298B8',
+  'Groovy Server Pages': '#4298B8',
+  'HAProxy': '#106DA9',
   'HCL': '#EDEDED',
-  'HLSL': '#EDEDED',
+  'HLSL': '#AACE60',
   'HTML': '#E34C26',
-  'HTML+Django': '#EDEDED',
-  'HTML+ECR': '#EDEDED',
-  'HTML+EEX': '#EDEDED',
-  'HTML+ERB': '#EDEDED',
-  'HTML+PHP': '#EDEDED',
-  'HTML+Razor': '#EDEDED',
-  'HTTP': '#EDEDED',
-  'HXML': '#EDEDED',
+  'HTML+ECR': '#2E1052',
+  'HTML+EEX': '#6E4A7E',
+  'HTML+ERB': '#701516',
+  'HTML+PHP': '#4F5D95',
+  'HTML+Razor': '#512BE4',
+  'HTTP': '#005C9C',
+  'HXML': '#F68712',
   'Hack': '#878787',
   'Haml': '#ECE2A9',
   'Handlebars': '#F7931E',
@@ -212,66 +235,72 @@ const languageColors = {
   'HyPhy': '#EDEDED',
   'IDL': '#A3522F',
   'IGOR Pro': '#0000CC',
-  'INI': '#EDEDED',
+  'INI': '#D1DBE0',
   'IRC log': '#EDEDED',
   'Idris': '#B30000',
-  'Ignore List': '#EDEDED',
+  'Ignore List': '#000000',
   'ImageJ Macro': '#99AAFF',
   'Inform 7': '#EDEDED',
-  'Inno Setup': '#EDEDED',
+  'Inno Setup': '#264B99',
   'Io': '#A9188D',
   'Ioke': '#078193',
   'Isabelle': '#FEFE00',
-  'Isabelle ROOT': '#EDEDED',
+  'Isabelle ROOT': '#FEFE00',
   'J': '#9EEDFF',
+  'JAR Manifest': '#B07219',
   'JFlex': '#DBCA00',
-  'JSON': '#EDEDED',
-  'JSON with Comments': '#EDEDED',
-  'JSON5': '#EDEDED',
-  'JSONLD': '#EDEDED',
+  'JSON': '#292929',
+  'JSON with Comments': '#292929',
+  'JSON5': '#267CB9',
+  'JSONLD': '#0C479C',
   'JSONiq': '#40D47E',
-  'Jasmin': '#EDEDED',
+  'Janet': '#0886A5',
+  'Jasmin': '#D03600',
   'Java': '#B07219',
-  'Java Properties': '#EDEDED',
-  'Java Server Pages': '#EDEDED',
+  'Java Properties': '#2A6277',
+  'Java Server Pages': '#2A6277',
   'JavaScript': '#F1E05A',
-  'JavaScript+ERB': '#EDEDED',
-  'Jison': '#EDEDED',
-  'Jison Lex': '#EDEDED',
+  'JavaScript+ERB': '#F1E05A',
+  'Jest Snapshot': '#15C213',
+  'Jinja': '#A52A22',
+  'Jison': '#56B3CB',
+  'Jison Lex': '#56B3CB',
   'Jolie': '#843179',
   'Jsonnet': '#0064BD',
   'Julia': '#A270BA',
   'Jupyter Notebook': '#DA5B0B',
   'KRL': '#28430A',
   'Kaitai Struct': '#773B37',
-  'KiCad Layout': '#EDEDED',
-  'KiCad Legacy Layout': '#EDEDED',
-  'KiCad Schematic': '#EDEDED',
+  'KakouneScript': '#6F8042',
+  'KiCad Layout': '#2F4AAB',
+  'KiCad Legacy Layout': '#2F4AAB',
+  'KiCad Schematic': '#2F4AAB',
   'Kit': '#EDEDED',
-  'Kotlin': '#F18E33',
+  'Kotlin': '#A97BFF',
+  'Kusto': '#EDEDED',
   'LFE': '#4C3023',
   'LLVM': '#185619',
   'LOLCODE': '#CC9900',
   'LSL': '#3D9970',
   'LTspice Symbol': '#EDEDED',
-  'LabVIEW': '#EDEDED',
-  'Lark': '#0B130F',
+  'LabVIEW': '#FEDE06',
+  'Lark': '#2980B9',
   'Lasso': '#999999',
   'Latte': '#F2A542',
   'Lean': '#EDEDED',
   'Less': '#1D365D',
   'Lex': '#DBCA00',
-  'LilyPond': '#EDEDED',
+  'LilyPond': '#9CCC7C',
   'Limbo': '#EDEDED',
   'Linker Script': '#EDEDED',
   'Linux Kernel Module': '#EDEDED',
   'Liquid': '#67B8DE',
-  'Literate Agda': '#EDEDED',
-  'Literate CoffeeScript': '#EDEDED',
-  'Literate Haskell': '#EDEDED',
+  'Literate Agda': '#315665',
+  'Literate CoffeeScript': '#244776',
+  'Literate Haskell': '#5E5086',
   'LiveScript': '#499886',
   'Logos': '#EDEDED',
-  'Logtalk': '#EDEDED',
+  'Logtalk': '#295B9A',
   'LookML': '#652B81',
   'LoomScript': '#EDEDED',
   'Lua': '#000080',
@@ -287,28 +316,31 @@ const languageColors = {
   'MUF': '#EDEDED',
   'Macaulay2': '#D8FFFF',
   'Makefile': '#427819',
-  'Mako': '#EDEDED',
+  'Mako': '#7E858D',
   'Markdown': '#083FA1',
   'Marko': '#42BFF2',
   'Mask': '#F97732',
-  'Mathematica': '#EDEDED',
+  'Mathematica': '#DD1100',
   'Maven POM': '#EDEDED',
   'Max': '#C4A79C',
-  'MediaWiki': '#EDEDED',
   'Mercury': '#FF2B2B',
   'Meson': '#007800',
   'Metal': '#8F14E9',
   'Microsoft Developer Studio Project': '#EDEDED',
+  'Microsoft Visual Studio Solution': '#EDEDED',
   'MiniD': '#EDEDED',
+  'MiniYAML': '#FF1111',
+  'Mint': '#02B046',
   'Mirah': '#C7A938',
-  'Modelica': '#EDEDED',
-  'Modula-2': '#EDEDED',
+  'Modelica': '#DE1D31',
+  'Modula-2': '#10253F',
   'Modula-3': '#223388',
   'Module Management System': '#EDEDED',
   'Monkey': '#EDEDED',
   'Moocode': '#EDEDED',
-  'MoonScript': '#EDEDED',
-  'Motorola 68K Assembly': '#EDEDED',
+  'MoonScript': '#FF4585',
+  'Motoko': '#FBB03B',
+  'Motorola 68K Assembly': '#005DAA',
   'Muse': '#EDEDED',
   'Mustache': '#724B3B',
   'Myghty': '#EDEDED',
@@ -316,7 +348,7 @@ const languageColors = {
   'NCL': '#28431F',
   'NEON': '#EDEDED',
   'NL': '#EDEDED',
-  'NPM Config': '#EDEDED',
+  'NPM Config': '#CB3837',
   'NSIS': '#EDEDED',
   'NWScript': '#111522',
   'Nearley': '#990000',
@@ -326,7 +358,7 @@ const languageColors = {
   'NetLogo': '#FF6375',
   'NewLisp': '#87AED7',
   'Nextflow': '#3AC486',
-  'Nginx': '#EDEDED',
+  'Nginx': '#009639',
   'Nim': '#FFC200',
   'Ninja': '#EDEDED',
   'Nit': '#009917',
@@ -345,12 +377,12 @@ const languageColors = {
   'Omgrofl': '#CABBFF',
   'Opa': '#EDEDED',
   'Opal': '#F7EDE0',
-  'Open Policy Agent': '#EDEDED',
-  'OpenCL': '#EDEDED',
-  'OpenEdge ABL': '#EDEDED',
+  'Open Policy Agent': '#7D9199',
+  'OpenCL': '#ED2E2D',
+  'OpenEdge ABL': '#5CE600',
   'OpenQASM': '#AA70FF',
   'OpenRC runscript': '#EDEDED',
-  'OpenSCAD': '#EDEDED',
+  'OpenSCAD': '#E5CD45',
   'OpenStep Property List': '#EDEDED',
   'OpenType Feature File': '#EDEDED',
   'Org': '#77AA99',
@@ -358,10 +390,11 @@ const languageColors = {
   'Oxygene': '#CDD0E3',
   'Oz': '#FAB738',
   'P4': '#7055B5',
+  'PEG.js': '#234D6B',
   'PHP': '#4F5D95',
   'PLSQL': '#DAD8D8',
-  'PLpgSQL': '#EDEDED',
-  'POV-Ray SDL': '#EDEDED',
+  'PLpgSQL': '#336790',
+  'POV-Ray SDL': '#6BAC65',
   'Pan': '#CC0000',
   'Papyrus': '#6600CC',
   'Parrot': '#F3CA0A',
@@ -373,7 +406,7 @@ const languageColors = {
   'Perl': '#0298C3',
   'Pic': '#EDEDED',
   'Pickle': '#EDEDED',
-  'PicoLisp': '#EDEDED',
+  'PicoLisp': '#6067AF',
   'PigLatin': '#FCD7DE',
   'Pike': '#005390',
   'PlantUML': '#EDEDED',
@@ -381,16 +414,19 @@ const languageColors = {
   'Pod 6': '#EDEDED',
   'PogoScript': '#D80074',
   'Pony': '#EDEDED',
-  'PostCSS': '#EDEDED',
+  'PostCSS': '#DC3A0C',
   'PostScript': '#DA291C',
   'PowerBuilder': '#8F0F8D',
   'PowerShell': '#012456',
   'Prisma': '#0C344B',
   'Processing': '#0096D8',
+  'Procfile': '#3B2F63',
   'Proguard': '#EDEDED',
   'Prolog': '#74283C',
+  'Promela': '#DE0000',
   'Propeller Spin': '#7FA2A7',
   'Protocol Buffer': '#EDEDED',
+  'Protocol Buffer Text Format': '#EDEDED',
   'Public Key': '#EDEDED',
   'Pug': '#A86454',
   'Puppet': '#302B6D',
@@ -398,8 +434,8 @@ const languageColors = {
   'PureBasic': '#5A6986',
   'PureScript': '#1D222D',
   'Python': '#3572A5',
-  'Python console': '#EDEDED',
-  'Python traceback': '#EDEDED',
+  'Python console': '#3572A5',
+  'Python traceback': '#3572A5',
   'Q#': '#FED659',
   'QML': '#44A51C',
   'QMake': '#EDEDED',
@@ -407,11 +443,12 @@ const languageColors = {
   'Quake': '#882233',
   'R': '#198CE7',
   'RAML': '#77D9FB',
-  'RDoc': '#EDEDED',
+  'RDoc': '#701516',
   'REALbasic': '#EDEDED',
-  'REXX': '#EDEDED',
-  'RMarkdown': '#EDEDED',
+  'REXX': '#D90E09',
+  'RMarkdown': '#198CE7',
   'RPC': '#EDEDED',
+  'RPGLE': '#2BDE21',
   'RPM Spec': '#EDEDED',
   'RUNOFF': '#665A4E',
   'Racket': '#3C5CAA',
@@ -426,25 +463,27 @@ const languageColors = {
   'Record Jar': '#0673BA',
   'Red': '#F50000',
   'Redcode': '#EDEDED',
-  'Regular Expression': '#EDEDED',
+  'Redirect Rules': '#EDEDED',
+  'Regular Expression': '#009A00',
   'Ren\'Py': '#FF7F7F',
   'RenderScript': '#EDEDED',
   'Rich Text Format': '#EDEDED',
   'Ring': '#2D54CB',
   'Riot': '#A71E49',
-  'RobotFramework': '#EDEDED',
+  'RobotFramework': '#00C0B5',
   'Roff': '#ECDEBE',
-  'Roff Manpage': '#EDEDED',
+  'Roff Manpage': '#ECDEBE',
   'Rouge': '#CC0088',
   'Ruby': '#701516',
   'Rust': '#DEA584',
   'SAS': '#B34936',
   'SCSS': '#C6538C',
+  'SELinux Policy': '#EDEDED',
   'SMT': '#EDEDED',
-  'SPARQL': '#EDEDED',
+  'SPARQL': '#0C4597',
   'SQF': '#3F3F3F',
-  'SQL': '#EDEDED',
-  'SQLPL': '#EDEDED',
+  'SQL': '#E38C00',
+  'SQLPL': '#E38C00',
   'SRecode Template': '#348A34',
   'SSH Config': '#EDEDED',
   'STON': '#EDEDED',
@@ -456,42 +495,46 @@ const languageColors = {
   'Scala': '#C22D40',
   'Scaml': '#BD181A',
   'Scheme': '#1E4AEC',
-  'Scilab': '#EDEDED',
+  'Scilab': '#CA0F21',
   'Self': '#0579AA',
-  'ShaderLab': '#EDEDED',
+  'ShaderLab': '#222C37',
   'Shell': '#89E051',
+  'ShellCheck Config': '#CECFCB',
   'ShellSession': '#EDEDED',
   'Shen': '#120F14',
   'Sieve': '#EDEDED',
+  'Singularity': '#64E6AD',
   'Slash': '#007EFF',
   'Slice': '#003FA2',
   'Slim': '#2B2B2B',
   'SmPL': '#C94949',
   'Smali': '#EDEDED',
   'Smalltalk': '#596706',
-  'Smarty': '#EDEDED',
+  'Smarty': '#F0C040',
   'Solidity': '#AA6746',
+  'Soong': '#EDEDED',
   'SourcePawn': '#F69E1D',
   'Spline Font Database': '#EDEDED',
   'Squirrel': '#800000',
   'Stan': '#B2011D',
   'Standard ML': '#DC566D',
   'Starlark': '#76D275',
-  'Stata': '#EDEDED',
+  'Stata': '#1A5F91',
+  'StringTemplate': '#3FB34F',
   'Stylus': '#FF6347',
-  'SubRip Text': '#EDEDED',
-  'SugarSS': '#EDEDED',
+  'SubRip Text': '#9E0101',
+  'SugarSS': '#2FCC9F',
   'SuperCollider': '#46390B',
   'Svelte': '#FF3E00',
-  'Swift': '#FFAC45',
+  'Swift': '#F05138',
   'SystemVerilog': '#DAE1C2',
   'TI Program': '#A0AA87',
-  'TLA': '#EDEDED',
-  'TOML': '#EDEDED',
-  'TSQL': '#EDEDED',
-  'TSV': '#EDEDED',
-  'TSX': '#EDEDED',
-  'TXL': '#EDEDED',
+  'TLA': '#4B0079',
+  'TOML': '#9C4221',
+  'TSQL': '#E38C00',
+  'TSV': '#237346',
+  'TSX': '#2B7489',
+  'TXL': '#0178B8',
   'Tcl': '#E4CC98',
   'Tcsh': '#EDEDED',
   'TeX': '#3D6117',
@@ -499,57 +542,63 @@ const languageColors = {
   'Terra': '#00004C',
   'Texinfo': '#EDEDED',
   'Text': '#EDEDED',
-  'Textile': '#EDEDED',
-  'Thrift': '#EDEDED',
+  'TextMate Properties': '#DF66E4',
+  'Textile': '#FFE7AC',
+  'Thrift': '#D12127',
   'Turing': '#CF142B',
   'Turtle': '#EDEDED',
   'Twig': '#C1D026',
   'Type Language': '#EDEDED',
   'TypeScript': '#2B7489',
   'Unified Parallel C': '#4E3617',
-  'Unity3D Asset': '#EDEDED',
+  'Unity3D Asset': '#222C37',
   'Unix Assembly': '#EDEDED',
   'Uno': '#9933CC',
   'UnrealScript': '#A54C4D',
-  'UrWeb': '#EDEDED',
+  'UrWeb': '#CCCCEE',
   'V': '#4F87C4',
   'VBA': '#867DB1',
   'VBScript': '#15DCDC',
   'VCL': '#148AA8',
   'VHDL': '#ADB2CB',
   'Vala': '#FBE5CD',
+  'Valve Data Format': '#F26025',
   'Verilog': '#B2B7F8',
-  'Vim Help File': '#EDEDED',
-  'Vim Snippet': '#EDEDED',
-  'Vim script': '#199F4B',
+  'Vim Help File': '#199F4B',
+  'Vim Script': '#199F4B',
+  'Vim Snippet': '#199F4B',
   'Visual Basic .NET': '#945DB7',
   'Volt': '#1F1F1F',
-  'Vue': '#2C3E50',
+  'Vue': '#41B883',
+  'Vyper': '#2980B9',
   'Wavefront Material': '#EDEDED',
   'Wavefront Object': '#EDEDED',
-  'Web Ontology Language': '#EDEDED',
+  'Web Ontology Language': '#5B70BD',
   'WebAssembly': '#04133B',
   'WebIDL': '#EDEDED',
   'WebVTT': '#EDEDED',
   'Wget Config': '#EDEDED',
-  'Windows Registry Entries': '#EDEDED',
+  'Wikitext': '#FC5757',
+  'Windows Registry Entries': '#52D5FF',
+  'Witcher Script': '#FF0000',
   'Wollok': '#A23738',
-  'World of Warcraft Addon Data': '#EDEDED',
+  'World of Warcraft Addon Data': '#F7E43F',
   'X BitMap': '#EDEDED',
   'X Font Directory Index': '#EDEDED',
   'X PixMap': '#EDEDED',
   'X10': '#4B6BEF',
   'XC': '#99DA07',
   'XCompose': '#EDEDED',
-  'XML': '#EDEDED',
-  'XML Property List': '#EDEDED',
+  'XML': '#0060AC',
+  'XML Property List': '#0060AC',
   'XPages': '#EDEDED',
   'XProc': '#EDEDED',
   'XQuery': '#5232E7',
   'XS': '#EDEDED',
   'XSLT': '#EB8CEB',
-  'Xojo': '#EDEDED',
-  'Xtend': '#EDEDED',
+  'Xojo': '#81BD41',
+  'Xonsh': '#285EEF',
+  'Xtend': '#24255D',
   'YAML': '#CB171E',
   'YANG': '#EDEDED',
   'YARA': '#220000',
@@ -561,21 +610,25 @@ const languageColors = {
   'ZenScript': '#00BCD1',
   'Zephir': '#118F9E',
   'Zig': '#EC915C',
-  'Zimpl': '#EDEDED',
+  'Zimpl': '#D67711',
   'cURL Config': '#EDEDED',
   'desktop': '#EDEDED',
   'dircolors': '#EDEDED',
   'eC': '#913960',
   'edn': '#EDEDED',
-  'fish': '#EDEDED',
+  'fish': '#4AAE47',
+  'hoon': '#00B171',
+  'jq': '#C7254E',
+  'kvlang': '#1DA6E0',
   'mIRC Script': '#3D57C3',
   'mcfunction': '#E22837',
-  'mupad': '#EDEDED',
-  'nanorc': '#EDEDED',
+  'mupad': '#244963',
+  'nanorc': '#2D004D',
   'nesC': '#94B0C7',
   'ooc': '#B0B77E',
   'q': '#0040CD',
-  'reStructuredText': '#EDEDED',
+  'reStructuredText': '#141414',
+  'robots.txt': '#EDEDED',
   'sed': '#64B970',
   'wdl': '#42F1F4',
   'wisp': '#7582D1',

From 46a06fec3c12596b460ed56a08ab576731bc2fc0 Mon Sep 17 00:00:00 2001
From: robrbecker 
Date: Mon, 14 Mar 2022 04:46:34 +0000
Subject: [PATCH 275/390] prep 9.0.3

---
 CHANGELOG.md | 7 +++++++
 pubspec.yaml | 2 +-
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index afffef1d..7813d830 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,10 @@
+## 9.0.3
+
+* Update Language Colors March 13th 2022 by @robrbecker in https://github.com/SpinlockLabs/github.dart/pull/302
+
+
+**Full Changelog**: https://github.com/SpinlockLabs/github.dart/compare/9.0.2...9.0.3
+
 ## 9.0.2
 - Switched to use the lints package instead of pedantic https://github.com/SpinlockLabs/github.dart/pull/301
 
diff --git a/pubspec.yaml b/pubspec.yaml
index 4a035a95..7065b6fa 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: github
-version: 9.0.2
+version: 9.0.3
 description: A high-level GitHub API Client Library that uses Github's v3 API
 homepage: https://github.com/SpinlockLabs/github.dart
 

From e79e5e7a2ae9f29796a9d6dfd39b84106f23b2e8 Mon Sep 17 00:00:00 2001
From: Rob Becker 
Date: Mon, 14 Mar 2022 17:25:47 -0600
Subject: [PATCH 276/390] update contributing guide

---
 CONTRIBUTING.md | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index ddf07a0a..d9a74cae 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -38,3 +38,12 @@ Pull Request rejections are not a bad thing. It just means you need to fix somet
 ## Becoming a Committer
 
 If you get on IRC and ask us, we can review your work and add you as a committer if we think you should have it.
+
+## Releasing & Publishing
+
+This repo is now configured to release after every PR merge. This means a couple things for PRs that are put up:
+
+1. A semver label is required. A github check will remind you that you need one. Reviewers should check that it is correct.
+2. There is no need to modify the version in the pubspec.yaml in your PRs. The tooling will update the version according to the semver label applied to your PR.
+3. Same thing for the CHANGELOG.md. Tooling will update it automatically after merge.
+4. A github release will be created and published ot pub.dev for you.
\ No newline at end of file

From 55b7aef3c3c9e1609466596d24e6d6253614fae9 Mon Sep 17 00:00:00 2001
From: Xilai Zhang 
Date: Mon, 28 Mar 2022 11:28:21 -0700
Subject: [PATCH 277/390] create event from githhub webhook event

---
 lib/src/server/hooks.dart   | 21 +++++++++++++++++++++
 lib/src/server/hooks.g.dart | 21 +++++++++++++++++++++
 test/src/mocks.mocks.dart   |  8 +++-----
 3 files changed, 45 insertions(+), 5 deletions(-)

diff --git a/lib/src/server/hooks.dart b/lib/src/server/hooks.dart
index 8c8ac396..b33a5b8e 100644
--- a/lib/src/server/hooks.dart
+++ b/lib/src/server/hooks.dart
@@ -214,3 +214,24 @@ class PullRequestEvent extends HookEvent {
       _$PullRequestEventFromJson(input);
   Map toJson() => _$PullRequestEventToJson(this);
 }
+
+@JsonSerializable(fieldRename: FieldRename.snake)
+class CreateEvent extends HookEvent {
+  CreateEvent({
+    this.ref,
+    this.refType,
+    this.pusherType,
+    this.repository,
+    this.sender,
+  });
+
+  factory CreateEvent.fromJson(Map input) => _$CreateEventFromJson(input);
+  String? ref;
+  String? refType;
+  String? pusherType;
+  Repository? repository;
+  User? sender;
+
+  Map toJson() => _$CreateEventToJson(this);
+}
+
diff --git a/lib/src/server/hooks.g.dart b/lib/src/server/hooks.g.dart
index 108b0e7a..3babd5cf 100644
--- a/lib/src/server/hooks.g.dart
+++ b/lib/src/server/hooks.g.dart
@@ -152,3 +152,24 @@ Map _$PullRequestEventToJson(PullRequestEvent instance) =>
       'sender': instance.sender,
       'repository': instance.repository,
     };
+
+CreateEvent _$CreateEventFromJson(Map json) => CreateEvent(
+      ref: json['ref'] as String?,
+      refType: json['ref_type'] as String?,
+      pusherType: json['pusher_type'] as String?,
+      repository: json['repository'] == null
+          ? null
+          : Repository.fromJson(json['repository'] as Map),
+      sender: json['sender'] == null
+          ? null
+          : User.fromJson(json['sender'] as Map),
+    );
+
+Map _$CreateEventToJson(CreateEvent instance) =>
+    {
+      'ref': instance.ref,
+      'ref_type': instance.refType,
+      'pusher_type': instance.pusherType,
+      'repository': instance.repository,
+      'sender': instance.sender,
+    };
diff --git a/test/src/mocks.mocks.dart b/test/src/mocks.mocks.dart
index bd1c1b8c..03e42ae9 100644
--- a/test/src/mocks.mocks.dart
+++ b/test/src/mocks.mocks.dart
@@ -1,4 +1,4 @@
-// Mocks generated by Mockito 5.0.15 from annotations
+// Mocks generated by Mockito 5.1.0 from annotations
 // in github/test/src/mocks.dart.
 // Do not manually edit this file.
 
@@ -8,15 +8,15 @@ import 'package:github/src/common.dart' as _i3;
 import 'package:http/http.dart' as _i2;
 import 'package:mockito/mockito.dart' as _i1;
 
+// ignore_for_file: type=lint
 // ignore_for_file: avoid_redundant_argument_values
 // ignore_for_file: avoid_setters_without_getters
-// ignore_for_file: camel_case_types
 // ignore_for_file: comment_references
 // ignore_for_file: implementation_imports
 // ignore_for_file: invalid_use_of_visible_for_testing_member
 // ignore_for_file: prefer_const_constructors
-// ignore_for_file: unnecessary_overrides
 // ignore_for_file: unnecessary_parenthesis
+// ignore_for_file: camel_case_types
 
 class _FakeClient_0 extends _i1.Fake implements _i2.Client {}
 
@@ -259,6 +259,4 @@ class MockGitHub extends _i1.Mock implements _i3.GitHub {
   @override
   void dispose() => super.noSuchMethod(Invocation.method(#dispose, []),
       returnValueForMissingStub: null);
-  @override
-  String toString() => super.toString();
 }

From 3fd3fe5816c6156d6e6850f569fc5974513d59de Mon Sep 17 00:00:00 2001
From: Xilai Zhang 
Date: Mon, 28 Mar 2022 11:37:40 -0700
Subject: [PATCH 278/390] Revert "create event from githhub webhook event"

This reverts commit 55b7aef3c3c9e1609466596d24e6d6253614fae9.
---
 lib/src/server/hooks.dart   | 21 ---------------------
 lib/src/server/hooks.g.dart | 21 ---------------------
 test/src/mocks.mocks.dart   |  8 +++++---
 3 files changed, 5 insertions(+), 45 deletions(-)

diff --git a/lib/src/server/hooks.dart b/lib/src/server/hooks.dart
index b33a5b8e..8c8ac396 100644
--- a/lib/src/server/hooks.dart
+++ b/lib/src/server/hooks.dart
@@ -214,24 +214,3 @@ class PullRequestEvent extends HookEvent {
       _$PullRequestEventFromJson(input);
   Map toJson() => _$PullRequestEventToJson(this);
 }
-
-@JsonSerializable(fieldRename: FieldRename.snake)
-class CreateEvent extends HookEvent {
-  CreateEvent({
-    this.ref,
-    this.refType,
-    this.pusherType,
-    this.repository,
-    this.sender,
-  });
-
-  factory CreateEvent.fromJson(Map input) => _$CreateEventFromJson(input);
-  String? ref;
-  String? refType;
-  String? pusherType;
-  Repository? repository;
-  User? sender;
-
-  Map toJson() => _$CreateEventToJson(this);
-}
-
diff --git a/lib/src/server/hooks.g.dart b/lib/src/server/hooks.g.dart
index 3babd5cf..108b0e7a 100644
--- a/lib/src/server/hooks.g.dart
+++ b/lib/src/server/hooks.g.dart
@@ -152,24 +152,3 @@ Map _$PullRequestEventToJson(PullRequestEvent instance) =>
       'sender': instance.sender,
       'repository': instance.repository,
     };
-
-CreateEvent _$CreateEventFromJson(Map json) => CreateEvent(
-      ref: json['ref'] as String?,
-      refType: json['ref_type'] as String?,
-      pusherType: json['pusher_type'] as String?,
-      repository: json['repository'] == null
-          ? null
-          : Repository.fromJson(json['repository'] as Map),
-      sender: json['sender'] == null
-          ? null
-          : User.fromJson(json['sender'] as Map),
-    );
-
-Map _$CreateEventToJson(CreateEvent instance) =>
-    {
-      'ref': instance.ref,
-      'ref_type': instance.refType,
-      'pusher_type': instance.pusherType,
-      'repository': instance.repository,
-      'sender': instance.sender,
-    };
diff --git a/test/src/mocks.mocks.dart b/test/src/mocks.mocks.dart
index 03e42ae9..bd1c1b8c 100644
--- a/test/src/mocks.mocks.dart
+++ b/test/src/mocks.mocks.dart
@@ -1,4 +1,4 @@
-// Mocks generated by Mockito 5.1.0 from annotations
+// Mocks generated by Mockito 5.0.15 from annotations
 // in github/test/src/mocks.dart.
 // Do not manually edit this file.
 
@@ -8,15 +8,15 @@ import 'package:github/src/common.dart' as _i3;
 import 'package:http/http.dart' as _i2;
 import 'package:mockito/mockito.dart' as _i1;
 
-// ignore_for_file: type=lint
 // ignore_for_file: avoid_redundant_argument_values
 // ignore_for_file: avoid_setters_without_getters
+// ignore_for_file: camel_case_types
 // ignore_for_file: comment_references
 // ignore_for_file: implementation_imports
 // ignore_for_file: invalid_use_of_visible_for_testing_member
 // ignore_for_file: prefer_const_constructors
+// ignore_for_file: unnecessary_overrides
 // ignore_for_file: unnecessary_parenthesis
-// ignore_for_file: camel_case_types
 
 class _FakeClient_0 extends _i1.Fake implements _i2.Client {}
 
@@ -259,4 +259,6 @@ class MockGitHub extends _i1.Mock implements _i3.GitHub {
   @override
   void dispose() => super.noSuchMethod(Invocation.method(#dispose, []),
       returnValueForMissingStub: null);
+  @override
+  String toString() => super.toString();
 }

From 3e6410e99ceaaab4052bc3463fce067f56c7e83c Mon Sep 17 00:00:00 2001
From: Xilai Zhang 
Date: Mon, 28 Mar 2022 11:39:18 -0700
Subject: [PATCH 279/390] create webhook event, without edit to mocks.mocks

---
 lib/src/server/hooks.dart   | 20 ++++++++++++++++++++
 lib/src/server/hooks.g.dart | 21 +++++++++++++++++++++
 2 files changed, 41 insertions(+)

diff --git a/lib/src/server/hooks.dart b/lib/src/server/hooks.dart
index 8c8ac396..93bf330b 100644
--- a/lib/src/server/hooks.dart
+++ b/lib/src/server/hooks.dart
@@ -214,3 +214,23 @@ class PullRequestEvent extends HookEvent {
       _$PullRequestEventFromJson(input);
   Map toJson() => _$PullRequestEventToJson(this);
 }
+
+@JsonSerializable(fieldRename: FieldRename.snake)
+class CreateEvent extends HookEvent {
+  CreateEvent({
+    this.ref,
+    this.refType,
+    this.pusherType,
+    this.repository,
+    this.sender,
+  });
+
+  factory CreateEvent.fromJson(Map input) => _$CreateEventFromJson(input);
+  String? ref;
+  String? refType;
+  String? pusherType;
+  Repository? repository;
+  User? sender;
+
+  Map toJson() => _$CreateEventToJson(this);
+}
diff --git a/lib/src/server/hooks.g.dart b/lib/src/server/hooks.g.dart
index 108b0e7a..3babd5cf 100644
--- a/lib/src/server/hooks.g.dart
+++ b/lib/src/server/hooks.g.dart
@@ -152,3 +152,24 @@ Map _$PullRequestEventToJson(PullRequestEvent instance) =>
       'sender': instance.sender,
       'repository': instance.repository,
     };
+
+CreateEvent _$CreateEventFromJson(Map json) => CreateEvent(
+      ref: json['ref'] as String?,
+      refType: json['ref_type'] as String?,
+      pusherType: json['pusher_type'] as String?,
+      repository: json['repository'] == null
+          ? null
+          : Repository.fromJson(json['repository'] as Map),
+      sender: json['sender'] == null
+          ? null
+          : User.fromJson(json['sender'] as Map),
+    );
+
+Map _$CreateEventToJson(CreateEvent instance) =>
+    {
+      'ref': instance.ref,
+      'ref_type': instance.refType,
+      'pusher_type': instance.pusherType,
+      'repository': instance.repository,
+      'sender': instance.sender,
+    };

From 696559aafc6abbeea678da84af2960e977283223 Mon Sep 17 00:00:00 2001
From: Xilai Zhang 
Date: Mon, 28 Mar 2022 17:33:29 -0700
Subject: [PATCH 280/390] add test

---
 test/server/hooks_test.dart      |  18 +++++
 test/server/hooks_test_data.dart | 124 +++++++++++++++++++++++++++++++
 2 files changed, 142 insertions(+)

diff --git a/test/server/hooks_test.dart b/test/server/hooks_test.dart
index b9d87e65..09deae27 100644
--- a/test/server/hooks_test.dart
+++ b/test/server/hooks_test.dart
@@ -39,4 +39,22 @@ void main() {
       expect(checkRun.status, CheckRunStatus.queued);
     });
   });
+
+  group('CreateEvent', () {
+    test('deserialize', () async {
+      final createEvent = CreateEvent.fromJson(
+          json.decode(createString) as Map);
+      expect(createEvent.ref, 'simple-branch');
+      expect(createEvent.refType, 'branch');
+      expect(createEvent.pusherType, 'user');
+
+      final repo = createEvent.repository!;
+      expect(repo.slug().fullName, 'Codertocat/Hello-World');
+      expect(repo.id, 186853002);
+
+      final sender = createEvent.sender!;
+      expect(sender.login, "Codertocat");
+      expect(sender.htmlUrl, "https://github.com/Codertocat");
+    });
+  });
 }
diff --git a/test/server/hooks_test_data.dart b/test/server/hooks_test_data.dart
index 6d780d51..c6f12f84 100644
--- a/test/server/hooks_test_data.dart
+++ b/test/server/hooks_test_data.dart
@@ -548,3 +548,127 @@ const String checkRunString = '''
   }
 }
 ''';
+
+const String createString = '''
+{
+  "ref": "simple-branch",
+  "ref_type": "branch",
+  "master_branch": "master",
+  "description": null,
+  "pusher_type": "user",
+  "repository": {
+    "id": 186853002,
+    "node_id": "MDEwOlJlcG9zaXRvcnkxODY4NTMwMDI=",
+    "name": "Hello-World",
+    "full_name": "Codertocat/Hello-World",
+    "private": false,
+    "owner": {
+      "login": "Codertocat",
+      "id": 21031067,
+      "node_id": "MDQ6VXNlcjIxMDMxMDY3",
+      "avatar_url": "https://avatars1.githubusercontent.com/u/21031067?v=4",
+      "gravatar_id": "",
+      "url": "https://api.github.com/users/Codertocat",
+      "html_url": "https://github.com/Codertocat",
+      "followers_url": "https://api.github.com/users/Codertocat/followers",
+      "following_url": "https://api.github.com/users/Codertocat/following{/other_user}",
+      "gists_url": "https://api.github.com/users/Codertocat/gists{/gist_id}",
+      "starred_url": "https://api.github.com/users/Codertocat/starred{/owner}{/repo}",
+      "subscriptions_url": "https://api.github.com/users/Codertocat/subscriptions",
+      "organizations_url": "https://api.github.com/users/Codertocat/orgs",
+      "repos_url": "https://api.github.com/users/Codertocat/repos",
+      "events_url": "https://api.github.com/users/Codertocat/events{/privacy}",
+      "received_events_url": "https://api.github.com/users/Codertocat/received_events",
+      "type": "User",
+      "site_admin": false
+    },
+    "html_url": "https://github.com/Codertocat/Hello-World",
+    "description": null,
+    "fork": false,
+    "url": "https://api.github.com/repos/Codertocat/Hello-World",
+    "forks_url": "https://api.github.com/repos/Codertocat/Hello-World/forks",
+    "keys_url": "https://api.github.com/repos/Codertocat/Hello-World/keys{/key_id}",
+    "collaborators_url": "https://api.github.com/repos/Codertocat/Hello-World/collaborators{/collaborator}",
+    "teams_url": "https://api.github.com/repos/Codertocat/Hello-World/teams",
+    "hooks_url": "https://api.github.com/repos/Codertocat/Hello-World/hooks",
+    "issue_events_url": "https://api.github.com/repos/Codertocat/Hello-World/issues/events{/number}",
+    "events_url": "https://api.github.com/repos/Codertocat/Hello-World/events",
+    "assignees_url": "https://api.github.com/repos/Codertocat/Hello-World/assignees{/user}",
+    "branches_url": "https://api.github.com/repos/Codertocat/Hello-World/branches{/branch}",
+    "tags_url": "https://api.github.com/repos/Codertocat/Hello-World/tags",
+    "blobs_url": "https://api.github.com/repos/Codertocat/Hello-World/git/blobs{/sha}",
+    "git_tags_url": "https://api.github.com/repos/Codertocat/Hello-World/git/tags{/sha}",
+    "git_refs_url": "https://api.github.com/repos/Codertocat/Hello-World/git/refs{/sha}",
+    "trees_url": "https://api.github.com/repos/Codertocat/Hello-World/git/trees{/sha}",
+    "statuses_url": "https://api.github.com/repos/Codertocat/Hello-World/statuses/{sha}",
+    "languages_url": "https://api.github.com/repos/Codertocat/Hello-World/languages",
+    "stargazers_url": "https://api.github.com/repos/Codertocat/Hello-World/stargazers",
+    "contributors_url": "https://api.github.com/repos/Codertocat/Hello-World/contributors",
+    "subscribers_url": "https://api.github.com/repos/Codertocat/Hello-World/subscribers",
+    "subscription_url": "https://api.github.com/repos/Codertocat/Hello-World/subscription",
+    "commits_url": "https://api.github.com/repos/Codertocat/Hello-World/commits{/sha}",
+    "git_commits_url": "https://api.github.com/repos/Codertocat/Hello-World/git/commits{/sha}",
+    "comments_url": "https://api.github.com/repos/Codertocat/Hello-World/comments{/number}",
+    "issue_comment_url": "https://api.github.com/repos/Codertocat/Hello-World/issues/comments{/number}",
+    "contents_url": "https://api.github.com/repos/Codertocat/Hello-World/contents/{+path}",
+    "compare_url": "https://api.github.com/repos/Codertocat/Hello-World/compare/{base}...{head}",
+    "merges_url": "https://api.github.com/repos/Codertocat/Hello-World/merges",
+    "archive_url": "https://api.github.com/repos/Codertocat/Hello-World/{archive_format}{/ref}",
+    "downloads_url": "https://api.github.com/repos/Codertocat/Hello-World/downloads",
+    "issues_url": "https://api.github.com/repos/Codertocat/Hello-World/issues{/number}",
+    "pulls_url": "https://api.github.com/repos/Codertocat/Hello-World/pulls{/number}",
+    "milestones_url": "https://api.github.com/repos/Codertocat/Hello-World/milestones{/number}",
+    "notifications_url": "https://api.github.com/repos/Codertocat/Hello-World/notifications{?since,all,participating}",
+    "labels_url": "https://api.github.com/repos/Codertocat/Hello-World/labels{/name}",
+    "releases_url": "https://api.github.com/repos/Codertocat/Hello-World/releases{/id}",
+    "deployments_url": "https://api.github.com/repos/Codertocat/Hello-World/deployments",
+    "created_at": "2019-05-15T15:19:25Z",
+    "updated_at": "2019-05-15T15:20:41Z",
+    "pushed_at": "2019-05-15T15:20:56Z",
+    "git_url": "git://github.com/Codertocat/Hello-World.git",
+    "ssh_url": "git@github.com:Codertocat/Hello-World.git",
+    "clone_url": "https://github.com/Codertocat/Hello-World.git",
+    "svn_url": "https://github.com/Codertocat/Hello-World",
+    "homepage": null,
+    "size": 0,
+    "stargazers_count": 0,
+    "watchers_count": 0,
+    "language": "Ruby",
+    "has_issues": true,
+    "has_projects": true,
+    "has_downloads": true,
+    "has_wiki": true,
+    "has_pages": true,
+    "forks_count": 1,
+    "mirror_url": null,
+    "archived": false,
+    "disabled": false,
+    "open_issues_count": 2,
+    "license": null,
+    "forks": 1,
+    "open_issues": 2,
+    "watchers": 0,
+    "default_branch": "master"
+  },
+  "sender": {
+    "login": "Codertocat",
+    "id": 21031067,
+    "node_id": "MDQ6VXNlcjIxMDMxMDY3",
+    "avatar_url": "https://avatars1.githubusercontent.com/u/21031067?v=4",
+    "gravatar_id": "",
+    "url": "https://api.github.com/users/Codertocat",
+    "html_url": "https://github.com/Codertocat",
+    "followers_url": "https://api.github.com/users/Codertocat/followers",
+    "following_url": "https://api.github.com/users/Codertocat/following{/other_user}",
+    "gists_url": "https://api.github.com/users/Codertocat/gists{/gist_id}",
+    "starred_url": "https://api.github.com/users/Codertocat/starred{/owner}{/repo}",
+    "subscriptions_url": "https://api.github.com/users/Codertocat/subscriptions",
+    "organizations_url": "https://api.github.com/users/Codertocat/orgs",
+    "repos_url": "https://api.github.com/users/Codertocat/repos",
+    "events_url": "https://api.github.com/users/Codertocat/events{/privacy}",
+    "received_events_url": "https://api.github.com/users/Codertocat/received_events",
+    "type": "User",
+    "site_admin": false
+  }
+}
+''';

From 4d2a485f21e6d54e986315e0880d5ec3587a83dd Mon Sep 17 00:00:00 2001
From: Xilai Zhang 
Date: Tue, 29 Mar 2022 10:02:48 -0700
Subject: [PATCH 281/390] format files

---
 lib/src/server/hooks.dart | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/lib/src/server/hooks.dart b/lib/src/server/hooks.dart
index 93bf330b..ea250c48 100644
--- a/lib/src/server/hooks.dart
+++ b/lib/src/server/hooks.dart
@@ -225,7 +225,8 @@ class CreateEvent extends HookEvent {
     this.sender,
   });
 
-  factory CreateEvent.fromJson(Map input) => _$CreateEventFromJson(input);
+  factory CreateEvent.fromJson(Map input) =>
+      _$CreateEventFromJson(input);
   String? ref;
   String? refType;
   String? pusherType;

From 781e8beb889162f7f3b4f662b1f66dccb4dc25f0 Mon Sep 17 00:00:00 2001
From: Rob Becker 
Date: Tue, 29 Mar 2022 16:36:21 -0600
Subject: [PATCH 282/390] prep 9.1.0

---
 CHANGELOG.md | 9 +++++++++
 pubspec.yaml | 2 +-
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7813d830..a8a57b4e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,12 @@
+## 9.1.0
+
+* add 'create' github webhook event to hooks.dart by @XilaiZhang in https://github.com/SpinlockLabs/github.dart/pull/304
+
+## New Contributors
+* @XilaiZhang made their first contribution in https://github.com/SpinlockLabs/github.dart/pull/304
+
+**Full Changelog**: https://github.com/SpinlockLabs/github.dart/compare/9.0.3...9.1.0
+
 ## 9.0.3
 
 * Update Language Colors March 13th 2022 by @robrbecker in https://github.com/SpinlockLabs/github.dart/pull/302
diff --git a/pubspec.yaml b/pubspec.yaml
index 7065b6fa..01e5fbde 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: github
-version: 9.0.3
+version: 9.1.0
 description: A high-level GitHub API Client Library that uses Github's v3 API
 homepage: https://github.com/SpinlockLabs/github.dart
 

From 28446163b310d1df756232240486609ad7660f48 Mon Sep 17 00:00:00 2001
From: Rob Becker 
Date: Thu, 7 Apr 2022 05:23:48 -0400
Subject: [PATCH 283/390] add beta dependabot

---
 .github/dependabot.yaml | 7 +++++++
 1 file changed, 7 insertions(+)
 create mode 100644 .github/dependabot.yaml

diff --git a/.github/dependabot.yaml b/.github/dependabot.yaml
new file mode 100644
index 00000000..39bd9ac1
--- /dev/null
+++ b/.github/dependabot.yaml
@@ -0,0 +1,7 @@
+version: 2
+enable-beta-ecosystems: true
+updates:
+  - package-ecosystem: "pub"
+    directory: "/"
+    schedule:
+      interval: "weekly"
\ No newline at end of file

From 70db48001c85c454e5d258617626f82acce56669 Mon Sep 17 00:00:00 2001
From: Rob Becker 
Date: Mon, 11 Apr 2022 12:45:46 -0600
Subject: [PATCH 284/390] prep 9.1.1

---
 CHANGELOG.md | 7 +++++++
 pubspec.yaml | 2 +-
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index a8a57b4e..f1de1051 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,10 @@
+## 9.1.1
+
+* Don't add state query param twice by @passsy in https://github.com/SpinlockLabs/github.dart/pull/264
+
+
+**Full Changelog**: https://github.com/SpinlockLabs/github.dart/compare/9.1.0...9.1.1
+
 ## 9.1.0
 
 * add 'create' github webhook event to hooks.dart by @XilaiZhang in https://github.com/SpinlockLabs/github.dart/pull/304
diff --git a/pubspec.yaml b/pubspec.yaml
index 01e5fbde..3d088c7b 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: github
-version: 9.1.0
+version: 9.1.1
 description: A high-level GitHub API Client Library that uses Github's v3 API
 homepage: https://github.com/SpinlockLabs/github.dart
 

From e679667362176cb22c3f5af7efc4087cc8566ec2 Mon Sep 17 00:00:00 2001
From: Rob Becker 
Date: Mon, 11 Apr 2022 15:44:34 -0600
Subject: [PATCH 285/390] dart format

---
 lib/src/common/pulls_service.dart | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/lib/src/common/pulls_service.dart b/lib/src/common/pulls_service.dart
index 4a49521b..38f659c9 100644
--- a/lib/src/common/pulls_service.dart
+++ b/lib/src/common/pulls_service.dart
@@ -29,12 +29,9 @@ class PullRequestsService extends Service {
     putValue('sort', sort, params);
     putValue('state', state, params);
 
-    return PaginationHelper(github).objects(
-        'GET',
-        '/repos/${slug.fullName}/pulls',
-        (dynamic i) => PullRequest.fromJson(i),
-        pages: pages,
-        params: params);
+    return PaginationHelper(github).objects('GET',
+        '/repos/${slug.fullName}/pulls', (dynamic i) => PullRequest.fromJson(i),
+        pages: pages, params: params);
   }
 
   /// Fetches a single pull request.

From 76887704d6b6ad60879c8f049ddaf9c315a138a5 Mon Sep 17 00:00:00 2001
From: Rob Becker 
Date: Sat, 16 Apr 2022 21:31:48 -0600
Subject: [PATCH 286/390] fixes for error handling and createComment

---
 lib/src/common/github.dart        |  25 +++--
 lib/src/common/pulls_service.dart |   4 +-
 pubspec.yaml                      |   5 +-
 tool/auto_release_on_merge.dart   | 112 --------------------
 tool/release_unreleased_prs.dart  | 170 ++++++++++++++++++++++++++++++
 5 files changed, 191 insertions(+), 125 deletions(-)
 delete mode 100644 tool/auto_release_on_merge.dart
 create mode 100644 tool/release_unreleased_prs.dart

diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart
index 31605c91..e715c2a9 100644
--- a/lib/src/common/github.dart
+++ b/lib/src/common/github.dart
@@ -419,19 +419,24 @@ class GitHub {
   ///
   @alwaysThrows
   void handleStatusCode(http.Response response) {
-    String? message;
+    print(response.body);
+    String? message = '';
     List>? errors;
     if (response.headers['content-type']!.contains('application/json')) {
-      final json = jsonDecode(response.body);
-      message = json['message'];
-      if (json['errors'] != null) {
-        try {
-          errors = List>.from(json['errors']);
-        } catch (_) {
-          errors = [
-            {'code': json['errors'].toString()}
-          ];
+      try {
+        final json = jsonDecode(response.body);
+        message = json['message'];
+        if (json['errors'] != null) {
+          try {
+            errors = List>.from(json['errors']);
+          } catch (_) {
+            errors = [
+              {'code': json['errors'].toString()}
+            ];
+          }
         }
+      } catch (ex) {
+        print(ex);
       }
     }
     switch (response.statusCode) {
diff --git a/lib/src/common/pulls_service.dart b/lib/src/common/pulls_service.dart
index 8c1d3633..7c05a010 100644
--- a/lib/src/common/pulls_service.dart
+++ b/lib/src/common/pulls_service.dart
@@ -164,12 +164,12 @@ class PullRequestsService extends Service {
   /// Creates a new pull request comment.
   ///
   /// API docs: https://developer.github.com/v3/pulls/comments/#create-a-comment
-  Future createComment(
+  Future createComment(
       RepositorySlug slug, int number, CreatePullRequestComment comment) {
     return github.postJSON('/repos/${slug.fullName}/pulls/$number/comments',
         body: GitHubJson.encode(comment.toJson()),
         convert: (dynamic i) => PullRequestComment.fromJson(i),
-        statusCode: 201) as Future;
+        statusCode: 201);
   }
 
   // TODO: Implement editComment: https://developer.github.com/v3/pulls/comments/#edit-a-comment
diff --git a/pubspec.yaml b/pubspec.yaml
index 01e5fbde..8a31d767 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -7,7 +7,6 @@ environment:
   sdk: '>=2.14.0 <3.0.0'
 
 dependencies:
-  collection: ^1.15.0
   http: ^0.13.0
   http_parser: ^4.0.0
   json_annotation: ^4.3.0
@@ -17,8 +16,12 @@ dev_dependencies:
   build_runner: any
   build_test: any
   build_web_compilers: any
+  collection: ^1.15.0
+  dependency_validator:
   json_serializable: ^6.0.0
   lints: ^1.0.0
   mockito: ^5.0.0
+  pub_semver: 
   test: ^1.16.0
   yaml: ^3.0.0
+  yaml_edit: 
diff --git a/tool/auto_release_on_merge.dart b/tool/auto_release_on_merge.dart
deleted file mode 100644
index 2b762bd0..00000000
--- a/tool/auto_release_on_merge.dart
+++ /dev/null
@@ -1,112 +0,0 @@
-import 'dart:io';
-import 'package:github/github.dart';
-import 'package:yaml/yaml.dart';
-
-const semvers = ['major', 'minor', 'patch'];
-
-/// Meant to be run from the github workflow.
-/// Expected arguments of:
-/// [repo] the full repo owner/name format
-/// [pr number] PR number of which to release
-/// the semver label is expected to be on the PR
-void main(List args) async {
-  if (args.length < 2) {
-    print('Usage: dart tool/auto_release_on_merge owner_and_repo pull_number');
-    exit(1);
-  }
-
-  final fullrepo = args[0];
-  final pullnumber = int.parse(args[1]);
-  final currentVersion = getVersion();
-  var slug = RepositorySlug.full(fullrepo);
-  var gh = GitHub(auth: findAuthenticationFromEnvironment());
-
-  print('Loading PR $pullnumber from $slug');
-  var pr = await gh.pullRequests.get(slug, pullnumber);
-  if (!(pr.merged ?? false)) {
-    print('PR not merged. skipping.');
-    exit(0);
-  }
-  print('PR $pullnumber loaded');
-
-  var labels = pr.labels ?? [];
-  var semverLabel = labels
-      .map((e) => e.name)
-      .firstWhere((label) => label.startsWith('semver'), orElse: () => '');
-  if (semverLabel.isEmpty) {
-    print('No semver label found');
-    exit(2);
-  }
-  semverLabel = semverLabel.toLowerCase().replaceAll('semver:', '').trim();
-  // ensure the semver label is valid
-  if (!semvers.contains(semverLabel)) {
-    print('semver label [$semverLabel] is not one of $semvers');
-    exit(3);
-  }
-  print('Semver label: $semverLabel');
-
-  run('cider bump $semverLabel');
-  var newVersion = getVersion();
-  print('Current Version: $currentVersion');
-  print('New Version    : $newVersion');
-
-  var rn = await gh.repositories.generateReleaseNotes(CreateReleaseNotes(
-      slug.owner, slug.name, newVersion,
-      previousTagName: currentVersion));
-
-  var releaseNotes = rn.body.replaceFirst('## What\'s Changed', '');
-  releaseNotes = '## $newVersion\n$releaseNotes';
-
-  print(releaseNotes);
-
-  var log = File('CHANGELOG.md');
-  var logdata = log.existsSync() ? log.readAsStringSync() : '';
-  log.writeAsStringSync('${releaseNotes}\n\n$logdata');
-
-  run('git add pubspec.yaml CHANGELOG.md');
-  run('git', rest: ['commit', '-m', 'prep $newVersion']);
-  run('git push');
-  // var commit = run('git rev-parse HEAD');
-  // print('autoprep commit: $commit');
-
-  var release = await gh.repositories.createRelease(
-      slug,
-      CreateRelease.from(
-          tagName: newVersion,
-          name: newVersion,
-          generateReleaseNotes: true,
-          targetCommitish: 'master',
-          isDraft: false,
-          isPrerelease: false));
-
-  print('$newVersion release created at ${release.createdAt}');
-  exit(0);
-}
-
-String getVersion() {
-  var y = loadYaml(File('pubspec.yaml').readAsStringSync());
-  var newVersion = y['version'].toString();
-  return newVersion;
-}
-
-String run(String cmd, {List? rest}) {
-  var args = [];
-  if (rest != null) {
-    args = rest;
-  } else {
-    args = cmd.split(' ');
-    if (args.isEmpty) return '';
-    cmd = args.removeAt(0);
-  }
-  var result = Process.runSync(cmd, args);
-  if (result.exitCode != 0) {
-    print('Command failed');
-  }
-  if (result.stdout != null) print(result.stdout);
-  if (result.stderr != null) print(result.stderr);
-  if (result.exitCode != 0) {
-    exit(6);
-  }
-
-  return result.stdout;
-}
diff --git a/tool/release_unreleased_prs.dart b/tool/release_unreleased_prs.dart
new file mode 100644
index 00000000..3bec7a3d
--- /dev/null
+++ b/tool/release_unreleased_prs.dart
@@ -0,0 +1,170 @@
+import 'dart:io';
+import 'package:github/github.dart';
+import 'package:pub_semver/pub_semver.dart';
+import 'package:yaml_edit/yaml_edit.dart';
+
+///////////////////////////////////////////////////////////
+const mainBranchName = 'main';
+const semverMajor = 'semver:major';
+const semverMinor = 'semver:minor';
+const semverPatch = 'semver:patch';
+const semvers = [semverMajor, semverMinor, semverPatch];
+const fullrepo = 'SpinlockLabs/github.dart';
+///////////////////////////////////////////////////////////
+
+var _gh = GitHub(auth: findAuthenticationFromEnvironment());
+var _slug = RepositorySlug.full(fullrepo);
+
+Future main(List args) async {
+  // get the latest released version
+  var latestVersion = await getLatestVersion(_slug);
+
+  // get all PRs (issues) that are merged but unreleased
+  var unreleased = await getUnreleasedPRs();
+
+  if (unreleased.isEmpty) {
+    print('No unreleased PRs found');
+    return;
+  }
+
+  // Calculate the next version
+  var nextVersion = getNextVersion(latestVersion, unreleased);
+
+  // Use the new version to generate release notes
+  var notes = await generateReleaseNotes(latestVersion.toString(), nextVersion);
+
+  // update the changelog with the new release notes
+  updateChangeLog(notes, nextVersion);
+
+  // update the version in the pubspec
+  updatePubspec(nextVersion);
+
+  // commit those changes and push them
+  commitUpdates(nextVersion);
+
+  // create a new release in github at main
+  await createRelease(nextVersion, mainBranchName);
+
+  // remove the unreleased labels
+  for (final i in unreleased) {
+    await _gh.issues.removeLabelForIssue(_slug, i.number, 'unreleased');
+    await _gh.issues.addLabelsToIssue(_slug, i.number, ['released']);
+    await _gh.issues.createComment(_slug, i.number, 'Released in version $nextVersion https://github.com/$fullrepo/releases/tag/$nextVersion');
+  }
+
+  exit(0);
+}
+
+String run(String cmd, {List? rest}) {
+  var args = [];
+  if (rest != null) {
+    args = rest;
+  } else {
+    args = cmd.split(' ');
+    if (args.isEmpty) {
+      return '';
+    }
+    cmd = args.removeAt(0);
+  }
+  var result = Process.runSync(cmd, args);
+  if (result.exitCode != 0) {
+    print('Command failed');
+  }
+  if (result.stdout != null) {
+    print(result.stdout);
+  }
+  if (result.stderr != null) {
+    print(result.stderr);
+  }
+  // if (result.exitCode != 0) {
+  //   exit(6);
+  // }
+
+  return result.stdout;
+}
+
+Future getLatestVersion(RepositorySlug slug) async {
+  var latestRelease = await _gh.repositories.getLatestRelease(slug);
+  var latestTag = latestRelease.tagName!;
+  print('Latest Tag: $latestTag');
+  return Version.parse(latestTag);
+}
+
+Future> getUnreleasedPRs() async {
+  print('Loading unreleased PRs...');
+  var prs = await _gh.search.issues('repo:${_slug.fullName} is:pull-request label:unreleased state:closed', sort: 'desc').toList();
+  print('${prs.length} loaded');
+  return prs;
+}
+
+String getNextVersion(Version currentVersion, List unreleased) {
+  var semvers = Set();
+  for (final pr in unreleased){
+    var prlabels = pr.labels.where((element) => element.name.startsWith('semver:')).toList();
+    for (final l in prlabels) {
+      semvers.add(l.name);
+    }
+  }
+  print('Calculating next version based on $semvers');
+  var newVersion = '';
+  if (semvers.contains('semver:major')) {
+    newVersion = currentVersion.nextMajor.toString();
+  } else if (semvers.contains('semver:minor')) {
+    newVersion = currentVersion.nextMinor.toString();
+  } else if (semvers.contains('semver:patch')) {
+    newVersion = currentVersion.nextPatch.toString();
+  }
+  print('Next Version: $newVersion');
+  return newVersion;
+}
+
+Future generateReleaseNotes(String fromVersion, String newVersion) async {
+  var notes = await _gh.repositories.generateReleaseNotes(CreateReleaseNotes(
+      _slug.owner, _slug.name, newVersion,
+      previousTagName: fromVersion));
+  
+  var releaseNotes = notes.body.replaceFirst('## What\'s Changed', '');
+  
+  var r = '## $newVersion\n$releaseNotes';
+  print(r);
+  return r;
+}
+
+void updateChangeLog(String notes, String version) {
+  var log = File('CHANGELOG.md');
+  var logdata = log.existsSync() ? log.readAsStringSync() : '';
+  if (logdata.contains('## $version')) {
+    return;
+  }
+  log.writeAsStringSync('$notes\n\n$logdata');
+}
+
+void updatePubspec(String newVersion) {
+  var f = File('pubspec.yaml');
+  var editor = YamlEditor(f.readAsStringSync());
+  editor.update(['version'], newVersion);
+  f.writeAsStringSync(editor.toString());
+}
+
+Future createRelease(String version, String target) async {
+    print('Creating release ...');
+    var release = await _gh.repositories.createRelease(
+      _slug,
+      CreateRelease.from(
+          tagName: version,
+          name: version,
+          generateReleaseNotes: true,
+          targetCommitish: target,
+          isDraft: false,
+          isPrerelease: false));
+
+    print('Release ${release.name} created ${release.createdAt}');
+    print(release.body);
+    return release;
+}
+
+void commitUpdates(String version) {
+  run('git add pubspec.yaml CHANGELOG.md');
+  run('git', rest: ['commit', '-m', 'prep $version']);
+  run('git push');
+}
\ No newline at end of file

From 52fe66c45db103c534b576096bdf0841b7039a1b Mon Sep 17 00:00:00 2001
From: Rob Becker 
Date: Sat, 16 Apr 2022 21:33:14 -0600
Subject: [PATCH 287/390] fix getIfExists when creating a release

---
 lib/src/common/repos_service.dart | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart
index 04163260..45904bc2 100644
--- a/lib/src/common/repos_service.dart
+++ b/lib/src/common/repos_service.dart
@@ -1003,7 +1003,11 @@ class RepositoriesService extends Service {
       if (alreadyExistsErrorCode != null) {
         final field = alreadyExistsErrorCode['field'];
         if (field == 'tag_name') {
-          return getReleaseByTagName(slug, createRelease.tagName);
+          if (getIfExists) {
+            return getReleaseByTagName(slug, createRelease.tagName);
+          } else {
+            throw Exception('Tag / Release already exists ${createRelease.tagName}');
+          }
         }
       } else {
         print(

From 08327e50e5da6263b1d42f2f4f1823564dc86895 Mon Sep 17 00:00:00 2001
From: Rob Becker 
Date: Sat, 16 Apr 2022 21:33:59 -0600
Subject: [PATCH 288/390] update github workflows

---
 ..._on_merge.yml => release_unreleased_prs.yml} | 17 ++++++++---------
 .github/workflows/require_semver_label.yml      |  9 +++++++--
 .github/workflows/tests.yml                     |  4 ----
 .github/workflows/triage.yml                    |  2 +-
 .pubignore                                      |  3 +++
 5 files changed, 19 insertions(+), 16 deletions(-)
 rename .github/workflows/{auto_release_on_merge.yml => release_unreleased_prs.yml} (60%)
 create mode 100644 .pubignore

diff --git a/.github/workflows/auto_release_on_merge.yml b/.github/workflows/release_unreleased_prs.yml
similarity index 60%
rename from .github/workflows/auto_release_on_merge.yml
rename to .github/workflows/release_unreleased_prs.yml
index 21a6f293..2999ef34 100644
--- a/.github/workflows/auto_release_on_merge.yml
+++ b/.github/workflows/release_unreleased_prs.yml
@@ -1,6 +1,7 @@
-name: Auto-Release on PR Merge
+name: Release unreleased PR
 
-# Runs when a PR merges. See https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#running-your-workflow-when-a-pull-request-merges
+# Runs when a PR merges.
+# See https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#running-your-workflow-when-a-pull-request-merges
 on:
   pull_request:
     types:
@@ -9,25 +10,23 @@ on:
 jobs:
   release:
     if: github.event.pull_request.merged == true
-    permissions:
-      contents: write
     runs-on: ubuntu-latest
     container: dart:2.14.4
+    permissions:
+      contents: write
 
     steps:
       - name: Checkout
         uses: actions/checkout@v3
         with:
           fetch-depth: 2
-          ref: master
+          ref: main
       - name: Release
         run: |
           git config --global user.name ${{ secrets.USER_NAME }}
           git config --global user.email ${{ secrets.USER_EMAIL }}
           export PATH="$PATH":"$HOME/.pub-cache/bin"
-          export GITHUB_TOKEN=${{secrets.GITHUB_TOKEN}}
+          export GITHUB_TOKEN=${{secrets.MACHINE_GITHUB_API_TOKEN}}
           export MACHINE_GITHUB_API_TOKEN=${{secrets.MACHINE_GITHUB_API_TOKEN}}
           pub get
-          pub global activate cider
-          dart tool/auto_release_on_merge.dart ${{github.repository}} ${{github.event.pull_request.number}}
-          
\ No newline at end of file
+          dart tool/release_unreleased_prs.dart
\ No newline at end of file
diff --git a/.github/workflows/require_semver_label.yml b/.github/workflows/require_semver_label.yml
index 5de414a6..a1b0bbe8 100644
--- a/.github/workflows/require_semver_label.yml
+++ b/.github/workflows/require_semver_label.yml
@@ -1,4 +1,4 @@
-name: Require Semver Pull Request Label
+name: Require semver:* and unreleased Label
 on:
   pull_request:
     types: [opened, labeled, unlabeled, synchronize]
@@ -10,4 +10,9 @@ jobs:
         with:
           mode: exactly
           count: 1
-          labels: "semver:patch, semver:minor, semver:major"
\ No newline at end of file
+          labels: "semver:patch, semver:minor, semver:major"
+      - uses: mheap/github-action-required-labels@v1
+        with:
+          mode: exactly
+          count: 1
+          labels: "unreleased"
\ No newline at end of file
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index 7fc5a1d6..b0ca36a3 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -12,10 +12,6 @@ jobs:
     - uses: dart-lang/setup-dart@v1
     - name: Install dependencies
       run: dart pub get
-    - name: Format
-      run: dart format --output=none --set-exit-if-changed .
-    - name: Analyze
-      run: dart analyze
     # - name: Unit tests
     #   run: dart test test
     # - name: Integration tests
diff --git a/.github/workflows/triage.yml b/.github/workflows/triage.yml
index 7c89b22c..c4893c72 100644
--- a/.github/workflows/triage.yml
+++ b/.github/workflows/triage.yml
@@ -18,7 +18,7 @@ jobs:
               issue_number: context.issue.number,
               owner: context.repo.owner,
               repo: context.repo.repo,
-              labels: ['untriaged']
+              labels: ['untriaged','unreleased']
             })
       - name: Comment On New Issues
         uses: actions/github-script@v3
diff --git a/.pubignore b/.pubignore
new file mode 100644
index 00000000..09134047
--- /dev/null
+++ b/.pubignore
@@ -0,0 +1,3 @@
+tool
+test
+integration_test
\ No newline at end of file

From 9186462c1fb3b9d6e87996a24e469e8405b67984 Mon Sep 17 00:00:00 2001
From: Rob Becker 
Date: Sat, 16 Apr 2022 21:34:54 -0600
Subject: [PATCH 289/390] temp: disable publish on release for testing

---
 .github/workflows/publish_release.yml | 34 +++++++++++++--------------
 1 file changed, 17 insertions(+), 17 deletions(-)

diff --git a/.github/workflows/publish_release.yml b/.github/workflows/publish_release.yml
index 3d6f125f..63d8c65b 100644
--- a/.github/workflows/publish_release.yml
+++ b/.github/workflows/publish_release.yml
@@ -1,21 +1,21 @@
-name: Publish to pub
+# name: Publish to pub
 
-on:
-  release:
-    types: [published]
+# on:
+#   release:
+#     types: [published]
 
-jobs:
-  publish:
+# jobs:
+#   publish:
 
-    runs-on: ubuntu-latest
+#     runs-on: ubuntu-latest
 
-    steps:
-      - name: Checkout
-        uses: actions/checkout@v1
-      - name: Publish
-        uses: sakebook/actions-flutter-pub-publisher@v1.3.1
-        with:
-          credential: ${{ secrets.CREDENTIAL_JSON }}
-          flutter_package: false
-          skip_test: true
-          dry_run: false
\ No newline at end of file
+#     steps:
+#       - name: Checkout
+#         uses: actions/checkout@v1
+#       - name: Publish
+#         uses: sakebook/actions-flutter-pub-publisher@v1.3.1
+#         with:
+#           credential: ${{ secrets.CREDENTIAL_JSON }}
+#           flutter_package: false
+#           skip_test: true
+#           dry_run: false
\ No newline at end of file

From 230e17946b8283fdbaf6752f51b805e0ad7b4e57 Mon Sep 17 00:00:00 2001
From: Rob Becker 
Date: Sat, 16 Apr 2022 21:41:52 -0600
Subject: [PATCH 290/390] Create label_prs.yml

---
 .github/workflows/label_prs.yml | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)
 create mode 100644 .github/workflows/label_prs.yml

diff --git a/.github/workflows/label_prs.yml b/.github/workflows/label_prs.yml
new file mode 100644
index 00000000..066e47b6
--- /dev/null
+++ b/.github/workflows/label_prs.yml
@@ -0,0 +1,22 @@
+name: Add PR labels on open
+on:
+  pull_request:
+    types: [opened]
+
+jobs:
+  assignUnreleased:
+    name: Unreleased
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@master
+      - name: Apply unreleased label
+        uses: actions/github-script@v3
+        with:
+          github-token: ${{secrets.GITHUB_TOKEN}}
+          script: |
+            github.issues.addLabels({
+              issue_number: context.issue.number,
+              owner: context.repo.owner,
+              repo: context.repo.repo,
+              labels: ['unreleased']
+            })

From 21e26d213573796054c920b6f058d1bb8f8231aa Mon Sep 17 00:00:00 2001
From: Rob Becker 
Date: Sat, 16 Apr 2022 21:42:47 -0600
Subject: [PATCH 291/390] test auto-release

for testing
---
 README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/README.md b/README.md
index ccdb9ab2..c64d3727 100644
--- a/README.md
+++ b/README.md
@@ -32,3 +32,4 @@ See the examples in the example directory to learn how to use some of the featur
 ## Contacting Us
 
 Post a question or idea: https://github.com/SpinlockLabs/github.dart/discussions
+

From 164b7452debbef86f1ff8114bf54abae304290f5 Mon Sep 17 00:00:00 2001
From: Rob Becker 
Date: Sat, 16 Apr 2022 21:49:52 -0600
Subject: [PATCH 292/390] main branch name change

---
 .github/workflows/release_unreleased_prs.yml | 2 +-
 tool/release_unreleased_prs.dart             | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/.github/workflows/release_unreleased_prs.yml b/.github/workflows/release_unreleased_prs.yml
index 2999ef34..87cec9be 100644
--- a/.github/workflows/release_unreleased_prs.yml
+++ b/.github/workflows/release_unreleased_prs.yml
@@ -20,7 +20,7 @@ jobs:
         uses: actions/checkout@v3
         with:
           fetch-depth: 2
-          ref: main
+          ref: master
       - name: Release
         run: |
           git config --global user.name ${{ secrets.USER_NAME }}
diff --git a/tool/release_unreleased_prs.dart b/tool/release_unreleased_prs.dart
index 3bec7a3d..72be1284 100644
--- a/tool/release_unreleased_prs.dart
+++ b/tool/release_unreleased_prs.dart
@@ -4,7 +4,7 @@ import 'package:pub_semver/pub_semver.dart';
 import 'package:yaml_edit/yaml_edit.dart';
 
 ///////////////////////////////////////////////////////////
-const mainBranchName = 'main';
+const mainBranchName = 'master';
 const semverMajor = 'semver:major';
 const semverMinor = 'semver:minor';
 const semverPatch = 'semver:patch';

From 01a23cf846d9ea911e3c63070ea5fe11fc2671a7 Mon Sep 17 00:00:00 2001
From: Rob Becker 
Date: Sat, 16 Apr 2022 21:50:40 -0600
Subject: [PATCH 293/390] test PR for auto-release

test
---
 README.md | 1 -
 1 file changed, 1 deletion(-)

diff --git a/README.md b/README.md
index c64d3727..ccdb9ab2 100644
--- a/README.md
+++ b/README.md
@@ -32,4 +32,3 @@ See the examples in the example directory to learn how to use some of the featur
 ## Contacting Us
 
 Post a question or idea: https://github.com/SpinlockLabs/github.dart/discussions
-

From 9639ea73a678d1b92cf53f01281e606cc102f87f Mon Sep 17 00:00:00 2001
From: robrbecker 
Date: Sun, 17 Apr 2022 03:52:09 +0000
Subject: [PATCH 294/390] prep 9.1.2

---
 CHANGELOG.md | 8 ++++++++
 pubspec.yaml | 2 +-
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index f1de1051..4b8b6259 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,11 @@
+## 9.1.2
+
+* test auto-release by @robrbecker in https://github.com/SpinlockLabs/github.dart/pull/307
+* test PR for auto-release by @robrbecker in https://github.com/SpinlockLabs/github.dart/pull/308
+
+
+**Full Changelog**: https://github.com/SpinlockLabs/github.dart/compare/9.1.1...9.1.2
+
 ## 9.1.1
 
 * Don't add state query param twice by @passsy in https://github.com/SpinlockLabs/github.dart/pull/264
diff --git a/pubspec.yaml b/pubspec.yaml
index 138fa9ae..f6c4afde 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: github
-version: 9.1.1
+version: 9.1.2
 description: A high-level GitHub API Client Library that uses Github's v3 API
 homepage: https://github.com/SpinlockLabs/github.dart
 

From 950983a6d35080a0f0a79255c5cc94459b9db7a5 Mon Sep 17 00:00:00 2001
From: Rob Becker 
Date: Sat, 16 Apr 2022 21:56:09 -0600
Subject: [PATCH 295/390] remove 9.1.2 and enable re-enable publish

---
 .github/workflows/publish_release.yml | 34 +++++++++++++--------------
 CHANGELOG.md                          |  8 -------
 pubspec.yaml                          |  2 +-
 3 files changed, 18 insertions(+), 26 deletions(-)

diff --git a/.github/workflows/publish_release.yml b/.github/workflows/publish_release.yml
index 63d8c65b..3d6f125f 100644
--- a/.github/workflows/publish_release.yml
+++ b/.github/workflows/publish_release.yml
@@ -1,21 +1,21 @@
-# name: Publish to pub
+name: Publish to pub
 
-# on:
-#   release:
-#     types: [published]
+on:
+  release:
+    types: [published]
 
-# jobs:
-#   publish:
+jobs:
+  publish:
 
-#     runs-on: ubuntu-latest
+    runs-on: ubuntu-latest
 
-#     steps:
-#       - name: Checkout
-#         uses: actions/checkout@v1
-#       - name: Publish
-#         uses: sakebook/actions-flutter-pub-publisher@v1.3.1
-#         with:
-#           credential: ${{ secrets.CREDENTIAL_JSON }}
-#           flutter_package: false
-#           skip_test: true
-#           dry_run: false
\ No newline at end of file
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v1
+      - name: Publish
+        uses: sakebook/actions-flutter-pub-publisher@v1.3.1
+        with:
+          credential: ${{ secrets.CREDENTIAL_JSON }}
+          flutter_package: false
+          skip_test: true
+          dry_run: false
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4b8b6259..f1de1051 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,11 +1,3 @@
-## 9.1.2
-
-* test auto-release by @robrbecker in https://github.com/SpinlockLabs/github.dart/pull/307
-* test PR for auto-release by @robrbecker in https://github.com/SpinlockLabs/github.dart/pull/308
-
-
-**Full Changelog**: https://github.com/SpinlockLabs/github.dart/compare/9.1.1...9.1.2
-
 ## 9.1.1
 
 * Don't add state query param twice by @passsy in https://github.com/SpinlockLabs/github.dart/pull/264
diff --git a/pubspec.yaml b/pubspec.yaml
index f6c4afde..138fa9ae 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: github
-version: 9.1.2
+version: 9.1.1
 description: A high-level GitHub API Client Library that uses Github's v3 API
 homepage: https://github.com/SpinlockLabs/github.dart
 

From 7846d4cbba15b161bee272e5ac6c3ad0b293a088 Mon Sep 17 00:00:00 2001
From: Rob Becker 
Date: Sat, 16 Apr 2022 22:12:05 -0600
Subject: [PATCH 296/390] prep 9.2.0

---
 CHANGELOG.md | 11 +++++++++++
 pubspec.yaml |  2 +-
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index f1de1051..bd3c6417 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,14 @@
+## 9.2.0
+
+* test auto-release by @robrbecker in https://github.com/SpinlockLabs/github.dart/pull/307
+* test PR for auto-release by @robrbecker in https://github.com/SpinlockLabs/github.dart/pull/308
+* Added assignees to Issue model for #289 by @sjhorn in https://github.com/SpinlockLabs/github.dart/pull/290
+
+## New Contributors
+* @sjhorn made their first contribution in https://github.com/SpinlockLabs/github.dart/pull/290
+
+**Full Changelog**: https://github.com/SpinlockLabs/github.dart/compare/9.1.1...9.2.0
+
 ## 9.1.1
 
 * Don't add state query param twice by @passsy in https://github.com/SpinlockLabs/github.dart/pull/264
diff --git a/pubspec.yaml b/pubspec.yaml
index b746b7bd..3bb66e40 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: github
-version: 9.1.1
+version: 9.2.0
 description: A high-level GitHub API Client Library that uses Github's v3 API
 homepage: https://github.com/SpinlockLabs/github.dart
 

From 66e5a9e8c726ea8e0b7b94f0cebb80810e667006 Mon Sep 17 00:00:00 2001
From: Rob Becker 
Date: Sat, 16 Apr 2022 23:04:26 -0600
Subject: [PATCH 297/390] dart format

---
 example/gist.dart                 |  7 ++++
 example/gist.html                 | 36 +++++++++++++++++++
 example/release_notes.dart        | 59 +++++++++++++++++++++++++++++++
 example/release_notes.html        | 21 +++++++++++
 lib/src/common/repos_service.dart |  3 +-
 5 files changed, 125 insertions(+), 1 deletion(-)
 create mode 100755 example/gist.dart
 create mode 100755 example/gist.html
 create mode 100644 example/release_notes.dart
 create mode 100644 example/release_notes.html

diff --git a/example/gist.dart b/example/gist.dart
new file mode 100755
index 00000000..0541ba58
--- /dev/null
+++ b/example/gist.dart
@@ -0,0 +1,7 @@
+import 'package:github/github.dart';
+
+Future main() async {
+  final github = GitHub(auth: findAuthenticationFromEnvironment());
+  var g = await github.gists.getGist('c14da36c866b9fe6f84f5d774b76570b');
+  print(g.files);
+}
diff --git a/example/gist.html b/example/gist.html
new file mode 100755
index 00000000..e25fd0bb
--- /dev/null
+++ b/example/gist.html
@@ -0,0 +1,36 @@
+
+
+
+
+
+  
+  
+  Gist
+  
+
+
+
+  

Gist

+ + +

+ +
+

+
+
+ + + + + + \ No newline at end of file diff --git a/example/release_notes.dart b/example/release_notes.dart new file mode 100644 index 00000000..867474ee --- /dev/null +++ b/example/release_notes.dart @@ -0,0 +1,59 @@ +import 'dart:html'; + +import 'common.dart'; +import 'package:pub_semver/pub_semver.dart'; + +late DivElement releasesDiv; + +Future main() async { + await initViewSourceButton('release_notes.dart'); + releasesDiv = querySelector('#release_notes')! as DivElement; + releasesDiv.innerText = await loadReleaseNotes(); +} + +Future loadReleaseNotes() async { + var slug = RepositorySlug.full('robrbecker/experiment'); + // var slug = RepositorySlug.full('SpinlockLabs/github.dart'); + + var latestRelease = await github.repositories.getLatestRelease(slug); + var latestTag = latestRelease.tagName!; + var latestVersion = Version.parse(latestTag); + + var unreleasedPRs = await github.search + .issues( + 'repo:${slug.fullName} is:pull-request label:unreleased state:closed', + sort: 'desc') + .toList(); + if (unreleasedPRs.isEmpty) { + print('No unreleased PRs'); + return ''; + } + var semvers = Set(); + for (var pr in unreleasedPRs) { + var prlabels = pr.labels + .where((element) => element.name.startsWith('semver:')) + .toList(); + for (var l in prlabels) { + semvers.add(l.name); + } + } + print(latestTag); + print(unreleasedPRs.first.toJson()); + print(semvers); + + var newVersion = ''; + if (semvers.contains('semver:major')) { + newVersion = latestVersion.nextMajor.toString(); + } else if (semvers.contains('semver:minor')) { + newVersion = latestVersion.nextMinor.toString(); + } else if (semvers.contains('semver:patch')) { + newVersion = latestVersion.nextPatch.toString(); + } + print(newVersion); + if (newVersion.isEmpty) return ''; + + var notes = await github.repositories.generateReleaseNotes(CreateReleaseNotes( + slug.owner, slug.name, newVersion, + previousTagName: latestTag)); + return '${notes.name}\n${notes.body}'; +} diff --git a/example/release_notes.html b/example/release_notes.html new file mode 100644 index 00000000..9544974f --- /dev/null +++ b/example/release_notes.html @@ -0,0 +1,21 @@ + + + + + GitHub Release Notes + + + +
+

GitHub Release Notes

+ +

+
+ +
+ + + + + + \ No newline at end of file diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 45904bc2..a3a73531 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -1006,7 +1006,8 @@ class RepositoriesService extends Service { if (getIfExists) { return getReleaseByTagName(slug, createRelease.tagName); } else { - throw Exception('Tag / Release already exists ${createRelease.tagName}'); + throw Exception( + 'Tag / Release already exists ${createRelease.tagName}'); } } } else { From 09a76ba74c72ff9a72442bd117e256d9590b23a4 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Mon, 18 Apr 2022 08:05:34 -0600 Subject: [PATCH 298/390] Skip label no_release_on_merge when autoreleasing --- tool/release_unreleased_prs.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tool/release_unreleased_prs.dart b/tool/release_unreleased_prs.dart index 72be1284..372eefc4 100644 --- a/tool/release_unreleased_prs.dart +++ b/tool/release_unreleased_prs.dart @@ -92,7 +92,7 @@ Future getLatestVersion(RepositorySlug slug) async { Future> getUnreleasedPRs() async { print('Loading unreleased PRs...'); - var prs = await _gh.search.issues('repo:${_slug.fullName} is:pull-request label:unreleased state:closed', sort: 'desc').toList(); + var prs = await _gh.search.issues('repo:${_slug.fullName} is:pull-request label:unreleased -label:no_release_on_merge state:closed', sort: 'desc').toList(); print('${prs.length} loaded'); return prs; } From 921269ba8f803ba47470c624460c23c289b3291b Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Mon, 18 Apr 2022 08:33:07 -0600 Subject: [PATCH 299/390] add manual release action & more release docs --- .github/workflows/release_unreleased_prs.yml | 5 +++-- CONTRIBUTING.md | 15 +++++++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/.github/workflows/release_unreleased_prs.yml b/.github/workflows/release_unreleased_prs.yml index 87cec9be..e3b196cd 100644 --- a/.github/workflows/release_unreleased_prs.yml +++ b/.github/workflows/release_unreleased_prs.yml @@ -1,15 +1,16 @@ -name: Release unreleased PR +name: Release unreleased PRs # Runs when a PR merges. # See https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#running-your-workflow-when-a-pull-request-merges on: + workflow_dispatch: pull_request: types: - closed jobs: release: - if: github.event.pull_request.merged == true + if: github.event.pull_request.merged == true || github.event_name == 'workflow_dispatch' runs-on: ubuntu-latest container: dart:2.14.4 permissions: diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d9a74cae..ac480095 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -43,7 +43,18 @@ If you get on IRC and ask us, we can review your work and add you as a committer This repo is now configured to release after every PR merge. This means a couple things for PRs that are put up: -1. A semver label is required. A github check will remind you that you need one. Reviewers should check that it is correct. +1. A semver label is required. A github check will remind you that you need one. Reviewers should check that it is correct. See https://semver.org/ to understand more. 2. There is no need to modify the version in the pubspec.yaml in your PRs. The tooling will update the version according to the semver label applied to your PR. 3. Same thing for the CHANGELOG.md. Tooling will update it automatically after merge. -4. A github release will be created and published ot pub.dev for you. \ No newline at end of file +4. A github release will be created and published to pub.dev for you. + +For example if your PR has `semver:minor` label applied and the latest version is 1.2.3, once merged, the tooling will: +- update the pubspec.yaml to 1.3.0 +- Add the github auto-generated release notes with 1.3.0 to the top of the CHANGELOG.md +- Create a release in github for 1.3.0 (which creates a git tag of 1.3.0) +- Remove the `unreleased` label from the PR and add the `released` label +- Comment on the PR stating the version that it was released in and link to the release +- When the release is created, it will automatically be published to pub.dev + +NOTE: If you want the ability to merge a PR **WITHOUT** automatically releasing and publishing, simply add the `no_release_on_merge` label before merging. Do note that the PR has been merged though and whatever the next PR is that triggers a release will release and publish everything that has been merged. So if you want to batch a few PRs into 1 release, label them all `no_release_on_merge`. Then whichever is the last to be merged, remove that label before merging to trigger the release. +You may also manually trigger the action to release unreleased PRs from the Actions tab in Github. From 328fa4197c6bab8333ebf940550ecda4ff8f3ec3 Mon Sep 17 00:00:00 2001 From: Ricardo Amador Date: Wed, 22 Jun 2022 16:42:47 -0700 Subject: [PATCH 300/390] Added a new conclusion state. --- lib/src/common/model/checks.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/src/common/model/checks.dart b/lib/src/common/model/checks.dart index 8d497540..0bb26e29 100644 --- a/lib/src/common/model/checks.dart +++ b/lib/src/common/model/checks.dart @@ -45,6 +45,7 @@ class CheckRunConclusion extends EnumWithValue { static const neutral = CheckRunConclusion._('neutral'); static const cancelled = CheckRunConclusion._('cancelled'); static const timedOut = CheckRunConclusion._('timed_out'); + static const skipped = CheckRunConclusion._('skipped'); static const actionRequired = CheckRunConclusion._('action_required'); static const empty = CheckRunConclusion._(null); From 9f55646b25f566d5b1bbd130c783a82eeb304a28 Mon Sep 17 00:00:00 2001 From: Ricardo Amador Date: Wed, 22 Jun 2022 17:58:29 -0700 Subject: [PATCH 301/390] Add a test for the new conclusion state. --- lib/src/common/model/checks.dart | 1 + test/unit/checks_test.dart | 101 +++++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+) diff --git a/lib/src/common/model/checks.dart b/lib/src/common/model/checks.dart index 0bb26e29..ccde4502 100644 --- a/lib/src/common/model/checks.dart +++ b/lib/src/common/model/checks.dart @@ -61,6 +61,7 @@ class CheckRunConclusion extends EnumWithValue { neutral, cancelled, timedOut, + skipped, actionRequired ]) { if (level.value == value) { diff --git a/test/unit/checks_test.dart b/test/unit/checks_test.dart index 15c8f9d8..bc08f7b3 100644 --- a/test/unit/checks_test.dart +++ b/test/unit/checks_test.dart @@ -105,5 +105,106 @@ void main() { expect(checkRun.name, 'mighty_readme'); expect(checkRun.conclusion, CheckRunConclusion.neutral); }); + + test('CheckRun fromJson for skipped conclusion', () { + /// The checkRun Json is the official Github values + /// + /// Github api url: https://docs.github.com/en/rest/reference/checks#get-a-check-run + const checkRunJson = '''{ + "id": 10, + "head_sha": "ce587453ced02b1526dfb4cb910479d431683101", + "node_id": "MDg6Q2hlY2tSdW40", + "external_id": "", + "url": "https://api.github.com/repos/github/hello-world/check-runs/4", + "html_url": "https://github.com/github/hello-world/runs/4", + "details_url": "https://example.com", + "status": "completed", + "conclusion": "skipped", + "started_at": "2018-05-04T01:14:52Z", + "completed_at": "2018-05-04T01:14:52Z", + "output": { + "title": "Mighty Readme report", + "summary": "There are 0 failures, 2 warnings, and 1 notice.", + "text": "You may have some misspelled words on lines 2 and 4. You also may want to add a section in your README about how to install your app.", + "annotations_count": 2, + "annotations_url": "https://api.github.com/repos/github/hello-world/check-runs/4/annotations" + }, + "name": "mighty_readme", + "check_suite": { + "id": 5 + }, + "app": { + "id": 1, + "slug": "octoapp", + "node_id": "MDExOkludGVncmF0aW9uMQ==", + "owner": { + "login": "github", + "id": 1, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjE=", + "url": "https://api.github.com/orgs/github", + "repos_url": "https://api.github.com/orgs/github/repos", + "events_url": "https://api.github.com/orgs/github/events", + "avatar_url": "https://github.com/images/error/octocat_happy.gif", + "gravatar_id": "", + "html_url": "https://github.com/octocat", + "followers_url": "https://api.github.com/users/octocat/followers", + "following_url": "https://api.github.com/users/octocat/following{/other_user}", + "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}", + "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/octocat/subscriptions", + "organizations_url": "https://api.github.com/users/octocat/orgs", + "received_events_url": "https://api.github.com/users/octocat/received_events", + "type": "User", + "site_admin": true + }, + "name": "Octocat App", + "description": "", + "external_url": "https://example.com", + "html_url": "https://github.com/apps/octoapp", + "created_at": "2017-07-08T16:18:44-04:00", + "updated_at": "2017-07-08T16:18:44-04:00", + "permissions": { + "metadata": "read", + "contents": "read", + "issues": "write", + "single_file": "write" + }, + "events": [ + "push", + "pull_request" + ] + }, + "pull_requests": [ + { + "url": "https://api.github.com/repos/github/hello-world/pulls/1", + "id": 1934, + "number": 3956, + "head": { + "ref": "say-hello", + "sha": "3dca65fa3e8d4b3da3f3d056c59aee1c50f41390", + "repo": { + "id": 526, + "url": "https://api.github.com/repos/github/hello-world", + "name": "hello-world" + } + }, + "base": { + "ref": "master", + "sha": "e7fdf7640066d71ad16a86fbcbb9c6a10a18af4f", + "repo": { + "id": 526, + "url": "https://api.github.com/repos/github/hello-world", + "name": "hello-world" + } + } + } + ] + }'''; + final checkRun = CheckRun.fromJson(jsonDecode(checkRunJson)); + + expect(checkRun.id, 10); + expect(checkRun.name, 'mighty_readme'); + expect(checkRun.conclusion, CheckRunConclusion.skipped); + }); }); } From fc7329f65e4ca652beade93b448488fa573fff6d Mon Sep 17 00:00:00 2001 From: robrbecker Date: Thu, 23 Jun 2022 20:15:11 +0000 Subject: [PATCH 302/390] prep 9.3.0 --- CHANGELOG.md | 9 +++++++++ pubspec.yaml | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bd3c6417..87fdac9d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +## 9.3.0 + +* Added a new conclusion state to support flutter autosubmit bot by @ricardoamador in https://github.com/SpinlockLabs/github.dart/pull/315 + +## New Contributors +* @ricardoamador made their first contribution in https://github.com/SpinlockLabs/github.dart/pull/315 + +**Full Changelog**: https://github.com/SpinlockLabs/github.dart/compare/9.2.0...9.3.0 + ## 9.2.0 * test auto-release by @robrbecker in https://github.com/SpinlockLabs/github.dart/pull/307 diff --git a/pubspec.yaml b/pubspec.yaml index 3bb66e40..92173dcf 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 9.2.0 +version: 9.3.0 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From 4a0bb47072be7bc59760b841ad336b4a8ea581c5 Mon Sep 17 00:00:00 2001 From: Casey Hillers Date: Thu, 23 Jun 2022 14:39:09 -0700 Subject: [PATCH 303/390] Fix publish release workflow --- .github/workflows/publish_release.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish_release.yml b/.github/workflows/publish_release.yml index 3d6f125f..0299a486 100644 --- a/.github/workflows/publish_release.yml +++ b/.github/workflows/publish_release.yml @@ -13,9 +13,9 @@ jobs: - name: Checkout uses: actions/checkout@v1 - name: Publish - uses: sakebook/actions-flutter-pub-publisher@v1.3.1 + uses: caseyhillers/actions-flutter-pub-publisher@v1.5.1 with: credential: ${{ secrets.CREDENTIAL_JSON }} flutter_package: false skip_test: true - dry_run: false \ No newline at end of file + dry_run: false From 1847b8a651f70562022e9eb458d07f6264f1a60e Mon Sep 17 00:00:00 2001 From: Ricardo Amador Date: Fri, 1 Jul 2022 16:29:40 -0700 Subject: [PATCH 304/390] Implemented toString in checkrun --- lib/src/common/model/checks.dart | 7 ++ test/unit/checks_test.dart | 200 +++++++++++++++++-------------- 2 files changed, 114 insertions(+), 93 deletions(-) diff --git a/lib/src/common/model/checks.dart b/lib/src/common/model/checks.dart index 8d497540..2db62f7b 100644 --- a/lib/src/common/model/checks.dart +++ b/lib/src/common/model/checks.dart @@ -1,3 +1,5 @@ +import 'dart:convert'; + import 'package:github/src/common/model/pulls.dart'; import 'package:github/src/common/util/utils.dart'; import 'package:meta/meta.dart'; @@ -148,6 +150,11 @@ class CheckRun { 'conclusion': conclusion, }; } + + @override + String toString() { + return jsonEncode(toJson()); + } } @immutable diff --git a/test/unit/checks_test.dart b/test/unit/checks_test.dart index 15c8f9d8..c7eefb05 100644 --- a/test/unit/checks_test.dart +++ b/test/unit/checks_test.dart @@ -3,107 +3,121 @@ import 'dart:convert'; import 'package:github/src/common/model/checks.dart'; import 'package:test/test.dart'; +/// The checkRun Json is the official Github values +/// +/// Github api url: https://docs.github.com/en/rest/reference/checks#get-a-check-run +const checkRunJson = '''{ + "id": 4, + "head_sha": "ce587453ced02b1526dfb4cb910479d431683101", + "node_id": "MDg6Q2hlY2tSdW40", + "external_id": "", + "url": "https://api.github.com/repos/github/hello-world/check-runs/4", + "html_url": "https://github.com/github/hello-world/runs/4", + "details_url": "https://example.com", + "status": "completed", + "conclusion": "neutral", + "started_at": "2018-05-04T01:14:52Z", + "completed_at": "2018-05-04T01:14:52Z", + "output": { + "title": "Mighty Readme report", + "summary": "There are 0 failures, 2 warnings, and 1 notice.", + "text": "You may have some misspelled words on lines 2 and 4. You also may want to add a section in your README about how to install your app.", + "annotations_count": 2, + "annotations_url": "https://api.github.com/repos/github/hello-world/check-runs/4/annotations" + }, + "name": "mighty_readme", + "check_suite": { + "id": 5 + }, + "app": { + "id": 1, + "slug": "octoapp", + "node_id": "MDExOkludGVncmF0aW9uMQ==", + "owner": { + "login": "github", + "id": 1, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjE=", + "url": "https://api.github.com/orgs/github", + "repos_url": "https://api.github.com/orgs/github/repos", + "events_url": "https://api.github.com/orgs/github/events", + "avatar_url": "https://github.com/images/error/octocat_happy.gif", + "gravatar_id": "", + "html_url": "https://github.com/octocat", + "followers_url": "https://api.github.com/users/octocat/followers", + "following_url": "https://api.github.com/users/octocat/following{/other_user}", + "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}", + "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/octocat/subscriptions", + "organizations_url": "https://api.github.com/users/octocat/orgs", + "received_events_url": "https://api.github.com/users/octocat/received_events", + "type": "User", + "site_admin": true + }, + "name": "Octocat App", + "description": "", + "external_url": "https://example.com", + "html_url": "https://github.com/apps/octoapp", + "created_at": "2017-07-08T16:18:44-04:00", + "updated_at": "2017-07-08T16:18:44-04:00", + "permissions": { + "metadata": "read", + "contents": "read", + "issues": "write", + "single_file": "write" + }, + "events": [ + "push", + "pull_request" + ] + }, + "pull_requests": [ + { + "url": "https://api.github.com/repos/github/hello-world/pulls/1", + "id": 1934, + "number": 3956, + "head": { + "ref": "say-hello", + "sha": "3dca65fa3e8d4b3da3f3d056c59aee1c50f41390", + "repo": { + "id": 526, + "url": "https://api.github.com/repos/github/hello-world", + "name": "hello-world" + } + }, + "base": { + "ref": "master", + "sha": "e7fdf7640066d71ad16a86fbcbb9c6a10a18af4f", + "repo": { + "id": 526, + "url": "https://api.github.com/repos/github/hello-world", + "name": "hello-world" + } + } + } + ] +}'''; + +const String expectedToString = '{"name":"mighty_readme","id":4,"external_id":"","status":"completed","head_sha":"","check_suite":{"id":5},"details_url":"https://example.com","started_at":"2018-05-04T01:14:52.000Z","conclusion":"neutral"}'; + void main() { group('Check run', () { test('CheckRun fromJson', () { - /// The checkRun Json is the official Github values - /// - /// Github api url: https://docs.github.com/en/rest/reference/checks#get-a-check-run - const checkRunJson = '''{ - "id": 4, - "head_sha": "ce587453ced02b1526dfb4cb910479d431683101", - "node_id": "MDg6Q2hlY2tSdW40", - "external_id": "", - "url": "https://api.github.com/repos/github/hello-world/check-runs/4", - "html_url": "https://github.com/github/hello-world/runs/4", - "details_url": "https://example.com", - "status": "completed", - "conclusion": "neutral", - "started_at": "2018-05-04T01:14:52Z", - "completed_at": "2018-05-04T01:14:52Z", - "output": { - "title": "Mighty Readme report", - "summary": "There are 0 failures, 2 warnings, and 1 notice.", - "text": "You may have some misspelled words on lines 2 and 4. You also may want to add a section in your README about how to install your app.", - "annotations_count": 2, - "annotations_url": "https://api.github.com/repos/github/hello-world/check-runs/4/annotations" - }, - "name": "mighty_readme", - "check_suite": { - "id": 5 - }, - "app": { - "id": 1, - "slug": "octoapp", - "node_id": "MDExOkludGVncmF0aW9uMQ==", - "owner": { - "login": "github", - "id": 1, - "node_id": "MDEyOk9yZ2FuaXphdGlvbjE=", - "url": "https://api.github.com/orgs/github", - "repos_url": "https://api.github.com/orgs/github/repos", - "events_url": "https://api.github.com/orgs/github/events", - "avatar_url": "https://github.com/images/error/octocat_happy.gif", - "gravatar_id": "", - "html_url": "https://github.com/octocat", - "followers_url": "https://api.github.com/users/octocat/followers", - "following_url": "https://api.github.com/users/octocat/following{/other_user}", - "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}", - "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/octocat/subscriptions", - "organizations_url": "https://api.github.com/users/octocat/orgs", - "received_events_url": "https://api.github.com/users/octocat/received_events", - "type": "User", - "site_admin": true - }, - "name": "Octocat App", - "description": "", - "external_url": "https://example.com", - "html_url": "https://github.com/apps/octoapp", - "created_at": "2017-07-08T16:18:44-04:00", - "updated_at": "2017-07-08T16:18:44-04:00", - "permissions": { - "metadata": "read", - "contents": "read", - "issues": "write", - "single_file": "write" - }, - "events": [ - "push", - "pull_request" - ] - }, - "pull_requests": [ - { - "url": "https://api.github.com/repos/github/hello-world/pulls/1", - "id": 1934, - "number": 3956, - "head": { - "ref": "say-hello", - "sha": "3dca65fa3e8d4b3da3f3d056c59aee1c50f41390", - "repo": { - "id": 526, - "url": "https://api.github.com/repos/github/hello-world", - "name": "hello-world" - } - }, - "base": { - "ref": "master", - "sha": "e7fdf7640066d71ad16a86fbcbb9c6a10a18af4f", - "repo": { - "id": 526, - "url": "https://api.github.com/repos/github/hello-world", - "name": "hello-world" - } - } - } - ] - }'''; + final checkRun = CheckRun.fromJson(jsonDecode(checkRunJson)); expect(checkRun.id, 4); expect(checkRun.name, 'mighty_readme'); expect(checkRun.conclusion, CheckRunConclusion.neutral); }); + + test('CheckRun toString', () { + // indirectly tests the toJson method as well. + final checkRun = CheckRun.fromJson(jsonDecode(checkRunJson)); + expect(checkRun, isNotNull); + final checkRunString = checkRun.toString(); + expect(checkRunString, isNotNull); + print(checkRunString); + expect(checkRunString == expectedToString, isTrue); + }); }); } From 0f2422acbc8c7293d0f99882682a6cb8cc6c5f95 Mon Sep 17 00:00:00 2001 From: Ricardo Amador Date: Fri, 1 Jul 2022 16:32:03 -0700 Subject: [PATCH 305/390] Remove print statement --- test/unit/checks_test.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/test/unit/checks_test.dart b/test/unit/checks_test.dart index c7eefb05..87e11b33 100644 --- a/test/unit/checks_test.dart +++ b/test/unit/checks_test.dart @@ -116,7 +116,6 @@ void main() { expect(checkRun, isNotNull); final checkRunString = checkRun.toString(); expect(checkRunString, isNotNull); - print(checkRunString); expect(checkRunString == expectedToString, isTrue); }); }); From 2287c65695763a9a2a67ca3581b95705753488d7 Mon Sep 17 00:00:00 2001 From: robrbecker Date: Wed, 6 Jul 2022 17:51:52 +0000 Subject: [PATCH 306/390] prep 9.4.0 --- CHANGELOG.md | 8 ++++++++ pubspec.yaml | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 87fdac9d..59375550 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +## 9.4.0 + +* Fix publish release workflow by @CaseyHillers in https://github.com/SpinlockLabs/github.dart/pull/316 +* Add support for toString to the Checkrun object. by @ricardoamador in https://github.com/SpinlockLabs/github.dart/pull/318 + + +**Full Changelog**: https://github.com/SpinlockLabs/github.dart/compare/9.3.0...9.4.0 + ## 9.3.0 * Added a new conclusion state to support flutter autosubmit bot by @ricardoamador in https://github.com/SpinlockLabs/github.dart/pull/315 diff --git a/pubspec.yaml b/pubspec.yaml index 92173dcf..794e7a29 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 9.3.0 +version: 9.4.0 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From 546abc295310072f9c6c4f2cfd4d4abb5c923a7e Mon Sep 17 00:00:00 2001 From: Casey Hillers Date: Wed, 6 Jul 2022 13:34:37 -0700 Subject: [PATCH 307/390] Simplify publish release action --- .github/workflows/publish_release.yml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/.github/workflows/publish_release.yml b/.github/workflows/publish_release.yml index 0299a486..c9c1df8f 100644 --- a/.github/workflows/publish_release.yml +++ b/.github/workflows/publish_release.yml @@ -12,10 +12,9 @@ jobs: steps: - name: Checkout uses: actions/checkout@v1 - - name: Publish - uses: caseyhillers/actions-flutter-pub-publisher@v1.5.1 - with: - credential: ${{ secrets.CREDENTIAL_JSON }} - flutter_package: false - skip_test: true - dry_run: false + - name: Setup credentials + run: | + mkdir -p ~/.pub-cache + echo ${{ secrets.CREDENTIAL_JSON }} > ~/.pub-cache/credentials.json + - name: Publish package + run: pub publish -f \ No newline at end of file From ce4a60676866bb9fa5d5fe852eeb19a414edf86f Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sat, 22 Oct 2022 07:32:25 -0600 Subject: [PATCH 308/390] Add star chart to the readme --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index ccdb9ab2..fc8aa669 100644 --- a/README.md +++ b/README.md @@ -32,3 +32,7 @@ See the examples in the example directory to learn how to use some of the featur ## Contacting Us Post a question or idea: https://github.com/SpinlockLabs/github.dart/discussions + +## Star History + +[![Star History Chart](https://api.star-history.com/svg?repos=SpinlockLabs/github.dart&type=Date)](https://star-history.com/#SpinlockLabs/github.dart&Date) \ No newline at end of file From d17192cea7b594d6f7126fc3dfff2fc46b1cf9ed Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sat, 22 Oct 2022 08:53:25 -0600 Subject: [PATCH 309/390] Update to github-script 6 (#331) Try updating to github-script 6 Co-authored-by: Rob Becker --- .github/workflows/label_prs.yml | 4 ++-- .github/workflows/triage.yml | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/label_prs.yml b/.github/workflows/label_prs.yml index 066e47b6..8f30b23d 100644 --- a/.github/workflows/label_prs.yml +++ b/.github/workflows/label_prs.yml @@ -10,11 +10,11 @@ jobs: steps: - uses: actions/checkout@master - name: Apply unreleased label - uses: actions/github-script@v3 + uses: actions/github-script@v6 with: github-token: ${{secrets.GITHUB_TOKEN}} script: | - github.issues.addLabels({ + github.rest.issues.addLabels({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, diff --git a/.github/workflows/triage.yml b/.github/workflows/triage.yml index c4893c72..90dddd83 100644 --- a/.github/workflows/triage.yml +++ b/.github/workflows/triage.yml @@ -10,22 +10,22 @@ jobs: steps: - uses: actions/checkout@master - name: Apply untriaged label - uses: actions/github-script@v3 + uses: actions/github-script@v6 with: github-token: ${{secrets.GITHUB_TOKEN}} script: | - github.issues.addLabels({ + github.rest.issues.addLabels({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, labels: ['untriaged','unreleased'] }) - name: Comment On New Issues - uses: actions/github-script@v3 + uses: actions/github-script@v6 with: github-token: ${{secrets.GITHUB_TOKEN}} script: | - github.issues.createComment({ + github.rest.issues.createComment({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, From ee05c4324622c40ab423c12fbd515c067faad600 Mon Sep 17 00:00:00 2001 From: robrbecker Date: Sat, 22 Oct 2022 14:53:55 +0000 Subject: [PATCH 310/390] prep 9.4.1 --- CHANGELOG.md | 7 +++++++ pubspec.yaml | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 59375550..d09d1b76 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## 9.4.1 + +* Update to github-script 6 by @robbecker-wf in https://github.com/SpinlockLabs/github.dart/pull/331 + + +**Full Changelog**: https://github.com/SpinlockLabs/github.dart/compare/9.4.0...9.4.1 + ## 9.4.0 * Fix publish release workflow by @CaseyHillers in https://github.com/SpinlockLabs/github.dart/pull/316 diff --git a/pubspec.yaml b/pubspec.yaml index 794e7a29..9aa43f84 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 9.4.0 +version: 9.4.1 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From af4a3c67c24f7a066acfd92152886cfa2b9d3332 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sat, 22 Oct 2022 08:56:27 -0600 Subject: [PATCH 311/390] fix indentation in publish_release.yml --- .github/workflows/publish_release.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/publish_release.yml b/.github/workflows/publish_release.yml index c9c1df8f..3743cd63 100644 --- a/.github/workflows/publish_release.yml +++ b/.github/workflows/publish_release.yml @@ -12,9 +12,9 @@ jobs: steps: - name: Checkout uses: actions/checkout@v1 - - name: Setup credentials - run: | - mkdir -p ~/.pub-cache - echo ${{ secrets.CREDENTIAL_JSON }} > ~/.pub-cache/credentials.json - - name: Publish package - run: pub publish -f \ No newline at end of file + - name: Setup credentials + run: | + mkdir -p ~/.pub-cache + echo ${{ secrets.CREDENTIAL_JSON }} > ~/.pub-cache/credentials.json + - name: Publish package + run: pub publish -f \ No newline at end of file From 1311d42945eeee91e359908ef659fb094bf1c12b Mon Sep 17 00:00:00 2001 From: Jeff Ward Date: Sat, 22 Oct 2022 10:57:57 -0400 Subject: [PATCH 312/390] Add 'commits' member to GitHubComparison object (#330) Co-authored-by: Rob Becker --- lib/src/common/model/repos.dart | 3 +- lib/src/common/model/repos.g.dart | 4 + test/src/mocks.mocks.dart | 562 +++++++++++++++++++++--------- 3 files changed, 411 insertions(+), 158 deletions(-) diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart index 739d6ca2..3612aa34 100644 --- a/lib/src/common/model/repos.dart +++ b/lib/src/common/model/repos.dart @@ -11,9 +11,10 @@ class GitHubComparison { final int? behindBy; final int? totalCommits; final List? files; + final List? commits; GitHubComparison(this.url, this.status, this.aheadBy, this.behindBy, - this.totalCommits, this.files); + this.totalCommits, this.files, this.commits); factory GitHubComparison.fromJson(Map json) => _$GitHubComparisonFromJson(json); diff --git a/lib/src/common/model/repos.g.dart b/lib/src/common/model/repos.g.dart index 78184d6f..b2e395bd 100644 --- a/lib/src/common/model/repos.g.dart +++ b/lib/src/common/model/repos.g.dart @@ -16,6 +16,9 @@ GitHubComparison _$GitHubComparisonFromJson(Map json) => (json['files'] as List?) ?.map((e) => CommitFile.fromJson(e as Map)) .toList(), + (json['commits'] as List?) + ?.map((e) => RepositoryCommit.fromJson(e as Map)) + .toList(), ); Map _$GitHubComparisonToJson(GitHubComparison instance) => @@ -26,6 +29,7 @@ Map _$GitHubComparisonToJson(GitHubComparison instance) => 'behind_by': instance.behindBy, 'total_commits': instance.totalCommits, 'files': instance.files, + 'commits': instance.commits, }; Repository _$RepositoryFromJson(Map json) => Repository( diff --git a/test/src/mocks.mocks.dart b/test/src/mocks.mocks.dart index 6b9c20c5..56e777d3 100644 --- a/test/src/mocks.mocks.dart +++ b/test/src/mocks.mocks.dart @@ -1,58 +1,180 @@ -// Mocks generated by Mockito 5.0.17 from annotations +// Mocks generated by Mockito 5.3.2 from annotations // in github/test/src/mocks.dart. // Do not manually edit this file. +// ignore_for_file: no_leading_underscores_for_library_prefixes import 'dart:async' as _i4; import 'package:github/src/common.dart' as _i3; import 'package:http/http.dart' as _i2; import 'package:mockito/mockito.dart' as _i1; +// ignore_for_file: type=lint // ignore_for_file: avoid_redundant_argument_values // ignore_for_file: avoid_setters_without_getters -// ignore_for_file: camel_case_types // ignore_for_file: comment_references // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member // ignore_for_file: prefer_const_constructors -// ignore_for_file: unnecessary_overrides // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class -class _FakeClient_0 extends _i1.Fake implements _i2.Client {} +class _FakeClient_0 extends _i1.SmartFake implements _i2.Client { + _FakeClient_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} -class _FakeActivityService_1 extends _i1.Fake implements _i3.ActivityService {} +class _FakeActivityService_1 extends _i1.SmartFake + implements _i3.ActivityService { + _FakeActivityService_1( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} -class _FakeAuthorizationsService_2 extends _i1.Fake - implements _i3.AuthorizationsService {} +class _FakeAuthorizationsService_2 extends _i1.SmartFake + implements _i3.AuthorizationsService { + _FakeAuthorizationsService_2( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} -class _FakeGistsService_3 extends _i1.Fake implements _i3.GistsService {} +class _FakeGistsService_3 extends _i1.SmartFake implements _i3.GistsService { + _FakeGistsService_3( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} -class _FakeGitService_4 extends _i1.Fake implements _i3.GitService {} +class _FakeGitService_4 extends _i1.SmartFake implements _i3.GitService { + _FakeGitService_4( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} -class _FakeIssuesService_5 extends _i1.Fake implements _i3.IssuesService {} +class _FakeIssuesService_5 extends _i1.SmartFake implements _i3.IssuesService { + _FakeIssuesService_5( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} -class _FakeMiscService_6 extends _i1.Fake implements _i3.MiscService {} +class _FakeMiscService_6 extends _i1.SmartFake implements _i3.MiscService { + _FakeMiscService_6( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} -class _FakeOrganizationsService_7 extends _i1.Fake - implements _i3.OrganizationsService {} +class _FakeOrganizationsService_7 extends _i1.SmartFake + implements _i3.OrganizationsService { + _FakeOrganizationsService_7( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} -class _FakePullRequestsService_8 extends _i1.Fake - implements _i3.PullRequestsService {} +class _FakePullRequestsService_8 extends _i1.SmartFake + implements _i3.PullRequestsService { + _FakePullRequestsService_8( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} -class _FakeRepositoriesService_9 extends _i1.Fake - implements _i3.RepositoriesService {} +class _FakeRepositoriesService_9 extends _i1.SmartFake + implements _i3.RepositoriesService { + _FakeRepositoriesService_9( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} -class _FakeSearchService_10 extends _i1.Fake implements _i3.SearchService {} +class _FakeSearchService_10 extends _i1.SmartFake implements _i3.SearchService { + _FakeSearchService_10( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} -class _FakeUrlShortenerService_11 extends _i1.Fake - implements _i3.UrlShortenerService {} +class _FakeUrlShortenerService_11 extends _i1.SmartFake + implements _i3.UrlShortenerService { + _FakeUrlShortenerService_11( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} -class _FakeUsersService_12 extends _i1.Fake implements _i3.UsersService {} +class _FakeUsersService_12 extends _i1.SmartFake implements _i3.UsersService { + _FakeUsersService_12( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} -class _FakeChecksService_13 extends _i1.Fake implements _i3.ChecksService {} +class _FakeChecksService_13 extends _i1.SmartFake implements _i3.ChecksService { + _FakeChecksService_13( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} -class _FakeResponse_14 extends _i1.Fake implements _i2.Response {} +class _FakeResponse_14 extends _i1.SmartFake implements _i2.Response { + _FakeResponse_14( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} /// A class which mocks [GitHub]. /// @@ -63,201 +185,327 @@ class MockGitHub extends _i1.Mock implements _i3.GitHub { } @override - set auth(_i3.Authentication? _auth) => - super.noSuchMethod(Invocation.setter(#auth, _auth), - returnValueForMissingStub: null); + set auth(_i3.Authentication? _auth) => super.noSuchMethod( + Invocation.setter( + #auth, + _auth, + ), + returnValueForMissingStub: null, + ); @override - String get endpoint => - (super.noSuchMethod(Invocation.getter(#endpoint), returnValue: '') - as String); + String get endpoint => (super.noSuchMethod( + Invocation.getter(#endpoint), + returnValue: '', + ) as String); @override - _i2.Client get client => (super.noSuchMethod(Invocation.getter(#client), - returnValue: _FakeClient_0()) as _i2.Client); + _i2.Client get client => (super.noSuchMethod( + Invocation.getter(#client), + returnValue: _FakeClient_0( + this, + Invocation.getter(#client), + ), + ) as _i2.Client); @override - _i3.ActivityService get activity => - (super.noSuchMethod(Invocation.getter(#activity), - returnValue: _FakeActivityService_1()) as _i3.ActivityService); + _i3.ActivityService get activity => (super.noSuchMethod( + Invocation.getter(#activity), + returnValue: _FakeActivityService_1( + this, + Invocation.getter(#activity), + ), + ) as _i3.ActivityService); @override - _i3.AuthorizationsService get authorizations => - (super.noSuchMethod(Invocation.getter(#authorizations), - returnValue: _FakeAuthorizationsService_2()) - as _i3.AuthorizationsService); + _i3.AuthorizationsService get authorizations => (super.noSuchMethod( + Invocation.getter(#authorizations), + returnValue: _FakeAuthorizationsService_2( + this, + Invocation.getter(#authorizations), + ), + ) as _i3.AuthorizationsService); @override - _i3.GistsService get gists => (super.noSuchMethod(Invocation.getter(#gists), - returnValue: _FakeGistsService_3()) as _i3.GistsService); + _i3.GistsService get gists => (super.noSuchMethod( + Invocation.getter(#gists), + returnValue: _FakeGistsService_3( + this, + Invocation.getter(#gists), + ), + ) as _i3.GistsService); @override - _i3.GitService get git => (super.noSuchMethod(Invocation.getter(#git), - returnValue: _FakeGitService_4()) as _i3.GitService); + _i3.GitService get git => (super.noSuchMethod( + Invocation.getter(#git), + returnValue: _FakeGitService_4( + this, + Invocation.getter(#git), + ), + ) as _i3.GitService); @override - _i3.IssuesService get issues => - (super.noSuchMethod(Invocation.getter(#issues), - returnValue: _FakeIssuesService_5()) as _i3.IssuesService); + _i3.IssuesService get issues => (super.noSuchMethod( + Invocation.getter(#issues), + returnValue: _FakeIssuesService_5( + this, + Invocation.getter(#issues), + ), + ) as _i3.IssuesService); @override - _i3.MiscService get misc => (super.noSuchMethod(Invocation.getter(#misc), - returnValue: _FakeMiscService_6()) as _i3.MiscService); + _i3.MiscService get misc => (super.noSuchMethod( + Invocation.getter(#misc), + returnValue: _FakeMiscService_6( + this, + Invocation.getter(#misc), + ), + ) as _i3.MiscService); @override _i3.OrganizationsService get organizations => (super.noSuchMethod( - Invocation.getter(#organizations), - returnValue: _FakeOrganizationsService_7()) as _i3.OrganizationsService); + Invocation.getter(#organizations), + returnValue: _FakeOrganizationsService_7( + this, + Invocation.getter(#organizations), + ), + ) as _i3.OrganizationsService); @override _i3.PullRequestsService get pullRequests => (super.noSuchMethod( - Invocation.getter(#pullRequests), - returnValue: _FakePullRequestsService_8()) as _i3.PullRequestsService); + Invocation.getter(#pullRequests), + returnValue: _FakePullRequestsService_8( + this, + Invocation.getter(#pullRequests), + ), + ) as _i3.PullRequestsService); @override _i3.RepositoriesService get repositories => (super.noSuchMethod( - Invocation.getter(#repositories), - returnValue: _FakeRepositoriesService_9()) as _i3.RepositoriesService); + Invocation.getter(#repositories), + returnValue: _FakeRepositoriesService_9( + this, + Invocation.getter(#repositories), + ), + ) as _i3.RepositoriesService); @override - _i3.SearchService get search => - (super.noSuchMethod(Invocation.getter(#search), - returnValue: _FakeSearchService_10()) as _i3.SearchService); + _i3.SearchService get search => (super.noSuchMethod( + Invocation.getter(#search), + returnValue: _FakeSearchService_10( + this, + Invocation.getter(#search), + ), + ) as _i3.SearchService); @override _i3.UrlShortenerService get urlShortener => (super.noSuchMethod( - Invocation.getter(#urlShortener), - returnValue: _FakeUrlShortenerService_11()) as _i3.UrlShortenerService); + Invocation.getter(#urlShortener), + returnValue: _FakeUrlShortenerService_11( + this, + Invocation.getter(#urlShortener), + ), + ) as _i3.UrlShortenerService); @override - _i3.UsersService get users => (super.noSuchMethod(Invocation.getter(#users), - returnValue: _FakeUsersService_12()) as _i3.UsersService); + _i3.UsersService get users => (super.noSuchMethod( + Invocation.getter(#users), + returnValue: _FakeUsersService_12( + this, + Invocation.getter(#users), + ), + ) as _i3.UsersService); @override - _i3.ChecksService get checks => - (super.noSuchMethod(Invocation.getter(#checks), - returnValue: _FakeChecksService_13()) as _i3.ChecksService); + _i3.ChecksService get checks => (super.noSuchMethod( + Invocation.getter(#checks), + returnValue: _FakeChecksService_13( + this, + Invocation.getter(#checks), + ), + ) as _i3.ChecksService); @override - _i4.Future getJSON(String? path, - {int? statusCode, - void Function(_i2.Response)? fail, - Map? headers, - Map? params, - _i3.JSONConverter? convert, - String? preview}) => + _i4.Future getJSON( + String? path, { + int? statusCode, + void Function(_i2.Response)? fail, + Map? headers, + Map? params, + _i3.JSONConverter? convert, + String? preview, + }) => (super.noSuchMethod( - Invocation.method(#getJSON, [ - path - ], { + Invocation.method( + #getJSON, + [path], + { #statusCode: statusCode, #fail: fail, #headers: headers, #params: params, #convert: convert, - #preview: preview - }), - returnValue: Future.value(null)) as _i4.Future); + #preview: preview, + }, + ), + returnValue: _i4.Future.value(null), + ) as _i4.Future); @override - _i4.Future postJSON(String? path, - {int? statusCode, - void Function(_i2.Response)? fail, - Map? headers, - Map? params, - _i3.JSONConverter? convert, - dynamic body, - String? preview}) => + _i4.Future postJSON( + String? path, { + int? statusCode, + void Function(_i2.Response)? fail, + Map? headers, + Map? params, + _i3.JSONConverter? convert, + dynamic body, + String? preview, + }) => (super.noSuchMethod( - Invocation.method(#postJSON, [ - path - ], { + Invocation.method( + #postJSON, + [path], + { #statusCode: statusCode, #fail: fail, #headers: headers, #params: params, #convert: convert, #body: body, - #preview: preview - }), - returnValue: Future.value(null)) as _i4.Future); + #preview: preview, + }, + ), + returnValue: _i4.Future.value(null), + ) as _i4.Future); @override - _i4.Future putJSON(String? path, - {int? statusCode, - void Function(_i2.Response)? fail, - Map? headers, - Map? params, - _i3.JSONConverter? convert, - dynamic body, - String? preview}) => + _i4.Future putJSON( + String? path, { + int? statusCode, + void Function(_i2.Response)? fail, + Map? headers, + Map? params, + _i3.JSONConverter? convert, + dynamic body, + String? preview, + }) => (super.noSuchMethod( - Invocation.method(#putJSON, [ - path - ], { + Invocation.method( + #putJSON, + [path], + { #statusCode: statusCode, #fail: fail, #headers: headers, #params: params, #convert: convert, #body: body, - #preview: preview - }), - returnValue: Future.value(null)) as _i4.Future); + #preview: preview, + }, + ), + returnValue: _i4.Future.value(null), + ) as _i4.Future); @override - _i4.Future patchJSON(String? path, - {int? statusCode, - void Function(_i2.Response)? fail, - Map? headers, - Map? params, - _i3.JSONConverter? convert, - dynamic body, - String? preview}) => + _i4.Future patchJSON( + String? path, { + int? statusCode, + void Function(_i2.Response)? fail, + Map? headers, + Map? params, + _i3.JSONConverter? convert, + dynamic body, + String? preview, + }) => (super.noSuchMethod( - Invocation.method(#patchJSON, [ - path - ], { + Invocation.method( + #patchJSON, + [path], + { #statusCode: statusCode, #fail: fail, #headers: headers, #params: params, #convert: convert, #body: body, - #preview: preview - }), - returnValue: Future.value(null)) as _i4.Future); + #preview: preview, + }, + ), + returnValue: _i4.Future.value(null), + ) as _i4.Future); @override - _i4.Future requestJson(String? method, String? path, - {int? statusCode, - void Function(_i2.Response)? fail, - Map? headers, - Map? params, - _i3.JSONConverter? convert, - dynamic body, - String? preview}) => + _i4.Future requestJson( + String? method, + String? path, { + int? statusCode, + void Function(_i2.Response)? fail, + Map? headers, + Map? params, + _i3.JSONConverter? convert, + dynamic body, + String? preview, + }) => (super.noSuchMethod( - Invocation.method(#requestJson, [ + Invocation.method( + #requestJson, + [ method, - path - ], { + path, + ], + { #statusCode: statusCode, #fail: fail, #headers: headers, #params: params, #convert: convert, #body: body, - #preview: preview - }), - returnValue: Future.value(null)) as _i4.Future); + #preview: preview, + }, + ), + returnValue: _i4.Future.value(null), + ) as _i4.Future); @override - _i4.Future<_i2.Response> request(String? method, String? path, - {Map? headers, - Map? params, - dynamic body, - int? statusCode, - void Function(_i2.Response)? fail, - String? preview}) => + _i4.Future<_i2.Response> request( + String? method, + String? path, { + Map? headers, + Map? params, + dynamic body, + int? statusCode, + void Function(_i2.Response)? fail, + String? preview, + }) => (super.noSuchMethod( - Invocation.method(#request, [ - method, - path - ], { - #headers: headers, - #params: params, - #body: body, - #statusCode: statusCode, - #fail: fail, - #preview: preview - }), - returnValue: Future<_i2.Response>.value(_FakeResponse_14())) - as _i4.Future<_i2.Response>); + Invocation.method( + #request, + [ + method, + path, + ], + { + #headers: headers, + #params: params, + #body: body, + #statusCode: statusCode, + #fail: fail, + #preview: preview, + }, + ), + returnValue: _i4.Future<_i2.Response>.value(_FakeResponse_14( + this, + Invocation.method( + #request, + [ + method, + path, + ], + { + #headers: headers, + #params: params, + #body: body, + #statusCode: statusCode, + #fail: fail, + #preview: preview, + }, + ), + )), + ) as _i4.Future<_i2.Response>); @override - void handleStatusCode(_i2.Response? response) => - super.noSuchMethod(Invocation.method(#handleStatusCode, [response]), - returnValueForMissingStub: null); + void handleStatusCode(_i2.Response? response) => super.noSuchMethod( + Invocation.method( + #handleStatusCode, + [response], + ), + returnValueForMissingStub: null, + ); @override - void dispose() => super.noSuchMethod(Invocation.method(#dispose, []), - returnValueForMissingStub: null); + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); } From 7056f9c2bf17c5f437e6cb32012a7d16f9ed3278 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sat, 22 Oct 2022 09:11:07 -0600 Subject: [PATCH 313/390] regen mocks for Dart 2.14 and dart format --- test/src/mocks.mocks.dart | 559 +++++++++---------------------- test/unit/checks_test.dart | 4 +- tool/release_unreleased_prs.dart | 34 +- 3 files changed, 178 insertions(+), 419 deletions(-) diff --git a/test/src/mocks.mocks.dart b/test/src/mocks.mocks.dart index 56e777d3..c381f58a 100644 --- a/test/src/mocks.mocks.dart +++ b/test/src/mocks.mocks.dart @@ -1,8 +1,7 @@ -// Mocks generated by Mockito 5.3.2 from annotations +// Mocks generated by Mockito 5.2.0 from annotations // in github/test/src/mocks.dart. // Do not manually edit this file. -// ignore_for_file: no_leading_underscores_for_library_prefixes import 'dart:async' as _i4; import 'package:github/src/common.dart' as _i3; @@ -18,163 +17,41 @@ import 'package:mockito/mockito.dart' as _i1; // ignore_for_file: prefer_const_constructors // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types -// ignore_for_file: subtype_of_sealed_class -class _FakeClient_0 extends _i1.SmartFake implements _i2.Client { - _FakeClient_0( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} +class _FakeClient_0 extends _i1.Fake implements _i2.Client {} -class _FakeActivityService_1 extends _i1.SmartFake - implements _i3.ActivityService { - _FakeActivityService_1( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} +class _FakeActivityService_1 extends _i1.Fake implements _i3.ActivityService {} -class _FakeAuthorizationsService_2 extends _i1.SmartFake - implements _i3.AuthorizationsService { - _FakeAuthorizationsService_2( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} +class _FakeAuthorizationsService_2 extends _i1.Fake + implements _i3.AuthorizationsService {} -class _FakeGistsService_3 extends _i1.SmartFake implements _i3.GistsService { - _FakeGistsService_3( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} +class _FakeGistsService_3 extends _i1.Fake implements _i3.GistsService {} -class _FakeGitService_4 extends _i1.SmartFake implements _i3.GitService { - _FakeGitService_4( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} +class _FakeGitService_4 extends _i1.Fake implements _i3.GitService {} -class _FakeIssuesService_5 extends _i1.SmartFake implements _i3.IssuesService { - _FakeIssuesService_5( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} +class _FakeIssuesService_5 extends _i1.Fake implements _i3.IssuesService {} -class _FakeMiscService_6 extends _i1.SmartFake implements _i3.MiscService { - _FakeMiscService_6( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} +class _FakeMiscService_6 extends _i1.Fake implements _i3.MiscService {} -class _FakeOrganizationsService_7 extends _i1.SmartFake - implements _i3.OrganizationsService { - _FakeOrganizationsService_7( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} +class _FakeOrganizationsService_7 extends _i1.Fake + implements _i3.OrganizationsService {} -class _FakePullRequestsService_8 extends _i1.SmartFake - implements _i3.PullRequestsService { - _FakePullRequestsService_8( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} +class _FakePullRequestsService_8 extends _i1.Fake + implements _i3.PullRequestsService {} -class _FakeRepositoriesService_9 extends _i1.SmartFake - implements _i3.RepositoriesService { - _FakeRepositoriesService_9( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} +class _FakeRepositoriesService_9 extends _i1.Fake + implements _i3.RepositoriesService {} -class _FakeSearchService_10 extends _i1.SmartFake implements _i3.SearchService { - _FakeSearchService_10( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} +class _FakeSearchService_10 extends _i1.Fake implements _i3.SearchService {} -class _FakeUrlShortenerService_11 extends _i1.SmartFake - implements _i3.UrlShortenerService { - _FakeUrlShortenerService_11( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} +class _FakeUrlShortenerService_11 extends _i1.Fake + implements _i3.UrlShortenerService {} -class _FakeUsersService_12 extends _i1.SmartFake implements _i3.UsersService { - _FakeUsersService_12( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} +class _FakeUsersService_12 extends _i1.Fake implements _i3.UsersService {} -class _FakeChecksService_13 extends _i1.SmartFake implements _i3.ChecksService { - _FakeChecksService_13( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} +class _FakeChecksService_13 extends _i1.Fake implements _i3.ChecksService {} -class _FakeResponse_14 extends _i1.SmartFake implements _i2.Response { - _FakeResponse_14( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} +class _FakeResponse_14 extends _i1.Fake implements _i2.Response {} /// A class which mocks [GitHub]. /// @@ -185,327 +62,201 @@ class MockGitHub extends _i1.Mock implements _i3.GitHub { } @override - set auth(_i3.Authentication? _auth) => super.noSuchMethod( - Invocation.setter( - #auth, - _auth, - ), - returnValueForMissingStub: null, - ); + set auth(_i3.Authentication? _auth) => + super.noSuchMethod(Invocation.setter(#auth, _auth), + returnValueForMissingStub: null); @override - String get endpoint => (super.noSuchMethod( - Invocation.getter(#endpoint), - returnValue: '', - ) as String); + String get endpoint => + (super.noSuchMethod(Invocation.getter(#endpoint), returnValue: '') + as String); @override - _i2.Client get client => (super.noSuchMethod( - Invocation.getter(#client), - returnValue: _FakeClient_0( - this, - Invocation.getter(#client), - ), - ) as _i2.Client); + _i2.Client get client => (super.noSuchMethod(Invocation.getter(#client), + returnValue: _FakeClient_0()) as _i2.Client); @override - _i3.ActivityService get activity => (super.noSuchMethod( - Invocation.getter(#activity), - returnValue: _FakeActivityService_1( - this, - Invocation.getter(#activity), - ), - ) as _i3.ActivityService); + _i3.ActivityService get activity => + (super.noSuchMethod(Invocation.getter(#activity), + returnValue: _FakeActivityService_1()) as _i3.ActivityService); @override - _i3.AuthorizationsService get authorizations => (super.noSuchMethod( - Invocation.getter(#authorizations), - returnValue: _FakeAuthorizationsService_2( - this, - Invocation.getter(#authorizations), - ), - ) as _i3.AuthorizationsService); + _i3.AuthorizationsService get authorizations => + (super.noSuchMethod(Invocation.getter(#authorizations), + returnValue: _FakeAuthorizationsService_2()) + as _i3.AuthorizationsService); @override - _i3.GistsService get gists => (super.noSuchMethod( - Invocation.getter(#gists), - returnValue: _FakeGistsService_3( - this, - Invocation.getter(#gists), - ), - ) as _i3.GistsService); + _i3.GistsService get gists => (super.noSuchMethod(Invocation.getter(#gists), + returnValue: _FakeGistsService_3()) as _i3.GistsService); @override - _i3.GitService get git => (super.noSuchMethod( - Invocation.getter(#git), - returnValue: _FakeGitService_4( - this, - Invocation.getter(#git), - ), - ) as _i3.GitService); + _i3.GitService get git => (super.noSuchMethod(Invocation.getter(#git), + returnValue: _FakeGitService_4()) as _i3.GitService); @override - _i3.IssuesService get issues => (super.noSuchMethod( - Invocation.getter(#issues), - returnValue: _FakeIssuesService_5( - this, - Invocation.getter(#issues), - ), - ) as _i3.IssuesService); + _i3.IssuesService get issues => + (super.noSuchMethod(Invocation.getter(#issues), + returnValue: _FakeIssuesService_5()) as _i3.IssuesService); @override - _i3.MiscService get misc => (super.noSuchMethod( - Invocation.getter(#misc), - returnValue: _FakeMiscService_6( - this, - Invocation.getter(#misc), - ), - ) as _i3.MiscService); + _i3.MiscService get misc => (super.noSuchMethod(Invocation.getter(#misc), + returnValue: _FakeMiscService_6()) as _i3.MiscService); @override _i3.OrganizationsService get organizations => (super.noSuchMethod( - Invocation.getter(#organizations), - returnValue: _FakeOrganizationsService_7( - this, - Invocation.getter(#organizations), - ), - ) as _i3.OrganizationsService); + Invocation.getter(#organizations), + returnValue: _FakeOrganizationsService_7()) as _i3.OrganizationsService); @override _i3.PullRequestsService get pullRequests => (super.noSuchMethod( - Invocation.getter(#pullRequests), - returnValue: _FakePullRequestsService_8( - this, - Invocation.getter(#pullRequests), - ), - ) as _i3.PullRequestsService); + Invocation.getter(#pullRequests), + returnValue: _FakePullRequestsService_8()) as _i3.PullRequestsService); @override _i3.RepositoriesService get repositories => (super.noSuchMethod( - Invocation.getter(#repositories), - returnValue: _FakeRepositoriesService_9( - this, - Invocation.getter(#repositories), - ), - ) as _i3.RepositoriesService); + Invocation.getter(#repositories), + returnValue: _FakeRepositoriesService_9()) as _i3.RepositoriesService); @override - _i3.SearchService get search => (super.noSuchMethod( - Invocation.getter(#search), - returnValue: _FakeSearchService_10( - this, - Invocation.getter(#search), - ), - ) as _i3.SearchService); + _i3.SearchService get search => + (super.noSuchMethod(Invocation.getter(#search), + returnValue: _FakeSearchService_10()) as _i3.SearchService); @override _i3.UrlShortenerService get urlShortener => (super.noSuchMethod( - Invocation.getter(#urlShortener), - returnValue: _FakeUrlShortenerService_11( - this, - Invocation.getter(#urlShortener), - ), - ) as _i3.UrlShortenerService); + Invocation.getter(#urlShortener), + returnValue: _FakeUrlShortenerService_11()) as _i3.UrlShortenerService); @override - _i3.UsersService get users => (super.noSuchMethod( - Invocation.getter(#users), - returnValue: _FakeUsersService_12( - this, - Invocation.getter(#users), - ), - ) as _i3.UsersService); + _i3.UsersService get users => (super.noSuchMethod(Invocation.getter(#users), + returnValue: _FakeUsersService_12()) as _i3.UsersService); @override - _i3.ChecksService get checks => (super.noSuchMethod( - Invocation.getter(#checks), - returnValue: _FakeChecksService_13( - this, - Invocation.getter(#checks), - ), - ) as _i3.ChecksService); + _i3.ChecksService get checks => + (super.noSuchMethod(Invocation.getter(#checks), + returnValue: _FakeChecksService_13()) as _i3.ChecksService); @override - _i4.Future getJSON( - String? path, { - int? statusCode, - void Function(_i2.Response)? fail, - Map? headers, - Map? params, - _i3.JSONConverter? convert, - String? preview, - }) => + _i4.Future getJSON(String? path, + {int? statusCode, + void Function(_i2.Response)? fail, + Map? headers, + Map? params, + _i3.JSONConverter? convert, + String? preview}) => (super.noSuchMethod( - Invocation.method( - #getJSON, - [path], - { + Invocation.method(#getJSON, [ + path + ], { #statusCode: statusCode, #fail: fail, #headers: headers, #params: params, #convert: convert, - #preview: preview, - }, - ), - returnValue: _i4.Future.value(null), - ) as _i4.Future); + #preview: preview + }), + returnValue: Future.value(null)) as _i4.Future); @override - _i4.Future postJSON( - String? path, { - int? statusCode, - void Function(_i2.Response)? fail, - Map? headers, - Map? params, - _i3.JSONConverter? convert, - dynamic body, - String? preview, - }) => + _i4.Future postJSON(String? path, + {int? statusCode, + void Function(_i2.Response)? fail, + Map? headers, + Map? params, + _i3.JSONConverter? convert, + dynamic body, + String? preview}) => (super.noSuchMethod( - Invocation.method( - #postJSON, - [path], - { + Invocation.method(#postJSON, [ + path + ], { #statusCode: statusCode, #fail: fail, #headers: headers, #params: params, #convert: convert, #body: body, - #preview: preview, - }, - ), - returnValue: _i4.Future.value(null), - ) as _i4.Future); + #preview: preview + }), + returnValue: Future.value(null)) as _i4.Future); @override - _i4.Future putJSON( - String? path, { - int? statusCode, - void Function(_i2.Response)? fail, - Map? headers, - Map? params, - _i3.JSONConverter? convert, - dynamic body, - String? preview, - }) => + _i4.Future putJSON(String? path, + {int? statusCode, + void Function(_i2.Response)? fail, + Map? headers, + Map? params, + _i3.JSONConverter? convert, + dynamic body, + String? preview}) => (super.noSuchMethod( - Invocation.method( - #putJSON, - [path], - { + Invocation.method(#putJSON, [ + path + ], { #statusCode: statusCode, #fail: fail, #headers: headers, #params: params, #convert: convert, #body: body, - #preview: preview, - }, - ), - returnValue: _i4.Future.value(null), - ) as _i4.Future); + #preview: preview + }), + returnValue: Future.value(null)) as _i4.Future); @override - _i4.Future patchJSON( - String? path, { - int? statusCode, - void Function(_i2.Response)? fail, - Map? headers, - Map? params, - _i3.JSONConverter? convert, - dynamic body, - String? preview, - }) => + _i4.Future patchJSON(String? path, + {int? statusCode, + void Function(_i2.Response)? fail, + Map? headers, + Map? params, + _i3.JSONConverter? convert, + dynamic body, + String? preview}) => (super.noSuchMethod( - Invocation.method( - #patchJSON, - [path], - { + Invocation.method(#patchJSON, [ + path + ], { #statusCode: statusCode, #fail: fail, #headers: headers, #params: params, #convert: convert, #body: body, - #preview: preview, - }, - ), - returnValue: _i4.Future.value(null), - ) as _i4.Future); + #preview: preview + }), + returnValue: Future.value(null)) as _i4.Future); @override - _i4.Future requestJson( - String? method, - String? path, { - int? statusCode, - void Function(_i2.Response)? fail, - Map? headers, - Map? params, - _i3.JSONConverter? convert, - dynamic body, - String? preview, - }) => + _i4.Future requestJson(String? method, String? path, + {int? statusCode, + void Function(_i2.Response)? fail, + Map? headers, + Map? params, + _i3.JSONConverter? convert, + dynamic body, + String? preview}) => (super.noSuchMethod( - Invocation.method( - #requestJson, - [ + Invocation.method(#requestJson, [ method, - path, - ], - { + path + ], { #statusCode: statusCode, #fail: fail, #headers: headers, #params: params, #convert: convert, #body: body, - #preview: preview, - }, - ), - returnValue: _i4.Future.value(null), - ) as _i4.Future); + #preview: preview + }), + returnValue: Future.value(null)) as _i4.Future); @override - _i4.Future<_i2.Response> request( - String? method, - String? path, { - Map? headers, - Map? params, - dynamic body, - int? statusCode, - void Function(_i2.Response)? fail, - String? preview, - }) => + _i4.Future<_i2.Response> request(String? method, String? path, + {Map? headers, + Map? params, + dynamic body, + int? statusCode, + void Function(_i2.Response)? fail, + String? preview}) => (super.noSuchMethod( - Invocation.method( - #request, - [ - method, - path, - ], - { - #headers: headers, - #params: params, - #body: body, - #statusCode: statusCode, - #fail: fail, - #preview: preview, - }, - ), - returnValue: _i4.Future<_i2.Response>.value(_FakeResponse_14( - this, - Invocation.method( - #request, - [ - method, - path, - ], - { - #headers: headers, - #params: params, - #body: body, - #statusCode: statusCode, - #fail: fail, - #preview: preview, - }, - ), - )), - ) as _i4.Future<_i2.Response>); + Invocation.method(#request, [ + method, + path + ], { + #headers: headers, + #params: params, + #body: body, + #statusCode: statusCode, + #fail: fail, + #preview: preview + }), + returnValue: Future<_i2.Response>.value(_FakeResponse_14())) + as _i4.Future<_i2.Response>); @override - void handleStatusCode(_i2.Response? response) => super.noSuchMethod( - Invocation.method( - #handleStatusCode, - [response], - ), - returnValueForMissingStub: null, - ); + void handleStatusCode(_i2.Response? response) => + super.noSuchMethod(Invocation.method(#handleStatusCode, [response]), + returnValueForMissingStub: null); @override - void dispose() => super.noSuchMethod( - Invocation.method( - #dispose, - [], - ), - returnValueForMissingStub: null, - ); + void dispose() => super.noSuchMethod(Invocation.method(#dispose, []), + returnValueForMissingStub: null); } diff --git a/test/unit/checks_test.dart b/test/unit/checks_test.dart index 7d77662c..8af59043 100644 --- a/test/unit/checks_test.dart +++ b/test/unit/checks_test.dart @@ -97,12 +97,12 @@ const checkRunJson = '''{ ] }'''; -const String expectedToString = '{"name":"mighty_readme","id":4,"external_id":"","status":"completed","head_sha":"","check_suite":{"id":5},"details_url":"https://example.com","started_at":"2018-05-04T01:14:52.000Z","conclusion":"neutral"}'; +const String expectedToString = + '{"name":"mighty_readme","id":4,"external_id":"","status":"completed","head_sha":"","check_suite":{"id":5},"details_url":"https://example.com","started_at":"2018-05-04T01:14:52.000Z","conclusion":"neutral"}'; void main() { group('Check run', () { test('CheckRun fromJson', () { - final checkRun = CheckRun.fromJson(jsonDecode(checkRunJson)); expect(checkRun.id, 4); diff --git a/tool/release_unreleased_prs.dart b/tool/release_unreleased_prs.dart index 372eefc4..aca8dae1 100644 --- a/tool/release_unreleased_prs.dart +++ b/tool/release_unreleased_prs.dart @@ -49,7 +49,8 @@ Future main(List args) async { for (final i in unreleased) { await _gh.issues.removeLabelForIssue(_slug, i.number, 'unreleased'); await _gh.issues.addLabelsToIssue(_slug, i.number, ['released']); - await _gh.issues.createComment(_slug, i.number, 'Released in version $nextVersion https://github.com/$fullrepo/releases/tag/$nextVersion'); + await _gh.issues.createComment(_slug, i.number, + 'Released in version $nextVersion https://github.com/$fullrepo/releases/tag/$nextVersion'); } exit(0); @@ -92,15 +93,21 @@ Future getLatestVersion(RepositorySlug slug) async { Future> getUnreleasedPRs() async { print('Loading unreleased PRs...'); - var prs = await _gh.search.issues('repo:${_slug.fullName} is:pull-request label:unreleased -label:no_release_on_merge state:closed', sort: 'desc').toList(); + var prs = await _gh.search + .issues( + 'repo:${_slug.fullName} is:pull-request label:unreleased -label:no_release_on_merge state:closed', + sort: 'desc') + .toList(); print('${prs.length} loaded'); return prs; } String getNextVersion(Version currentVersion, List unreleased) { var semvers = Set(); - for (final pr in unreleased){ - var prlabels = pr.labels.where((element) => element.name.startsWith('semver:')).toList(); + for (final pr in unreleased) { + var prlabels = pr.labels + .where((element) => element.name.startsWith('semver:')) + .toList(); for (final l in prlabels) { semvers.add(l.name); } @@ -118,13 +125,14 @@ String getNextVersion(Version currentVersion, List unreleased) { return newVersion; } -Future generateReleaseNotes(String fromVersion, String newVersion) async { +Future generateReleaseNotes( + String fromVersion, String newVersion) async { var notes = await _gh.repositories.generateReleaseNotes(CreateReleaseNotes( _slug.owner, _slug.name, newVersion, previousTagName: fromVersion)); - + var releaseNotes = notes.body.replaceFirst('## What\'s Changed', ''); - + var r = '## $newVersion\n$releaseNotes'; print(r); return r; @@ -147,8 +155,8 @@ void updatePubspec(String newVersion) { } Future createRelease(String version, String target) async { - print('Creating release ...'); - var release = await _gh.repositories.createRelease( + print('Creating release ...'); + var release = await _gh.repositories.createRelease( _slug, CreateRelease.from( tagName: version, @@ -158,13 +166,13 @@ Future createRelease(String version, String target) async { isDraft: false, isPrerelease: false)); - print('Release ${release.name} created ${release.createdAt}'); - print(release.body); - return release; + print('Release ${release.name} created ${release.createdAt}'); + print(release.body); + return release; } void commitUpdates(String version) { run('git add pubspec.yaml CHANGELOG.md'); run('git', rest: ['commit', '-m', 'prep $version']); run('git push'); -} \ No newline at end of file +} From f90446459e2723baecc16f8ac725b5147bd915ab Mon Sep 17 00:00:00 2001 From: robrbecker Date: Sat, 22 Oct 2022 15:15:48 +0000 Subject: [PATCH 314/390] prep 9.5.0 --- CHANGELOG.md | 9 +++++++++ pubspec.yaml | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d09d1b76..5de4e987 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +## 9.5.0 + +* Add 'commits' member to GitHubComparison object by @fuzzybinary in https://github.com/SpinlockLabs/github.dart/pull/330 + +## New Contributors +* @fuzzybinary made their first contribution in https://github.com/SpinlockLabs/github.dart/pull/330 + +**Full Changelog**: https://github.com/SpinlockLabs/github.dart/compare/9.4.1...9.5.0 + ## 9.4.1 * Update to github-script 6 by @robbecker-wf in https://github.com/SpinlockLabs/github.dart/pull/331 diff --git a/pubspec.yaml b/pubspec.yaml index 9aa43f84..77f1f627 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 9.4.1 +version: 9.5.0 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From eb66f129cd44be6fc97de3b449a51d3c645d0c05 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sat, 22 Oct 2022 09:19:21 -0600 Subject: [PATCH 315/390] use "dart pub" instead of just "pub" --- .github/workflows/dart.yml | 2 +- .github/workflows/publish_demos.yml | 6 +++--- .github/workflows/publish_release.yml | 2 +- .github/workflows/release_unreleased_prs.yml | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/dart.yml b/.github/workflows/dart.yml index 0a4012c0..798e95c2 100644 --- a/.github/workflows/dart.yml +++ b/.github/workflows/dart.yml @@ -13,7 +13,7 @@ jobs: steps: - uses: actions/checkout@v1 - name: Install dependencies - run: pub get + run: dart pub get - name: Dart Analyzer run: dart analyze - name: Check Dart Format diff --git a/.github/workflows/publish_demos.yml b/.github/workflows/publish_demos.yml index a92beb58..33f242d2 100644 --- a/.github/workflows/publish_demos.yml +++ b/.github/workflows/publish_demos.yml @@ -18,9 +18,9 @@ jobs: - name: Install and Build 🔧 run: | - pub global activate webdev - pub get - pub global run webdev build -o build -- --delete-conflicting-outputs + dart pub global activate webdev + dart pub get + dart pub global run webdev build -o build -- --delete-conflicting-outputs rm build/example/packages - name: Publish 🚀 diff --git a/.github/workflows/publish_release.yml b/.github/workflows/publish_release.yml index 3743cd63..ca9789ba 100644 --- a/.github/workflows/publish_release.yml +++ b/.github/workflows/publish_release.yml @@ -17,4 +17,4 @@ jobs: mkdir -p ~/.pub-cache echo ${{ secrets.CREDENTIAL_JSON }} > ~/.pub-cache/credentials.json - name: Publish package - run: pub publish -f \ No newline at end of file + run: dart pub publish -f \ No newline at end of file diff --git a/.github/workflows/release_unreleased_prs.yml b/.github/workflows/release_unreleased_prs.yml index e3b196cd..c3afb5dd 100644 --- a/.github/workflows/release_unreleased_prs.yml +++ b/.github/workflows/release_unreleased_prs.yml @@ -29,5 +29,5 @@ jobs: export PATH="$PATH":"$HOME/.pub-cache/bin" export GITHUB_TOKEN=${{secrets.MACHINE_GITHUB_API_TOKEN}} export MACHINE_GITHUB_API_TOKEN=${{secrets.MACHINE_GITHUB_API_TOKEN}} - pub get + dart pub get dart tool/release_unreleased_prs.dart \ No newline at end of file From b9f545a4cfa9c8acae996a7151f94ee49ba5cf65 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Mon, 31 Oct 2022 08:28:23 -0600 Subject: [PATCH 316/390] Fix up unit tests & run them in CI (#336) - remove mockito generated mocks, use nock instead - lots of test fixes - add testing matrix - added a makefile - added ocktokit scenarios - actually run tests in CI --- .github/workflows/dart.yml | 7 +- .github/workflows/release_unreleased_prs.yml | 2 +- .github/workflows/tests.yml | 24 +- Makefile | 20 + dart_test.yaml | 15 + lib/src/common/model/misc.dart | 12 +- lib/src/common/model/repos_releases.dart | 1 + lib/src/common/model/repos_releases.g.dart | 2 +- pubspec.yaml | 3 +- test/assets/responses/nocked_responses.dart | 1474 ++++++++++++++++++ test/code_search_test.dart | 21 - test/git_test.dart | 419 ++--- test/scenarios_test.dart | 140 ++ test/src/mocks.dart | 5 - test/src/mocks.mocks.dart | 262 ---- test/unit/common/model/misc_test.dart | 51 +- 16 files changed, 1870 insertions(+), 588 deletions(-) create mode 100644 Makefile create mode 100644 dart_test.yaml create mode 100644 test/assets/responses/nocked_responses.dart delete mode 100644 test/code_search_test.dart create mode 100644 test/scenarios_test.dart delete mode 100644 test/src/mocks.dart delete mode 100644 test/src/mocks.mocks.dart diff --git a/.github/workflows/dart.yml b/.github/workflows/dart.yml index 798e95c2..119546e2 100644 --- a/.github/workflows/dart.yml +++ b/.github/workflows/dart.yml @@ -4,12 +4,9 @@ on: [push] jobs: build: - runs-on: ubuntu-latest - container: - image: dart:2.14 - + image: dart:2.17 steps: - uses: actions/checkout@v1 - name: Install dependencies @@ -17,6 +14,6 @@ jobs: - name: Dart Analyzer run: dart analyze - name: Check Dart Format - run: dart format --set-exit-if-changed -o none lib test tool example && echo Dart Format 👍 || echo Files needed Dart formatting 😢 + run: dart format --set-exit-if-changed -o none lib test tool example integration_test && echo Dart Format 👍 || echo Files needed Dart formatting 😢 - name: Check if Publishable run: dart pub publish --dry-run diff --git a/.github/workflows/release_unreleased_prs.yml b/.github/workflows/release_unreleased_prs.yml index c3afb5dd..a087b032 100644 --- a/.github/workflows/release_unreleased_prs.yml +++ b/.github/workflows/release_unreleased_prs.yml @@ -12,7 +12,7 @@ jobs: release: if: github.event.pull_request.merged == true || github.event_name == 'workflow_dispatch' runs-on: ubuntu-latest - container: dart:2.14.4 + container: dart:2.17.7 permissions: contents: write diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index b0ca36a3..6e1cb6e5 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -6,13 +6,19 @@ on: branches: [ master ] jobs: test: - runs-on: ubuntu-latest + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest] + sdk: [2.14.4, 2.17.7, stable] # Test with at least the declared minimum Dart version steps: - - uses: actions/checkout@v2 - - uses: dart-lang/setup-dart@v1 - - name: Install dependencies - run: dart pub get - # - name: Unit tests - # run: dart test test - # - name: Integration tests - # run: dart test integration_test + - uses: actions/checkout@v2 + - uses: dart-lang/setup-dart@v1.3 + with: + sdk: ${{ matrix.sdk }} + - name: Install dependencies + run: dart pub get + - name: Unit tests + run: dart test + # - name: Integration tests + # run: dart test integration_test diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..c146167b --- /dev/null +++ b/Makefile @@ -0,0 +1,20 @@ +.DEFAULT_GOAL := help +SHELL=/bin/bash -o pipefail + +# Cite: https://marmelab.com/blog/2016/02/29/auto-documented-makefile.html +.PHONY: help +help: ## Display this help page + @grep -E '^[a-zA-Z0-9/_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' + +.PHONY: fixtures +fixtures: ## Run octokit-fixtures-server for scenario tests + @npx octokit-fixtures-server & + +.PHONY: stop +stop: ## Stop the fixtures server + @killall node + +.PHONY: test +test: fixtures ## Run tests + @dart test -P all + make stop \ No newline at end of file diff --git a/dart_test.yaml b/dart_test.yaml new file mode 100644 index 00000000..04f3491b --- /dev/null +++ b/dart_test.yaml @@ -0,0 +1,15 @@ +tags: + scenarios: + skip: | + Not run by default when running dart test. To run: + npx octokit-fixtures-server + dart test -P scenarios + or run all tests with: + make test + +presets: + scenarios: + include_tags: scenarios + run_skipped: true + all: + run_skipped: true \ No newline at end of file diff --git a/lib/src/common/model/misc.dart b/lib/src/common/model/misc.dart index ad693d34..adf7b2be 100644 --- a/lib/src/common/model/misc.dart +++ b/lib/src/common/model/misc.dart @@ -44,10 +44,14 @@ class RateLimit { /// /// API docs: https://developer.github.com/v3/rate_limit/ factory RateLimit.fromRateLimitResponse(Map response) { - final rateJson = response['rate'] as Map; - final limit = rateJson['limit'] as int?; - final remaining = rateJson['remaining'] as int?; - final resets = DateTime.fromMillisecondsSinceEpoch(rateJson['reset']!); + final rateJson = response['rate'] == null + ? null + : response['rate'] as Map; + final limit = rateJson?['limit'] as int?; + final remaining = rateJson?['remaining'] as int?; + final resets = rateJson?['reset'] == null + ? null + : DateTime.fromMillisecondsSinceEpoch(rateJson?['reset']); return RateLimit(limit, remaining, resets); } diff --git a/lib/src/common/model/repos_releases.dart b/lib/src/common/model/repos_releases.dart index 4656dd1c..30a80172 100644 --- a/lib/src/common/model/repos_releases.dart +++ b/lib/src/common/model/repos_releases.dart @@ -175,6 +175,7 @@ class CreateRelease { String? discussionCategoryName; + @JsonKey(defaultValue: false) bool generateReleaseNotes = false; CreateRelease(this.tagName); diff --git a/lib/src/common/model/repos_releases.g.dart b/lib/src/common/model/repos_releases.g.dart index bcaec1ee..2e0998e7 100644 --- a/lib/src/common/model/repos_releases.g.dart +++ b/lib/src/common/model/repos_releases.g.dart @@ -101,7 +101,7 @@ CreateRelease _$CreateReleaseFromJson(Map json) => ..isDraft = json['draft'] as bool? ..isPrerelease = json['prerelease'] as bool? ..discussionCategoryName = json['discussion_category_name'] as String? - ..generateReleaseNotes = json['generate_release_notes'] as bool; + ..generateReleaseNotes = json['generate_release_notes'] as bool? ?? false; Map _$CreateReleaseToJson(CreateRelease instance) => { diff --git a/pubspec.yaml b/pubspec.yaml index 77f1f627..ed60fc15 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -21,7 +21,8 @@ dev_dependencies: json_serializable: ^6.0.0 lints: ^1.0.0 mockito: ^5.0.0 - pub_semver: + nock: ^1.0.0 + pub_semver: ^2.0.0 test: ^1.16.0 yaml: ^3.0.0 yaml_edit: diff --git a/test/assets/responses/nocked_responses.dart b/test/assets/responses/nocked_responses.dart new file mode 100644 index 00000000..6feb9465 --- /dev/null +++ b/test/assets/responses/nocked_responses.dart @@ -0,0 +1,1474 @@ +var getBlob = ''' +{ + "content": "Q29udGVudCBvZiB0aGUgYmxvYg==", + "encoding": "base64", + "url": "https://api.github.com/repos/octocat/example/git/blobs/3a0f86fb8db8eea7ccbb9a95f325ddbedfb25e15", + "sha": "3a0f86fb8db8eea7ccbb9a95f325ddbedfb25e15", + "size": 19, + "node_id": "Q29udGVudCBvZiB0aGUgYmxvYg==" +}'''; + +var createBlob = ''' +{ + "url": "https://api.github.com/repos/octocat/example/git/blobs/3a0f86fb8db8eea7ccbb9a95f325ddbedfb25e15", + "sha": "3a0f86fb8db8eea7ccbb9a95f325ddbedfb25e15", + "content": "bbb", + "encoding": "utf-8" +}'''; + +var getCommit = ''' +{ + "sha": "7638417db6d59f3c431d3e1f261cc637155684cd", + "node_id": "MDY6Q29tbWl0NmRjYjA5YjViNTc4NzVmMzM0ZjYxYWViZWQ2OTVlMmU0MTkzZGI1ZQ==", + "url": "https://api.github.com/repos/octocat/Hello-World/git/commits/7638417db6d59f3c431d3e1f261cc637155684cd", + "html_url": "https://github.com/octocat/Hello-World/commit/7638417db6d59f3c431d3e1f261cc637155684cd", + "author": { + "date": "2014-11-07T22:01:45Z", + "name": "Monalisa Octocat", + "email": "octocat@github.com" + }, + "committer": { + "date": "2014-11-07T22:01:45Z", + "name": "Monalisa Octocat", + "email": "octocat@github.com" + }, + "message": "added readme, because im a good github citizen", + "tree": { + "url": "https://api.github.com/repos/octocat/Hello-World/git/trees/691272480426f78a0138979dd3ce63b77f706feb", + "sha": "691272480426f78a0138979dd3ce63b77f706feb" + }, + "parents": [ + { + "url": "https://api.github.com/repos/octocat/Hello-World/git/commits/1acc419d4d6a9ce985db7be48c6349a0475975b5", + "sha": "1acc419d4d6a9ce985db7be48c6349a0475975b5", + "html_url": "https://github.com/octocat/Hello-World/commit/7638417db6d59f3c431d3e1f261cc637155684cd" + } + ], + "verification": { + "verified": false, + "reason": "unsigned", + "signature": null, + "payload": null + } +}'''; + +var createCommit = ''' +{ + "sha": "7638417db6d59f3c431d3e1f261cc637155684cd", + "node_id": "MDY6Q29tbWl0NzYzODQxN2RiNmQ1OWYzYzQzMWQzZTFmMjYxY2M2MzcxNTU2ODRjZA==", + "url": "https://api.github.com/repos/octocat/Hello-World/git/commits/7638417db6d59f3c431d3e1f261cc637155684cd", + "author": { + "date": "2014-11-07T22:01:45Z", + "name": "Monalisa Octocat", + "email": "octocat@github.com" + }, + "committer": { + "date": "2014-11-07T22:01:45Z", + "name": "Monalisa Octocat", + "email": "octocat@github.com" + }, + "message": "aMessage", + "tree": { + "url": "https://api.github.com/repos/octocat/Hello-World/git/trees/827efc6d56897b048c772eb4087f854f46256132", + "sha": "aTreeSha" + }, + "parents": [ + { + "url": "https://api.github.com/repos/octocat/Hello-World/git/commits/7d1b31e74ee336d15cbd21741bc88a537ed063a0", + "sha": "7d1b31e74ee336d15cbd21741bc88a537ed063a0", + "html_url": "https://github.com/octocat/Hello-World/commit/7d1b31e74ee336d15cbd21741bc88a537ed063a0" + } + ], + "verification": { + "verified": false, + "reason": "unsigned", + "signature": null, + "payload": null + }, + "html_url": "https://github.com/octocat/Hello-World/commit/7638417db6d59f3c431d3e1f261cc637155684cd" +}'''; + +var getReference = '''{ + "ref": "refs/heads/b", + "node_id": "MDM6UmVmcmVmcy9oZWFkcy9mZWF0dXJlQQ==", + "url": "https://api.github.com/repos/octocat/Hello-World/git/refs/heads/featureA", + "object": { + "type": "commit", + "sha": "aa218f56b14c9653891f9e74264a383fa43fefbd", + "url": "https://api.github.com/repos/octocat/Hello-World/git/commits/aa218f56b14c9653891f9e74264a383fa43fefbd" + } +}'''; + +var createReference = '''{ + "ref": "refs/heads/b", + "node_id": "MDM6UmVmcmVmcy9oZWFkcy9mZWF0dXJlQQ==", + "url": "https://api.github.com/repos/octocat/Hello-World/git/refs/heads/featureA", + "object": { + "type": "commit", + "sha": "aa218f56b14c9653891f9e74264a383fa43fefbd", + "url": "https://api.github.com/repos/octocat/Hello-World/git/commits/aa218f56b14c9653891f9e74264a383fa43fefbd" + } +}'''; + +var getTag = '''{ + "node_id": "MDM6VGFnOTQwYmQzMzYyNDhlZmFlMGY5ZWU1YmM3YjJkNWM5ODU4ODdiMTZhYw==", + "tag": "v0.0.1", + "sha": "940bd336248efae0f9ee5bc7b2d5c985887b16ac", + "url": "https://api.github.com/repos/octocat/Hello-World/git/tags/940bd336248efae0f9ee5bc7b2d5c985887b16ac", + "message": "initial version", + "tagger": { + "name": "Monalisa Octocat", + "email": "octocat@github.com", + "date": "2014-11-07T22:01:45Z" + }, + "object": { + "type": "commit", + "sha": "c3d0be41ecbe669545ee3e94d31ed9a4bc91ee3c", + "url": "https://api.github.com/repos/octocat/Hello-World/git/commits/c3d0be41ecbe669545ee3e94d31ed9a4bc91ee3c" + }, + "verification": { + "verified": false, + "reason": "unsigned", + "signature": null, + "payload": null + } +}'''; + +var createTag = '''{ + "node_id": "MDM6VGFnOTQwYmQzMzYyNDhlZmFlMGY5ZWU1YmM3YjJkNWM5ODU4ODdiMTZhYw==", + "tag": "v0.0.1", + "sha": "940bd336248efae0f9ee5bc7b2d5c985887b16ac", + "url": "https://api.github.com/repos/octocat/Hello-World/git/tags/940bd336248efae0f9ee5bc7b2d5c985887b16ac", + "message": "initial version", + "tagger": { + "name": "Monalisa Octocat", + "email": "octocat@github.com", + "date": "2014-11-07T22:01:45Z" + }, + "object": { + "type": "commit", + "sha": "c3d0be41ecbe669545ee3e94d31ed9a4bc91ee3c", + "url": "https://api.github.com/repos/octocat/Hello-World/git/commits/c3d0be41ecbe669545ee3e94d31ed9a4bc91ee3c" + }, + "verification": { + "verified": false, + "reason": "unsigned", + "signature": null, + "payload": null + } +}'''; + +var createTree = '''{ + "sha": "44b4fc6d56897b048c772eb4087f854f46256132", + "url": "https://api.github.com/repos/octocat/Hello-World/trees/44b4fc6d56897b048c772eb4087f854f46256132", + "tree": [ + { + "path": "file.rb", + "mode": "100644", + "type": "blob", + "size": 132, + "sha": "44b4fc6d56897b048c772eb4087f854f46256132", + "url": "https://api.github.com/repos/octocat/Hello-World/git/blobs/44b4fc6d56897b048c772eb4087f854f46256132" + } + ], + "truncated": true +}'''; + +var searchResults = '''{ + "total_count": 17, + "incomplete_results": false, + "items": [ + { + "name": "search.dart", + "path": "lib/src/common/model/search.dart", + "sha": "c61f39e54eeef0b20d132d2c3ea48bcd3b0d34a9", + "url": "https://api.github.com/repositories/22344823/contents/lib/src/common/model/search.dart?ref=27929ddc731393422327dddee0aaa56d0164c775", + "git_url": "https://api.github.com/repositories/22344823/git/blobs/c61f39e54eeef0b20d132d2c3ea48bcd3b0d34a9", + "html_url": "https://github.com/SpinlockLabs/github.dart/blob/27929ddc731393422327dddee0aaa56d0164c775/lib/src/common/model/search.dart", + "repository": { + "id": 22344823, + "node_id": "MDEwOlJlcG9zaXRvcnkyMjM0NDgyMw==", + "name": "github.dart", + "full_name": "SpinlockLabs/github.dart", + "private": false, + "owner": { + "login": "SpinlockLabs", + "id": 26679435, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjI2Njc5NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/26679435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/SpinlockLabs", + "html_url": "https://github.com/SpinlockLabs", + "followers_url": "https://api.github.com/users/SpinlockLabs/followers", + "following_url": "https://api.github.com/users/SpinlockLabs/following{/other_user}", + "gists_url": "https://api.github.com/users/SpinlockLabs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/SpinlockLabs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/SpinlockLabs/subscriptions", + "organizations_url": "https://api.github.com/users/SpinlockLabs/orgs", + "repos_url": "https://api.github.com/users/SpinlockLabs/repos", + "events_url": "https://api.github.com/users/SpinlockLabs/events{/privacy}", + "received_events_url": "https://api.github.com/users/SpinlockLabs/received_events", + "type": "Organization", + "site_admin": false + }, + "html_url": "https://github.com/SpinlockLabs/github.dart", + "description": "GitHub Client Library for Dart", + "fork": false, + "url": "https://api.github.com/repos/SpinlockLabs/github.dart", + "forks_url": "https://api.github.com/repos/SpinlockLabs/github.dart/forks", + "keys_url": "https://api.github.com/repos/SpinlockLabs/github.dart/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/SpinlockLabs/github.dart/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/SpinlockLabs/github.dart/teams", + "hooks_url": "https://api.github.com/repos/SpinlockLabs/github.dart/hooks", + "issue_events_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues/events{/number}", + "events_url": "https://api.github.com/repos/SpinlockLabs/github.dart/events", + "assignees_url": "https://api.github.com/repos/SpinlockLabs/github.dart/assignees{/user}", + "branches_url": "https://api.github.com/repos/SpinlockLabs/github.dart/branches{/branch}", + "tags_url": "https://api.github.com/repos/SpinlockLabs/github.dart/tags", + "blobs_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/SpinlockLabs/github.dart/statuses/{sha}", + "languages_url": "https://api.github.com/repos/SpinlockLabs/github.dart/languages", + "stargazers_url": "https://api.github.com/repos/SpinlockLabs/github.dart/stargazers", + "contributors_url": "https://api.github.com/repos/SpinlockLabs/github.dart/contributors", + "subscribers_url": "https://api.github.com/repos/SpinlockLabs/github.dart/subscribers", + "subscription_url": "https://api.github.com/repos/SpinlockLabs/github.dart/subscription", + "commits_url": "https://api.github.com/repos/SpinlockLabs/github.dart/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/SpinlockLabs/github.dart/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/SpinlockLabs/github.dart/contents/{+path}", + "compare_url": "https://api.github.com/repos/SpinlockLabs/github.dart/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/SpinlockLabs/github.dart/merges", + "archive_url": "https://api.github.com/repos/SpinlockLabs/github.dart/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/SpinlockLabs/github.dart/downloads", + "issues_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues{/number}", + "pulls_url": "https://api.github.com/repos/SpinlockLabs/github.dart/pulls{/number}", + "milestones_url": "https://api.github.com/repos/SpinlockLabs/github.dart/milestones{/number}", + "notifications_url": "https://api.github.com/repos/SpinlockLabs/github.dart/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/SpinlockLabs/github.dart/labels{/name}", + "releases_url": "https://api.github.com/repos/SpinlockLabs/github.dart/releases{/id}", + "deployments_url": "https://api.github.com/repos/SpinlockLabs/github.dart/deployments" + }, + "score": 1.0 + }, + { + "name": "search_service.dart", + "path": "lib/src/common/search_service.dart", + "sha": "e98344a6f07d4d9ba1d5b1045354c6a8d3a5323f", + "url": "https://api.github.com/repositories/22344823/contents/lib/src/common/search_service.dart?ref=11a83b4fc9558b7f8c47fdced01c7a8dac3c65b2", + "git_url": "https://api.github.com/repositories/22344823/git/blobs/e98344a6f07d4d9ba1d5b1045354c6a8d3a5323f", + "html_url": "https://github.com/SpinlockLabs/github.dart/blob/11a83b4fc9558b7f8c47fdced01c7a8dac3c65b2/lib/src/common/search_service.dart", + "repository": { + "id": 22344823, + "node_id": "MDEwOlJlcG9zaXRvcnkyMjM0NDgyMw==", + "name": "github.dart", + "full_name": "SpinlockLabs/github.dart", + "private": false, + "owner": { + "login": "SpinlockLabs", + "id": 26679435, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjI2Njc5NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/26679435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/SpinlockLabs", + "html_url": "https://github.com/SpinlockLabs", + "followers_url": "https://api.github.com/users/SpinlockLabs/followers", + "following_url": "https://api.github.com/users/SpinlockLabs/following{/other_user}", + "gists_url": "https://api.github.com/users/SpinlockLabs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/SpinlockLabs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/SpinlockLabs/subscriptions", + "organizations_url": "https://api.github.com/users/SpinlockLabs/orgs", + "repos_url": "https://api.github.com/users/SpinlockLabs/repos", + "events_url": "https://api.github.com/users/SpinlockLabs/events{/privacy}", + "received_events_url": "https://api.github.com/users/SpinlockLabs/received_events", + "type": "Organization", + "site_admin": false + }, + "html_url": "https://github.com/SpinlockLabs/github.dart", + "description": "GitHub Client Library for Dart", + "fork": false, + "url": "https://api.github.com/repos/SpinlockLabs/github.dart", + "forks_url": "https://api.github.com/repos/SpinlockLabs/github.dart/forks", + "keys_url": "https://api.github.com/repos/SpinlockLabs/github.dart/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/SpinlockLabs/github.dart/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/SpinlockLabs/github.dart/teams", + "hooks_url": "https://api.github.com/repos/SpinlockLabs/github.dart/hooks", + "issue_events_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues/events{/number}", + "events_url": "https://api.github.com/repos/SpinlockLabs/github.dart/events", + "assignees_url": "https://api.github.com/repos/SpinlockLabs/github.dart/assignees{/user}", + "branches_url": "https://api.github.com/repos/SpinlockLabs/github.dart/branches{/branch}", + "tags_url": "https://api.github.com/repos/SpinlockLabs/github.dart/tags", + "blobs_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/SpinlockLabs/github.dart/statuses/{sha}", + "languages_url": "https://api.github.com/repos/SpinlockLabs/github.dart/languages", + "stargazers_url": "https://api.github.com/repos/SpinlockLabs/github.dart/stargazers", + "contributors_url": "https://api.github.com/repos/SpinlockLabs/github.dart/contributors", + "subscribers_url": "https://api.github.com/repos/SpinlockLabs/github.dart/subscribers", + "subscription_url": "https://api.github.com/repos/SpinlockLabs/github.dart/subscription", + "commits_url": "https://api.github.com/repos/SpinlockLabs/github.dart/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/SpinlockLabs/github.dart/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/SpinlockLabs/github.dart/contents/{+path}", + "compare_url": "https://api.github.com/repos/SpinlockLabs/github.dart/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/SpinlockLabs/github.dart/merges", + "archive_url": "https://api.github.com/repos/SpinlockLabs/github.dart/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/SpinlockLabs/github.dart/downloads", + "issues_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues{/number}", + "pulls_url": "https://api.github.com/repos/SpinlockLabs/github.dart/pulls{/number}", + "milestones_url": "https://api.github.com/repos/SpinlockLabs/github.dart/milestones{/number}", + "notifications_url": "https://api.github.com/repos/SpinlockLabs/github.dart/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/SpinlockLabs/github.dart/labels{/name}", + "releases_url": "https://api.github.com/repos/SpinlockLabs/github.dart/releases{/id}", + "deployments_url": "https://api.github.com/repos/SpinlockLabs/github.dart/deployments" + }, + "score": 1.0 + }, + { + "name": "search.dart", + "path": "example/search.dart", + "sha": "9ca8b0ac2bfe0ce4afe2d49713ba639146f1ee1a", + "url": "https://api.github.com/repositories/22344823/contents/example/search.dart?ref=4875e4b34ade7f5e36443cd5a2716fe83d9360a2", + "git_url": "https://api.github.com/repositories/22344823/git/blobs/9ca8b0ac2bfe0ce4afe2d49713ba639146f1ee1a", + "html_url": "https://github.com/SpinlockLabs/github.dart/blob/4875e4b34ade7f5e36443cd5a2716fe83d9360a2/example/search.dart", + "repository": { + "id": 22344823, + "node_id": "MDEwOlJlcG9zaXRvcnkyMjM0NDgyMw==", + "name": "github.dart", + "full_name": "SpinlockLabs/github.dart", + "private": false, + "owner": { + "login": "SpinlockLabs", + "id": 26679435, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjI2Njc5NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/26679435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/SpinlockLabs", + "html_url": "https://github.com/SpinlockLabs", + "followers_url": "https://api.github.com/users/SpinlockLabs/followers", + "following_url": "https://api.github.com/users/SpinlockLabs/following{/other_user}", + "gists_url": "https://api.github.com/users/SpinlockLabs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/SpinlockLabs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/SpinlockLabs/subscriptions", + "organizations_url": "https://api.github.com/users/SpinlockLabs/orgs", + "repos_url": "https://api.github.com/users/SpinlockLabs/repos", + "events_url": "https://api.github.com/users/SpinlockLabs/events{/privacy}", + "received_events_url": "https://api.github.com/users/SpinlockLabs/received_events", + "type": "Organization", + "site_admin": false + }, + "html_url": "https://github.com/SpinlockLabs/github.dart", + "description": "GitHub Client Library for Dart", + "fork": false, + "url": "https://api.github.com/repos/SpinlockLabs/github.dart", + "forks_url": "https://api.github.com/repos/SpinlockLabs/github.dart/forks", + "keys_url": "https://api.github.com/repos/SpinlockLabs/github.dart/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/SpinlockLabs/github.dart/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/SpinlockLabs/github.dart/teams", + "hooks_url": "https://api.github.com/repos/SpinlockLabs/github.dart/hooks", + "issue_events_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues/events{/number}", + "events_url": "https://api.github.com/repos/SpinlockLabs/github.dart/events", + "assignees_url": "https://api.github.com/repos/SpinlockLabs/github.dart/assignees{/user}", + "branches_url": "https://api.github.com/repos/SpinlockLabs/github.dart/branches{/branch}", + "tags_url": "https://api.github.com/repos/SpinlockLabs/github.dart/tags", + "blobs_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/SpinlockLabs/github.dart/statuses/{sha}", + "languages_url": "https://api.github.com/repos/SpinlockLabs/github.dart/languages", + "stargazers_url": "https://api.github.com/repos/SpinlockLabs/github.dart/stargazers", + "contributors_url": "https://api.github.com/repos/SpinlockLabs/github.dart/contributors", + "subscribers_url": "https://api.github.com/repos/SpinlockLabs/github.dart/subscribers", + "subscription_url": "https://api.github.com/repos/SpinlockLabs/github.dart/subscription", + "commits_url": "https://api.github.com/repos/SpinlockLabs/github.dart/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/SpinlockLabs/github.dart/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/SpinlockLabs/github.dart/contents/{+path}", + "compare_url": "https://api.github.com/repos/SpinlockLabs/github.dart/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/SpinlockLabs/github.dart/merges", + "archive_url": "https://api.github.com/repos/SpinlockLabs/github.dart/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/SpinlockLabs/github.dart/downloads", + "issues_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues{/number}", + "pulls_url": "https://api.github.com/repos/SpinlockLabs/github.dart/pulls{/number}", + "milestones_url": "https://api.github.com/repos/SpinlockLabs/github.dart/milestones{/number}", + "notifications_url": "https://api.github.com/repos/SpinlockLabs/github.dart/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/SpinlockLabs/github.dart/labels{/name}", + "releases_url": "https://api.github.com/repos/SpinlockLabs/github.dart/releases{/id}", + "deployments_url": "https://api.github.com/repos/SpinlockLabs/github.dart/deployments" + }, + "score": 1.0 + }, + { + "name": "emoji.dart", + "path": "example/emoji.dart", + "sha": "7604d4619400b6b2a19ab11baa60dfa6fa08843e", + "url": "https://api.github.com/repositories/22344823/contents/example/emoji.dart?ref=4875e4b34ade7f5e36443cd5a2716fe83d9360a2", + "git_url": "https://api.github.com/repositories/22344823/git/blobs/7604d4619400b6b2a19ab11baa60dfa6fa08843e", + "html_url": "https://github.com/SpinlockLabs/github.dart/blob/4875e4b34ade7f5e36443cd5a2716fe83d9360a2/example/emoji.dart", + "repository": { + "id": 22344823, + "node_id": "MDEwOlJlcG9zaXRvcnkyMjM0NDgyMw==", + "name": "github.dart", + "full_name": "SpinlockLabs/github.dart", + "private": false, + "owner": { + "login": "SpinlockLabs", + "id": 26679435, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjI2Njc5NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/26679435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/SpinlockLabs", + "html_url": "https://github.com/SpinlockLabs", + "followers_url": "https://api.github.com/users/SpinlockLabs/followers", + "following_url": "https://api.github.com/users/SpinlockLabs/following{/other_user}", + "gists_url": "https://api.github.com/users/SpinlockLabs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/SpinlockLabs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/SpinlockLabs/subscriptions", + "organizations_url": "https://api.github.com/users/SpinlockLabs/orgs", + "repos_url": "https://api.github.com/users/SpinlockLabs/repos", + "events_url": "https://api.github.com/users/SpinlockLabs/events{/privacy}", + "received_events_url": "https://api.github.com/users/SpinlockLabs/received_events", + "type": "Organization", + "site_admin": false + }, + "html_url": "https://github.com/SpinlockLabs/github.dart", + "description": "GitHub Client Library for Dart", + "fork": false, + "url": "https://api.github.com/repos/SpinlockLabs/github.dart", + "forks_url": "https://api.github.com/repos/SpinlockLabs/github.dart/forks", + "keys_url": "https://api.github.com/repos/SpinlockLabs/github.dart/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/SpinlockLabs/github.dart/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/SpinlockLabs/github.dart/teams", + "hooks_url": "https://api.github.com/repos/SpinlockLabs/github.dart/hooks", + "issue_events_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues/events{/number}", + "events_url": "https://api.github.com/repos/SpinlockLabs/github.dart/events", + "assignees_url": "https://api.github.com/repos/SpinlockLabs/github.dart/assignees{/user}", + "branches_url": "https://api.github.com/repos/SpinlockLabs/github.dart/branches{/branch}", + "tags_url": "https://api.github.com/repos/SpinlockLabs/github.dart/tags", + "blobs_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/SpinlockLabs/github.dart/statuses/{sha}", + "languages_url": "https://api.github.com/repos/SpinlockLabs/github.dart/languages", + "stargazers_url": "https://api.github.com/repos/SpinlockLabs/github.dart/stargazers", + "contributors_url": "https://api.github.com/repos/SpinlockLabs/github.dart/contributors", + "subscribers_url": "https://api.github.com/repos/SpinlockLabs/github.dart/subscribers", + "subscription_url": "https://api.github.com/repos/SpinlockLabs/github.dart/subscription", + "commits_url": "https://api.github.com/repos/SpinlockLabs/github.dart/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/SpinlockLabs/github.dart/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/SpinlockLabs/github.dart/contents/{+path}", + "compare_url": "https://api.github.com/repos/SpinlockLabs/github.dart/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/SpinlockLabs/github.dart/merges", + "archive_url": "https://api.github.com/repos/SpinlockLabs/github.dart/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/SpinlockLabs/github.dart/downloads", + "issues_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues{/number}", + "pulls_url": "https://api.github.com/repos/SpinlockLabs/github.dart/pulls{/number}", + "milestones_url": "https://api.github.com/repos/SpinlockLabs/github.dart/milestones{/number}", + "notifications_url": "https://api.github.com/repos/SpinlockLabs/github.dart/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/SpinlockLabs/github.dart/labels{/name}", + "releases_url": "https://api.github.com/repos/SpinlockLabs/github.dart/releases{/id}", + "deployments_url": "https://api.github.com/repos/SpinlockLabs/github.dart/deployments" + }, + "score": 1.0 + }, + { + "name": "search.html", + "path": "example/search.html", + "sha": "16f41b72e4e6135c63aaf923be50a6c87ec80126", + "url": "https://api.github.com/repositories/22344823/contents/example/search.html?ref=4875e4b34ade7f5e36443cd5a2716fe83d9360a2", + "git_url": "https://api.github.com/repositories/22344823/git/blobs/16f41b72e4e6135c63aaf923be50a6c87ec80126", + "html_url": "https://github.com/SpinlockLabs/github.dart/blob/4875e4b34ade7f5e36443cd5a2716fe83d9360a2/example/search.html", + "repository": { + "id": 22344823, + "node_id": "MDEwOlJlcG9zaXRvcnkyMjM0NDgyMw==", + "name": "github.dart", + "full_name": "SpinlockLabs/github.dart", + "private": false, + "owner": { + "login": "SpinlockLabs", + "id": 26679435, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjI2Njc5NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/26679435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/SpinlockLabs", + "html_url": "https://github.com/SpinlockLabs", + "followers_url": "https://api.github.com/users/SpinlockLabs/followers", + "following_url": "https://api.github.com/users/SpinlockLabs/following{/other_user}", + "gists_url": "https://api.github.com/users/SpinlockLabs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/SpinlockLabs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/SpinlockLabs/subscriptions", + "organizations_url": "https://api.github.com/users/SpinlockLabs/orgs", + "repos_url": "https://api.github.com/users/SpinlockLabs/repos", + "events_url": "https://api.github.com/users/SpinlockLabs/events{/privacy}", + "received_events_url": "https://api.github.com/users/SpinlockLabs/received_events", + "type": "Organization", + "site_admin": false + }, + "html_url": "https://github.com/SpinlockLabs/github.dart", + "description": "GitHub Client Library for Dart", + "fork": false, + "url": "https://api.github.com/repos/SpinlockLabs/github.dart", + "forks_url": "https://api.github.com/repos/SpinlockLabs/github.dart/forks", + "keys_url": "https://api.github.com/repos/SpinlockLabs/github.dart/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/SpinlockLabs/github.dart/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/SpinlockLabs/github.dart/teams", + "hooks_url": "https://api.github.com/repos/SpinlockLabs/github.dart/hooks", + "issue_events_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues/events{/number}", + "events_url": "https://api.github.com/repos/SpinlockLabs/github.dart/events", + "assignees_url": "https://api.github.com/repos/SpinlockLabs/github.dart/assignees{/user}", + "branches_url": "https://api.github.com/repos/SpinlockLabs/github.dart/branches{/branch}", + "tags_url": "https://api.github.com/repos/SpinlockLabs/github.dart/tags", + "blobs_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/SpinlockLabs/github.dart/statuses/{sha}", + "languages_url": "https://api.github.com/repos/SpinlockLabs/github.dart/languages", + "stargazers_url": "https://api.github.com/repos/SpinlockLabs/github.dart/stargazers", + "contributors_url": "https://api.github.com/repos/SpinlockLabs/github.dart/contributors", + "subscribers_url": "https://api.github.com/repos/SpinlockLabs/github.dart/subscribers", + "subscription_url": "https://api.github.com/repos/SpinlockLabs/github.dart/subscription", + "commits_url": "https://api.github.com/repos/SpinlockLabs/github.dart/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/SpinlockLabs/github.dart/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/SpinlockLabs/github.dart/contents/{+path}", + "compare_url": "https://api.github.com/repos/SpinlockLabs/github.dart/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/SpinlockLabs/github.dart/merges", + "archive_url": "https://api.github.com/repos/SpinlockLabs/github.dart/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/SpinlockLabs/github.dart/downloads", + "issues_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues{/number}", + "pulls_url": "https://api.github.com/repos/SpinlockLabs/github.dart/pulls{/number}", + "milestones_url": "https://api.github.com/repos/SpinlockLabs/github.dart/milestones{/number}", + "notifications_url": "https://api.github.com/repos/SpinlockLabs/github.dart/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/SpinlockLabs/github.dart/labels{/name}", + "releases_url": "https://api.github.com/repos/SpinlockLabs/github.dart/releases{/id}", + "deployments_url": "https://api.github.com/repos/SpinlockLabs/github.dart/deployments" + }, + "score": 1.0 + }, + { + "name": "mocks.mocks.dart", + "path": "test/src/mocks.mocks.dart", + "sha": "c381f58a8641b8814afd65b6b7a39384035e2ae3", + "url": "https://api.github.com/repositories/22344823/contents/test/src/mocks.mocks.dart?ref=7056f9c2bf17c5f437e6cb32012a7d16f9ed3278", + "git_url": "https://api.github.com/repositories/22344823/git/blobs/c381f58a8641b8814afd65b6b7a39384035e2ae3", + "html_url": "https://github.com/SpinlockLabs/github.dart/blob/7056f9c2bf17c5f437e6cb32012a7d16f9ed3278/test/src/mocks.mocks.dart", + "repository": { + "id": 22344823, + "node_id": "MDEwOlJlcG9zaXRvcnkyMjM0NDgyMw==", + "name": "github.dart", + "full_name": "SpinlockLabs/github.dart", + "private": false, + "owner": { + "login": "SpinlockLabs", + "id": 26679435, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjI2Njc5NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/26679435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/SpinlockLabs", + "html_url": "https://github.com/SpinlockLabs", + "followers_url": "https://api.github.com/users/SpinlockLabs/followers", + "following_url": "https://api.github.com/users/SpinlockLabs/following{/other_user}", + "gists_url": "https://api.github.com/users/SpinlockLabs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/SpinlockLabs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/SpinlockLabs/subscriptions", + "organizations_url": "https://api.github.com/users/SpinlockLabs/orgs", + "repos_url": "https://api.github.com/users/SpinlockLabs/repos", + "events_url": "https://api.github.com/users/SpinlockLabs/events{/privacy}", + "received_events_url": "https://api.github.com/users/SpinlockLabs/received_events", + "type": "Organization", + "site_admin": false + }, + "html_url": "https://github.com/SpinlockLabs/github.dart", + "description": "GitHub Client Library for Dart", + "fork": false, + "url": "https://api.github.com/repos/SpinlockLabs/github.dart", + "forks_url": "https://api.github.com/repos/SpinlockLabs/github.dart/forks", + "keys_url": "https://api.github.com/repos/SpinlockLabs/github.dart/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/SpinlockLabs/github.dart/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/SpinlockLabs/github.dart/teams", + "hooks_url": "https://api.github.com/repos/SpinlockLabs/github.dart/hooks", + "issue_events_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues/events{/number}", + "events_url": "https://api.github.com/repos/SpinlockLabs/github.dart/events", + "assignees_url": "https://api.github.com/repos/SpinlockLabs/github.dart/assignees{/user}", + "branches_url": "https://api.github.com/repos/SpinlockLabs/github.dart/branches{/branch}", + "tags_url": "https://api.github.com/repos/SpinlockLabs/github.dart/tags", + "blobs_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/SpinlockLabs/github.dart/statuses/{sha}", + "languages_url": "https://api.github.com/repos/SpinlockLabs/github.dart/languages", + "stargazers_url": "https://api.github.com/repos/SpinlockLabs/github.dart/stargazers", + "contributors_url": "https://api.github.com/repos/SpinlockLabs/github.dart/contributors", + "subscribers_url": "https://api.github.com/repos/SpinlockLabs/github.dart/subscribers", + "subscription_url": "https://api.github.com/repos/SpinlockLabs/github.dart/subscription", + "commits_url": "https://api.github.com/repos/SpinlockLabs/github.dart/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/SpinlockLabs/github.dart/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/SpinlockLabs/github.dart/contents/{+path}", + "compare_url": "https://api.github.com/repos/SpinlockLabs/github.dart/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/SpinlockLabs/github.dart/merges", + "archive_url": "https://api.github.com/repos/SpinlockLabs/github.dart/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/SpinlockLabs/github.dart/downloads", + "issues_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues{/number}", + "pulls_url": "https://api.github.com/repos/SpinlockLabs/github.dart/pulls{/number}", + "milestones_url": "https://api.github.com/repos/SpinlockLabs/github.dart/milestones{/number}", + "notifications_url": "https://api.github.com/repos/SpinlockLabs/github.dart/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/SpinlockLabs/github.dart/labels{/name}", + "releases_url": "https://api.github.com/repos/SpinlockLabs/github.dart/releases{/id}", + "deployments_url": "https://api.github.com/repos/SpinlockLabs/github.dart/deployments" + }, + "score": 1.0 + }, + { + "name": "emoji.html", + "path": "example/emoji.html", + "sha": "bdafb143dd918a4872e982b3f876c32aaf9877b2", + "url": "https://api.github.com/repositories/22344823/contents/example/emoji.html?ref=4875e4b34ade7f5e36443cd5a2716fe83d9360a2", + "git_url": "https://api.github.com/repositories/22344823/git/blobs/bdafb143dd918a4872e982b3f876c32aaf9877b2", + "html_url": "https://github.com/SpinlockLabs/github.dart/blob/4875e4b34ade7f5e36443cd5a2716fe83d9360a2/example/emoji.html", + "repository": { + "id": 22344823, + "node_id": "MDEwOlJlcG9zaXRvcnkyMjM0NDgyMw==", + "name": "github.dart", + "full_name": "SpinlockLabs/github.dart", + "private": false, + "owner": { + "login": "SpinlockLabs", + "id": 26679435, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjI2Njc5NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/26679435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/SpinlockLabs", + "html_url": "https://github.com/SpinlockLabs", + "followers_url": "https://api.github.com/users/SpinlockLabs/followers", + "following_url": "https://api.github.com/users/SpinlockLabs/following{/other_user}", + "gists_url": "https://api.github.com/users/SpinlockLabs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/SpinlockLabs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/SpinlockLabs/subscriptions", + "organizations_url": "https://api.github.com/users/SpinlockLabs/orgs", + "repos_url": "https://api.github.com/users/SpinlockLabs/repos", + "events_url": "https://api.github.com/users/SpinlockLabs/events{/privacy}", + "received_events_url": "https://api.github.com/users/SpinlockLabs/received_events", + "type": "Organization", + "site_admin": false + }, + "html_url": "https://github.com/SpinlockLabs/github.dart", + "description": "GitHub Client Library for Dart", + "fork": false, + "url": "https://api.github.com/repos/SpinlockLabs/github.dart", + "forks_url": "https://api.github.com/repos/SpinlockLabs/github.dart/forks", + "keys_url": "https://api.github.com/repos/SpinlockLabs/github.dart/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/SpinlockLabs/github.dart/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/SpinlockLabs/github.dart/teams", + "hooks_url": "https://api.github.com/repos/SpinlockLabs/github.dart/hooks", + "issue_events_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues/events{/number}", + "events_url": "https://api.github.com/repos/SpinlockLabs/github.dart/events", + "assignees_url": "https://api.github.com/repos/SpinlockLabs/github.dart/assignees{/user}", + "branches_url": "https://api.github.com/repos/SpinlockLabs/github.dart/branches{/branch}", + "tags_url": "https://api.github.com/repos/SpinlockLabs/github.dart/tags", + "blobs_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/SpinlockLabs/github.dart/statuses/{sha}", + "languages_url": "https://api.github.com/repos/SpinlockLabs/github.dart/languages", + "stargazers_url": "https://api.github.com/repos/SpinlockLabs/github.dart/stargazers", + "contributors_url": "https://api.github.com/repos/SpinlockLabs/github.dart/contributors", + "subscribers_url": "https://api.github.com/repos/SpinlockLabs/github.dart/subscribers", + "subscription_url": "https://api.github.com/repos/SpinlockLabs/github.dart/subscription", + "commits_url": "https://api.github.com/repos/SpinlockLabs/github.dart/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/SpinlockLabs/github.dart/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/SpinlockLabs/github.dart/contents/{+path}", + "compare_url": "https://api.github.com/repos/SpinlockLabs/github.dart/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/SpinlockLabs/github.dart/merges", + "archive_url": "https://api.github.com/repos/SpinlockLabs/github.dart/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/SpinlockLabs/github.dart/downloads", + "issues_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues{/number}", + "pulls_url": "https://api.github.com/repos/SpinlockLabs/github.dart/pulls{/number}", + "milestones_url": "https://api.github.com/repos/SpinlockLabs/github.dart/milestones{/number}", + "notifications_url": "https://api.github.com/repos/SpinlockLabs/github.dart/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/SpinlockLabs/github.dart/labels{/name}", + "releases_url": "https://api.github.com/repos/SpinlockLabs/github.dart/releases{/id}", + "deployments_url": "https://api.github.com/repos/SpinlockLabs/github.dart/deployments" + }, + "score": 1.0 + }, + { + "name": "index.html", + "path": "example/index.html", + "sha": "81e054e8a613cb2932f905e42c3dc2e294e551ac", + "url": "https://api.github.com/repositories/22344823/contents/example/index.html?ref=c72b46031fcd326820cbc5bb0c3b4b1c15e075e4", + "git_url": "https://api.github.com/repositories/22344823/git/blobs/81e054e8a613cb2932f905e42c3dc2e294e551ac", + "html_url": "https://github.com/SpinlockLabs/github.dart/blob/c72b46031fcd326820cbc5bb0c3b4b1c15e075e4/example/index.html", + "repository": { + "id": 22344823, + "node_id": "MDEwOlJlcG9zaXRvcnkyMjM0NDgyMw==", + "name": "github.dart", + "full_name": "SpinlockLabs/github.dart", + "private": false, + "owner": { + "login": "SpinlockLabs", + "id": 26679435, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjI2Njc5NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/26679435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/SpinlockLabs", + "html_url": "https://github.com/SpinlockLabs", + "followers_url": "https://api.github.com/users/SpinlockLabs/followers", + "following_url": "https://api.github.com/users/SpinlockLabs/following{/other_user}", + "gists_url": "https://api.github.com/users/SpinlockLabs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/SpinlockLabs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/SpinlockLabs/subscriptions", + "organizations_url": "https://api.github.com/users/SpinlockLabs/orgs", + "repos_url": "https://api.github.com/users/SpinlockLabs/repos", + "events_url": "https://api.github.com/users/SpinlockLabs/events{/privacy}", + "received_events_url": "https://api.github.com/users/SpinlockLabs/received_events", + "type": "Organization", + "site_admin": false + }, + "html_url": "https://github.com/SpinlockLabs/github.dart", + "description": "GitHub Client Library for Dart", + "fork": false, + "url": "https://api.github.com/repos/SpinlockLabs/github.dart", + "forks_url": "https://api.github.com/repos/SpinlockLabs/github.dart/forks", + "keys_url": "https://api.github.com/repos/SpinlockLabs/github.dart/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/SpinlockLabs/github.dart/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/SpinlockLabs/github.dart/teams", + "hooks_url": "https://api.github.com/repos/SpinlockLabs/github.dart/hooks", + "issue_events_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues/events{/number}", + "events_url": "https://api.github.com/repos/SpinlockLabs/github.dart/events", + "assignees_url": "https://api.github.com/repos/SpinlockLabs/github.dart/assignees{/user}", + "branches_url": "https://api.github.com/repos/SpinlockLabs/github.dart/branches{/branch}", + "tags_url": "https://api.github.com/repos/SpinlockLabs/github.dart/tags", + "blobs_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/SpinlockLabs/github.dart/statuses/{sha}", + "languages_url": "https://api.github.com/repos/SpinlockLabs/github.dart/languages", + "stargazers_url": "https://api.github.com/repos/SpinlockLabs/github.dart/stargazers", + "contributors_url": "https://api.github.com/repos/SpinlockLabs/github.dart/contributors", + "subscribers_url": "https://api.github.com/repos/SpinlockLabs/github.dart/subscribers", + "subscription_url": "https://api.github.com/repos/SpinlockLabs/github.dart/subscription", + "commits_url": "https://api.github.com/repos/SpinlockLabs/github.dart/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/SpinlockLabs/github.dart/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/SpinlockLabs/github.dart/contents/{+path}", + "compare_url": "https://api.github.com/repos/SpinlockLabs/github.dart/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/SpinlockLabs/github.dart/merges", + "archive_url": "https://api.github.com/repos/SpinlockLabs/github.dart/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/SpinlockLabs/github.dart/downloads", + "issues_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues{/number}", + "pulls_url": "https://api.github.com/repos/SpinlockLabs/github.dart/pulls{/number}", + "milestones_url": "https://api.github.com/repos/SpinlockLabs/github.dart/milestones{/number}", + "notifications_url": "https://api.github.com/repos/SpinlockLabs/github.dart/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/SpinlockLabs/github.dart/labels{/name}", + "releases_url": "https://api.github.com/repos/SpinlockLabs/github.dart/releases{/id}", + "deployments_url": "https://api.github.com/repos/SpinlockLabs/github.dart/deployments" + }, + "score": 1.0 + }, + { + "name": "readme.md", + "path": "example/readme.md", + "sha": "0781c2ba3898ee16123d9b63a7685d588f3f7511", + "url": "https://api.github.com/repositories/22344823/contents/example/readme.md?ref=4875e4b34ade7f5e36443cd5a2716fe83d9360a2", + "git_url": "https://api.github.com/repositories/22344823/git/blobs/0781c2ba3898ee16123d9b63a7685d588f3f7511", + "html_url": "https://github.com/SpinlockLabs/github.dart/blob/4875e4b34ade7f5e36443cd5a2716fe83d9360a2/example/readme.md", + "repository": { + "id": 22344823, + "node_id": "MDEwOlJlcG9zaXRvcnkyMjM0NDgyMw==", + "name": "github.dart", + "full_name": "SpinlockLabs/github.dart", + "private": false, + "owner": { + "login": "SpinlockLabs", + "id": 26679435, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjI2Njc5NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/26679435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/SpinlockLabs", + "html_url": "https://github.com/SpinlockLabs", + "followers_url": "https://api.github.com/users/SpinlockLabs/followers", + "following_url": "https://api.github.com/users/SpinlockLabs/following{/other_user}", + "gists_url": "https://api.github.com/users/SpinlockLabs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/SpinlockLabs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/SpinlockLabs/subscriptions", + "organizations_url": "https://api.github.com/users/SpinlockLabs/orgs", + "repos_url": "https://api.github.com/users/SpinlockLabs/repos", + "events_url": "https://api.github.com/users/SpinlockLabs/events{/privacy}", + "received_events_url": "https://api.github.com/users/SpinlockLabs/received_events", + "type": "Organization", + "site_admin": false + }, + "html_url": "https://github.com/SpinlockLabs/github.dart", + "description": "GitHub Client Library for Dart", + "fork": false, + "url": "https://api.github.com/repos/SpinlockLabs/github.dart", + "forks_url": "https://api.github.com/repos/SpinlockLabs/github.dart/forks", + "keys_url": "https://api.github.com/repos/SpinlockLabs/github.dart/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/SpinlockLabs/github.dart/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/SpinlockLabs/github.dart/teams", + "hooks_url": "https://api.github.com/repos/SpinlockLabs/github.dart/hooks", + "issue_events_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues/events{/number}", + "events_url": "https://api.github.com/repos/SpinlockLabs/github.dart/events", + "assignees_url": "https://api.github.com/repos/SpinlockLabs/github.dart/assignees{/user}", + "branches_url": "https://api.github.com/repos/SpinlockLabs/github.dart/branches{/branch}", + "tags_url": "https://api.github.com/repos/SpinlockLabs/github.dart/tags", + "blobs_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/SpinlockLabs/github.dart/statuses/{sha}", + "languages_url": "https://api.github.com/repos/SpinlockLabs/github.dart/languages", + "stargazers_url": "https://api.github.com/repos/SpinlockLabs/github.dart/stargazers", + "contributors_url": "https://api.github.com/repos/SpinlockLabs/github.dart/contributors", + "subscribers_url": "https://api.github.com/repos/SpinlockLabs/github.dart/subscribers", + "subscription_url": "https://api.github.com/repos/SpinlockLabs/github.dart/subscription", + "commits_url": "https://api.github.com/repos/SpinlockLabs/github.dart/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/SpinlockLabs/github.dart/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/SpinlockLabs/github.dart/contents/{+path}", + "compare_url": "https://api.github.com/repos/SpinlockLabs/github.dart/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/SpinlockLabs/github.dart/merges", + "archive_url": "https://api.github.com/repos/SpinlockLabs/github.dart/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/SpinlockLabs/github.dart/downloads", + "issues_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues{/number}", + "pulls_url": "https://api.github.com/repos/SpinlockLabs/github.dart/pulls{/number}", + "milestones_url": "https://api.github.com/repos/SpinlockLabs/github.dart/milestones{/number}", + "notifications_url": "https://api.github.com/repos/SpinlockLabs/github.dart/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/SpinlockLabs/github.dart/labels{/name}", + "releases_url": "https://api.github.com/repos/SpinlockLabs/github.dart/releases{/id}", + "deployments_url": "https://api.github.com/repos/SpinlockLabs/github.dart/deployments" + }, + "score": 1.0 + }, + { + "name": "CHANGELOG.md", + "path": "CHANGELOG.md", + "sha": "5de4e987d591c1f71b8f94311671fa8edb38ca6b", + "url": "https://api.github.com/repositories/22344823/contents/CHANGELOG.md?ref=f90446459e2723baecc16f8ac725b5147bd915ab", + "git_url": "https://api.github.com/repositories/22344823/git/blobs/5de4e987d591c1f71b8f94311671fa8edb38ca6b", + "html_url": "https://github.com/SpinlockLabs/github.dart/blob/f90446459e2723baecc16f8ac725b5147bd915ab/CHANGELOG.md", + "repository": { + "id": 22344823, + "node_id": "MDEwOlJlcG9zaXRvcnkyMjM0NDgyMw==", + "name": "github.dart", + "full_name": "SpinlockLabs/github.dart", + "private": false, + "owner": { + "login": "SpinlockLabs", + "id": 26679435, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjI2Njc5NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/26679435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/SpinlockLabs", + "html_url": "https://github.com/SpinlockLabs", + "followers_url": "https://api.github.com/users/SpinlockLabs/followers", + "following_url": "https://api.github.com/users/SpinlockLabs/following{/other_user}", + "gists_url": "https://api.github.com/users/SpinlockLabs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/SpinlockLabs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/SpinlockLabs/subscriptions", + "organizations_url": "https://api.github.com/users/SpinlockLabs/orgs", + "repos_url": "https://api.github.com/users/SpinlockLabs/repos", + "events_url": "https://api.github.com/users/SpinlockLabs/events{/privacy}", + "received_events_url": "https://api.github.com/users/SpinlockLabs/received_events", + "type": "Organization", + "site_admin": false + }, + "html_url": "https://github.com/SpinlockLabs/github.dart", + "description": "GitHub Client Library for Dart", + "fork": false, + "url": "https://api.github.com/repos/SpinlockLabs/github.dart", + "forks_url": "https://api.github.com/repos/SpinlockLabs/github.dart/forks", + "keys_url": "https://api.github.com/repos/SpinlockLabs/github.dart/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/SpinlockLabs/github.dart/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/SpinlockLabs/github.dart/teams", + "hooks_url": "https://api.github.com/repos/SpinlockLabs/github.dart/hooks", + "issue_events_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues/events{/number}", + "events_url": "https://api.github.com/repos/SpinlockLabs/github.dart/events", + "assignees_url": "https://api.github.com/repos/SpinlockLabs/github.dart/assignees{/user}", + "branches_url": "https://api.github.com/repos/SpinlockLabs/github.dart/branches{/branch}", + "tags_url": "https://api.github.com/repos/SpinlockLabs/github.dart/tags", + "blobs_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/SpinlockLabs/github.dart/statuses/{sha}", + "languages_url": "https://api.github.com/repos/SpinlockLabs/github.dart/languages", + "stargazers_url": "https://api.github.com/repos/SpinlockLabs/github.dart/stargazers", + "contributors_url": "https://api.github.com/repos/SpinlockLabs/github.dart/contributors", + "subscribers_url": "https://api.github.com/repos/SpinlockLabs/github.dart/subscribers", + "subscription_url": "https://api.github.com/repos/SpinlockLabs/github.dart/subscription", + "commits_url": "https://api.github.com/repos/SpinlockLabs/github.dart/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/SpinlockLabs/github.dart/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/SpinlockLabs/github.dart/contents/{+path}", + "compare_url": "https://api.github.com/repos/SpinlockLabs/github.dart/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/SpinlockLabs/github.dart/merges", + "archive_url": "https://api.github.com/repos/SpinlockLabs/github.dart/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/SpinlockLabs/github.dart/downloads", + "issues_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues{/number}", + "pulls_url": "https://api.github.com/repos/SpinlockLabs/github.dart/pulls{/number}", + "milestones_url": "https://api.github.com/repos/SpinlockLabs/github.dart/milestones{/number}", + "notifications_url": "https://api.github.com/repos/SpinlockLabs/github.dart/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/SpinlockLabs/github.dart/labels{/name}", + "releases_url": "https://api.github.com/repos/SpinlockLabs/github.dart/releases{/id}", + "deployments_url": "https://api.github.com/repos/SpinlockLabs/github.dart/deployments" + }, + "score": 1.0 + }, + { + "name": "github.dart", + "path": "lib/src/common/github.dart", + "sha": "e715c2a9b4439c24f00b00071cc86db63c426f1e", + "url": "https://api.github.com/repositories/22344823/contents/lib/src/common/github.dart?ref=921269ba8f803ba47470c624460c23c289b3291b", + "git_url": "https://api.github.com/repositories/22344823/git/blobs/e715c2a9b4439c24f00b00071cc86db63c426f1e", + "html_url": "https://github.com/SpinlockLabs/github.dart/blob/921269ba8f803ba47470c624460c23c289b3291b/lib/src/common/github.dart", + "repository": { + "id": 22344823, + "node_id": "MDEwOlJlcG9zaXRvcnkyMjM0NDgyMw==", + "name": "github.dart", + "full_name": "SpinlockLabs/github.dart", + "private": false, + "owner": { + "login": "SpinlockLabs", + "id": 26679435, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjI2Njc5NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/26679435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/SpinlockLabs", + "html_url": "https://github.com/SpinlockLabs", + "followers_url": "https://api.github.com/users/SpinlockLabs/followers", + "following_url": "https://api.github.com/users/SpinlockLabs/following{/other_user}", + "gists_url": "https://api.github.com/users/SpinlockLabs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/SpinlockLabs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/SpinlockLabs/subscriptions", + "organizations_url": "https://api.github.com/users/SpinlockLabs/orgs", + "repos_url": "https://api.github.com/users/SpinlockLabs/repos", + "events_url": "https://api.github.com/users/SpinlockLabs/events{/privacy}", + "received_events_url": "https://api.github.com/users/SpinlockLabs/received_events", + "type": "Organization", + "site_admin": false + }, + "html_url": "https://github.com/SpinlockLabs/github.dart", + "description": "GitHub Client Library for Dart", + "fork": false, + "url": "https://api.github.com/repos/SpinlockLabs/github.dart", + "forks_url": "https://api.github.com/repos/SpinlockLabs/github.dart/forks", + "keys_url": "https://api.github.com/repos/SpinlockLabs/github.dart/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/SpinlockLabs/github.dart/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/SpinlockLabs/github.dart/teams", + "hooks_url": "https://api.github.com/repos/SpinlockLabs/github.dart/hooks", + "issue_events_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues/events{/number}", + "events_url": "https://api.github.com/repos/SpinlockLabs/github.dart/events", + "assignees_url": "https://api.github.com/repos/SpinlockLabs/github.dart/assignees{/user}", + "branches_url": "https://api.github.com/repos/SpinlockLabs/github.dart/branches{/branch}", + "tags_url": "https://api.github.com/repos/SpinlockLabs/github.dart/tags", + "blobs_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/SpinlockLabs/github.dart/statuses/{sha}", + "languages_url": "https://api.github.com/repos/SpinlockLabs/github.dart/languages", + "stargazers_url": "https://api.github.com/repos/SpinlockLabs/github.dart/stargazers", + "contributors_url": "https://api.github.com/repos/SpinlockLabs/github.dart/contributors", + "subscribers_url": "https://api.github.com/repos/SpinlockLabs/github.dart/subscribers", + "subscription_url": "https://api.github.com/repos/SpinlockLabs/github.dart/subscription", + "commits_url": "https://api.github.com/repos/SpinlockLabs/github.dart/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/SpinlockLabs/github.dart/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/SpinlockLabs/github.dart/contents/{+path}", + "compare_url": "https://api.github.com/repos/SpinlockLabs/github.dart/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/SpinlockLabs/github.dart/merges", + "archive_url": "https://api.github.com/repos/SpinlockLabs/github.dart/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/SpinlockLabs/github.dart/downloads", + "issues_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues{/number}", + "pulls_url": "https://api.github.com/repos/SpinlockLabs/github.dart/pulls{/number}", + "milestones_url": "https://api.github.com/repos/SpinlockLabs/github.dart/milestones{/number}", + "notifications_url": "https://api.github.com/repos/SpinlockLabs/github.dart/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/SpinlockLabs/github.dart/labels{/name}", + "releases_url": "https://api.github.com/repos/SpinlockLabs/github.dart/releases{/id}", + "deployments_url": "https://api.github.com/repos/SpinlockLabs/github.dart/deployments" + }, + "score": 1.0 + }, + { + "name": "common.dart", + "path": "lib/src/common.dart", + "sha": "f8be345ced35b7320355e04663f7504cb0a502b6", + "url": "https://api.github.com/repositories/22344823/contents/lib/src/common.dart?ref=4875e4b34ade7f5e36443cd5a2716fe83d9360a2", + "git_url": "https://api.github.com/repositories/22344823/git/blobs/f8be345ced35b7320355e04663f7504cb0a502b6", + "html_url": "https://github.com/SpinlockLabs/github.dart/blob/4875e4b34ade7f5e36443cd5a2716fe83d9360a2/lib/src/common.dart", + "repository": { + "id": 22344823, + "node_id": "MDEwOlJlcG9zaXRvcnkyMjM0NDgyMw==", + "name": "github.dart", + "full_name": "SpinlockLabs/github.dart", + "private": false, + "owner": { + "login": "SpinlockLabs", + "id": 26679435, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjI2Njc5NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/26679435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/SpinlockLabs", + "html_url": "https://github.com/SpinlockLabs", + "followers_url": "https://api.github.com/users/SpinlockLabs/followers", + "following_url": "https://api.github.com/users/SpinlockLabs/following{/other_user}", + "gists_url": "https://api.github.com/users/SpinlockLabs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/SpinlockLabs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/SpinlockLabs/subscriptions", + "organizations_url": "https://api.github.com/users/SpinlockLabs/orgs", + "repos_url": "https://api.github.com/users/SpinlockLabs/repos", + "events_url": "https://api.github.com/users/SpinlockLabs/events{/privacy}", + "received_events_url": "https://api.github.com/users/SpinlockLabs/received_events", + "type": "Organization", + "site_admin": false + }, + "html_url": "https://github.com/SpinlockLabs/github.dart", + "description": "GitHub Client Library for Dart", + "fork": false, + "url": "https://api.github.com/repos/SpinlockLabs/github.dart", + "forks_url": "https://api.github.com/repos/SpinlockLabs/github.dart/forks", + "keys_url": "https://api.github.com/repos/SpinlockLabs/github.dart/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/SpinlockLabs/github.dart/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/SpinlockLabs/github.dart/teams", + "hooks_url": "https://api.github.com/repos/SpinlockLabs/github.dart/hooks", + "issue_events_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues/events{/number}", + "events_url": "https://api.github.com/repos/SpinlockLabs/github.dart/events", + "assignees_url": "https://api.github.com/repos/SpinlockLabs/github.dart/assignees{/user}", + "branches_url": "https://api.github.com/repos/SpinlockLabs/github.dart/branches{/branch}", + "tags_url": "https://api.github.com/repos/SpinlockLabs/github.dart/tags", + "blobs_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/SpinlockLabs/github.dart/statuses/{sha}", + "languages_url": "https://api.github.com/repos/SpinlockLabs/github.dart/languages", + "stargazers_url": "https://api.github.com/repos/SpinlockLabs/github.dart/stargazers", + "contributors_url": "https://api.github.com/repos/SpinlockLabs/github.dart/contributors", + "subscribers_url": "https://api.github.com/repos/SpinlockLabs/github.dart/subscribers", + "subscription_url": "https://api.github.com/repos/SpinlockLabs/github.dart/subscription", + "commits_url": "https://api.github.com/repos/SpinlockLabs/github.dart/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/SpinlockLabs/github.dart/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/SpinlockLabs/github.dart/contents/{+path}", + "compare_url": "https://api.github.com/repos/SpinlockLabs/github.dart/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/SpinlockLabs/github.dart/merges", + "archive_url": "https://api.github.com/repos/SpinlockLabs/github.dart/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/SpinlockLabs/github.dart/downloads", + "issues_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues{/number}", + "pulls_url": "https://api.github.com/repos/SpinlockLabs/github.dart/pulls{/number}", + "milestones_url": "https://api.github.com/repos/SpinlockLabs/github.dart/milestones{/number}", + "notifications_url": "https://api.github.com/repos/SpinlockLabs/github.dart/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/SpinlockLabs/github.dart/labels{/name}", + "releases_url": "https://api.github.com/repos/SpinlockLabs/github.dart/releases{/id}", + "deployments_url": "https://api.github.com/repos/SpinlockLabs/github.dart/deployments" + }, + "score": 1.0 + }, + { + "name": "search.dart", + "path": "test/experiment/search.dart", + "sha": "1fffe4dd40ca49cff3f96d248a1740ac67e6a602", + "url": "https://api.github.com/repositories/22344823/contents/test/experiment/search.dart?ref=4875e4b34ade7f5e36443cd5a2716fe83d9360a2", + "git_url": "https://api.github.com/repositories/22344823/git/blobs/1fffe4dd40ca49cff3f96d248a1740ac67e6a602", + "html_url": "https://github.com/SpinlockLabs/github.dart/blob/4875e4b34ade7f5e36443cd5a2716fe83d9360a2/test/experiment/search.dart", + "repository": { + "id": 22344823, + "node_id": "MDEwOlJlcG9zaXRvcnkyMjM0NDgyMw==", + "name": "github.dart", + "full_name": "SpinlockLabs/github.dart", + "private": false, + "owner": { + "login": "SpinlockLabs", + "id": 26679435, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjI2Njc5NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/26679435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/SpinlockLabs", + "html_url": "https://github.com/SpinlockLabs", + "followers_url": "https://api.github.com/users/SpinlockLabs/followers", + "following_url": "https://api.github.com/users/SpinlockLabs/following{/other_user}", + "gists_url": "https://api.github.com/users/SpinlockLabs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/SpinlockLabs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/SpinlockLabs/subscriptions", + "organizations_url": "https://api.github.com/users/SpinlockLabs/orgs", + "repos_url": "https://api.github.com/users/SpinlockLabs/repos", + "events_url": "https://api.github.com/users/SpinlockLabs/events{/privacy}", + "received_events_url": "https://api.github.com/users/SpinlockLabs/received_events", + "type": "Organization", + "site_admin": false + }, + "html_url": "https://github.com/SpinlockLabs/github.dart", + "description": "GitHub Client Library for Dart", + "fork": false, + "url": "https://api.github.com/repos/SpinlockLabs/github.dart", + "forks_url": "https://api.github.com/repos/SpinlockLabs/github.dart/forks", + "keys_url": "https://api.github.com/repos/SpinlockLabs/github.dart/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/SpinlockLabs/github.dart/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/SpinlockLabs/github.dart/teams", + "hooks_url": "https://api.github.com/repos/SpinlockLabs/github.dart/hooks", + "issue_events_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues/events{/number}", + "events_url": "https://api.github.com/repos/SpinlockLabs/github.dart/events", + "assignees_url": "https://api.github.com/repos/SpinlockLabs/github.dart/assignees{/user}", + "branches_url": "https://api.github.com/repos/SpinlockLabs/github.dart/branches{/branch}", + "tags_url": "https://api.github.com/repos/SpinlockLabs/github.dart/tags", + "blobs_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/SpinlockLabs/github.dart/statuses/{sha}", + "languages_url": "https://api.github.com/repos/SpinlockLabs/github.dart/languages", + "stargazers_url": "https://api.github.com/repos/SpinlockLabs/github.dart/stargazers", + "contributors_url": "https://api.github.com/repos/SpinlockLabs/github.dart/contributors", + "subscribers_url": "https://api.github.com/repos/SpinlockLabs/github.dart/subscribers", + "subscription_url": "https://api.github.com/repos/SpinlockLabs/github.dart/subscription", + "commits_url": "https://api.github.com/repos/SpinlockLabs/github.dart/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/SpinlockLabs/github.dart/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/SpinlockLabs/github.dart/contents/{+path}", + "compare_url": "https://api.github.com/repos/SpinlockLabs/github.dart/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/SpinlockLabs/github.dart/merges", + "archive_url": "https://api.github.com/repos/SpinlockLabs/github.dart/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/SpinlockLabs/github.dart/downloads", + "issues_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues{/number}", + "pulls_url": "https://api.github.com/repos/SpinlockLabs/github.dart/pulls{/number}", + "milestones_url": "https://api.github.com/repos/SpinlockLabs/github.dart/milestones{/number}", + "notifications_url": "https://api.github.com/repos/SpinlockLabs/github.dart/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/SpinlockLabs/github.dart/labels{/name}", + "releases_url": "https://api.github.com/repos/SpinlockLabs/github.dart/releases{/id}", + "deployments_url": "https://api.github.com/repos/SpinlockLabs/github.dart/deployments" + }, + "score": 1.0 + }, + { + "name": "code_search_test.dart", + "path": "test/code_search_test.dart", + "sha": "3d60cf6329a298d99d8b074009c2a8fd3c39a470", + "url": "https://api.github.com/repositories/22344823/contents/test/code_search_test.dart?ref=4875e4b34ade7f5e36443cd5a2716fe83d9360a2", + "git_url": "https://api.github.com/repositories/22344823/git/blobs/3d60cf6329a298d99d8b074009c2a8fd3c39a470", + "html_url": "https://github.com/SpinlockLabs/github.dart/blob/4875e4b34ade7f5e36443cd5a2716fe83d9360a2/test/code_search_test.dart", + "repository": { + "id": 22344823, + "node_id": "MDEwOlJlcG9zaXRvcnkyMjM0NDgyMw==", + "name": "github.dart", + "full_name": "SpinlockLabs/github.dart", + "private": false, + "owner": { + "login": "SpinlockLabs", + "id": 26679435, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjI2Njc5NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/26679435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/SpinlockLabs", + "html_url": "https://github.com/SpinlockLabs", + "followers_url": "https://api.github.com/users/SpinlockLabs/followers", + "following_url": "https://api.github.com/users/SpinlockLabs/following{/other_user}", + "gists_url": "https://api.github.com/users/SpinlockLabs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/SpinlockLabs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/SpinlockLabs/subscriptions", + "organizations_url": "https://api.github.com/users/SpinlockLabs/orgs", + "repos_url": "https://api.github.com/users/SpinlockLabs/repos", + "events_url": "https://api.github.com/users/SpinlockLabs/events{/privacy}", + "received_events_url": "https://api.github.com/users/SpinlockLabs/received_events", + "type": "Organization", + "site_admin": false + }, + "html_url": "https://github.com/SpinlockLabs/github.dart", + "description": "GitHub Client Library for Dart", + "fork": false, + "url": "https://api.github.com/repos/SpinlockLabs/github.dart", + "forks_url": "https://api.github.com/repos/SpinlockLabs/github.dart/forks", + "keys_url": "https://api.github.com/repos/SpinlockLabs/github.dart/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/SpinlockLabs/github.dart/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/SpinlockLabs/github.dart/teams", + "hooks_url": "https://api.github.com/repos/SpinlockLabs/github.dart/hooks", + "issue_events_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues/events{/number}", + "events_url": "https://api.github.com/repos/SpinlockLabs/github.dart/events", + "assignees_url": "https://api.github.com/repos/SpinlockLabs/github.dart/assignees{/user}", + "branches_url": "https://api.github.com/repos/SpinlockLabs/github.dart/branches{/branch}", + "tags_url": "https://api.github.com/repos/SpinlockLabs/github.dart/tags", + "blobs_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/SpinlockLabs/github.dart/statuses/{sha}", + "languages_url": "https://api.github.com/repos/SpinlockLabs/github.dart/languages", + "stargazers_url": "https://api.github.com/repos/SpinlockLabs/github.dart/stargazers", + "contributors_url": "https://api.github.com/repos/SpinlockLabs/github.dart/contributors", + "subscribers_url": "https://api.github.com/repos/SpinlockLabs/github.dart/subscribers", + "subscription_url": "https://api.github.com/repos/SpinlockLabs/github.dart/subscription", + "commits_url": "https://api.github.com/repos/SpinlockLabs/github.dart/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/SpinlockLabs/github.dart/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/SpinlockLabs/github.dart/contents/{+path}", + "compare_url": "https://api.github.com/repos/SpinlockLabs/github.dart/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/SpinlockLabs/github.dart/merges", + "archive_url": "https://api.github.com/repos/SpinlockLabs/github.dart/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/SpinlockLabs/github.dart/downloads", + "issues_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues{/number}", + "pulls_url": "https://api.github.com/repos/SpinlockLabs/github.dart/pulls{/number}", + "milestones_url": "https://api.github.com/repos/SpinlockLabs/github.dart/milestones{/number}", + "notifications_url": "https://api.github.com/repos/SpinlockLabs/github.dart/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/SpinlockLabs/github.dart/labels{/name}", + "releases_url": "https://api.github.com/repos/SpinlockLabs/github.dart/releases{/id}", + "deployments_url": "https://api.github.com/repos/SpinlockLabs/github.dart/deployments" + }, + "score": 1.0 + }, + { + "name": "xplat_browser.dart", + "path": "lib/src/browser/xplat_browser.dart", + "sha": "79aeeb174148ae38f6a26d2297356b160e504b6b", + "url": "https://api.github.com/repositories/22344823/contents/lib/src/browser/xplat_browser.dart?ref=4875e4b34ade7f5e36443cd5a2716fe83d9360a2", + "git_url": "https://api.github.com/repositories/22344823/git/blobs/79aeeb174148ae38f6a26d2297356b160e504b6b", + "html_url": "https://github.com/SpinlockLabs/github.dart/blob/4875e4b34ade7f5e36443cd5a2716fe83d9360a2/lib/src/browser/xplat_browser.dart", + "repository": { + "id": 22344823, + "node_id": "MDEwOlJlcG9zaXRvcnkyMjM0NDgyMw==", + "name": "github.dart", + "full_name": "SpinlockLabs/github.dart", + "private": false, + "owner": { + "login": "SpinlockLabs", + "id": 26679435, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjI2Njc5NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/26679435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/SpinlockLabs", + "html_url": "https://github.com/SpinlockLabs", + "followers_url": "https://api.github.com/users/SpinlockLabs/followers", + "following_url": "https://api.github.com/users/SpinlockLabs/following{/other_user}", + "gists_url": "https://api.github.com/users/SpinlockLabs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/SpinlockLabs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/SpinlockLabs/subscriptions", + "organizations_url": "https://api.github.com/users/SpinlockLabs/orgs", + "repos_url": "https://api.github.com/users/SpinlockLabs/repos", + "events_url": "https://api.github.com/users/SpinlockLabs/events{/privacy}", + "received_events_url": "https://api.github.com/users/SpinlockLabs/received_events", + "type": "Organization", + "site_admin": false + }, + "html_url": "https://github.com/SpinlockLabs/github.dart", + "description": "GitHub Client Library for Dart", + "fork": false, + "url": "https://api.github.com/repos/SpinlockLabs/github.dart", + "forks_url": "https://api.github.com/repos/SpinlockLabs/github.dart/forks", + "keys_url": "https://api.github.com/repos/SpinlockLabs/github.dart/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/SpinlockLabs/github.dart/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/SpinlockLabs/github.dart/teams", + "hooks_url": "https://api.github.com/repos/SpinlockLabs/github.dart/hooks", + "issue_events_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues/events{/number}", + "events_url": "https://api.github.com/repos/SpinlockLabs/github.dart/events", + "assignees_url": "https://api.github.com/repos/SpinlockLabs/github.dart/assignees{/user}", + "branches_url": "https://api.github.com/repos/SpinlockLabs/github.dart/branches{/branch}", + "tags_url": "https://api.github.com/repos/SpinlockLabs/github.dart/tags", + "blobs_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/SpinlockLabs/github.dart/statuses/{sha}", + "languages_url": "https://api.github.com/repos/SpinlockLabs/github.dart/languages", + "stargazers_url": "https://api.github.com/repos/SpinlockLabs/github.dart/stargazers", + "contributors_url": "https://api.github.com/repos/SpinlockLabs/github.dart/contributors", + "subscribers_url": "https://api.github.com/repos/SpinlockLabs/github.dart/subscribers", + "subscription_url": "https://api.github.com/repos/SpinlockLabs/github.dart/subscription", + "commits_url": "https://api.github.com/repos/SpinlockLabs/github.dart/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/SpinlockLabs/github.dart/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/SpinlockLabs/github.dart/contents/{+path}", + "compare_url": "https://api.github.com/repos/SpinlockLabs/github.dart/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/SpinlockLabs/github.dart/merges", + "archive_url": "https://api.github.com/repos/SpinlockLabs/github.dart/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/SpinlockLabs/github.dart/downloads", + "issues_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues{/number}", + "pulls_url": "https://api.github.com/repos/SpinlockLabs/github.dart/pulls{/number}", + "milestones_url": "https://api.github.com/repos/SpinlockLabs/github.dart/milestones{/number}", + "notifications_url": "https://api.github.com/repos/SpinlockLabs/github.dart/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/SpinlockLabs/github.dart/labels{/name}", + "releases_url": "https://api.github.com/repos/SpinlockLabs/github.dart/releases{/id}", + "deployments_url": "https://api.github.com/repos/SpinlockLabs/github.dart/deployments" + }, + "score": 1.0 + }, + { + "name": "release_notes.dart", + "path": "example/release_notes.dart", + "sha": "867474ee071b0b026fcf64cd2409830279c8b2db", + "url": "https://api.github.com/repositories/22344823/contents/example/release_notes.dart?ref=921269ba8f803ba47470c624460c23c289b3291b", + "git_url": "https://api.github.com/repositories/22344823/git/blobs/867474ee071b0b026fcf64cd2409830279c8b2db", + "html_url": "https://github.com/SpinlockLabs/github.dart/blob/921269ba8f803ba47470c624460c23c289b3291b/example/release_notes.dart", + "repository": { + "id": 22344823, + "node_id": "MDEwOlJlcG9zaXRvcnkyMjM0NDgyMw==", + "name": "github.dart", + "full_name": "SpinlockLabs/github.dart", + "private": false, + "owner": { + "login": "SpinlockLabs", + "id": 26679435, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjI2Njc5NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/26679435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/SpinlockLabs", + "html_url": "https://github.com/SpinlockLabs", + "followers_url": "https://api.github.com/users/SpinlockLabs/followers", + "following_url": "https://api.github.com/users/SpinlockLabs/following{/other_user}", + "gists_url": "https://api.github.com/users/SpinlockLabs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/SpinlockLabs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/SpinlockLabs/subscriptions", + "organizations_url": "https://api.github.com/users/SpinlockLabs/orgs", + "repos_url": "https://api.github.com/users/SpinlockLabs/repos", + "events_url": "https://api.github.com/users/SpinlockLabs/events{/privacy}", + "received_events_url": "https://api.github.com/users/SpinlockLabs/received_events", + "type": "Organization", + "site_admin": false + }, + "html_url": "https://github.com/SpinlockLabs/github.dart", + "description": "GitHub Client Library for Dart", + "fork": false, + "url": "https://api.github.com/repos/SpinlockLabs/github.dart", + "forks_url": "https://api.github.com/repos/SpinlockLabs/github.dart/forks", + "keys_url": "https://api.github.com/repos/SpinlockLabs/github.dart/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/SpinlockLabs/github.dart/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/SpinlockLabs/github.dart/teams", + "hooks_url": "https://api.github.com/repos/SpinlockLabs/github.dart/hooks", + "issue_events_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues/events{/number}", + "events_url": "https://api.github.com/repos/SpinlockLabs/github.dart/events", + "assignees_url": "https://api.github.com/repos/SpinlockLabs/github.dart/assignees{/user}", + "branches_url": "https://api.github.com/repos/SpinlockLabs/github.dart/branches{/branch}", + "tags_url": "https://api.github.com/repos/SpinlockLabs/github.dart/tags", + "blobs_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/SpinlockLabs/github.dart/statuses/{sha}", + "languages_url": "https://api.github.com/repos/SpinlockLabs/github.dart/languages", + "stargazers_url": "https://api.github.com/repos/SpinlockLabs/github.dart/stargazers", + "contributors_url": "https://api.github.com/repos/SpinlockLabs/github.dart/contributors", + "subscribers_url": "https://api.github.com/repos/SpinlockLabs/github.dart/subscribers", + "subscription_url": "https://api.github.com/repos/SpinlockLabs/github.dart/subscription", + "commits_url": "https://api.github.com/repos/SpinlockLabs/github.dart/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/SpinlockLabs/github.dart/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/SpinlockLabs/github.dart/contents/{+path}", + "compare_url": "https://api.github.com/repos/SpinlockLabs/github.dart/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/SpinlockLabs/github.dart/merges", + "archive_url": "https://api.github.com/repos/SpinlockLabs/github.dart/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/SpinlockLabs/github.dart/downloads", + "issues_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues{/number}", + "pulls_url": "https://api.github.com/repos/SpinlockLabs/github.dart/pulls{/number}", + "milestones_url": "https://api.github.com/repos/SpinlockLabs/github.dart/milestones{/number}", + "notifications_url": "https://api.github.com/repos/SpinlockLabs/github.dart/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/SpinlockLabs/github.dart/labels{/name}", + "releases_url": "https://api.github.com/repos/SpinlockLabs/github.dart/releases{/id}", + "deployments_url": "https://api.github.com/repos/SpinlockLabs/github.dart/deployments" + }, + "score": 1.0 + }, + { + "name": "release_unreleased_prs.dart", + "path": "tool/release_unreleased_prs.dart", + "sha": "aca8dae11ec0a26804761ea302934829bf70b4c9", + "url": "https://api.github.com/repositories/22344823/contents/tool/release_unreleased_prs.dart?ref=7056f9c2bf17c5f437e6cb32012a7d16f9ed3278", + "git_url": "https://api.github.com/repositories/22344823/git/blobs/aca8dae11ec0a26804761ea302934829bf70b4c9", + "html_url": "https://github.com/SpinlockLabs/github.dart/blob/7056f9c2bf17c5f437e6cb32012a7d16f9ed3278/tool/release_unreleased_prs.dart", + "repository": { + "id": 22344823, + "node_id": "MDEwOlJlcG9zaXRvcnkyMjM0NDgyMw==", + "name": "github.dart", + "full_name": "SpinlockLabs/github.dart", + "private": false, + "owner": { + "login": "SpinlockLabs", + "id": 26679435, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjI2Njc5NDM1", + "avatar_url": "https://avatars.githubusercontent.com/u/26679435?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/SpinlockLabs", + "html_url": "https://github.com/SpinlockLabs", + "followers_url": "https://api.github.com/users/SpinlockLabs/followers", + "following_url": "https://api.github.com/users/SpinlockLabs/following{/other_user}", + "gists_url": "https://api.github.com/users/SpinlockLabs/gists{/gist_id}", + "starred_url": "https://api.github.com/users/SpinlockLabs/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/SpinlockLabs/subscriptions", + "organizations_url": "https://api.github.com/users/SpinlockLabs/orgs", + "repos_url": "https://api.github.com/users/SpinlockLabs/repos", + "events_url": "https://api.github.com/users/SpinlockLabs/events{/privacy}", + "received_events_url": "https://api.github.com/users/SpinlockLabs/received_events", + "type": "Organization", + "site_admin": false + }, + "html_url": "https://github.com/SpinlockLabs/github.dart", + "description": "GitHub Client Library for Dart", + "fork": false, + "url": "https://api.github.com/repos/SpinlockLabs/github.dart", + "forks_url": "https://api.github.com/repos/SpinlockLabs/github.dart/forks", + "keys_url": "https://api.github.com/repos/SpinlockLabs/github.dart/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/SpinlockLabs/github.dart/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/SpinlockLabs/github.dart/teams", + "hooks_url": "https://api.github.com/repos/SpinlockLabs/github.dart/hooks", + "issue_events_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues/events{/number}", + "events_url": "https://api.github.com/repos/SpinlockLabs/github.dart/events", + "assignees_url": "https://api.github.com/repos/SpinlockLabs/github.dart/assignees{/user}", + "branches_url": "https://api.github.com/repos/SpinlockLabs/github.dart/branches{/branch}", + "tags_url": "https://api.github.com/repos/SpinlockLabs/github.dart/tags", + "blobs_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/SpinlockLabs/github.dart/statuses/{sha}", + "languages_url": "https://api.github.com/repos/SpinlockLabs/github.dart/languages", + "stargazers_url": "https://api.github.com/repos/SpinlockLabs/github.dart/stargazers", + "contributors_url": "https://api.github.com/repos/SpinlockLabs/github.dart/contributors", + "subscribers_url": "https://api.github.com/repos/SpinlockLabs/github.dart/subscribers", + "subscription_url": "https://api.github.com/repos/SpinlockLabs/github.dart/subscription", + "commits_url": "https://api.github.com/repos/SpinlockLabs/github.dart/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/SpinlockLabs/github.dart/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/SpinlockLabs/github.dart/contents/{+path}", + "compare_url": "https://api.github.com/repos/SpinlockLabs/github.dart/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/SpinlockLabs/github.dart/merges", + "archive_url": "https://api.github.com/repos/SpinlockLabs/github.dart/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/SpinlockLabs/github.dart/downloads", + "issues_url": "https://api.github.com/repos/SpinlockLabs/github.dart/issues{/number}", + "pulls_url": "https://api.github.com/repos/SpinlockLabs/github.dart/pulls{/number}", + "milestones_url": "https://api.github.com/repos/SpinlockLabs/github.dart/milestones{/number}", + "notifications_url": "https://api.github.com/repos/SpinlockLabs/github.dart/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/SpinlockLabs/github.dart/labels{/name}", + "releases_url": "https://api.github.com/repos/SpinlockLabs/github.dart/releases{/id}", + "deployments_url": "https://api.github.com/repos/SpinlockLabs/github.dart/deployments" + }, + "score": 1.0 + } + ] +}'''; diff --git a/test/code_search_test.dart b/test/code_search_test.dart deleted file mode 100644 index 3d60cf63..00000000 --- a/test/code_search_test.dart +++ /dev/null @@ -1,21 +0,0 @@ -import 'dart:io'; -import 'package:github/github.dart'; - -Future main() async { - print('Searching ...'); - final github = GitHub(); - - final resultsStream = github.search.code( - 'github', - repo: 'SpinlockLabs/github.dart', - perPage: 5, - pages: 1, - ); - final results = await resultsStream.first; - print('${results.totalCount} results'); - var k = 1; - for (final i in results.items!) { - print('${k++} ${i.path}'); - } - exit(0); -} diff --git a/test/git_test.dart b/test/git_test.dart index d6e19bdb..2eaff028 100644 --- a/test/git_test.dart +++ b/test/git_test.dart @@ -1,310 +1,191 @@ -import 'dart:async'; -import 'dart:convert'; - -import 'package:github/src/common.dart'; -import 'package:http/http.dart' as http; -import 'package:mockito/mockito.dart'; +import 'dart:io'; +import 'package:github/github.dart'; +import 'package:nock/nock.dart'; import 'package:test/test.dart'; -import 'src/mocks.mocks.dart'; +import 'assets/responses/nocked_responses.dart' as nocked; + +const fakeApiUrl = 'http://fake.api.github.com'; +const date = '2014-10-02T15:21:29Z'; + +GitHub createGithub() { + return GitHub( + endpoint: fakeApiUrl, + auth: + Authentication.withToken('0000000000000000000000000000000000000001')); +} void main() { - late MockGitHub github; + late GitHub github; late GitService git; late RepositorySlug repo; const someSha = 'someSHA'; + setUpAll(nock.init); + setUp(() { - github = MockGitHub(); + nock.cleanAll(); + github = createGithub(); git = GitService(github); repo = RepositorySlug('o', 'n'); }); + tearDown(nock.cleanAll); - group('getBlob()', () { - test('constructs correct path', () { - git.getBlob(repo, 'sh'); - - verify(github.getJSON('/repos/o/n/git/blobs/sh', - convert: (dynamic i) => GitBlob.fromJson(i), - statusCode: StatusCodes.OK)); - }); + test('getBlob()', () async { + nock(fakeApiUrl).get('/repos/o/n/git/blobs/sh').reply(200, nocked.getBlob); + final blob = await git.getBlob(repo, 'sh'); + expect(blob.sha, '3a0f86fb8db8eea7ccbb9a95f325ddbedfb25e15'); + expect(nock.pendingMocks.isEmpty, true); }); - group('createBlob()', () { - test('constructs correct path', () { - var blob = CreateGitBlob('bbb', 'utf-8'); - git.createBlob(repo, blob); - - verify(github.postJSON( - '/repos/o/n/git/blobs', - convert: (dynamic i) => GitBlob.fromJson(i), - statusCode: StatusCodes.CREATED, - body: GitHubJson.encode(blob), - )); - }); - - test('creates valid JSON body', () { - var blob = CreateGitBlob('bbb', 'utf-8'); - - git.createBlob(repo, blob); - final body = captureSentBody(github)!; - expect(body['content'], equals('bbb')); - expect(body['encoding'], equals('utf-8')); - }); + test('createBlob()', () async { + nock(fakeApiUrl) + .post('/repos/o/n/git/blobs', '{"content":"bbb","encoding":"utf-8"}') + .reply(201, nocked.createBlob); + var blob = await git.createBlob(repo, CreateGitBlob('bbb', 'utf-8')); + expect(blob.content, 'bbb'); + expect(blob.encoding, 'utf-8'); }); - group('getCommit()', () { - test('constructs correct path', () { - git.getCommit(repo, 'sh'); - - verify(github.getJSON('/repos/o/n/git/commits/sh', - convert: (dynamic i) => GitCommit.fromJson(i), - statusCode: StatusCodes.OK)); - }); + test('getCommit()', () async { + nock(fakeApiUrl) + .get('/repos/o/n/git/commits/sh') + .reply(200, nocked.getCommit); + var commit = await git.getCommit(repo, 'sh'); + expect(commit.sha, '7638417db6d59f3c431d3e1f261cc637155684cd'); }); - group('createCommit()', () { - test('constructs correct path', () { - final commit = CreateGitCommit('aMessage', 'aTreeSha'); - git.createCommit(repo, commit); - - verify(github.postJSON( - '/repos/o/n/git/commits', - convert: (dynamic i) => GitCommit.fromJson(i), - statusCode: StatusCodes.CREATED, - body: GitHubJson.encode(commit), - )); - }); - - test('creates valid JSON body', () { - // given - const date = '2014-10-02T15:21:29Z'; - - final commit = CreateGitCommit('aMessage', 'aTreeSha') - ..parents = ['parentSha1', 'parentSha2'] - ..committer = GitCommitUser('cName', 'cEmail', DateTime.parse(date)) - ..author = GitCommitUser('aName', 'aEmail', DateTime.parse(date)); - - // when - git.createCommit(repo, commit); - - // then - final body = captureSentBody(github)!; - expect(body['message'], equals('aMessage')); - expect(body['tree'], equals('aTreeSha')); - expect(body['parents'], equals(['parentSha1', 'parentSha2'])); - expect(body['committer']['name'], equals('cName')); - expect(body['committer']['email'], equals('cEmail')); - expect(body['committer']['date'], equals(date)); - expect(body['author']['name'], equals('aName')); - expect(body['author']['email'], equals('aEmail')); - expect(body['author']['date'], equals(date)); - }); + test('createCommit()', () async { + nock(fakeApiUrl) + .post('/repos/o/n/git/commits', + '{"message":"aMessage","tree":"aTreeSha","parents":["parentSha1","parentSha2"],"committer":{"name":"cName","email":"cEmail","date":"2014-10-02T15:21:29Z"},"author":{"name":"aName","email":"aEmail","date":"2014-10-02T15:21:29Z"}}') + .reply(201, nocked.createCommit); + + var commit = await git.createCommit( + repo, + CreateGitCommit('aMessage', 'aTreeSha') + ..parents = ['parentSha1', 'parentSha2'] + ..committer = GitCommitUser('cName', 'cEmail', DateTime.parse(date)) + ..author = GitCommitUser('aName', 'aEmail', DateTime.parse(date))); + expect(commit.message, 'aMessage'); + expect(commit.tree!.sha, 'aTreeSha'); }); - group('getReference()', () { - test('constructs correct path', () { - git.getReference(repo, 'heads/b'); - - verify(github.getJSON('/repos/o/n/git/refs/heads/b', - convert: (dynamic i) => GitReference.fromJson(i), - statusCode: StatusCodes.OK)); - }); + test('getReference()', () async { + nock(fakeApiUrl) + .get('/repos/o/n/git/refs/heads/b') + .reply(200, nocked.getReference); + var ref = await git.getReference(repo, 'heads/b'); + expect(ref.ref, 'refs/heads/b'); }); - group('createReference()', () { + test('createReference()', () async { const someRef = 'refs/heads/b'; - test('constructs correct path', () { - git.createReference(repo, someRef, someSha); - - verify(github.postJSON('/repos/o/n/git/refs', - convert: (dynamic i) => GitReference.fromJson(i), - statusCode: StatusCodes.CREATED, - body: GitHubJson.encode({'ref': someRef, 'sha': someSha}))); - }); - - test('creates valid JSON body', () { - git.createReference(repo, someRef, someSha); - - final body = captureSentBody(github)!; - expect(body['ref'], equals(someRef)); - expect(body['sha'], equals(someSha)); - }); + nock(fakeApiUrl) + .post('/repos/o/n/git/refs', '{"ref":"refs/heads/b","sha":"someSHA"}') + .reply(201, nocked.createReference); + var ref = await git.createReference(repo, someRef, someSha); + expect(ref.ref, someRef); }); - group('editReference()', () { - test('constructs correct path', () { - // given - final expectedResponse = http.Response('{}', 200); - - when(github.request(any, any, body: any, headers: any)) - .thenReturn(Future.value(expectedResponse)); - - // when - git.editReference(repo, 'heads/b', someSha); - - // then - verify(github.request('PATCH', '/repos/o/n/git/refs/heads/b', - headers: any, body: any)); - }); - - test('creates valid JSON body', () { - // given - final expectedResponse = http.Response('{}', 200); - when(github.request(any, any, body: any, headers: any)) - .thenReturn(Future.value(expectedResponse)); - - // when - git.editReference(repo, 'heads/b', someSha, force: true); + test('editReference()', () async { + nock(fakeApiUrl) + .patch('/repos/o/n/git/refs/heads/b', '{"sha":"someSHA","force":true}') + .reply(200, '{}'); - // then - final captured = verify(github.request( - any, - any, - body: captureAny, - headers: captureAny, - )).captured; - - final body = jsonDecode(captured[0]); - final headers = captured[1]; - - expect(body['sha'], equals(someSha)); - expect(body['force'], equals(true)); - expect(headers['content-length'], equals('30')); - }); + await git.editReference(repo, 'heads/b', someSha, force: true); }); - group('deleteReference()', () { - test('constructs correct path', () { - // given - final expectedResponse = http.Response('{}', 200); - when(github.request(any, any)).thenReturn(Future.value(expectedResponse)); - - // when - git.deleteReference(repo, 'heads/b'); - - // then - verify(github.request('DELETE', '/repos/o/n/git/refs/heads/b')); - }); + test('deleteReference()', () async { + nock(fakeApiUrl).delete('/repos/o/n/git/refs/heads/b').reply(200, '{}'); + await git.deleteReference(repo, 'heads/b'); }); - group('getTag()', () { - test('constructs correct path', () { - git.getTag(repo, someSha); - - verify(github.getJSON('/repos/o/n/git/tags/someSHA', - convert: (dynamic i) => GitTag.fromJson(i), - statusCode: StatusCodes.OK)); - }); + test('getTag()', () async { + nock(fakeApiUrl) + .get('/repos/o/n/git/tags/someSHA') + .reply(200, nocked.getTag); + await git.getTag(repo, someSha); }); - group('createTag()', () { - final createGitTag = CreateGitTag('v0.0.1', 'a message', someSha, 'commit', - GitCommitUser('aName', 'aEmail', DateTime.now())); - - test('constructs correct path', () { - git.createTag(repo, createGitTag); - - verify(github.postJSON('/repos/o/n/git/tags', - convert: (dynamic i) => GitTag.fromJson(i), - statusCode: StatusCodes.CREATED, - body: GitHubJson.encode(createGitTag))); - }); - - test('creates valid JSON body', () { - git.createTag(repo, createGitTag); - - final body = captureSentBody(github)!; - expect(body['tag'], equals('v0.0.1')); - expect(body['message'], equals('a message')); - expect(body['object'], equals(someSha)); - expect(body['type'], equals('commit')); - expect(body['tagger']['name'], equals('aName')); - }); + test('createTag()', () async { + nock(fakeApiUrl) + .post('/repos/o/n/git/tags', + '{"tag":"v0.0.1","message":"initial version","object":"someSHA","type":"commit","tagger":{"name":"Monalisa Octocat","email":"octocat@github.com","date":"$date"}}') + .reply(201, nocked.createTag); + + final createGitTag = CreateGitTag( + 'v0.0.1', + 'initial version', + someSha, + 'commit', + GitCommitUser( + 'Monalisa Octocat', 'octocat@github.com', DateTime.parse(date))); + + var tag = await git.createTag(repo, createGitTag); + + expect(tag.tag, 'v0.0.1'); + expect(tag.message, 'initial version'); + expect(tag.tagger?.name, 'Monalisa Octocat'); }); - group('getTree()', () { - test('constructs correct path', () { - git.getTree(repo, 'sh'); - - verify(github.getJSON('/repos/o/n/git/trees/sh', - convert: (dynamic j) => GitTree.fromJson(j), - statusCode: StatusCodes.OK)); - }); + test('getTree()', () async { + nock(fakeApiUrl) + .get('/repos/o/n/git/trees/sh?recursive=1') + .reply(200, '{}'); + await git.getTree(repo, 'sh', recursive: true); }); - group('getTree(recursive: true)', () { - test('constructs correct path', () { - git.getTree(repo, 'sh', recursive: true); - - verify(github.getJSON('/repos/o/n/git/trees/sh?recursive=1', - convert: (dynamic j) => GitTree.fromJson(j), - statusCode: StatusCodes.OK)); - }); + test('createTree()', () async { + nock(fakeApiUrl) + .post('/repos/o/n/git/trees', + '{"tree":[{"path":"file.rb","mode":"100644","type":"blob","sha":"44b4fc6d56897b048c772eb4087f854f46256132"}]}') + .reply(201, nocked.createTree); + + var createTree = CreateGitTree([ + CreateGitTreeEntry('file.rb', '100644', 'blob', + sha: '44b4fc6d56897b048c772eb4087f854f46256132') + ]); + + var tree = await git.createTree(repo, createTree); + var entry = tree.entries?.first; + expect(entry?.path, 'file.rb'); + expect(entry?.mode, '100644'); + expect(entry?.type, 'blob'); + expect(entry?.sha, '44b4fc6d56897b048c772eb4087f854f46256132'); + + nock(fakeApiUrl) + .post('/repos/o/n/git/trees', + '{"tree":[{"path":"file.rb","mode":"100644","type":"blob","content":"content"}]}') + .reply(201, nocked.createTree); + + createTree = CreateGitTree( + [CreateGitTreeEntry('file.rb', '100644', 'blob', content: 'content')]); + + tree = await git.createTree(repo, createTree); + entry = tree.entries?.first; + expect(entry?.path, 'file.rb'); + expect(entry?.mode, '100644'); + expect(entry?.type, 'blob'); + expect(entry?.sha, '44b4fc6d56897b048c772eb4087f854f46256132'); }); - group('createTree()', () { - test('constructs correct path', () { - final createGitTree = CreateGitTree([]); - git.createTree(repo, createGitTree); - - verify(github.postJSON('/repos/o/n/git/trees', - convert: (dynamic j) => GitTree.fromJson(j), - statusCode: StatusCodes.CREATED, - body: GitHubJson.encode(createGitTree))); - }); - - test('with sha creates valid JSON body', () { - // given - var treeEntry = CreateGitTreeEntry('file.rb', '100644', 'blob', - sha: '44b4fc6d56897b048c772eb4087f854f46256132'); - - final tree = CreateGitTree([treeEntry]); - - // when - git.createTree(repo, tree); - - // then - final body = captureSentBody(github)!; - expect(body['tree'], isNotNull); - expect(body['tree'][0]['path'], equals('file.rb')); - expect(body['tree'][0]['mode'], equals('100644')); - expect(body['tree'][0]['type'], equals('blob')); - expect(body['tree'][0]['sha'], - equals('44b4fc6d56897b048c772eb4087f854f46256132')); - expect(body['tree'][0]['content'], isNull); - }); - - test('with content creates valid JSON body', () { - // given - var treeEntry = CreateGitTreeEntry('file.rb', '100644', 'blob', - content: 'some file content'); - - final tree = CreateGitTree([treeEntry]); - - // when - git.createTree(repo, tree); - - // then - final body = captureSentBody(github)!; - expect(body['tree'], isNotNull); - expect(body['tree'][0]['path'], equals('file.rb')); - expect(body['tree'][0]['mode'], equals('100644')); - expect(body['tree'][0]['type'], equals('blob')); - expect(body['tree'][0]['sha'], isNull); - expect(body['tree'][0]['content'], equals('some file content')); - }); + test('code search', () async { + nock(fakeApiUrl) + .get( + '/search/code?q=search%20repo%3ASpinlockLabs%2Fgithub.dart%20in%3Afile&per_page=20&page=1') + .reply(200, nocked.searchResults); + + final results = (await github.search + .code( + 'search', + repo: 'SpinlockLabs/github.dart', + perPage: 20, + pages: 1, + ) + .toList()) + .first; + expect(results.totalCount, 17); + expect(results.items?.length, 17); }); } - -Map? captureSentBody(MockGitHub github) { - final bodyString = verify(github.postJSON( - any, - convert: any, - statusCode: any, - body: captureAny, - )).captured.single; - - final body = jsonDecode(bodyString) as Map?; - return body; -} diff --git a/test/scenarios_test.dart b/test/scenarios_test.dart new file mode 100644 index 00000000..6486553d --- /dev/null +++ b/test/scenarios_test.dart @@ -0,0 +1,140 @@ +@Tags(['scenarios']) +@TestOn('vm') + +import 'dart:convert'; + +import 'package:github/github.dart'; +import 'package:http/http.dart' as http; +import 'package:test/test.dart'; + +final defaultFixtureServerUri = Uri.parse('http://localhost:3000/fixtures'); + +/// All folder names at @octokit/fixtures/scenarios/api.github.com +/// are valid values for [scenario]. +Future createGithubWithScenario(String scenario, + {Uri? fixtureServerUri}) async { + fixtureServerUri ??= defaultFixtureServerUri; + + // send a request to the fixtures server to get load a fixture + var resp = await http.post(fixtureServerUri, + headers: {'Content-Type': 'application/json'}, + body: '{"scenario": "$scenario"}'); + if (resp.statusCode < 200 || resp.statusCode >= 300) { + throw Exception( + 'Error loading scenario: $scenario\n${resp.statusCode}\n${resp.body}'); + } + var j = json.decode(resp.body); + return GitHub( + endpoint: j['url'], + auth: + Authentication.withToken('0000000000000000000000000000000000000001')); +} + +/// Run scenario tests against ockokits fixtures-server +/// https://github.com/octokit/fixtures-server +/// +/// These tests are a port of the rest.js ocktokit tests from +/// https://github.com/octokit/rest.js/tree/master/test/scenarios +/// +/// The fixture server must be running before running these tests +/// The easiest way is to install node and then run +/// npx octokit-fixtures-server +/// +/// TODO(robrbecker) Implement a fixture-server "light" in Dart +/// directly using nock so we can remove the dependency on node +/// and running a server in order to run tests +void main() { + test('add-and-remove-repository-collaborator', () async { + var gh = await createGithubWithScenario( + 'add-and-remove-repository-collaborator'); + // todo do test + }, skip: true); + test('add-labels-to-issue', () async { + var gh = await createGithubWithScenario('add-labels-to-issue'); + // todo do test + }, skip: true); + test('branch-protection', () async { + var gh = await createGithubWithScenario('branch-protection'); + // todo do test + }, skip: true); + test('create-file', () async { + var gh = await createGithubWithScenario('create-file'); + // todo do test + }, skip: true); + + test('create-status', () async { + var gh = await createGithubWithScenario('create-status'); + // todo do test + }, skip: true); + test('errors', () async { + var gh = await createGithubWithScenario('errors'); + // todo do test + }, skip: true); + test('get-archive', () async { + var gh = await createGithubWithScenario('get-archive'); + // todo do test + }, skip: true); + test('get-content', () async { + var gh = await createGithubWithScenario('get-content'); + // todo do test + }, skip: true); + + test('get-organization', () async { + var gh = await createGithubWithScenario('get-organization'); + var org = await gh.organizations.get('octokit-fixture-org'); + expect(org.login, 'octokit-fixture-org'); + }); + + test('get-repository', () async { + var gh = await createGithubWithScenario('get-repository'); + // todo do test + }, skip: true); + test('get-root', () async { + var gh = await createGithubWithScenario('get-root'); + // todo do test + }, skip: true); + test('git-refs', () async { + var gh = await createGithubWithScenario('git-refs'); + // todo do test + }, skip: true); + test('labels', () async { + var gh = await createGithubWithScenario('labels'); + // todo do test + }, skip: true); + test('lock-issue', () async { + var gh = await createGithubWithScenario('lock-issue'); + // todo do test + }, skip: true); + test('mark-notifications-as-read', () async { + var gh = await createGithubWithScenario('mark-notifications-as-read'); + // todo do test + }, skip: true); + test('markdown', () async { + var gh = await createGithubWithScenario('markdown'); + // todo do test + }, skip: true); + test('paginate-issues', () async { + var gh = await createGithubWithScenario('paginate-issues'); + // todo do test + }, skip: true); + test('project-cards', () async { + var gh = await createGithubWithScenario('project-cards'); + // todo do test + }, skip: true); + test('release-assets-conflict', () async { + var gh = await createGithubWithScenario('release-assets-conflict'); + // todo do test + }, skip: true); + test('release-assets', () async { + var gh = await createGithubWithScenario('release-assets'); + // todo do test + }, skip: true); + test('rename-repository', () async { + var gh = await createGithubWithScenario('rename-repository'); + // todo do test + }, skip: true); + test('search-issues', () async { + var gh = await createGithubWithScenario('search-issues'); + // todo do test + }, skip: true); +} diff --git a/test/src/mocks.dart b/test/src/mocks.dart deleted file mode 100644 index 8add5505..00000000 --- a/test/src/mocks.dart +++ /dev/null @@ -1,5 +0,0 @@ -import 'package:github/src/common.dart'; -import 'package:mockito/annotations.dart'; - -@GenerateMocks([GitHub]) -void main() {} diff --git a/test/src/mocks.mocks.dart b/test/src/mocks.mocks.dart deleted file mode 100644 index c381f58a..00000000 --- a/test/src/mocks.mocks.dart +++ /dev/null @@ -1,262 +0,0 @@ -// Mocks generated by Mockito 5.2.0 from annotations -// in github/test/src/mocks.dart. -// Do not manually edit this file. - -import 'dart:async' as _i4; - -import 'package:github/src/common.dart' as _i3; -import 'package:http/http.dart' as _i2; -import 'package:mockito/mockito.dart' as _i1; - -// ignore_for_file: type=lint -// ignore_for_file: avoid_redundant_argument_values -// ignore_for_file: avoid_setters_without_getters -// ignore_for_file: comment_references -// ignore_for_file: implementation_imports -// ignore_for_file: invalid_use_of_visible_for_testing_member -// ignore_for_file: prefer_const_constructors -// ignore_for_file: unnecessary_parenthesis -// ignore_for_file: camel_case_types - -class _FakeClient_0 extends _i1.Fake implements _i2.Client {} - -class _FakeActivityService_1 extends _i1.Fake implements _i3.ActivityService {} - -class _FakeAuthorizationsService_2 extends _i1.Fake - implements _i3.AuthorizationsService {} - -class _FakeGistsService_3 extends _i1.Fake implements _i3.GistsService {} - -class _FakeGitService_4 extends _i1.Fake implements _i3.GitService {} - -class _FakeIssuesService_5 extends _i1.Fake implements _i3.IssuesService {} - -class _FakeMiscService_6 extends _i1.Fake implements _i3.MiscService {} - -class _FakeOrganizationsService_7 extends _i1.Fake - implements _i3.OrganizationsService {} - -class _FakePullRequestsService_8 extends _i1.Fake - implements _i3.PullRequestsService {} - -class _FakeRepositoriesService_9 extends _i1.Fake - implements _i3.RepositoriesService {} - -class _FakeSearchService_10 extends _i1.Fake implements _i3.SearchService {} - -class _FakeUrlShortenerService_11 extends _i1.Fake - implements _i3.UrlShortenerService {} - -class _FakeUsersService_12 extends _i1.Fake implements _i3.UsersService {} - -class _FakeChecksService_13 extends _i1.Fake implements _i3.ChecksService {} - -class _FakeResponse_14 extends _i1.Fake implements _i2.Response {} - -/// A class which mocks [GitHub]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockGitHub extends _i1.Mock implements _i3.GitHub { - MockGitHub() { - _i1.throwOnMissingStub(this); - } - - @override - set auth(_i3.Authentication? _auth) => - super.noSuchMethod(Invocation.setter(#auth, _auth), - returnValueForMissingStub: null); - @override - String get endpoint => - (super.noSuchMethod(Invocation.getter(#endpoint), returnValue: '') - as String); - @override - _i2.Client get client => (super.noSuchMethod(Invocation.getter(#client), - returnValue: _FakeClient_0()) as _i2.Client); - @override - _i3.ActivityService get activity => - (super.noSuchMethod(Invocation.getter(#activity), - returnValue: _FakeActivityService_1()) as _i3.ActivityService); - @override - _i3.AuthorizationsService get authorizations => - (super.noSuchMethod(Invocation.getter(#authorizations), - returnValue: _FakeAuthorizationsService_2()) - as _i3.AuthorizationsService); - @override - _i3.GistsService get gists => (super.noSuchMethod(Invocation.getter(#gists), - returnValue: _FakeGistsService_3()) as _i3.GistsService); - @override - _i3.GitService get git => (super.noSuchMethod(Invocation.getter(#git), - returnValue: _FakeGitService_4()) as _i3.GitService); - @override - _i3.IssuesService get issues => - (super.noSuchMethod(Invocation.getter(#issues), - returnValue: _FakeIssuesService_5()) as _i3.IssuesService); - @override - _i3.MiscService get misc => (super.noSuchMethod(Invocation.getter(#misc), - returnValue: _FakeMiscService_6()) as _i3.MiscService); - @override - _i3.OrganizationsService get organizations => (super.noSuchMethod( - Invocation.getter(#organizations), - returnValue: _FakeOrganizationsService_7()) as _i3.OrganizationsService); - @override - _i3.PullRequestsService get pullRequests => (super.noSuchMethod( - Invocation.getter(#pullRequests), - returnValue: _FakePullRequestsService_8()) as _i3.PullRequestsService); - @override - _i3.RepositoriesService get repositories => (super.noSuchMethod( - Invocation.getter(#repositories), - returnValue: _FakeRepositoriesService_9()) as _i3.RepositoriesService); - @override - _i3.SearchService get search => - (super.noSuchMethod(Invocation.getter(#search), - returnValue: _FakeSearchService_10()) as _i3.SearchService); - @override - _i3.UrlShortenerService get urlShortener => (super.noSuchMethod( - Invocation.getter(#urlShortener), - returnValue: _FakeUrlShortenerService_11()) as _i3.UrlShortenerService); - @override - _i3.UsersService get users => (super.noSuchMethod(Invocation.getter(#users), - returnValue: _FakeUsersService_12()) as _i3.UsersService); - @override - _i3.ChecksService get checks => - (super.noSuchMethod(Invocation.getter(#checks), - returnValue: _FakeChecksService_13()) as _i3.ChecksService); - @override - _i4.Future getJSON(String? path, - {int? statusCode, - void Function(_i2.Response)? fail, - Map? headers, - Map? params, - _i3.JSONConverter? convert, - String? preview}) => - (super.noSuchMethod( - Invocation.method(#getJSON, [ - path - ], { - #statusCode: statusCode, - #fail: fail, - #headers: headers, - #params: params, - #convert: convert, - #preview: preview - }), - returnValue: Future.value(null)) as _i4.Future); - @override - _i4.Future postJSON(String? path, - {int? statusCode, - void Function(_i2.Response)? fail, - Map? headers, - Map? params, - _i3.JSONConverter? convert, - dynamic body, - String? preview}) => - (super.noSuchMethod( - Invocation.method(#postJSON, [ - path - ], { - #statusCode: statusCode, - #fail: fail, - #headers: headers, - #params: params, - #convert: convert, - #body: body, - #preview: preview - }), - returnValue: Future.value(null)) as _i4.Future); - @override - _i4.Future putJSON(String? path, - {int? statusCode, - void Function(_i2.Response)? fail, - Map? headers, - Map? params, - _i3.JSONConverter? convert, - dynamic body, - String? preview}) => - (super.noSuchMethod( - Invocation.method(#putJSON, [ - path - ], { - #statusCode: statusCode, - #fail: fail, - #headers: headers, - #params: params, - #convert: convert, - #body: body, - #preview: preview - }), - returnValue: Future.value(null)) as _i4.Future); - @override - _i4.Future patchJSON(String? path, - {int? statusCode, - void Function(_i2.Response)? fail, - Map? headers, - Map? params, - _i3.JSONConverter? convert, - dynamic body, - String? preview}) => - (super.noSuchMethod( - Invocation.method(#patchJSON, [ - path - ], { - #statusCode: statusCode, - #fail: fail, - #headers: headers, - #params: params, - #convert: convert, - #body: body, - #preview: preview - }), - returnValue: Future.value(null)) as _i4.Future); - @override - _i4.Future requestJson(String? method, String? path, - {int? statusCode, - void Function(_i2.Response)? fail, - Map? headers, - Map? params, - _i3.JSONConverter? convert, - dynamic body, - String? preview}) => - (super.noSuchMethod( - Invocation.method(#requestJson, [ - method, - path - ], { - #statusCode: statusCode, - #fail: fail, - #headers: headers, - #params: params, - #convert: convert, - #body: body, - #preview: preview - }), - returnValue: Future.value(null)) as _i4.Future); - @override - _i4.Future<_i2.Response> request(String? method, String? path, - {Map? headers, - Map? params, - dynamic body, - int? statusCode, - void Function(_i2.Response)? fail, - String? preview}) => - (super.noSuchMethod( - Invocation.method(#request, [ - method, - path - ], { - #headers: headers, - #params: params, - #body: body, - #statusCode: statusCode, - #fail: fail, - #preview: preview - }), - returnValue: Future<_i2.Response>.value(_FakeResponse_14())) - as _i4.Future<_i2.Response>); - @override - void handleStatusCode(_i2.Response? response) => - super.noSuchMethod(Invocation.method(#handleStatusCode, [response]), - returnValueForMissingStub: null); - @override - void dispose() => super.noSuchMethod(Invocation.method(#dispose, []), - returnValueForMissingStub: null); -} diff --git a/test/unit/common/model/misc_test.dart b/test/unit/common/model/misc_test.dart index e5bb9a4d..a7cbf3c2 100644 --- a/test/unit/common/model/misc_test.dart +++ b/test/unit/common/model/misc_test.dart @@ -6,16 +6,47 @@ import 'package:test/test.dart'; void main() { group('RateLimit', () { test('fromRateLimitResponse', () { - // This is a truncated version of the response - const rateLimitJson = '''{ - "resources": { - "rate": { - "limit": 5000, - "remaining": 4999, - "reset": 1372700873, - "used": 1 - } - }'''; + const rateLimitJson = ''' +{ + "resources": { + "core": { + "limit": 5000, + "remaining": 4999, + "reset": 1372700873, + "used": 1 + }, + "search": { + "limit": 30, + "remaining": 18, + "reset": 1372697452, + "used": 12 + }, + "graphql": { + "limit": 5000, + "remaining": 4993, + "reset": 1372700389, + "used": 7 + }, + "integration_manifest": { + "limit": 5000, + "remaining": 4999, + "reset": 1551806725, + "used": 1 + }, + "code_scanning_upload": { + "limit": 500, + "remaining": 499, + "reset": 1551806725, + "used": 1 + } + }, + "rate": { + "limit": 5000, + "remaining": 4999, + "reset": 1372700873, + "used": 1 + } +}'''; final rateLimit = RateLimit.fromRateLimitResponse(jsonDecode(rateLimitJson)); From 5f7b2645007208522dc5d53b7bf48f206dafa73a Mon Sep 17 00:00:00 2001 From: robrbecker Date: Mon, 31 Oct 2022 14:28:57 +0000 Subject: [PATCH 317/390] prep 9.5.1 --- CHANGELOG.md | 7 +++++++ pubspec.yaml | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5de4e987..fcbf764c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## 9.5.1 + +* Fix up unit tests & run them in CI by @robrbecker in https://github.com/SpinlockLabs/github.dart/pull/336 + + +**Full Changelog**: https://github.com/SpinlockLabs/github.dart/compare/9.5.0...9.5.1 + ## 9.5.0 * Add 'commits' member to GitHubComparison object by @fuzzybinary in https://github.com/SpinlockLabs/github.dart/pull/330 diff --git a/pubspec.yaml b/pubspec.yaml index ed60fc15..d7d20f57 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 9.5.0 +version: 9.5.1 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From 203d1d5126009657a23a219b3052e3098269222d Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Mon, 31 Oct 2022 08:33:12 -0600 Subject: [PATCH 318/390] fix publish GHA --- .github/workflows/publish_release.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish_release.yml b/.github/workflows/publish_release.yml index ca9789ba..320032df 100644 --- a/.github/workflows/publish_release.yml +++ b/.github/workflows/publish_release.yml @@ -8,7 +8,8 @@ jobs: publish: runs-on: ubuntu-latest - + container: + image: dart:2.17 steps: - name: Checkout uses: actions/checkout@v1 From 6854f404ca505bbc553db0ab0c72f6dcbcdfbcb7 Mon Sep 17 00:00:00 2001 From: Ricardo Amador <32242716+ricardoamador@users.noreply.github.com> Date: Mon, 31 Oct 2022 07:35:47 -0700 Subject: [PATCH 319/390] Update to allow different merge methods in pulls_service (#333) * Updated to allow different merge methods in pulls_service. * Adding tests for pulls service merge changes. --- lib/src/common/pulls_service.dart | 18 ++++ test/pulls_test.dart | 143 ++++++++++++++++++++++++++++++ 2 files changed, 161 insertions(+) create mode 100644 test/pulls_test.dart diff --git a/lib/src/common/pulls_service.dart b/lib/src/common/pulls_service.dart index 9c611cf9..bbf45a51 100644 --- a/lib/src/common/pulls_service.dart +++ b/lib/src/common/pulls_service.dart @@ -121,15 +121,27 @@ class PullRequestsService extends Service { RepositorySlug slug, int number, { String? message, + MergeMethod mergeMethod = MergeMethod.merge, + String? requestSha, }) { final json = {}; if (message != null) { json['commit_message'] = message; } + if (requestSha != null) { + json['sha'] = requestSha; + } + + json['merge_method'] = mergeMethod.name; + + // Recommended Accept header when making a merge request. + Map? headers = {}; + headers['Accept'] = 'application/vnd.github+json'; return github .request('PUT', '/repos/${slug.fullName}/pulls/$number/merge', + headers: headers, body: GitHubJson.encode(json)) .then((response) { return PullRequestMerge.fromJson( @@ -184,3 +196,9 @@ class PullRequestsService extends Service { ); } } + +enum MergeMethod { + merge, + squash, + rebase, +} \ No newline at end of file diff --git a/test/pulls_test.dart b/test/pulls_test.dart new file mode 100644 index 00000000..ae711b2c --- /dev/null +++ b/test/pulls_test.dart @@ -0,0 +1,143 @@ +import 'dart:async'; + +import 'package:github/src/common.dart'; +import 'package:http/http.dart' as http; +import 'package:mockito/mockito.dart'; +import 'package:test/test.dart'; + +import 'src/mocks.mocks.dart'; + +void main() { + late MockGitHub github; + late PullRequestsService pulls; + late RepositorySlug repo; + const someSha = 'someSHA'; + + setUp(() { + github = MockGitHub(); + pulls = PullRequestsService(github); + repo = RepositorySlug('o', 'n'); + }); + + group('Merge', () { + test('Merge() normal', () async { + const expectedMessage = 'Pull Request successfully merged'; + const expectedMerge = true; + + when(github.request(any, any, headers: anyNamed("headers"), body: anyNamed("body"))) + .thenAnswer((_) => Future.value( + http.Response('''{ + "sha": "$someSha", + "merged": $expectedMerge, + "message": "$expectedMessage" + }''', 200) + )); + + var pullRequestMerge = await pulls.merge(repo, 1); + + verify(github.request('PUT', '/repos/o/n/pulls/1/merge', + headers: anyNamed("headers"), body: '''{"merge_method":"merge"}''')); + + expect(pullRequestMerge.merged, isTrue); + expect(pullRequestMerge.message, expectedMessage); + expect(pullRequestMerge.sha, someSha); + }); + + test('Merge() with squash', () async { + const expectedMessage = 'Pull Request successfully merged'; + const expectedMerge = true; + + when(github.request(any, any, headers: anyNamed("headers"), body: anyNamed("body"))) + .thenAnswer((_) => Future.value( + http.Response('''{ + "sha": "$someSha", + "merged": $expectedMerge, + "message": "$expectedMessage" + }''', 200) + )); + + var pullRequestMerge = await pulls.merge(repo, 1, mergeMethod: MergeMethod.squash); + + verify(github.request('PUT', '/repos/o/n/pulls/1/merge', + headers: anyNamed("headers"), body: '''{"merge_method":"squash"}''')); + + expect(pullRequestMerge.merged, isTrue); + expect(pullRequestMerge.message, expectedMessage); + expect(pullRequestMerge.sha, someSha); + }); + + test('Merge() with rebase', () async { + const expectedMessage = 'Pull Request successfully merged'; + const expectedMerge = true; + + when(github.request(any, any, headers: anyNamed("headers"), body: anyNamed("body"))) + .thenAnswer((_) => Future.value( + http.Response('''{ + "sha": "$someSha", + "merged": $expectedMerge, + "message": "$expectedMessage" + }''', 200) + )); + + var pullRequestMerge = await pulls.merge(repo, 1, mergeMethod: MergeMethod.rebase); + + verify(github.request('PUT', '/repos/o/n/pulls/1/merge', + headers: anyNamed("headers"), body: '''{"merge_method":"rebase"}''')); + + expect(pullRequestMerge.merged, isTrue); + expect(pullRequestMerge.message, expectedMessage); + expect(pullRequestMerge.sha, someSha); + }); + + test('Merge() with commitMessage', () async { + const expectedMessage = 'Pull Request successfully merged'; + const expectedMerge = true; + const commitMessage = 'Some message'; + + when(github.request(any, any, headers: anyNamed("headers"), body: anyNamed("body"))) + .thenAnswer((_) => Future.value( + http.Response('''{ + "sha": "$someSha", + "merged": $expectedMerge, + "message": "$expectedMessage" + }''', 200) + )); + + var pullRequestMerge = await pulls.merge(repo, 1, message: commitMessage, mergeMethod: MergeMethod.squash); + + verify(github.request('PUT', '/repos/o/n/pulls/1/merge', + headers: anyNamed("headers"), body: '''{"commit_message":"$commitMessage","merge_method":"squash"}''')); + + expect(pullRequestMerge.merged, isTrue); + expect(pullRequestMerge.message, expectedMessage); + expect(pullRequestMerge.sha, someSha); + }); + + test('Merge() with commitMessage, with sha', () async { + const expectedMessage = 'Pull Request successfully merged'; + const expectedMerge = true; + const commitMessage = 'Some message'; + const commitSha = 'commitSha'; + + when(github.request(any, any, headers: anyNamed("headers"), body: anyNamed("body"))) + .thenAnswer((_) => Future.value( + http.Response('''{ + "sha": "$someSha", + "merged": $expectedMerge, + "message": "$expectedMessage" + }''', 200) + )); + + var pullRequestMerge = await pulls.merge(repo, 1, message: commitMessage, + mergeMethod: MergeMethod.squash, requestSha: commitSha); + + verify(github.request('PUT', '/repos/o/n/pulls/1/merge', + headers: anyNamed("headers"), + body: '''{"commit_message":"$commitMessage","sha":"$commitSha","merge_method":"squash"}''')); + + expect(pullRequestMerge.merged, isTrue); + expect(pullRequestMerge.message, expectedMessage); + expect(pullRequestMerge.sha, someSha); + }); + }); +} \ No newline at end of file From 450cdb5af0ad87e33a514d34a00c1ae52896690d Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Mon, 31 Oct 2022 17:44:01 -0600 Subject: [PATCH 320/390] fix up merged PR, tests failing --- lib/src/common/pulls_service.dart | 5 +- test/assets/responses/nocked_responses.dart | 6 + test/git_test.dart | 73 ++++++++++ test/pulls_test.dart | 143 -------------------- 4 files changed, 81 insertions(+), 146 deletions(-) delete mode 100644 test/pulls_test.dart diff --git a/lib/src/common/pulls_service.dart b/lib/src/common/pulls_service.dart index bbf45a51..f0ec3dcc 100644 --- a/lib/src/common/pulls_service.dart +++ b/lib/src/common/pulls_service.dart @@ -141,8 +141,7 @@ class PullRequestsService extends Service { return github .request('PUT', '/repos/${slug.fullName}/pulls/$number/merge', - headers: headers, - body: GitHubJson.encode(json)) + headers: headers, body: GitHubJson.encode(json)) .then((response) { return PullRequestMerge.fromJson( jsonDecode(response.body) as Map); @@ -201,4 +200,4 @@ enum MergeMethod { merge, squash, rebase, -} \ No newline at end of file +} diff --git a/test/assets/responses/nocked_responses.dart b/test/assets/responses/nocked_responses.dart index 6feb9465..3a1b9b5b 100644 --- a/test/assets/responses/nocked_responses.dart +++ b/test/assets/responses/nocked_responses.dart @@ -1472,3 +1472,9 @@ var searchResults = '''{ } ] }'''; + +var mergedPR1 = '''{ + "sha": "someSHA", + "merged": true, + "message": "Pull Request successfully merged" +}'''; diff --git a/test/git_test.dart b/test/git_test.dart index 2eaff028..f769571b 100644 --- a/test/git_test.dart +++ b/test/git_test.dart @@ -188,4 +188,77 @@ void main() { expect(results.totalCount, 17); expect(results.items?.length, 17); }); + + group('Merge', () { + test('Merge() normal', () async { + nock(fakeApiUrl) + .put('/repos/o/n/pulls/1/merge', '{"merge_method":"merge"}') + .reply(201, nocked.mergedPR1); + + var pullRequestMerge = await github.pullRequests.merge(repo, 1); + + expect(pullRequestMerge.merged, true); + expect(pullRequestMerge.message, 'Pull Request successfully merged'); + expect(pullRequestMerge.sha, someSha); + }); + + test('Merge() with squash', () async { + nock(fakeApiUrl) + .put('/repos/o/n/pulls/1/merge', '{"merge_method":"squash"}') + .reply(201, nocked.mergedPR1); + + var pullRequestMerge = await github.pullRequests + .merge(repo, 1, mergeMethod: MergeMethod.squash); + + expect(pullRequestMerge.merged, true); + expect(pullRequestMerge.message, 'Pull Request successfully merged'); + expect(pullRequestMerge.sha, someSha); + }); + + test('Merge() with rebase', () async { + nock(fakeApiUrl) + .put('/repos/o/n/pulls/1/merge', '{"merge_method":"rebase"}') + .reply(201, nocked.mergedPR1); + + var pullRequestMerge = await github.pullRequests + .merge(repo, 1, mergeMethod: MergeMethod.rebase); + + expect(pullRequestMerge.merged, true); + expect(pullRequestMerge.message, 'Pull Request successfully merged'); + expect(pullRequestMerge.sha, someSha); + }); + + test('Merge() with commitMessage', () async { + const commitMessage = 'Some message'; + nock(fakeApiUrl) + .put('/repos/o/n/pulls/1/merge', + '{"commit_message":"$commitMessage","merge_method":"squash"}') + .reply(201, nocked.mergedPR1); + + var pullRequestMerge = await github.pullRequests.merge(repo, 1, + message: commitMessage, mergeMethod: MergeMethod.squash); + + expect(pullRequestMerge.merged, true); + expect(pullRequestMerge.message, 'Pull Request successfully merged'); + expect(pullRequestMerge.sha, someSha); + }); + + test('Merge() with commitMessage, with sha', () async { + const commitMessage = 'Some message'; + const commitSha = 'commitSha'; + nock(fakeApiUrl) + .put('/repos/o/n/pulls/1/merge', + '{"commit_message":"$commitMessage","sha":"$commitSha","merge_method":"squash"}') + .reply(201, nocked.mergedPR1); + + var pullRequestMerge = await github.pullRequests.merge(repo, 1, + message: commitMessage, + mergeMethod: MergeMethod.squash, + requestSha: commitSha); + + expect(pullRequestMerge.merged, true); + expect(pullRequestMerge.message, 'Pull Request successfully merged'); + expect(pullRequestMerge.sha, someSha); + }); + }); } diff --git a/test/pulls_test.dart b/test/pulls_test.dart deleted file mode 100644 index ae711b2c..00000000 --- a/test/pulls_test.dart +++ /dev/null @@ -1,143 +0,0 @@ -import 'dart:async'; - -import 'package:github/src/common.dart'; -import 'package:http/http.dart' as http; -import 'package:mockito/mockito.dart'; -import 'package:test/test.dart'; - -import 'src/mocks.mocks.dart'; - -void main() { - late MockGitHub github; - late PullRequestsService pulls; - late RepositorySlug repo; - const someSha = 'someSHA'; - - setUp(() { - github = MockGitHub(); - pulls = PullRequestsService(github); - repo = RepositorySlug('o', 'n'); - }); - - group('Merge', () { - test('Merge() normal', () async { - const expectedMessage = 'Pull Request successfully merged'; - const expectedMerge = true; - - when(github.request(any, any, headers: anyNamed("headers"), body: anyNamed("body"))) - .thenAnswer((_) => Future.value( - http.Response('''{ - "sha": "$someSha", - "merged": $expectedMerge, - "message": "$expectedMessage" - }''', 200) - )); - - var pullRequestMerge = await pulls.merge(repo, 1); - - verify(github.request('PUT', '/repos/o/n/pulls/1/merge', - headers: anyNamed("headers"), body: '''{"merge_method":"merge"}''')); - - expect(pullRequestMerge.merged, isTrue); - expect(pullRequestMerge.message, expectedMessage); - expect(pullRequestMerge.sha, someSha); - }); - - test('Merge() with squash', () async { - const expectedMessage = 'Pull Request successfully merged'; - const expectedMerge = true; - - when(github.request(any, any, headers: anyNamed("headers"), body: anyNamed("body"))) - .thenAnswer((_) => Future.value( - http.Response('''{ - "sha": "$someSha", - "merged": $expectedMerge, - "message": "$expectedMessage" - }''', 200) - )); - - var pullRequestMerge = await pulls.merge(repo, 1, mergeMethod: MergeMethod.squash); - - verify(github.request('PUT', '/repos/o/n/pulls/1/merge', - headers: anyNamed("headers"), body: '''{"merge_method":"squash"}''')); - - expect(pullRequestMerge.merged, isTrue); - expect(pullRequestMerge.message, expectedMessage); - expect(pullRequestMerge.sha, someSha); - }); - - test('Merge() with rebase', () async { - const expectedMessage = 'Pull Request successfully merged'; - const expectedMerge = true; - - when(github.request(any, any, headers: anyNamed("headers"), body: anyNamed("body"))) - .thenAnswer((_) => Future.value( - http.Response('''{ - "sha": "$someSha", - "merged": $expectedMerge, - "message": "$expectedMessage" - }''', 200) - )); - - var pullRequestMerge = await pulls.merge(repo, 1, mergeMethod: MergeMethod.rebase); - - verify(github.request('PUT', '/repos/o/n/pulls/1/merge', - headers: anyNamed("headers"), body: '''{"merge_method":"rebase"}''')); - - expect(pullRequestMerge.merged, isTrue); - expect(pullRequestMerge.message, expectedMessage); - expect(pullRequestMerge.sha, someSha); - }); - - test('Merge() with commitMessage', () async { - const expectedMessage = 'Pull Request successfully merged'; - const expectedMerge = true; - const commitMessage = 'Some message'; - - when(github.request(any, any, headers: anyNamed("headers"), body: anyNamed("body"))) - .thenAnswer((_) => Future.value( - http.Response('''{ - "sha": "$someSha", - "merged": $expectedMerge, - "message": "$expectedMessage" - }''', 200) - )); - - var pullRequestMerge = await pulls.merge(repo, 1, message: commitMessage, mergeMethod: MergeMethod.squash); - - verify(github.request('PUT', '/repos/o/n/pulls/1/merge', - headers: anyNamed("headers"), body: '''{"commit_message":"$commitMessage","merge_method":"squash"}''')); - - expect(pullRequestMerge.merged, isTrue); - expect(pullRequestMerge.message, expectedMessage); - expect(pullRequestMerge.sha, someSha); - }); - - test('Merge() with commitMessage, with sha', () async { - const expectedMessage = 'Pull Request successfully merged'; - const expectedMerge = true; - const commitMessage = 'Some message'; - const commitSha = 'commitSha'; - - when(github.request(any, any, headers: anyNamed("headers"), body: anyNamed("body"))) - .thenAnswer((_) => Future.value( - http.Response('''{ - "sha": "$someSha", - "merged": $expectedMerge, - "message": "$expectedMessage" - }''', 200) - )); - - var pullRequestMerge = await pulls.merge(repo, 1, message: commitMessage, - mergeMethod: MergeMethod.squash, requestSha: commitSha); - - verify(github.request('PUT', '/repos/o/n/pulls/1/merge', - headers: anyNamed("headers"), - body: '''{"commit_message":"$commitMessage","sha":"$commitSha","merge_method":"squash"}''')); - - expect(pullRequestMerge.merged, isTrue); - expect(pullRequestMerge.message, expectedMessage); - expect(pullRequestMerge.sha, someSha); - }); - }); -} \ No newline at end of file From 8423ee6036ec68165c3196e6d609e559a0288f2c Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Mon, 31 Oct 2022 17:51:24 -0600 Subject: [PATCH 321/390] require Dart 2.17 --- .github/workflows/tests.yml | 2 +- CHANGELOG.md | 2 +- pubspec.yaml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 6e1cb6e5..225f514f 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -10,7 +10,7 @@ jobs: strategy: matrix: os: [ubuntu-latest] - sdk: [2.14.4, 2.17.7, stable] # Test with at least the declared minimum Dart version + sdk: [2.17.7, stable] # Test with at least the declared minimum Dart version steps: - uses: actions/checkout@v2 - uses: dart-lang/setup-dart@v1.3 diff --git a/CHANGELOG.md b/CHANGELOG.md index fcbf764c..fd49b5ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,8 @@ ## 9.5.1 +* Require Dart 2.17 * Fix up unit tests & run them in CI by @robrbecker in https://github.com/SpinlockLabs/github.dart/pull/336 - **Full Changelog**: https://github.com/SpinlockLabs/github.dart/compare/9.5.0...9.5.1 ## 9.5.0 diff --git a/pubspec.yaml b/pubspec.yaml index d7d20f57..1ba3138f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart environment: - sdk: '>=2.14.0 <3.0.0' + sdk: '>=2.17.0 <3.0.0' dependencies: http: ^0.13.0 From 9287a0ecf16522209d2aa8bfc70ab9be1e8edd92 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Mon, 31 Oct 2022 17:59:37 -0600 Subject: [PATCH 322/390] use latest dart in github actions workflows --- .github/workflows/dart.yml | 2 +- .github/workflows/publish_demos.yml | 2 +- .github/workflows/publish_release.yml | 2 +- .github/workflows/release_unreleased_prs.yml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/dart.yml b/.github/workflows/dart.yml index 119546e2..bb1838d7 100644 --- a/.github/workflows/dart.yml +++ b/.github/workflows/dart.yml @@ -6,7 +6,7 @@ jobs: build: runs-on: ubuntu-latest container: - image: dart:2.17 + image: dart steps: - uses: actions/checkout@v1 - name: Install dependencies diff --git a/.github/workflows/publish_demos.yml b/.github/workflows/publish_demos.yml index 33f242d2..25a2bb12 100644 --- a/.github/workflows/publish_demos.yml +++ b/.github/workflows/publish_demos.yml @@ -7,7 +7,7 @@ jobs: build-and-deploy: runs-on: ubuntu-latest container: - image: google/dart:latest + image: dart steps: - name: Checkout 🛎️ uses: actions/checkout@v2.3.1 diff --git a/.github/workflows/publish_release.yml b/.github/workflows/publish_release.yml index 320032df..0287d22a 100644 --- a/.github/workflows/publish_release.yml +++ b/.github/workflows/publish_release.yml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest container: - image: dart:2.17 + image: dart steps: - name: Checkout uses: actions/checkout@v1 diff --git a/.github/workflows/release_unreleased_prs.yml b/.github/workflows/release_unreleased_prs.yml index a087b032..9b33737d 100644 --- a/.github/workflows/release_unreleased_prs.yml +++ b/.github/workflows/release_unreleased_prs.yml @@ -12,7 +12,7 @@ jobs: release: if: github.event.pull_request.merged == true || github.event_name == 'workflow_dispatch' runs-on: ubuntu-latest - container: dart:2.17.7 + container: dart permissions: contents: write From d6347b2b7715f7039369f6af199b9489a0574019 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Tue, 1 Nov 2022 08:12:13 -0600 Subject: [PATCH 323/390] prep 9.6.0 --- CHANGELOG.md | 7 +++++++ pubspec.yaml | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fd49b5ee..1e7a870d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## 9.6.0 + +* Update to allow different merge methods in pulls_service by @ricardoamador in https://github.com/SpinlockLabs/github.dart/pull/333 + + +**Full Changelog**: https://github.com/SpinlockLabs/github.dart/compare/9.5.1...9.6.0 + ## 9.5.1 * Require Dart 2.17 diff --git a/pubspec.yaml b/pubspec.yaml index 1ba3138f..76b54847 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 9.5.1 +version: 9.6.0 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From 11544fcf69c4268d6faa6b36745ec96957b89a75 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Tue, 1 Nov 2022 08:16:55 -0600 Subject: [PATCH 324/390] update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e7a870d..f77d669a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ ## 9.6.0 +* Require Dart 2.17 * Update to allow different merge methods in pulls_service by @ricardoamador in https://github.com/SpinlockLabs/github.dart/pull/333 @@ -7,7 +8,6 @@ ## 9.5.1 -* Require Dart 2.17 * Fix up unit tests & run them in CI by @robrbecker in https://github.com/SpinlockLabs/github.dart/pull/336 **Full Changelog**: https://github.com/SpinlockLabs/github.dart/compare/9.5.0...9.5.1 From e9230e6a1314f727d4030b1aa9090c2e0b8659ad Mon Sep 17 00:00:00 2001 From: Casey Hillers Date: Tue, 29 Nov 2022 18:50:21 -0800 Subject: [PATCH 325/390] Add calendar versioning (#338) Add calendar version --- lib/src/common/github.dart | 14 ++++++++++++++ test/common/github_test.dart | 26 ++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 test/common/github_test.dart diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index e715c2a9..77864725 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -21,6 +21,7 @@ class GitHub { GitHub({ Authentication? auth, this.endpoint = 'https://api.github.com', + this.version = '2022-11-28', http.Client? client, }) : auth = auth ?? Authentication.anonymous(), client = client ?? http.Client(); @@ -29,12 +30,24 @@ class GitHub { static const _ratelimitResetHeader = 'x-ratelimit-reset'; static const _ratelimitRemainingHeader = 'x-ratelimit-remaining'; + @visibleForTesting + static const versionHeader = 'X-GitHub-Api-Version'; + /// Authentication Information Authentication? auth; /// API Endpoint final String endpoint; + /// Calendar version of the GitHub API to use. + /// + /// Changing this value is unsupported. However, it may unblock you if there's + /// hotfix versions. + /// + /// See also: + /// * https://docs.github.com/en/rest/overview/api-versions?apiVersion=2022-11-28 + final String version; + /// HTTP Client final http.Client client; @@ -306,6 +319,7 @@ class GitHub { } headers.putIfAbsent('Accept', () => v3ApiMimeType); + headers.putIfAbsent(versionHeader, () => version); final response = await request( method, diff --git a/test/common/github_test.dart b/test/common/github_test.dart new file mode 100644 index 00000000..45c3b68f --- /dev/null +++ b/test/common/github_test.dart @@ -0,0 +1,26 @@ +import 'dart:io'; + +import 'package:github/src/common/github.dart'; +import 'package:http/http.dart'; +import 'package:http/testing.dart'; +import 'package:test/test.dart'; + +void main() { + group(GitHub, () { + test('passes calendar version header', () async { + Request? request; + final client = MockClient((r) async { + request = r; + return Response('{}', HttpStatus.ok); + }); + + final github = GitHub(client: client); + await github.getJSON(''); // Make HTTP request + + expect(request, isNotNull); + expect(request!.headers.containsKey(GitHub.versionHeader), isTrue); + final version = request!.headers[GitHub.versionHeader]; + expect(version, github.version); + }); + }); +} From a983dd2ef7c80524e0e96721b52bc4ef4fbbeeeb Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Wed, 30 Nov 2022 11:23:43 -0700 Subject: [PATCH 326/390] prep 9.7.0 --- CHANGELOG.md | 4 ++++ pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f77d669a..2ec0527e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 9.7.0 +* Add calendar versioning by @CaseyHillers in https://github.com/SpinlockLabs/github.dart/pull/338 + +**Full Changelog**: https://github.com/SpinlockLabs/github.dart/compare/9.6.0...9.7.0 ## 9.6.0 * Require Dart 2.17 diff --git a/pubspec.yaml b/pubspec.yaml index 76b54847..f45153a6 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 9.6.0 +version: 9.7.0 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From 067d7d3b3b359eecf32343443c1c715546714c67 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Wed, 30 Nov 2022 11:33:51 -0700 Subject: [PATCH 327/390] fail if a git command fails --- tool/release_unreleased_prs.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tool/release_unreleased_prs.dart b/tool/release_unreleased_prs.dart index aca8dae1..2eb1d273 100644 --- a/tool/release_unreleased_prs.dart +++ b/tool/release_unreleased_prs.dart @@ -77,9 +77,9 @@ String run(String cmd, {List? rest}) { if (result.stderr != null) { print(result.stderr); } - // if (result.exitCode != 0) { - // exit(6); - // } + if (result.exitCode != 0) { + exit(6); + } return result.stdout; } From 4f6553791f3daa6ab217c14505525f567007bb18 Mon Sep 17 00:00:00 2001 From: Nehal Patel Date: Thu, 26 Jan 2023 12:35:01 -0800 Subject: [PATCH 328/390] Add "head_branch" field to CheckSuite object (#347) * Add "head_branch" field to CheckSuite object * Add CheckSuite test * Add forked repository test to validate behavior when "head_branch" is null * Update CHANGELOG and pubspec --- CHANGELOG.md | 9 +++ lib/src/common/model/checks.dart | 3 + pubspec.yaml | 2 +- test/unit/checksuite_test.dart | 121 +++++++++++++++++++++++++++++++ 4 files changed, 134 insertions(+), 1 deletion(-) create mode 100644 test/unit/checksuite_test.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ec0527e..f48c4621 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +## 9.8.0 + +* Add "head_branch" field to CheckSuite object by @nehalvpatel in https://github.com/SpinlockLabs/github.dart/pull/347 + +## New Contributors +* @nehalvpatel made their first contribution in https://github.com/SpinlockLabs/github.dart/pull/347 + +**Full Changelog**: https://github.com/SpinlockLabs/github.dart/compare/9.7.0...9.8.0 + ## 9.7.0 * Add calendar versioning by @CaseyHillers in https://github.com/SpinlockLabs/github.dart/pull/338 diff --git a/lib/src/common/model/checks.dart b/lib/src/common/model/checks.dart index 43b49769..9d7d6e21 100644 --- a/lib/src/common/model/checks.dart +++ b/lib/src/common/model/checks.dart @@ -362,12 +362,14 @@ class CheckRunAction { @immutable class CheckSuite { final int? id; + final String? headBranch; final String? headSha; final CheckRunConclusion conclusion; final List pullRequests; const CheckSuite({ required this.conclusion, + required this.headBranch, required this.headSha, required this.id, required this.pullRequests, @@ -381,6 +383,7 @@ class CheckSuite { .toList(); return CheckSuite( conclusion: CheckRunConclusion._fromValue(input['conclusion']), + headBranch: input['head_branch'], headSha: input['head_sha'], id: input['id'], pullRequests: pullRequests, diff --git a/pubspec.yaml b/pubspec.yaml index f45153a6..81066cc1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 9.7.0 +version: 9.8.0 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart diff --git a/test/unit/checksuite_test.dart b/test/unit/checksuite_test.dart new file mode 100644 index 00000000..d9571bc9 --- /dev/null +++ b/test/unit/checksuite_test.dart @@ -0,0 +1,121 @@ +import 'dart:convert'; + +import 'package:github/src/common/model/checks.dart'; +import 'package:test/test.dart'; + +/// The checkSuite Json is composed from multiple GitHub examples +/// +/// See https://docs.github.com/en/rest/checks/runs?apiVersion=2022-11-28 +/// See https://docs.github.com/en/rest/checks/suites?apiVersion=2022-11-28 +const checkSuiteJson = '''{ + "id": 5, + "head_branch": "main", + "head_sha": "d6fde92930d4715a2b49857d24b940956b26d2d3", + "conclusion": "neutral", + "pull_requests": [ + { + "url": "https://api.github.com/repos/github/hello-world/pulls/1", + "id": 1934, + "number": 3956, + "head": { + "ref": "say-hello", + "sha": "3dca65fa3e8d4b3da3f3d056c59aee1c50f41390", + "repo": { + "id": 526, + "url": "https://api.github.com/repos/github/hello-world", + "name": "hello-world" + } + }, + "base": { + "ref": "master", + "sha": "e7fdf7640066d71ad16a86fbcbb9c6a10a18af4f", + "repo": { + "id": 526, + "url": "https://api.github.com/repos/github/hello-world", + "name": "hello-world" + } + } + } + ] +}'''; + +const String expectedToString = + '{"name":"mighty_readme","id":4,"external_id":"","status":"completed","head_sha":"","check_suite":{"id":5},"details_url":"https://example.com","started_at":"2018-05-04T01:14:52.000Z","conclusion":"neutral"}'; + +void main() { + group('Check suite', () { + test('CheckSuite fromJson', () { + final checkSuite = CheckSuite.fromJson(jsonDecode(checkSuiteJson)); + + expect(checkSuite.id, 5); + expect(checkSuite.headBranch, 'main'); + expect(checkSuite.headSha, 'd6fde92930d4715a2b49857d24b940956b26d2d3'); + expect(checkSuite.conclusion, CheckRunConclusion.neutral); + expect(checkSuite.pullRequests.isNotEmpty, true); + }); + + test('CheckSuite fromJson for skipped conclusion', () { + /// The checkSuite Json is composed from multiple GitHub examples + /// + /// See https://docs.github.com/en/rest/checks/runs?apiVersion=2022-11-28 + /// See https://docs.github.com/en/rest/checks/suites?apiVersion=2022-11-28 + const checkSuiteJson = '''{ + "id": 10, + "head_branch": "master", + "head_sha": "ce587453ced02b1526dfb4cb910479d431683101", + "conclusion": "skipped", + "pull_requests": [ + { + "url": "https://api.github.com/repos/github/hello-world/pulls/1", + "id": 1934, + "number": 3956, + "head": { + "ref": "say-hello", + "sha": "3dca65fa3e8d4b3da3f3d056c59aee1c50f41390", + "repo": { + "id": 526, + "url": "https://api.github.com/repos/github/hello-world", + "name": "hello-world" + } + }, + "base": { + "ref": "master", + "sha": "e7fdf7640066d71ad16a86fbcbb9c6a10a18af4f", + "repo": { + "id": 526, + "url": "https://api.github.com/repos/github/hello-world", + "name": "hello-world" + } + } + } + ] + }'''; + final checkSuite = CheckSuite.fromJson(jsonDecode(checkSuiteJson)); + + expect(checkSuite.id, 10); + expect(checkSuite.headBranch, 'master'); + expect(checkSuite.headSha, 'ce587453ced02b1526dfb4cb910479d431683101'); + expect(checkSuite.conclusion, CheckRunConclusion.skipped); + expect(checkSuite.pullRequests.isNotEmpty, true); + }); + + test('CheckSuite fromJson for forked repository', () { + /// The checkSuite Json is composed from multiple GitHub examples + /// + /// See https://docs.github.com/en/rest/checks/runs?apiVersion=2022-11-28 + /// See https://docs.github.com/en/rest/checks/suites?apiVersion=2022-11-28 + const checkSuiteJson = '''{ + "id": 10, + "head_branch": null, + "head_sha": "ce587453ced02b1526dfb4cb910479d431683101", + "conclusion": "skipped", + "pull_requests": [] + }'''; + final checkSuite = CheckSuite.fromJson(jsonDecode(checkSuiteJson)); + + expect(checkSuite.id, 10); + expect(checkSuite.headBranch, null); + expect(checkSuite.pullRequests.isEmpty, true); + }); + }); +} From 4f5e7559e7fcef4b41efb70039103096343399ad Mon Sep 17 00:00:00 2001 From: Ricardo Amador <32242716+ricardoamador@users.noreply.github.com> Date: Thu, 2 Feb 2023 10:21:56 -0800 Subject: [PATCH 329/390] Add author_association to the IssueComment object for access. (#348) * Add author_association to the IssueComment object for access. * Update changelog.md * Add new line before EOF --------- Co-authored-by: Casey Hillers --- CHANGELOG.md | 6 +++ lib/src/common/model/issues.dart | 2 + lib/src/common/model/issues.g.dart | 2 + test/unit/issues_test.dart | 63 ++++++++++++++++++++++++++++++ 4 files changed, 73 insertions(+) create mode 100644 test/unit/issues_test.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index f48c4621..9fd43ae6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## 9.9.0 + +* Add "author_association" field to the IssueComment object by @ricardoamador in https://github.com/SpinlockLabs/github.dart/pull/348 + +**Full Changelog**: https://github.com/SpinlockLabs/github.dart/compare/9.8.0...9.9.0 + ## 9.8.0 * Add "head_branch" field to CheckSuite object by @nehalvpatel in https://github.com/SpinlockLabs/github.dart/pull/347 diff --git a/lib/src/common/model/issues.dart b/lib/src/common/model/issues.dart index 4a86f62b..4534892e 100644 --- a/lib/src/common/model/issues.dart +++ b/lib/src/common/model/issues.dart @@ -149,6 +149,7 @@ class IssueComment { this.url, this.htmlUrl, this.issueUrl, + this.authorAssociation, }); int? id; String? body; @@ -158,6 +159,7 @@ class IssueComment { String? url; String? htmlUrl; String? issueUrl; + String? authorAssociation; factory IssueComment.fromJson(Map input) => _$IssueCommentFromJson(input); diff --git a/lib/src/common/model/issues.g.dart b/lib/src/common/model/issues.g.dart index 0b6b8a3f..12e03103 100644 --- a/lib/src/common/model/issues.g.dart +++ b/lib/src/common/model/issues.g.dart @@ -123,6 +123,7 @@ IssueComment _$IssueCommentFromJson(Map json) => IssueComment( url: json['url'] as String?, htmlUrl: json['html_url'] as String?, issueUrl: json['issue_url'] as String?, + authorAssociation: json['author_association'] as String?, ); Map _$IssueCommentToJson(IssueComment instance) => @@ -135,6 +136,7 @@ Map _$IssueCommentToJson(IssueComment instance) => 'url': instance.url, 'html_url': instance.htmlUrl, 'issue_url': instance.issueUrl, + 'author_association': instance.authorAssociation, }; IssueLabel _$IssueLabelFromJson(Map json) => IssueLabel( diff --git a/test/unit/issues_test.dart b/test/unit/issues_test.dart new file mode 100644 index 00000000..88b06086 --- /dev/null +++ b/test/unit/issues_test.dart @@ -0,0 +1,63 @@ +import 'dart:convert'; +import 'package:github/src/common/model/issues.dart'; + +import 'package:test/test.dart'; + + +const String testIssueCommentJson = ''' + { + "url": "https://api.github.com/repos/flutter/cocoon/issues/comments/1352355796", + "html_url": "https://github.com/flutter/cocoon/pull/2356#issuecomment-1352355796", + "issue_url": "https://api.github.com/repos/flutter/cocoon/issues/2356", + "id": 1352355796, + "node_id": "IC_kwDOA8VHis5Qm0_U", + "user": { + "login": "CaseyHillers", + "id": 2148558, + "node_id": "MDQ6VXNlcjIxNDg1NTg=", + "avatar_url": "https://avatars.githubusercontent.com/u/2148558?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/CaseyHillers", + "html_url": "https://github.com/CaseyHillers", + "followers_url": "https://api.github.com/users/CaseyHillers/followers", + "following_url": "https://api.github.com/users/CaseyHillers/following{/other_user}", + "gists_url": "https://api.github.com/users/CaseyHillers/gists{/gist_id}", + "starred_url": "https://api.github.com/users/CaseyHillers/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/CaseyHillers/subscriptions", + "organizations_url": "https://api.github.com/users/CaseyHillers/orgs", + "repos_url": "https://api.github.com/users/CaseyHillers/repos", + "events_url": "https://api.github.com/users/CaseyHillers/events{/privacy}", + "received_events_url": "https://api.github.com/users/CaseyHillers/received_events", + "type": "User", + "site_admin": false + }, + "created_at": "2022-12-14T23:26:32Z", + "updated_at": "2022-12-14T23:26:32Z", + "author_association": "MEMBER", + "body": "FYI you need to run https://github.com/flutter/cocoon/blob/main/format.sh for formatting Cocoon code", + "reactions": { + "url": "https://api.github.com/repos/flutter/cocoon/issues/comments/1352355796/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "performed_via_github_app": null + } +'''; + +void main() { + group('Issue Comments', () { + test('IssueComment from Json', () { + final issueComment = IssueComment.fromJson(jsonDecode(testIssueCommentJson)); + expect(1352355796, issueComment.id); + expect('MEMBER', issueComment.authorAssociation); + expect('CaseyHillers', issueComment.user!.login); + }); + }); +} From ed73adf7b4663d19bf2031b9411db2cc09f11b0e Mon Sep 17 00:00:00 2001 From: Ricardo Amador <32242716+ricardoamador@users.noreply.github.com> Date: Thu, 2 Feb 2023 11:38:55 -0800 Subject: [PATCH 330/390] Update package version (#350) --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 81066cc1..bdc75ce3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 9.8.0 +version: 9.9.0 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From 5e64d599b8baee4eec4973af50acf44c9d825dc8 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Thu, 2 Feb 2023 23:55:32 -0800 Subject: [PATCH 331/390] Expose CheckSuitesService and ChuckRunsService classes (#351) Require Dart 2.18 Also a bunch of other cleanup, enabled latest lints removed duplicate lints sorted lints etc --- .github/workflows/tests.yml | 2 +- CHANGELOG.md | 5 + analysis_options.yaml | 342 +------------------- example/release_notes.dart | 13 +- example/stars.dart | 2 +- lib/src/common/activity_service.dart | 64 ++-- lib/src/common/authorizations_service.dart | 6 +- lib/src/common/checks_service.dart | 37 +-- lib/src/common/gists_service.dart | 24 +- lib/src/common/git_service.dart | 28 +- lib/src/common/github.dart | 7 +- lib/src/common/issues_service.dart | 55 ++-- lib/src/common/misc_service.dart | 5 +- lib/src/common/model/users.dart | 2 +- lib/src/common/orgs_service.dart | 34 +- lib/src/common/pulls_service.dart | 27 +- lib/src/common/repos_service.dart | 108 ++++--- lib/src/common/search_service.dart | 29 +- lib/src/common/users_service.dart | 37 +-- lib/src/common/util/oauth2.dart | 6 +- pubspec.yaml | 10 +- test/assets/responses/nocked_responses.dart | 22 +- test/common/github_test.dart | 2 +- test/experiment/error_handling.dart | 4 - test/git_test.dart | 1 - test/scenarios_test.dart | 2 + test/unit/issues_test.dart | 4 +- tool/release_unreleased_prs.dart | 2 +- 28 files changed, 258 insertions(+), 622 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 225f514f..b5a0c40d 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -10,7 +10,7 @@ jobs: strategy: matrix: os: [ubuntu-latest] - sdk: [2.17.7, stable] # Test with at least the declared minimum Dart version + sdk: [2.18.7, stable] # Test with at least the declared minimum Dart version steps: - uses: actions/checkout@v2 - uses: dart-lang/setup-dart@v1.3 diff --git a/CHANGELOG.md b/CHANGELOG.md index 9fd43ae6..eae3873b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## 9.10.0-dev + +* Require Dart 2.18 +* Expose `CheckSuitesService` and `ChuckRunsService` classes. + ## 9.9.0 * Add "author_association" field to the IssueComment object by @ricardoamador in https://github.com/SpinlockLabs/github.dart/pull/348 diff --git a/analysis_options.yaml b/analysis_options.yaml index 1b107aa5..f7a9ff49 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1,397 +1,61 @@ include: package:lints/recommended.yaml analyzer: - strong-mode: - implicit-casts: true - implicit-dynamic: true + language: + #strict-casts: true linter: rules: - - # Separate the control structure expression from its statement. - # http://dart-lang.github.io/linter/lints/always_put_control_body_on_new_line.html - always_put_control_body_on_new_line - - # Put @required named parameters first. - # http://dart-lang.github.io/linter/lints/always_put_required_named_parameters_first.html - always_put_required_named_parameters_first - - # Avoid bool literals in conditional expressions. - # http://dart-lang.github.io/linter/lints/avoid_bool_literals_in_conditional_expressions.html - # - avoid_bool_literals_in_conditional_expressions - - # Don't explicitly catch Error or types that implement it. - # http://dart-lang.github.io/linter/lints/avoid_catching_errors.html - avoid_catching_errors - - # Avoid defining a class that contains only static members. - # http://dart-lang.github.io/linter/lints/avoid_classes_with_only_static_members.html - avoid_classes_with_only_static_members - - # Avoid double and int checks. - # http://dart-lang.github.io/linter/lints/avoid_double_and_int_checks.html - avoid_double_and_int_checks - - # Avoid field initializers in const classes. - # http://dart-lang.github.io/linter/lints/avoid_field_initializers_in_const_classes.html - avoid_field_initializers_in_const_classes - - # Avoid using `forEach` with a function literal. - # http://dart-lang.github.io/linter/lints/avoid_function_literals_in_foreach_calls.html - # reason: Use for (x in y) or forEach(someFunc) instead - # - avoid_function_literals_in_foreach_calls - - # Don't implement classes that override `==`. - # http://dart-lang.github.io/linter/lints/avoid_implementing_value_types.html - avoid_implementing_value_types - - # Avoid JavaScript rounded ints. - # http://dart-lang.github.io/linter/lints/avoid_js_rounded_ints.html - avoid_js_rounded_ints - - # Avoid positional boolean parameters. - # http://dart-lang.github.io/linter/lints/avoid_positional_boolean_parameters.html - # - avoid_positional_boolean_parameters - - # Avoid `print` calls in production code. - # http://dart-lang.github.io/linter/lints/avoid_print.html - # - avoid_print - - # Avoid private typedef functions. - # http://dart-lang.github.io/linter/lints/avoid_private_typedef_functions.html - avoid_private_typedef_functions - - # Don't rename parameters of overridden methods. - # http://dart-lang.github.io/linter/lints/avoid_renaming_method_parameters.html - # - avoid_renaming_method_parameters - - # Avoid returning null from members whose return type is bool, double, int, or num. - # http://dart-lang.github.io/linter/lints/avoid_returning_null.html - avoid_returning_null - - # Avoid returning null for Future. - # http://dart-lang.github.io/linter/lints/avoid_returning_null_for_future.html - avoid_returning_null_for_future - - # Avoid returning null for void. - # http://dart-lang.github.io/linter/lints/avoid_returning_null_for_void.html - - avoid_returning_null_for_void - - # Avoid returning this from methods just to enable a fluent interface. - # http://dart-lang.github.io/linter/lints/avoid_returning_this.html - avoid_returning_this - - # Avoid setters without getters. - # http://dart-lang.github.io/linter/lints/avoid_setters_without_getters.html - avoid_setters_without_getters - - # Avoid single cascade in expression statements. - # http://dart-lang.github.io/linter/lints/avoid_single_cascade_in_expression_statements.html - - avoid_single_cascade_in_expression_statements - - # Avoid slow async `dart:io` methods. - # http://dart-lang.github.io/linter/lints/avoid_slow_async_io.html - avoid_slow_async_io - - # Avoid defining unused parameters in constructors. - # http://dart-lang.github.io/linter/lints/avoid_unused_constructor_parameters.html - avoid_unused_constructor_parameters - - # Avoid async functions that return void. - # http://dart-lang.github.io/linter/lints/avoid_void_async.html - avoid_void_async - - # Await only futures. - # http://dart-lang.github.io/linter/lints/await_only_futures.html - - await_only_futures - - # Name types using UpperCamelCase. - # http://dart-lang.github.io/linter/lints/camel_case_types.html - - camel_case_types - - # Cancel instances of dart.async.StreamSubscription. - # http://dart-lang.github.io/linter/lints/cancel_subscriptions.html - cancel_subscriptions - - # Cascade consecutive method invocations on the same reference. - # http://dart-lang.github.io/linter/lints/cascade_invocations.html - # - cascade_invocations - - # Close instances of `dart.core.Sink`. - # http://dart-lang.github.io/linter/lints/close_sinks.html - close_sinks - - # Only reference in scope identifiers in doc comments. - # http://dart-lang.github.io/linter/lints/comment_references.html - comment_references - - # Avoid control flow in finally blocks. - # http://dart-lang.github.io/linter/lints/control_flow_in_finally.html - - control_flow_in_finally - - # DO reference all public properties in debug methods. - # http://dart-lang.github.io/linter/lints/diagnostic_describe_all_properties.html - diagnostic_describe_all_properties - - # Adhere to Effective Dart Guide directives sorting conventions. - # http://dart-lang.github.io/linter/lints/directives_ordering.html - directives_ordering - - # Avoid empty statements. - # http://dart-lang.github.io/linter/lints/empty_statements.html - - empty_statements - - # Name source files using `lowercase_with_underscores`. - # http://dart-lang.github.io/linter/lints/file_names.html - - file_names - - # Use Flutter TODO format: // TODO(username): message, https://URL-to-issue. - # http://dart-lang.github.io/linter/lints/flutter_style_todos.html - # - flutter_style_todos - - # Always override `hashCode` if overriding `==`. - # http://dart-lang.github.io/linter/lints/hash_and_equals.html - - hash_and_equals - - # Don't import implementation files from another package. - # http://dart-lang.github.io/linter/lints/implementation_imports.html - - implementation_imports - - # Conditions should not unconditionally evaluate to `true` or to `false`. - # http://dart-lang.github.io/linter/lints/invariant_booleans.html - # reason: There are several outstanding bugs with this lint that cause a good deal of noise - - invariant_booleans - - # Invocation of Iterable.contains with references of unrelated types. - # http://dart-lang.github.io/linter/lints/iterable_contains_unrelated_type.html - - iterable_contains_unrelated_type - - # Join return statement with assignment when possible. - # http://dart-lang.github.io/linter/lints/join_return_with_assignment.html - join_return_with_assignment - - - # AVOID lines longer than 80 characters. - # http://dart-lang.github.io/linter/lints/lines_longer_than_80_chars.html - # - lines_longer_than_80_chars - - # Invocation of `remove` with references of unrelated types. - # http://dart-lang.github.io/linter/lints/list_remove_unrelated_type.html - - list_remove_unrelated_type - - # Boolean expression composed only with literals. - # http://dart-lang.github.io/linter/lints/literal_only_boolean_expressions.html - literal_only_boolean_expressions - - # Don't use adjacent strings in list. - # http://dart-lang.github.io/linter/lints/no_adjacent_strings_in_list.html - no_adjacent_strings_in_list - - - # Name non-constant identifiers using lowerCamelCase. - # http://dart-lang.github.io/linter/lints/non_constant_identifier_names.html - - non_constant_identifier_names - - # Avoid defining a one-member abstract class when a simple function will do. - # http://dart-lang.github.io/linter/lints/one_member_abstracts.html + - omit_local_variable_types - one_member_abstracts - - # Only throw instances of classes extending either Exception or Error. - # http://dart-lang.github.io/linter/lints/only_throw_errors.html - only_throw_errors - - # Don't override fields. - # http://dart-lang.github.io/linter/lints/overridden_fields.html - - overridden_fields - - # Provide doc comments for all public APIs. - # http://dart-lang.github.io/linter/lints/package_api_docs.html - package_api_docs - - # Use `lowercase_with_underscores` for package names. - # http://dart-lang.github.io/linter/lints/package_names.html - - package_names - - # Prefix library names with the package name and a dot-separated path. - # http://dart-lang.github.io/linter/lints/package_prefixed_library_names.html - - package_prefixed_library_names - - # Don't reassign references to parameters of functions or methods. - # http://dart-lang.github.io/linter/lints/parameter_assignments.html - # - parameter_assignments - - # Prefer putting asserts in initializer list. - # http://dart-lang.github.io/linter/lints/prefer_asserts_in_initializer_lists.html - prefer_asserts_in_initializer_lists - - # Prefer asserts with message. - # http://dart-lang.github.io/linter/lints/prefer_asserts_with_message.html - # - prefer_asserts_with_message - - # Prefer using a boolean as the assert condition. - # http://dart-lang.github.io/linter/lints/prefer_bool_in_asserts.html - # reason: This lint rule has been deprecated - # - prefer_bool_in_asserts - - # Prefer using `??=` over testing for null. - # http://dart-lang.github.io/linter/lints/prefer_conditional_assignment.html - # - prefer_conditional_assignment - - # Prefer const with constant constructors. - # http://dart-lang.github.io/linter/lints/prefer_const_constructors.html - prefer_const_constructors - - # Prefer declare const constructors on `@immutable` classes. - # http://dart-lang.github.io/linter/lints/prefer_const_constructors_in_immutables.html - prefer_const_constructors_in_immutables - - # Prefer const over final for declarations. - # http://dart-lang.github.io/linter/lints/prefer_const_declarations.html - prefer_const_declarations - - # Prefer const literals as parameters of constructors on @immutable classes. - # http://dart-lang.github.io/linter/lints/prefer_const_literals_to_create_immutables.html - prefer_const_literals_to_create_immutables - - # Prefer defining constructors instead of static methods to create instances. - # http://dart-lang.github.io/linter/lints/prefer_constructors_over_static_methods.html - prefer_constructors_over_static_methods - - # Prefer final in for-each loop variable if reference is not reassigned. - # http://dart-lang.github.io/linter/lints/prefer_final_in_for_each.html - prefer_final_in_for_each - - # Use `forEach` to only apply a function to all the elements. - # http://dart-lang.github.io/linter/lints/prefer_foreach.html - prefer_foreach - - # Use a function declaration to bind a function to a name. - # http://dart-lang.github.io/linter/lints/prefer_function_declarations_over_variables.html - - prefer_function_declarations_over_variables - - # Prefer if elements to conditional expressions where possible. - # http://dart-lang.github.io/linter/lints/prefer_if_elements_to_conditional_expressions.html - prefer_if_elements_to_conditional_expressions - - # Use initializing formals when possible. - # http://dart-lang.github.io/linter/lints/prefer_initializing_formals.html - - prefer_initializing_formals - - # Inline list item declarations where possible. - # http://dart-lang.github.io/linter/lints/prefer_inlined_adds.html - - prefer_inlined_adds - - # Prefer int literals over double literals. - # http://dart-lang.github.io/linter/lints/prefer_int_literals.html - prefer_int_literals - - # Prefer using mixins. - # http://dart-lang.github.io/linter/lints/prefer_mixin.html - prefer_mixin - - # Prefer typing uninitialized variables and fields. - # http://dart-lang.github.io/linter/lints/prefer_typing_uninitialized_variables.html - - prefer_typing_uninitialized_variables - - # Don't use the Null type, unless you are positive that you don't want void. - # http://dart-lang.github.io/linter/lints/prefer_void_to_null.html - - prefer_void_to_null - - # Provide a deprecation message, via @Deprecated("message"). - # http://dart-lang.github.io/linter/lints/provide_deprecation_message.html - - provide_deprecation_message - - # Document all public members. - # http://dart-lang.github.io/linter/lints/public_member_api_docs.html - # reason: Can get annoying for React component lifecycle methods, constructors. - # - public_member_api_docs - - # Sort child properties last in widget instance creations. - # http://dart-lang.github.io/linter/lints/sort_child_properties_last.html - sort_child_properties_last - - # Sort constructor declarations before other members. - # http://dart-lang.github.io/linter/lints/sort_constructors_first.html - # - sort_constructors_first - - # Sort pub dependencies. - # http://dart-lang.github.io/linter/lints/sort_pub_dependencies.html - sort_pub_dependencies - - # Sort unnamed constructor declarations first. - # http://dart-lang.github.io/linter/lints/sort_unnamed_constructors_first.html - sort_unnamed_constructors_first - - # Test type arguments in operator ==(Object other). - # http://dart-lang.github.io/linter/lints/test_types_in_equals.html - test_types_in_equals - - # Avoid `throw` in finally block. - # http://dart-lang.github.io/linter/lints/throw_in_finally.html - throw_in_finally - - # Type annotate public APIs. - # http://dart-lang.github.io/linter/lints/type_annotate_public_apis.html - # reason: React component render() method can return either ReactElement or false. Use overrides. - type_annotate_public_apis - - # Unnecessary await keyword in return. - # http://dart-lang.github.io/linter/lints/unnecessary_await_in_return.html - unnecessary_await_in_return - - # Avoid using braces in interpolation when not needed. - # http://dart-lang.github.io/linter/lints/unnecessary_brace_in_string_interps.html - - unnecessary_brace_in_string_interps - - # Avoid wrapping fields in getters and setters just to be "safe". - # http://dart-lang.github.io/linter/lints/unnecessary_getters_setters.html - - unnecessary_getters_setters - - # Don't create a lambda when a tear-off will do. - # http://dart-lang.github.io/linter/lints/unnecessary_lambdas.html - unnecessary_lambdas - - # Avoid null in null-aware assignment. - # http://dart-lang.github.io/linter/lints/unnecessary_null_aware_assignments.html - - unnecessary_null_aware_assignments - - # Don't override a method to do a super method invocation with the same parameters. - # http://dart-lang.github.io/linter/lints/unnecessary_overrides.html - - unnecessary_overrides - - # Unnecessary parenthesis can be removed. - # http://dart-lang.github.io/linter/lints/unnecessary_parenthesis.html - unnecessary_parenthesis - - # Avoid using unnecessary statements. - # http://dart-lang.github.io/linter/lints/unnecessary_statements.html - unnecessary_statements - - # Avoid unsafe HTML APIs. - # http://dart-lang.github.io/linter/lints/unsafe_html.html - # - unsafe_html - - # Prefer an 8-digit hexadecimal integer(0xFFFFFFFF) to instantiate Color. - # http://dart-lang.github.io/linter/lints/use_full_hex_values_for_flutter_colors.html - use_full_hex_values_for_flutter_colors - - # Use a setter for operations that conceptually change a property. - # http://dart-lang.github.io/linter/lints/use_setters_to_change_properties.html - use_setters_to_change_properties - - # Use string buffers to compose strings. - # http://dart-lang.github.io/linter/lints/use_string_buffers.html - use_string_buffers - - # Start the name of the method with to/_to or as/_as if applicable. - # http://dart-lang.github.io/linter/lints/use_to_and_as_if_applicable.html - use_to_and_as_if_applicable - - # Don't assign to void. - # http://dart-lang.github.io/linter/lints/void_checks.html - # reason: Trying to assigning a value to void is an error. - - void_checks - - - omit_local_variable_types - - prefer_final_fields - - use_function_type_syntax_for_parameters diff --git a/example/release_notes.dart b/example/release_notes.dart index 867474ee..be929744 100644 --- a/example/release_notes.dart +++ b/example/release_notes.dart @@ -1,8 +1,9 @@ import 'dart:html'; -import 'common.dart'; import 'package:pub_semver/pub_semver.dart'; +import 'common.dart'; + late DivElement releasesDiv; Future main() async { @@ -28,12 +29,12 @@ Future loadReleaseNotes() async { print('No unreleased PRs'); return ''; } - var semvers = Set(); - for (var pr in unreleasedPRs) { + var semvers = {}; + for (final pr in unreleasedPRs) { var prlabels = pr.labels .where((element) => element.name.startsWith('semver:')) .toList(); - for (var l in prlabels) { + for (final l in prlabels) { semvers.add(l.name); } } @@ -50,7 +51,9 @@ Future loadReleaseNotes() async { newVersion = latestVersion.nextPatch.toString(); } print(newVersion); - if (newVersion.isEmpty) return ''; + if (newVersion.isEmpty) { + return ''; + } var notes = await github.repositories.generateReleaseNotes(CreateReleaseNotes( slug.owner, slug.name, newVersion, diff --git a/example/stars.dart b/example/stars.dart index a7c96bc4..52a95e54 100644 --- a/example/stars.dart +++ b/example/stars.dart @@ -30,6 +30,6 @@ void loadStars() { $stars!.append(h); }).onDone(() { querySelector('#total')! - .appendText(querySelectorAll('.user').length.toString() + ' stars'); + .appendText('${querySelectorAll('.user').length} stars'); }); } diff --git a/lib/src/common/activity_service.dart b/lib/src/common/activity_service.dart index 16b7b84a..0001fcdc 100644 --- a/lib/src/common/activity_service.dart +++ b/lib/src/common/activity_service.dart @@ -15,9 +15,8 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/events/#list-public-events Stream listPublicEvents({int pages = 2}) { - return PaginationHelper(github).objects( - 'GET', '/events', (dynamic i) => Event.fromJson(i), - pages: pages); + return PaginationHelper(github) + .objects('GET', '/events', Event.fromJson, pages: pages); } /// Lists public events for a network of repositories. @@ -25,8 +24,8 @@ class ActivityService extends Service { /// API docs: https://developer.github.com/v3/activity/events/#list-public-events-for-a-network-of-repositories Stream listRepositoryNetworkEvents(RepositorySlug slug, {int pages = 2}) { - return PaginationHelper(github).objects('GET', - '/networks/${slug.fullName}/events', (dynamic i) => Event.fromJson(i), + return PaginationHelper(github).objects( + 'GET', '/networks/${slug.fullName}/events', Event.fromJson, pages: pages); } @@ -47,9 +46,7 @@ class ActivityService extends Service { /// API docs: https://developer.github.com/v3/activity/events/#list-repository-events Stream listRepositoryIssueEvents(RepositorySlug slug, {int? pages}) { return PaginationHelper(github).objects( - 'GET', - '/repos/${slug.fullName}/issues/events', - (dynamic i) => Event.fromJson(i), + 'GET', '/repos/${slug.fullName}/issues/events', Event.fromJson, pages: pages); } @@ -62,8 +59,8 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/events/#list-repository-events Stream listRepositoryEvents(RepositorySlug slug, {int? pages}) { - return PaginationHelper(github).objects('GET', - '/repos/${slug.fullName}/events', (dynamic i) => Event.fromJson(i), + return PaginationHelper(github).objects( + 'GET', '/repos/${slug.fullName}/events', Event.fromJson, pages: pages); } @@ -77,9 +74,8 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/events/#list-public-events-for-an-organization Stream listEventsForOrganization(String name, {int? pages}) { - return PaginationHelper(github).objects( - 'GET', '/orgs/$name/events', (dynamic i) => Event.fromJson(i), - pages: pages); + return PaginationHelper(github) + .objects('GET', '/orgs/$name/events', Event.fromJson, pages: pages); } /// Returns an [EventPoller] for public events for an organization. @@ -105,7 +101,7 @@ class ActivityService extends Service { /// API docs: https://developer.github.com/v3/activity/events/#list-events-performed-by-a-user Stream listEventsPerformedByUser(String username, {int? pages}) { return PaginationHelper(github).objects( - 'GET', '/users/$username/events', (dynamic i) => Event.fromJson(i), + 'GET', '/users/$username/events', Event.fromJson, pages: pages); } @@ -113,8 +109,8 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/events/#list-public-events-performed-by-a-user Stream listPublicEventsPerformedByUser(String username, {int? pages}) { - return PaginationHelper(github).objects('GET', - '/users/$username/events/public', (dynamic i) => Event.fromJson(i), + return PaginationHelper(github).objects( + 'GET', '/users/$username/events/public', Event.fromJson, pages: pages); } @@ -132,7 +128,7 @@ class ActivityService extends Service { Stream listNotifications( {bool all = false, bool participating = false}) { return PaginationHelper(github).objects( - 'GET', '/notifications', (dynamic i) => Notification.fromJson(i), + 'GET', '/notifications', Notification.fromJson, params: {'all': all, 'participating': participating}); } @@ -141,10 +137,8 @@ class ActivityService extends Service { /// API docs: https://developer.github.com/v3/activity/notifications/#list-your-notifications-in-a-repository Stream listRepositoryNotifications(RepositorySlug repository, {bool all = false, bool participating = false}) { - return PaginationHelper(github).objects( - 'GET', - '/repos/${repository.fullName}/notifications', - (dynamic i) => Notification.fromJson(i), + return PaginationHelper(github).objects('GET', + '/repos/${repository.fullName}/notifications', Notification.fromJson, params: {'all': all, 'participating': participating}); } @@ -192,8 +186,7 @@ class ActivityService extends Service { /// API docs: https://developer.github.com/v3/activity/notifications/#view-a-single-thread Future getThread(String threadId) => github.getJSON('/notification/threads/$threadId', - statusCode: StatusCodes.OK, - convert: (dynamic i) => Notification.fromJson(i)); + statusCode: StatusCodes.OK, convert: Notification.fromJson); /// Mark the specified notification thread as read. /// @@ -214,8 +207,8 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/starring/#list-stargazers Stream listStargazers(RepositorySlug slug, {int perPage = 30}) { - return PaginationHelper(github).objects('GET', - '/repos/${slug.fullName}/stargazers', (dynamic i) => User.fromJson(i), + return PaginationHelper(github).objects( + 'GET', '/repos/${slug.fullName}/stargazers', User.fromJson, params: {'per_page': perPage}); } @@ -224,7 +217,7 @@ class ActivityService extends Service { /// API docs: https://developer.github.com/v3/activity/starring/#list-repositories-being-starred Stream listStarredByUser(String user, {int perPage = 30}) { return PaginationHelper(github).objects( - 'GET', '/users/$user/starred', (dynamic i) => Repository.fromJson(i), + 'GET', '/users/$user/starred', Repository.fromJson, params: {'per_page': perPage}); } @@ -233,7 +226,7 @@ class ActivityService extends Service { /// API docs: https://developer.github.com/v3/activity/starring/#list-repositories-being-starred Stream listStarred({int perPage = 30}) { return PaginationHelper(github).objects( - 'GET', '/user/starred', (dynamic i) => Repository.fromJson(i), + 'GET', '/user/starred', Repository.fromJson, params: {'per_page': perPage}); } @@ -272,24 +265,24 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/watching/#list-watchers Stream listWatchers(RepositorySlug slug) { - return PaginationHelper(github).objects('GET', - '/repos/${slug.fullName}/subscribers', (dynamic i) => User.fromJson(i)); + return PaginationHelper(github) + .objects('GET', '/repos/${slug.fullName}/subscribers', User.fromJson); } /// Lists the repositories the specified user is watching. /// /// API docs: https://developer.github.com/v3/activity/watching/#list-repositories-being-watched Stream listWatchedByUser(String user) { - return PaginationHelper(github).objects('GET', '/users/$user/subscriptions', - (dynamic i) => Repository.fromJson(i)); + return PaginationHelper(github) + .objects('GET', '/users/$user/subscriptions', Repository.fromJson); } /// Lists the repositories the current user is watching. /// /// API docs: https://developer.github.com/v3/activity/watching/#list-repositories-being-watched Stream listWatched() { - return PaginationHelper(github).objects( - 'GET', '/user/subscriptions', (dynamic i) => Repository.fromJson(i)); + return PaginationHelper(github) + .objects('GET', '/user/subscriptions', Repository.fromJson); } /// Fetches repository subscription information. @@ -298,8 +291,7 @@ class ActivityService extends Service { Future getRepositorySubscription( RepositorySlug slug) => github.getJSON('/repos/${slug.fullName}/subscription', - statusCode: StatusCodes.OK, - convert: (dynamic i) => RepositorySubscription.fromJson(i)); + statusCode: StatusCodes.OK, convert: RepositorySubscription.fromJson); /// Sets the Repository Subscription Status /// @@ -315,7 +307,7 @@ class ActivityService extends Service { return github.putJSON( '/repos/${slug.fullName}/subscription', statusCode: StatusCodes.OK, - convert: (dynamic i) => RepositorySubscription.fromJson(i), + convert: RepositorySubscription.fromJson, body: GitHubJson.encode(map), ); } diff --git a/lib/src/common/authorizations_service.dart b/lib/src/common/authorizations_service.dart index 7e714afb..3cbe6ef0 100644 --- a/lib/src/common/authorizations_service.dart +++ b/lib/src/common/authorizations_service.dart @@ -16,8 +16,8 @@ class AuthorizationsService extends Service { /// /// API docs: https://developer.github.com/v3/oauth_authorizations/#list-your-authorizations Stream listAuthorizations() { - return PaginationHelper(github).objects( - 'GET', '/authorizations', (dynamic i) => Authorization.fromJson(i)); + return PaginationHelper(github) + .objects('GET', '/authorizations', Authorization.fromJson); } /// Fetches an authorization specified by [id]. @@ -25,7 +25,7 @@ class AuthorizationsService extends Service { /// API docs: https://developer.github.com/v3/oauth_authorizations/#get-a-single-authorization Future getAuthorization(int id) => github.getJSON('/authorizations/$id', - statusCode: 200, convert: (dynamic i) => Authorization.fromJson(i)); + statusCode: 200, convert: Authorization.fromJson); // TODO: Implement remaining API methods of authorizations: // See https://developer.github.com/v3/oauth_authorizations/ diff --git a/lib/src/common/checks_service.dart b/lib/src/common/checks_service.dart index d3b63f77..0e87f4d2 100644 --- a/lib/src/common/checks_service.dart +++ b/lib/src/common/checks_service.dart @@ -11,21 +11,21 @@ class ChecksService extends Service { /// Methods to interact with Check Runs. /// /// API docs: https://developer.github.com/v3/checks/runs/ - final _CheckRunsService checkRuns; + final CheckRunsService checkRuns; /// Methods to interact with Check Suites. /// /// API docs: https://developer.github.com/v3/checks/suites/ - final _CheckSuitesService checkSuites; + final CheckSuitesService checkSuites; ChecksService(GitHub github) - : checkRuns = _CheckRunsService._(github), - checkSuites = _CheckSuitesService._(github), + : checkRuns = CheckRunsService._(github), + checkSuites = CheckSuitesService._(github), super(github); } -class _CheckRunsService extends Service { - _CheckRunsService._(GitHub github) : super(github); +class CheckRunsService extends Service { + CheckRunsService._(GitHub github) : super(github); /// Creates a new check run for a specific commit in a repository. /// Your GitHub App must have the `checks:write` permission to create check runs. @@ -78,7 +78,7 @@ class _CheckRunsService extends Service { 'output': output, 'actions': actions, })), - convert: (i) => CheckRun.fromJson(i), + convert: CheckRun.fromJson, ); } @@ -129,7 +129,7 @@ class _CheckRunsService extends Service { 'output': output, 'actions': actions, })), - convert: (i) => CheckRun.fromJson(i), + convert: CheckRun.fromJson, ); } @@ -153,7 +153,7 @@ class _CheckRunsService extends Service { return PaginationHelper(github).objects, CheckRun>( 'GET', 'repos/$slug/commits/$ref/check-runs', - (input) => CheckRun.fromJson(input), + CheckRun.fromJson, statusCode: StatusCodes.OK, preview: _previewHeader, params: createNonNullMap({ @@ -184,7 +184,7 @@ class _CheckRunsService extends Service { return PaginationHelper(github).objects, CheckRun>( 'GET', 'repos/$slug/check-suites/$checkSuiteId/check-runs', - (input) => CheckRun.fromJson(input), + CheckRun.fromJson, statusCode: StatusCodes.OK, preview: _previewHeader, params: createNonNullMap({ @@ -210,7 +210,7 @@ class _CheckRunsService extends Service { 'repos/${slug.fullName}/check-runs/$checkRunId', preview: _previewHeader, statusCode: StatusCodes.OK, - convert: (i) => CheckRun.fromJson(i), + convert: CheckRun.fromJson, ); } @@ -227,15 +227,15 @@ class _CheckRunsService extends Service { .objects, CheckRunAnnotation>( 'GET', '/repos/${slug.fullName}/check-runs/${checkRun.id}/annotations', - (i) => CheckRunAnnotation.fromJSON(i), + CheckRunAnnotation.fromJSON, statusCode: StatusCodes.OK, preview: _previewHeader, ); } } -class _CheckSuitesService extends Service { - _CheckSuitesService._(GitHub github) : super(github); +class CheckSuitesService extends Service { + CheckSuitesService._(GitHub github) : super(github); /// Gets a single check suite using its `id`. /// GitHub Apps must have the `checks:read` permission on a private repository or pull access to a public repository to get check suites. @@ -250,7 +250,7 @@ class _CheckSuitesService extends Service { return github.requestJson( 'GET', 'repos/$slug/check-suites/$checkSuiteId', - convert: (dynamic input) => CheckSuite.fromJson(input), + convert: CheckSuite.fromJson, preview: _previewHeader, statusCode: StatusCodes.OK, ); @@ -274,7 +274,7 @@ class _CheckSuitesService extends Service { return PaginationHelper(github).objects, CheckSuite>( 'GET', 'repos/$slug/commits/$ref/check-suites', - (input) => CheckSuite.fromJson(input), + CheckSuite.fromJson, preview: _previewHeader, params: createNonNullMap({ 'app_id': appId, @@ -304,7 +304,8 @@ class _CheckSuitesService extends Service { preview: _previewHeader, body: {'auto_trigger_checks': autoTriggerChecks}, convert: (input) => (input['preferences']['auto_trigger_checks'] as List) - .map((e) => AutoTriggerChecks.fromJson(e)) + .cast>() + .map(AutoTriggerChecks.fromJson) .toList(), ); } @@ -326,7 +327,7 @@ class _CheckSuitesService extends Service { statusCode: StatusCodes.CREATED, preview: _previewHeader, params: {'head_sha': headSha}, - convert: (input) => CheckSuite.fromJson(input), + convert: CheckSuite.fromJson, ); } diff --git a/lib/src/common/gists_service.dart b/lib/src/common/gists_service.dart index 9f64717e..9078e03d 100644 --- a/lib/src/common/gists_service.dart +++ b/lib/src/common/gists_service.dart @@ -14,8 +14,8 @@ class GistsService extends Service { /// /// API docs: https://developer.github.com/v3/gists/#list-gists Stream listUserGists(String username) { - return PaginationHelper(github).objects( - 'GET', '/users/$username/gists', (dynamic i) => Gist.fromJson(i)); + return PaginationHelper(github) + .objects('GET', '/users/$username/gists', Gist.fromJson); } /// Fetches the gists for the currently authenticated user. @@ -23,8 +23,7 @@ class GistsService extends Service { /// /// API docs: https://developer.github.com/v3/gists/#list-gists Stream listCurrentUserGists() { - return PaginationHelper(github) - .objects('GET', '/gists', (dynamic i) => Gist.fromJson(i)); + return PaginationHelper(github).objects('GET', '/gists', Gist.fromJson); } /// Fetches the currently authenticated user's public gists. @@ -32,7 +31,7 @@ class GistsService extends Service { /// API docs: https://developer.github.com/v3/gists/#list-gists Stream listCurrentUserPublicGists() { return PaginationHelper(github) - .objects('GET', '/gists/public', (dynamic i) => Gist.fromJson(i)); + .objects('GET', '/gists/public', Gist.fromJson); } /// Fetches the currently authenticated user's starred gists. @@ -40,14 +39,14 @@ class GistsService extends Service { /// API docs: https://developer.github.com/v3/gists/#list-gists Stream listCurrentUserStarredGists() { return PaginationHelper(github) - .objects('GET', '/gists/starred', (dynamic i) => Gist.fromJson(i)); + .objects('GET', '/gists/starred', Gist.fromJson); } /// Fetches a Gist by the specified [id]. /// /// API docs: https://developer.github.com/v3/gists/#get-a-single-gist Future getGist(String id) => github.getJSON('/gists/$id', - statusCode: StatusCodes.OK, convert: (dynamic i) => Gist.fromJson(i)); + statusCode: StatusCodes.OK, convert: Gist.fromJson); /// Creates a Gist /// @@ -77,7 +76,7 @@ class GistsService extends Service { '/gists', statusCode: 201, body: GitHubJson.encode(map), - convert: (dynamic i) => Gist.fromJson(i), + convert: Gist.fromJson, ); } @@ -116,7 +115,7 @@ class GistsService extends Service { '/gists/$id', statusCode: 200, body: GitHubJson.encode(map), - convert: (dynamic i) => Gist.fromJson(i), + convert: Gist.fromJson, ); } @@ -166,8 +165,8 @@ class GistsService extends Service { /// /// API docs: https://developer.github.com/v3/gists/comments/#list-comments-on-a-gist Stream listComments(String gistId) { - return PaginationHelper(github).objects('GET', '/gists/$gistId/comments', - (dynamic i) => GistComment.fromJson(i)); + return PaginationHelper(github) + .objects('GET', '/gists/$gistId/comments', GistComment.fromJson); } // TODO: Implement getComment: https://developer.github.com/v3/gists/comments/#get-a-single-comment @@ -177,8 +176,7 @@ class GistsService extends Service { /// API docs: https://developer.github.com/v3/gists/comments/#create-a-comment Future createComment(String gistId, CreateGistComment request) { return github.postJSON('/gists/$gistId/comments', - body: GitHubJson.encode(request), - convert: (dynamic i) => GistComment.fromJson(i)); + body: GitHubJson.encode(request), convert: GistComment.fromJson); } // TODO: Implement editComment: https://developer.github.com/v3/gists/comments/#edit-a-comment diff --git a/lib/src/common/git_service.dart b/lib/src/common/git_service.dart index 1165eeb0..7052e4f6 100644 --- a/lib/src/common/git_service.dart +++ b/lib/src/common/git_service.dart @@ -15,15 +15,14 @@ class GitService extends Service { /// API docs: https://developer.github.com/v3/git/blobs/#get-a-blob Future getBlob(RepositorySlug slug, String? sha) => github.getJSON('/repos/${slug.fullName}/git/blobs/$sha', - convert: (dynamic i) => GitBlob.fromJson(i), - statusCode: StatusCodes.OK); + convert: GitBlob.fromJson, statusCode: StatusCodes.OK); /// Creates a blob with specified [blob] content. /// /// API docs: https://developer.github.com/v3/git/blobs/#create-a-blob Future createBlob(RepositorySlug slug, CreateGitBlob blob) { return github.postJSON('/repos/${slug.fullName}/git/blobs', - convert: (dynamic i) => GitBlob.fromJson(i), + convert: GitBlob.fromJson, statusCode: StatusCodes.CREATED, body: GitHubJson.encode(blob)); } @@ -33,15 +32,14 @@ class GitService extends Service { /// API docs: https://developer.github.com/v3/git/commits/#get-a-commit Future getCommit(RepositorySlug slug, String? sha) => github.getJSON('/repos/${slug.fullName}/git/commits/$sha', - convert: (dynamic i) => GitCommit.fromJson(i), - statusCode: StatusCodes.OK); + convert: GitCommit.fromJson, statusCode: StatusCodes.OK); /// Creates a new commit in a repository. /// /// API docs: https://developer.github.com/v3/git/commits/#create-a-commit Future createCommit(RepositorySlug slug, CreateGitCommit commit) { return github.postJSON('/repos/${slug.fullName}/git/commits', - convert: (dynamic i) => GitCommit.fromJson(i), + convert: GitCommit.fromJson, statusCode: StatusCodes.CREATED, body: GitHubJson.encode(commit)); } @@ -53,8 +51,7 @@ class GitService extends Service { /// API docs: https://developer.github.com/v3/git/refs/#get-a-reference Future getReference(RepositorySlug slug, String ref) => github.getJSON('/repos/${slug.fullName}/git/refs/$ref', - convert: (dynamic i) => GitReference.fromJson(i), - statusCode: StatusCodes.OK); + convert: GitReference.fromJson, statusCode: StatusCodes.OK); /// Lists the references in a repository. /// @@ -69,8 +66,7 @@ class GitService extends Service { path += '/$type'; } - return PaginationHelper(github) - .objects('GET', path, (dynamic i) => GitReference.fromJson(i)); + return PaginationHelper(github).objects('GET', path, GitReference.fromJson); } /// Creates a new reference in a repository. @@ -82,7 +78,7 @@ class GitService extends Service { Future createReference( RepositorySlug slug, String ref, String? sha) { return github.postJSON('/repos/${slug.fullName}/git/refs', - convert: (dynamic i) => GitReference.fromJson(i), + convert: GitReference.fromJson, statusCode: StatusCodes.CREATED, body: GitHubJson.encode({'ref': ref, 'sha': sha})); } @@ -123,15 +119,14 @@ class GitService extends Service { /// API docs: https://developer.github.com/v3/git/tags/#get-a-tag Future getTag(RepositorySlug slug, String? sha) => github.getJSON('/repos/${slug.fullName}/git/tags/$sha', - convert: (dynamic i) => GitTag.fromJson(i), - statusCode: StatusCodes.OK); + convert: GitTag.fromJson, statusCode: StatusCodes.OK); /// Creates a new tag in a repository. /// /// API docs: https://developer.github.com/v3/git/tags/#create-a-tag-object Future createTag(RepositorySlug slug, CreateGitTag tag) => github.postJSON('/repos/${slug.fullName}/git/tags', - convert: (dynamic i) => GitTag.fromJson(i), + convert: GitTag.fromJson, statusCode: StatusCodes.CREATED, body: GitHubJson.encode(tag)); @@ -149,8 +144,7 @@ class GitService extends Service { } return github.getJSON(path, - convert: (dynamic j) => GitTree.fromJson(j), - statusCode: StatusCodes.OK); + convert: GitTree.fromJson, statusCode: StatusCodes.OK); } /// Creates a new tree in a repository. @@ -158,7 +152,7 @@ class GitService extends Service { /// API docs: https://developer.github.com/v3/git/trees/#create-a-tree Future createTree(RepositorySlug slug, CreateGitTree tree) { return github.postJSON('/repos/${slug.fullName}/git/trees', - convert: (dynamic j) => GitTree.fromJson(j), + convert: GitTree.fromJson, statusCode: StatusCodes.CREATED, body: GitHubJson.encode(tree)); } diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index 77864725..fdfbdc1c 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -333,7 +333,7 @@ class GitHub { final json = jsonDecode(response.body); - final T returnValue = convert(json)!; + final returnValue = convert(json) as T; _applyExpandos(returnValue, response); return returnValue; } @@ -424,15 +424,12 @@ class GitHub { } else { return response; } - - throw UnknownError(this); } /// /// Internal method to handle status codes /// - @alwaysThrows - void handleStatusCode(http.Response response) { + Never handleStatusCode(http.Response response) { print(response.body); String? message = ''; List>? errors; diff --git a/lib/src/common/issues_service.dart b/lib/src/common/issues_service.dart index b20d809a..490396fb 100644 --- a/lib/src/common/issues_service.dart +++ b/lib/src/common/issues_service.dart @@ -123,7 +123,7 @@ class IssuesService extends Service { return PaginationHelper(github).objects( 'GET', pathSegment, - (dynamic i) => Issue.fromJson(i), + Issue.fromJson, params: params, ); } @@ -144,7 +144,7 @@ class IssuesService extends Service { return PaginationHelper(github).objects( 'GET', '/repos/${slug.owner}/${slug.name}/issues/$issueNumber/reactions$query', - (dynamic i) => Reaction.fromJson(i), + Reaction.fromJson, headers: { 'Accept': 'application/vnd.github.squirrel-girl-preview+json', }, @@ -169,7 +169,7 @@ class IssuesService extends Service { /// API docs: https://developer.github.com/v3/issues/#get-a-single-issue Future get(RepositorySlug slug, int issueNumber) => github.getJSON('/repos/${slug.fullName}/issues/$issueNumber', - convert: (dynamic i) => Issue.fromJson(i)); + convert: Issue.fromJson); /// Create an issue. /// @@ -194,8 +194,8 @@ class IssuesService extends Service { /// /// API docs: https://developer.github.com/v3/issues/assignees/#list-assignees Stream listAssignees(RepositorySlug slug) { - return PaginationHelper(github).objects('GET', - '/repos/${slug.fullName}/assignees', (dynamic i) => User.fromJson(i)); + return PaginationHelper(github) + .objects('GET', '/repos/${slug.fullName}/assignees', User.fromJson); } /// Checks if a user is an assignee for the specified repository. @@ -215,17 +215,15 @@ class IssuesService extends Service { return PaginationHelper(github).objects( 'GET', '/repos/${slug.fullName}/issues/$issueNumber/comments', - (dynamic i) => IssueComment.fromJson(i)); + IssueComment.fromJson); } /// Lists all comments in a repository. /// /// API docs: https://developer.github.com/v3/issues/comments/#list-comments-on-an-issue Stream listCommentsByRepo(RepositorySlug slug) { - return PaginationHelper(github).objects( - 'GET', - '/repos/${slug.fullName}/issues/comments', - (dynamic i) => IssueComment.fromJson(i)); + return PaginationHelper(github).objects('GET', + '/repos/${slug.fullName}/issues/comments', IssueComment.fromJson); } /// Fetches the specified issue comment. @@ -233,7 +231,7 @@ class IssuesService extends Service { /// API docs: https://developer.github.com/v3/issues/comments/#get-a-single-comment Future getComment(RepositorySlug slug, int id) => github.getJSON('/repos/${slug.fullName}/issues/comments/$id', - convert: (dynamic i) => IssueComment.fromJson(i)); + convert: IssueComment.fromJson); /// Creates a new comment on the specified issue /// @@ -244,7 +242,7 @@ class IssuesService extends Service { return github.postJSON( '/repos/${slug.fullName}/issues/$issueNumber/comments', body: it, - convert: (dynamic i) => IssueComment.fromJson(i), + convert: IssueComment.fromJson, statusCode: StatusCodes.CREATED, ); } @@ -257,7 +255,7 @@ class IssuesService extends Service { return github.postJSON( '/repos/${slug.fullName}/issues/comments/$id', body: it, - convert: (dynamic i) => IssueComment.fromJson(i), + convert: IssueComment.fromJson, statusCode: StatusCodes.OK, ); } @@ -277,10 +275,8 @@ class IssuesService extends Service { /// /// API docs: https://developer.github.com/v3/issues/labels/#list-all-labels-for-this-repository Stream listLabels(RepositorySlug slug) { - return PaginationHelper(github).objects( - 'GET', - '/repos/${slug.fullName}/labels', - (dynamic i) => IssueLabel.fromJson(i)); + return PaginationHelper(github) + .objects('GET', '/repos/${slug.fullName}/labels', IssueLabel.fromJson); } /// Fetches a single label. @@ -288,8 +284,7 @@ class IssuesService extends Service { /// API docs: https://developer.github.com/v3/issues/labels/#get-a-single-label Future getLabel(RepositorySlug slug, String name) => github.getJSON('/repos/${slug.fullName}/labels/$name', - convert: (dynamic i) => IssueLabel.fromJson(i), - statusCode: StatusCodes.OK); + convert: IssueLabel.fromJson, statusCode: StatusCodes.OK); /// Creates a new label on the specified repository. /// @@ -298,7 +293,7 @@ class IssuesService extends Service { RepositorySlug slug, String name, String color) { return github.postJSON('/repos/${slug.fullName}/labels', body: GitHubJson.encode({'name': name, 'color': color}), - convert: (dynamic i) => IssueLabel.fromJson(i)); + convert: IssueLabel.fromJson); } /// Edits a label. @@ -307,7 +302,7 @@ class IssuesService extends Service { Future editLabel(RepositorySlug slug, String name, String color) { return github.postJSON('/repos/${slug.fullName}/labels/$name', body: GitHubJson.encode({'name': name, 'color': color}), - convert: (dynamic i) => IssueLabel.fromJson(i)); + convert: IssueLabel.fromJson); } /// Deletes a label. @@ -327,7 +322,7 @@ class IssuesService extends Service { return PaginationHelper(github).objects( 'GET', '/repos/${slug.fullName}/issues/$issueNumber/labels', - (dynamic i) => IssueLabel.fromJson(i)); + IssueLabel.fromJson); } /// Adds labels to an issue. @@ -338,10 +333,8 @@ class IssuesService extends Service { return github.postJSON, List>( '/repos/${slug.fullName}/issues/$issueNumber/labels', body: GitHubJson.encode(labels), - convert: (input) => input - .cast>() - .map((i) => IssueLabel.fromJson(i)) - .toList(), + convert: (input) => + input.cast>().map(IssueLabel.fromJson).toList(), ); } @@ -354,8 +347,7 @@ class IssuesService extends Service { .request('PUT', '/repos/${slug.fullName}/issues/$issueNumber/labels', body: GitHubJson.encode(labels)) .then((response) { - return jsonDecode(response.body) - .map((Map it) => IssueLabel.fromJson(it)); + return jsonDecode(response.body).map(IssueLabel.fromJson); }); } @@ -386,9 +378,7 @@ class IssuesService extends Service { /// API docs: https://developer.github.com/v3/issues/milestones/#list-milestones-for-a-repository Stream listMilestones(RepositorySlug slug) { return PaginationHelper(github).objects( - 'GET', - '/repos/${slug.fullName}/milestones', - (dynamic i) => Milestone.fromJson(i)); + 'GET', '/repos/${slug.fullName}/milestones', Milestone.fromJson); } // TODO: Implement getMilestone: https://developer.github.com/v3/issues/milestones/#get-a-single-milestone @@ -399,8 +389,7 @@ class IssuesService extends Service { Future createMilestone( RepositorySlug slug, CreateMilestone request) { return github.postJSON('/repos/${slug.fullName}/milestones', - body: GitHubJson.encode(request), - convert: (dynamic i) => Milestone.fromJson(i)); + body: GitHubJson.encode(request), convert: Milestone.fromJson); } // TODO: Implement editMilestone: https://developer.github.com/v3/issues/milestones/#update-a-milestone diff --git a/lib/src/common/misc_service.dart b/lib/src/common/misc_service.dart index f34a7964..4951848f 100644 --- a/lib/src/common/misc_service.dart +++ b/lib/src/common/misc_service.dart @@ -35,7 +35,7 @@ class MiscService extends Service { /// API docs: https://developer.github.com/v3/gitignore/#get-a-single-template Future getGitignoreTemplate(String name) => github.getJSON('/gitignore/templates/$name', - convert: (dynamic i) => GitignoreTemplate.fromJson(i)); + convert: GitignoreTemplate.fromJson); /// Renders Markdown from the [input]. /// @@ -70,8 +70,7 @@ class MiscService extends Service { /// Gets the GitHub API Status. Future getApiStatus() => github.getJSON('https://status.github.com/api/status.json', - statusCode: StatusCodes.OK, - convert: (dynamic i) => APIStatus.fromJson(i)); + statusCode: StatusCodes.OK, convert: APIStatus.fromJson); /// Returns an ASCII Octocat with the specified [text]. Future getOctocat([String? text]) { diff --git a/lib/src/common/model/users.dart b/lib/src/common/model/users.dart index 766f6185..8044983a 100644 --- a/lib/src/common/model/users.dart +++ b/lib/src/common/model/users.dart @@ -26,7 +26,7 @@ class User { this.updatedAt, }); - @JsonKey(ignore: true) + @JsonKey(includeToJson: false, includeFromJson: false) Map? json; // TODO remove /// User's Username diff --git a/lib/src/common/orgs_service.dart b/lib/src/common/orgs_service.dart index f72f93b1..c0774bda 100644 --- a/lib/src/common/orgs_service.dart +++ b/lib/src/common/orgs_service.dart @@ -22,16 +22,15 @@ class OrganizationsService extends Service { requestPath = '/user/orgs'; } return PaginationHelper(github) - .objects('GET', requestPath, (dynamic i) => Organization.fromJson(i)); + .objects('GET', requestPath, Organization.fromJson); } /// Fetches the organization specified by [name]. /// /// API docs: https://developer.github.com/v3/orgs/#get-an-organization Future get(String? name) => github.getJSON('/orgs/$name', - convert: (dynamic i) => Organization.fromJson(i), - statusCode: StatusCodes.OK, - fail: (http.Response response) { + convert: Organization.fromJson, + statusCode: StatusCodes.OK, fail: (http.Response response) { if (response.statusCode == 404) { throw OrganizationNotFound(github, name); } @@ -66,7 +65,7 @@ class OrganizationsService extends Service { return github.postJSON('/orgs/$org', statusCode: 200, - convert: (dynamic i) => Organization.fromJson(i), + convert: Organization.fromJson, body: GitHubJson.encode(map)); } @@ -74,8 +73,8 @@ class OrganizationsService extends Service { /// /// API docs: https://developer.github.com/v3/orgs/teams/#list-teams Stream listTeams(String orgName) { - return PaginationHelper(github).objects( - 'GET', '/orgs/$orgName/teams', (dynamic i) => Team.fromJson(i)); + return PaginationHelper(github) + .objects('GET', '/orgs/$orgName/teams', Team.fromJson); } /// Gets the team specified by the [teamId]. @@ -83,8 +82,7 @@ class OrganizationsService extends Service { /// API docs: https://developer.github.com/v3/orgs/teams/#get-team Future getTeam(int teamId) { return github.getJSON('/teams/$teamId', - convert: (dynamic i) => Organization.fromJson(i), - statusCode: 200) as Future; + convert: Organization.fromJson, statusCode: 200) as Future; } /// Creates a Team. @@ -100,9 +98,7 @@ class OrganizationsService extends Service { }); return github.postJSON('/orgs/$org/teams', - statusCode: 201, - convert: (dynamic i) => Team.fromJson(i), - body: GitHubJson.encode(map)); + statusCode: 201, convert: Team.fromJson, body: GitHubJson.encode(map)); } /// Edits a Team. @@ -119,7 +115,7 @@ class OrganizationsService extends Service { return github.postJSON( '/teams/$teamId', statusCode: 200, - convert: (dynamic i) => Team.fromJson(i), + convert: Team.fromJson, body: GitHubJson.encode(map), ); } @@ -137,8 +133,8 @@ class OrganizationsService extends Service { /// /// API docs: https://developer.github.com/v3/orgs/teams/#list-team-members Stream listTeamMembers(int teamId) { - return PaginationHelper(github).objects( - 'GET', '/teams/$teamId/members', (dynamic i) => TeamMember.fromJson(i)); + return PaginationHelper(github) + .objects('GET', '/teams/$teamId/members', TeamMember.fromJson); } Future getTeamMemberStatus(int teamId, String user) { @@ -192,8 +188,8 @@ class OrganizationsService extends Service { /// /// API docs: https://developer.github.com/v3/orgs/teams/#list-team-repos Stream listTeamRepositories(int teamId) { - return PaginationHelper(github).objects( - 'GET', '/teams/$teamId/repos', (dynamic i) => Repository.fromJson(i)); + return PaginationHelper(github) + .objects('GET', '/teams/$teamId/repos', Repository.fromJson); } /// Checks if a team manages the specified repository. @@ -234,7 +230,7 @@ class OrganizationsService extends Service { /// API docs: https://developer.github.com/v3/orgs/teams/#list-user-teams Stream listUserTeams() { return PaginationHelper(github) - .objects('GET', '/user/teams', (dynamic i) => Team.fromJson(i)); + .objects('GET', '/user/teams', Team.fromJson); } /// Lists all of the users in an organization @@ -242,7 +238,7 @@ class OrganizationsService extends Service { /// API docs: https://developer.github.com/v3/orgs/teams/#list-user-teams Stream listUsers(String org) { return PaginationHelper(github) - .objects('GET', '/orgs/$org/members', (dynamic i) => User.fromJson(i)); + .objects('GET', '/orgs/$org/members', User.fromJson); } /// Lists the hooks for the specified organization. diff --git a/lib/src/common/pulls_service.dart b/lib/src/common/pulls_service.dart index f0ec3dcc..5242f0e3 100644 --- a/lib/src/common/pulls_service.dart +++ b/lib/src/common/pulls_service.dart @@ -29,8 +29,8 @@ class PullRequestsService extends Service { putValue('sort', sort, params); putValue('state', state, params); - return PaginationHelper(github).objects('GET', - '/repos/${slug.fullName}/pulls', (dynamic i) => PullRequest.fromJson(i), + return PaginationHelper(github).objects( + 'GET', '/repos/${slug.fullName}/pulls', PullRequest.fromJson, pages: pages, params: params); } @@ -39,8 +39,7 @@ class PullRequestsService extends Service { /// API docs: https://developer.github.com/v3/pulls/#get-a-single-pull-request Future get(RepositorySlug slug, int number) => github.getJSON('/repos/${slug.fullName}/pulls/$number', - convert: (dynamic i) => PullRequest.fromJson(i), - statusCode: StatusCodes.OK); + convert: PullRequest.fromJson, statusCode: StatusCodes.OK); /// Creates a Pull Request based on the given [request]. /// @@ -48,7 +47,7 @@ class PullRequestsService extends Service { Future create(RepositorySlug slug, CreatePullRequest request) { return github.postJSON( '/repos/${slug.fullName}/pulls', - convert: (dynamic i) => PullRequest.fromJson(i), + convert: PullRequest.fromJson, body: GitHubJson.encode(request), preview: request.draft! ? 'application/vnd.github.shadow-cat-preview+json' @@ -83,7 +82,7 @@ class PullRequestsService extends Service { return PaginationHelper(github).objects( 'GET', '/repos/${slug.fullName}/pulls/$number/commits', - (dynamic i) => RepositoryCommit.fromJson(i)); + RepositoryCommit.fromJson); } /// Lists the files in a pull request. @@ -93,7 +92,7 @@ class PullRequestsService extends Service { return PaginationHelper(github).objects( 'GET', '/repos/${slug.fullName}/pulls/$number/files', - (dynamic i) => PullRequestFile.fromJson(i)); + PullRequestFile.fromJson); } /// Lists the reviews for a pull request. @@ -103,7 +102,7 @@ class PullRequestsService extends Service { return PaginationHelper(github).objects( 'GET', '/repos/${slug.fullName}/pulls/$number/reviews', - (dynamic i) => PullRequestReview.fromJson(i)); + PullRequestReview.fromJson); } Future isMerged(RepositorySlug slug, int number) { @@ -156,17 +155,15 @@ class PullRequestsService extends Service { return PaginationHelper(github).objects( 'GET', '/repos/${slug.fullName}/pulls/$number/comments', - (dynamic i) => PullRequestComment.fromJson(i)); + PullRequestComment.fromJson); } /// Lists all comments on all pull requests for the repository. /// /// API docs: https://developer.github.com/v3/pulls/comments/#list-comments-in-a-repository Stream listComments(RepositorySlug slug) { - return PaginationHelper(github).objects( - 'GET', - '/repos/${slug.fullName}/pulls/comments', - (dynamic i) => PullRequestComment.fromJson(i)); + return PaginationHelper(github).objects('GET', + '/repos/${slug.fullName}/pulls/comments', PullRequestComment.fromJson); } /// Creates a new pull request comment. @@ -176,7 +173,7 @@ class PullRequestsService extends Service { RepositorySlug slug, int number, CreatePullRequestComment comment) { return github.postJSON('/repos/${slug.fullName}/pulls/$number/comments', body: GitHubJson.encode(comment.toJson()), - convert: (dynamic i) => PullRequestComment.fromJson(i), + convert: PullRequestComment.fromJson, statusCode: 201); } @@ -191,7 +188,7 @@ class PullRequestsService extends Service { return github.postJSON( '/repos/${slug.fullName}/pulls/${review.pullNumber}/reviews', body: GitHubJson.encode(review), - convert: (dynamic i) => PullRequestReview.fromJson(i), + convert: PullRequestReview.fromJson, ); } } diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index a3a73531..535e1060 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -27,7 +27,7 @@ class RepositoriesService extends Service { return PaginationHelper(github).objects, Repository>( 'GET', '/user/repos', - (i) => Repository.fromJson(i), + Repository.fromJson, params: params, ); } @@ -49,7 +49,7 @@ class RepositoriesService extends Service { return PaginationHelper(github).objects, Repository>( 'GET', '/users/$user/repos', - (i) => Repository.fromJson(i), + Repository.fromJson, params: params, ); } @@ -65,7 +65,7 @@ class RepositoriesService extends Service { return PaginationHelper(github).objects, Repository>( 'GET', '/orgs/$org/repos', - (i) => Repository.fromJson(i), + Repository.fromJson, params: params, ); } @@ -91,7 +91,7 @@ class RepositoriesService extends Service { .expand((http.Response response) { final list = jsonDecode(response.body) as List>; - return list.map((Map it) => Repository.fromJson(it)); + return list.map(Repository.fromJson); }); } @@ -107,13 +107,13 @@ class RepositoriesService extends Service { return github.postJSON, Repository>( '/orgs/$org/repos', body: GitHubJson.encode(repository), - convert: (i) => Repository.fromJson(i), + convert: Repository.fromJson, ); } else { return github.postJSON, Repository>( '/user/repos', body: GitHubJson.encode(repository), - convert: (i) => Repository.fromJson(i), + convert: Repository.fromJson, ); } } @@ -122,7 +122,7 @@ class RepositoriesService extends Service { ArgumentError.checkNotNull(slug); return github.getJSON, LicenseDetails>( '/repos/${slug.owner}/${slug.name}/license', - convert: (json) => LicenseDetails.fromJson(json), + convert: LicenseDetails.fromJson, ); } @@ -133,7 +133,7 @@ class RepositoriesService extends Service { ArgumentError.checkNotNull(slug); return github.getJSON, Repository>( '/repos/${slug.owner}/${slug.name}', - convert: (i) => Repository.fromJson(i), + convert: Repository.fromJson, statusCode: StatusCodes.OK, fail: (http.Response response) { if (response.statusCode == 404) { @@ -206,7 +206,7 @@ class RepositoriesService extends Service { return PaginationHelper(github).objects, Contributor>( 'GET', '/repos/${slug.fullName}/contributors', - (i) => Contributor.fromJson(i), + Contributor.fromJson, params: {'anon': anon.toString()}, ); } @@ -219,7 +219,7 @@ class RepositoriesService extends Service { return PaginationHelper(github).objects, Team>( 'GET', '/repos/${slug.fullName}/teams', - (i) => Team.fromJson(i), + Team.fromJson, ); } @@ -242,7 +242,7 @@ class RepositoriesService extends Service { {int page = 1, int? pages, int perPage = 30}) { ArgumentError.checkNotNull(slug); return PaginationHelper(github).objects, Tag>( - 'GET', '/repos/${slug.fullName}/tags', (i) => Tag.fromJson(i), + 'GET', '/repos/${slug.fullName}/tags', Tag.fromJson, pages: pages, params: {'page': page, 'per_page': perPage}); } @@ -254,7 +254,7 @@ class RepositoriesService extends Service { return PaginationHelper(github).objects, Branch>( 'GET', '/repos/${slug.fullName}/branches', - (i) => Branch.fromJson(i), + Branch.fromJson, ); } @@ -266,7 +266,7 @@ class RepositoriesService extends Service { ArgumentError.checkNotNull(branch); return github.getJSON, Branch>( '/repos/${slug.fullName}/branches/$branch', - convert: (i) => Branch.fromJson(i), + convert: Branch.fromJson, ); } @@ -278,7 +278,7 @@ class RepositoriesService extends Service { return PaginationHelper(github).objects, Collaborator>( 'GET', '/repos/${slug.fullName}/collaborators', - (json) => Collaborator.fromJson(json), + Collaborator.fromJson, ); } @@ -346,7 +346,7 @@ class RepositoriesService extends Service { .objects, CommitComment>( 'GET', '/repos/${slug.fullName}/commits/${commit.sha}/comments', - (i) => CommitComment.fromJson(i), + CommitComment.fromJson, statusCode: StatusCodes.OK, ); } @@ -360,7 +360,7 @@ class RepositoriesService extends Service { .objects, CommitComment>( 'GET', 'repos/${slug.fullName}/comments', - (i) => CommitComment.fromJson(i), + CommitComment.fromJson, statusCode: StatusCodes.OK, ); } @@ -392,7 +392,7 @@ class RepositoriesService extends Service { '/repos/${slug.fullName}/commits/${commit.sha}/comments', body: GitHubJson.encode(data), statusCode: StatusCodes.CREATED, - convert: (i) => CommitComment.fromJson(i), + convert: CommitComment.fromJson, ); } @@ -406,7 +406,7 @@ class RepositoriesService extends Service { return github.getJSON, CommitComment>( '/repos/${slug.fullName}/comments/$id', statusCode: StatusCodes.OK, - convert: (i) => CommitComment.fromJson(i), + convert: CommitComment.fromJson, ); } @@ -426,7 +426,7 @@ class RepositoriesService extends Service { '/repos/${slug.fullName}/comments/$id', body: GitHubJson.encode(createNonNullMap({'body': body})), statusCode: StatusCodes.OK, - convert: (i) => CommitComment.fromJson(i), + convert: CommitComment.fromJson, ); } @@ -455,7 +455,7 @@ class RepositoriesService extends Service { .objects, RepositoryCommit>( 'GET', '/repos/${slug.fullName}/commits', - (i) => RepositoryCommit.fromJson(i), + RepositoryCommit.fromJson, ); } @@ -467,7 +467,7 @@ class RepositoriesService extends Service { ArgumentError.checkNotNull(sha); return github.getJSON, RepositoryCommit>( '/repos/${slug.fullName}/commits/$sha', - convert: (i) => RepositoryCommit.fromJson(i), + convert: RepositoryCommit.fromJson, statusCode: StatusCodes.OK, ); } @@ -501,7 +501,7 @@ class RepositoriesService extends Service { ArgumentError.checkNotNull(refHead); return github.getJSON, GitHubComparison>( '/repos/${slug.fullName}/compare/$refBase...$refHead', - convert: (j) => GitHubComparison.fromJson(j), + convert: GitHubComparison.fromJson, ); } @@ -572,8 +572,10 @@ class RepositoriesService extends Service { } contents.file = GitHubFile.fromJson(input as Map); } else { - contents.tree = - (input as List).map((it) => GitHubFile.fromJson(it)).toList(); + contents.tree = (input as List) + .cast>() + .map(GitHubFile.fromJson) + .toList(); } return contents; }, @@ -662,7 +664,7 @@ class RepositoriesService extends Service { return PaginationHelper(github).objects, Repository>( 'GET', '/repos/${slug.fullName}/forks', - (i) => Repository.fromJson(i), + Repository.fromJson, ); } @@ -675,7 +677,7 @@ class RepositoriesService extends Service { return github.postJSON, Repository>( '/repos/${slug.fullName}/forks', body: GitHubJson.encode(fork), - convert: (i) => Repository.fromJson(i), + convert: Repository.fromJson, ); } @@ -820,7 +822,7 @@ class RepositoriesService extends Service { return PaginationHelper(github).objects, PublicKey>( 'GET', '/repos/${slug.fullName}/keys', - (i) => PublicKey.fromJson(i), + PublicKey.fromJson, ); } @@ -834,7 +836,7 @@ class RepositoriesService extends Service { return github.getJSON, PublicKey>( '/repos/${slug.fullName}/keys/$id', statusCode: StatusCodes.OK, - convert: (i) => PublicKey.fromJson(i), + convert: PublicKey.fromJson, ); } @@ -849,7 +851,7 @@ class RepositoriesService extends Service { '/repos/${slug.fullName}/keys', body: GitHubJson.encode(key), statusCode: StatusCodes.CREATED, - convert: (i) => PublicKey.fromJson(i), + convert: PublicKey.fromJson, ); } @@ -878,7 +880,7 @@ class RepositoriesService extends Service { return github.postJSON, RepositoryCommit>( '/repos/${slug.fullName}/merges', body: GitHubJson.encode(merge), - convert: (i) => RepositoryCommit.fromJson(i), + convert: RepositoryCommit.fromJson, statusCode: StatusCodes.CREATED, ); } @@ -891,7 +893,7 @@ class RepositoriesService extends Service { return github.getJSON, RepositoryPages>( '/repos/${slug.fullName}/pages', statusCode: StatusCodes.OK, - convert: (i) => RepositoryPages.fromJson(i), + convert: RepositoryPages.fromJson, ); } @@ -903,7 +905,7 @@ class RepositoriesService extends Service { return PaginationHelper(github).objects, PageBuild>( 'GET', '/repos/${slug.fullName}/pages/builds', - (i) => PageBuild.fromJson(i), + PageBuild.fromJson, statusCode: StatusCodes.OK, ); } @@ -915,7 +917,7 @@ class RepositoriesService extends Service { ArgumentError.checkNotNull(slug); return github.getJSON( '/repos/${slug.fullName}/pages/builds/latest', - convert: (dynamic i) => PageBuild.fromJson(i), + convert: PageBuild.fromJson, statusCode: StatusCodes.OK, ); } @@ -930,7 +932,7 @@ class RepositoriesService extends Service { return PaginationHelper(github).objects, Release>( 'GET', '/repos/${slug.fullName}/releases', - (i) => Release.fromJson(i), + Release.fromJson, ); } @@ -941,7 +943,7 @@ class RepositoriesService extends Service { ArgumentError.checkNotNull(slug); return github.getJSON, Release>( '/repos/${slug.fullName}/releases/latest', - convert: (i) => Release.fromJson(i), + convert: Release.fromJson, statusCode: StatusCodes.OK, ); } @@ -954,7 +956,7 @@ class RepositoriesService extends Service { ArgumentError.checkNotNull(id); return github.getJSON, Release>( '/repos/${slug.fullName}/releases/$id', - convert: (i) => Release.fromJson(i), + convert: Release.fromJson, ); } @@ -968,7 +970,7 @@ class RepositoriesService extends Service { RepositorySlug slug, String? tagName) async { return github.getJSON( '/repos/${slug.fullName}/releases/tags/$tagName', - convert: (dynamic i) => Release.fromJson(i), + convert: Release.fromJson, statusCode: StatusCodes.OK, fail: (http.Response response) { if (response.statusCode == 404) { @@ -992,7 +994,7 @@ class RepositoriesService extends Service { ArgumentError.checkNotNull(createRelease); final release = await github.postJSON, Release>( '/repos/${slug.fullName}/releases', - convert: (i) => Release.fromJson(i), + convert: Release.fromJson, body: GitHubJson.encode(createRelease.toJson()), statusCode: StatusCodes.CREATED); if (release.hasErrors) { @@ -1052,7 +1054,7 @@ class RepositoriesService extends Service { 'prerelease': preRelease ?? releaseToEdit.isPrerelease, })), statusCode: StatusCodes.OK, - convert: (i) => Release.fromJson(i), + convert: Release.fromJson, ); } @@ -1080,7 +1082,7 @@ class RepositoriesService extends Service { return PaginationHelper(github).objects, ReleaseAsset>( 'GET', '/repos/${slug.fullName}/releases/${release.id}/assets', - (i) => ReleaseAsset.fromJson(i), + ReleaseAsset.fromJson, statusCode: StatusCodes.OK, ); } @@ -1096,7 +1098,7 @@ class RepositoriesService extends Service { return github.postJSON, ReleaseAsset>( '/repos/${slug.fullName}/releases/assets/$assetId', statusCode: StatusCodes.OK, - convert: (i) => ReleaseAsset.fromJson(i), + convert: ReleaseAsset.fromJson, ); } @@ -1114,7 +1116,7 @@ class RepositoriesService extends Service { return github.postJSON, ReleaseAsset>( '/repos/${slug.fullName}/releases/assets/${assetToEdit.id}', statusCode: StatusCodes.OK, - convert: (i) => ReleaseAsset.fromJson(i), + convert: ReleaseAsset.fromJson, body: GitHubJson.encode(createNonNullMap({ 'name': name ?? assetToEdit.name, 'label': label ?? assetToEdit.label, @@ -1152,7 +1154,7 @@ class RepositoriesService extends Service { ), headers: headers, body: createReleaseAsset.assetData, - convert: (dynamic i) => ReleaseAsset.fromJson(i)); + convert: ReleaseAsset.fromJson); releaseAssets.add(releaseAsset); } return releaseAssets; @@ -1174,13 +1176,13 @@ class RepositoriesService extends Service { if (response.statusCode == StatusCodes.OK) { return (jsonDecode(response.body) as List) - .map((e) => ContributorStatistics.fromJson(e)) + .cast>() + .map(ContributorStatistics.fromJson) .toList(); } else if (response.statusCode == StatusCodes.ACCEPTED) { throw NotReady(github, path); } github.handleStatusCode(response); - throw UnknownError(github); } /// Fetches commit counts for the past year. @@ -1192,7 +1194,7 @@ class RepositoriesService extends Service { .objects, YearCommitCountWeek>( 'GET', '/repos/${slug.fullName}/stats/commit_activity', - (i) => YearCommitCountWeek.fromJson(i), + YearCommitCountWeek.fromJson, ); } @@ -1205,7 +1207,7 @@ class RepositoriesService extends Service { .objects, WeeklyChangesCount>( 'GET', '/repos/${slug.fullName}/stats/code_frequency', - (i) => WeeklyChangesCount.fromJson(i), + WeeklyChangesCount.fromJson, ); } @@ -1217,7 +1219,7 @@ class RepositoriesService extends Service { return github.getJSON( '/repos/${slug.fullName}/stats/participation', statusCode: StatusCodes.OK, - convert: (dynamic i) => ContributorParticipation.fromJson(i), + convert: ContributorParticipation.fromJson, ); } @@ -1230,7 +1232,7 @@ class RepositoriesService extends Service { .objects, PunchcardEntry>( 'GET', '/repos/${slug.fullName}/stats/punchcard', - (i) => PunchcardEntry.fromJson(i), + PunchcardEntry.fromJson, ); } @@ -1245,7 +1247,7 @@ class RepositoriesService extends Service { .objects, RepositoryStatus>( 'GET', '/repos/${slug.fullName}/commits/$ref/statuses', - (i) => RepositoryStatus.fromJson(i), + RepositoryStatus.fromJson, ); } @@ -1261,7 +1263,7 @@ class RepositoriesService extends Service { return github.postJSON, RepositoryStatus>( '/repos/${slug.fullName}/statuses/$ref', body: GitHubJson.encode(request), - convert: (i) => RepositoryStatus.fromJson(i), + convert: RepositoryStatus.fromJson, ); } @@ -1274,7 +1276,7 @@ class RepositoriesService extends Service { ArgumentError.checkNotNull(ref); return github.getJSON, CombinedRepositoryStatus>( '/repos/${slug.fullName}/commits/$ref/status', - convert: (i) => CombinedRepositoryStatus.fromJson(i), + convert: CombinedRepositoryStatus.fromJson, statusCode: StatusCodes.OK, ); } @@ -1291,7 +1293,7 @@ class RepositoriesService extends Service { '/repos/${crn.owner}/${crn.repo}/releases/generate-notes', body: GitHubJson.encode(crn), statusCode: StatusCodes.OK, - convert: (i) => ReleaseNotes.fromJson(i), + convert: ReleaseNotes.fromJson, ); } } diff --git a/lib/src/common/search_service.dart b/lib/src/common/search_service.dart index e98344a6..bf2b41ec 100644 --- a/lib/src/common/search_service.dart +++ b/lib/src/common/search_service.dart @@ -44,7 +44,10 @@ class SearchService extends Service { final items = input['items'] as List; - items.map((item) => Repository.fromJson(item)).forEach(controller.add); + items + .cast>() + .map(Repository.fromJson) + .forEach(controller.add); }).onDone(controller.close); return controller.stream; @@ -94,19 +97,19 @@ class SearchService extends Service { query += _searchQualifier('size', size); // build up the in: qualifier based on the 2 booleans - var _in = ''; + var inValue = ''; if (inFile) { - _in = 'file'; + inValue = 'file'; } if (inPath) { - if (_in.isEmpty) { - _in = 'path'; + if (inValue.isEmpty) { + inValue = 'path'; } else { - _in = 'file,path'; + inValue = 'file,path'; } } - if (_in.isNotEmpty) { - query += ' in:$_in'; + if (inValue.isNotEmpty) { + query += ' in:$inValue'; } final params = {}; @@ -159,7 +162,10 @@ class SearchService extends Service { final items = input['items'] as List; - items.map((item) => Issue.fromJson(item)).forEach(controller.add); + items + .cast>() + .map(Issue.fromJson) + .forEach(controller.add); }).onDone(controller.close); return controller.stream; @@ -206,7 +212,10 @@ class SearchService extends Service { final items = input['items'] as List; - items.map((item) => User.fromJson(item)).forEach(controller.add); + items + .cast>() + .map(User.fromJson) + .forEach(controller.add); }).onDone(controller.close); return controller.stream; diff --git a/lib/src/common/users_service.dart b/lib/src/common/users_service.dart index 3a469401..bb27ff6d 100644 --- a/lib/src/common/users_service.dart +++ b/lib/src/common/users_service.dart @@ -14,7 +14,7 @@ class UsersService extends Service { /// /// API docs: https://developer.github.com/v3/users/#get-a-single-user Future getUser(String? name) => - github.getJSON('/users/$name', convert: (dynamic i) => User.fromJson(i)); + github.getJSON('/users/$name', convert: User.fromJson); /// Updates the Current User. /// @@ -41,7 +41,7 @@ class UsersService extends Service { '/user', body: GitHubJson.encode(map), statusCode: 200, - convert: (dynamic i) => CurrentUser.fromJson(i), + convert: CurrentUser.fromJson, ); } @@ -58,14 +58,13 @@ class UsersService extends Service { /// Throws [AccessForbidden] if we are not authenticated. /// /// API docs: https://developer.github.com/v3/users/#get-the-authenticated-user - Future getCurrentUser() => github.getJSON('/user', - statusCode: StatusCodes.OK, - fail: (http.Response response) { + Future getCurrentUser() => + github.getJSON('/user', statusCode: StatusCodes.OK, + fail: (http.Response response) { if (response.statusCode == StatusCodes.FORBIDDEN) { throw AccessForbidden(github); } - }, - convert: (dynamic i) => CurrentUser.fromJson(i)); + }, convert: CurrentUser.fromJson); /// Checks if a user exists. Future isUser(String name) => github @@ -77,21 +76,21 @@ class UsersService extends Service { /// Lists all users. /// /// API docs: https://developer.github.com/v3/users/#get-all-users - Stream listUsers({int? pages, int? since}) => PaginationHelper(github) - .objects('GET', '/users', (dynamic i) => User.fromJson(i), + Stream listUsers({int? pages, int? since}) => + PaginationHelper(github).objects('GET', '/users', User.fromJson, pages: pages, params: {'since': since}); /// Lists all email addresses for the currently authenticated user. /// /// API docs: https://developer.github.com/v3/users/emails/#list-email-addresses-for-a-user Stream listEmails() => PaginationHelper(github) - .objects('GET', '/user/emails', (dynamic i) => UserEmail.fromJson(i)); + .objects('GET', '/user/emails', UserEmail.fromJson); /// Add Emails /// /// API docs: https://developer.github.com/v3/users/emails/#add-email-addresses Stream addEmails(List emails) => PaginationHelper(github) - .objects('POST', '/user/emails', (dynamic i) => UserEmail.fromJson(i), + .objects('POST', '/user/emails', UserEmail.fromJson, statusCode: 201, body: GitHubJson.encode(emails)); /// Delete Emails @@ -106,8 +105,7 @@ class UsersService extends Service { /// /// API docs: https://developer.github.com/v3/users/followers/#list-followers-of-a-user Stream listUserFollowers(String user) => PaginationHelper(github) - .objects('GET', '/users/$user/followers', (dynamic i) => User.fromJson(i), - statusCode: 200); + .objects('GET', '/users/$user/followers', User.fromJson, statusCode: 200); /// Check if the current user is following the specified user. Future isFollowingUser(String user) => @@ -144,16 +142,14 @@ class UsersService extends Service { /// List current user followers. /// /// API docs: https://developer.github.com/v3/users/followers/#list-followers-of-a-user - Stream listCurrentUserFollowers() => PaginationHelper(github).objects( - 'GET', '/user/followers', (dynamic i) => User.fromJson(i), - statusCode: 200); + Stream listCurrentUserFollowers() => PaginationHelper(github) + .objects('GET', '/user/followers', User.fromJson, statusCode: 200); /// List current user following /// /// API docs: https://developer.github.com/v3/users/followers/#list-users-followed-by-the-authenticated-user - Stream listCurrentUserFollowing() => PaginationHelper(github).objects( - 'GET', '/user/following', (dynamic i) => User.fromJson(i), - statusCode: 200); + Stream listCurrentUserFollowing() => PaginationHelper(github) + .objects('GET', '/user/following', User.fromJson, statusCode: 200); /// Lists the verified public keys for a [userLogin]. If no [userLogin] is specified, /// the public keys for the authenticated user are fetched. @@ -162,8 +158,7 @@ class UsersService extends Service { /// and https://developer.github.com/v3/users/keys/#list-your-public-keys Stream listPublicKeys([String? userLogin]) { final path = userLogin == null ? '/user/keys' : '/users/$userLogin/keys'; - return PaginationHelper(github) - .objects('GET', path, (dynamic i) => PublicKey.fromJson(i)); + return PaginationHelper(github).objects('GET', path, PublicKey.fromJson); } // TODO: Implement getPublicKey: https://developer.github.com/v3/users/keys/#get-a-single-public-key diff --git a/lib/src/common/util/oauth2.dart b/lib/src/common/util/oauth2.dart index 5d3c9e59..9333d606 100644 --- a/lib/src/common/util/oauth2.dart +++ b/lib/src/common/util/oauth2.dart @@ -54,14 +54,12 @@ class OAuth2Flow { /// /// This should be displayed to the user. String createAuthorizeUrl() { - return baseUrl + - '/authorize' + - buildQueryString({ + return '$baseUrl/authorize${buildQueryString({ 'client_id': clientId, 'scope': scopes.join(','), 'redirect_uri': redirectUri, 'state': state - }); + })}'; } /// Exchanges the given [code] for a token. diff --git a/pubspec.yaml b/pubspec.yaml index bdc75ce3..188c93ec 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,15 +1,15 @@ name: github -version: 9.9.0 +version: 9.10.0-dev description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart environment: - sdk: '>=2.17.0 <3.0.0' + sdk: '>=2.18.0 <3.0.0' dependencies: http: ^0.13.0 http_parser: ^4.0.0 - json_annotation: ^4.4.0 + json_annotation: ^4.8.0 meta: ^1.3.0 dev_dependencies: @@ -18,8 +18,8 @@ dev_dependencies: build_web_compilers: any collection: ^1.15.0 dependency_validator: - json_serializable: ^6.0.0 - lints: ^1.0.0 + json_serializable: ^6.6.1 + lints: ^2.0.0 mockito: ^5.0.0 nock: ^1.0.0 pub_semver: ^2.0.0 diff --git a/test/assets/responses/nocked_responses.dart b/test/assets/responses/nocked_responses.dart index 3a1b9b5b..bf0e50f4 100644 --- a/test/assets/responses/nocked_responses.dart +++ b/test/assets/responses/nocked_responses.dart @@ -1,4 +1,4 @@ -var getBlob = ''' +String getBlob = ''' { "content": "Q29udGVudCBvZiB0aGUgYmxvYg==", "encoding": "base64", @@ -8,7 +8,7 @@ var getBlob = ''' "node_id": "Q29udGVudCBvZiB0aGUgYmxvYg==" }'''; -var createBlob = ''' +String createBlob = ''' { "url": "https://api.github.com/repos/octocat/example/git/blobs/3a0f86fb8db8eea7ccbb9a95f325ddbedfb25e15", "sha": "3a0f86fb8db8eea7ccbb9a95f325ddbedfb25e15", @@ -16,7 +16,7 @@ var createBlob = ''' "encoding": "utf-8" }'''; -var getCommit = ''' +String getCommit = ''' { "sha": "7638417db6d59f3c431d3e1f261cc637155684cd", "node_id": "MDY6Q29tbWl0NmRjYjA5YjViNTc4NzVmMzM0ZjYxYWViZWQ2OTVlMmU0MTkzZGI1ZQ==", @@ -52,7 +52,7 @@ var getCommit = ''' } }'''; -var createCommit = ''' +String createCommit = ''' { "sha": "7638417db6d59f3c431d3e1f261cc637155684cd", "node_id": "MDY6Q29tbWl0NzYzODQxN2RiNmQ1OWYzYzQzMWQzZTFmMjYxY2M2MzcxNTU2ODRjZA==", @@ -88,7 +88,7 @@ var createCommit = ''' "html_url": "https://github.com/octocat/Hello-World/commit/7638417db6d59f3c431d3e1f261cc637155684cd" }'''; -var getReference = '''{ +String getReference = '''{ "ref": "refs/heads/b", "node_id": "MDM6UmVmcmVmcy9oZWFkcy9mZWF0dXJlQQ==", "url": "https://api.github.com/repos/octocat/Hello-World/git/refs/heads/featureA", @@ -99,7 +99,7 @@ var getReference = '''{ } }'''; -var createReference = '''{ +String createReference = '''{ "ref": "refs/heads/b", "node_id": "MDM6UmVmcmVmcy9oZWFkcy9mZWF0dXJlQQ==", "url": "https://api.github.com/repos/octocat/Hello-World/git/refs/heads/featureA", @@ -110,7 +110,7 @@ var createReference = '''{ } }'''; -var getTag = '''{ +String getTag = '''{ "node_id": "MDM6VGFnOTQwYmQzMzYyNDhlZmFlMGY5ZWU1YmM3YjJkNWM5ODU4ODdiMTZhYw==", "tag": "v0.0.1", "sha": "940bd336248efae0f9ee5bc7b2d5c985887b16ac", @@ -134,7 +134,7 @@ var getTag = '''{ } }'''; -var createTag = '''{ +String createTag = '''{ "node_id": "MDM6VGFnOTQwYmQzMzYyNDhlZmFlMGY5ZWU1YmM3YjJkNWM5ODU4ODdiMTZhYw==", "tag": "v0.0.1", "sha": "940bd336248efae0f9ee5bc7b2d5c985887b16ac", @@ -158,7 +158,7 @@ var createTag = '''{ } }'''; -var createTree = '''{ +String createTree = '''{ "sha": "44b4fc6d56897b048c772eb4087f854f46256132", "url": "https://api.github.com/repos/octocat/Hello-World/trees/44b4fc6d56897b048c772eb4087f854f46256132", "tree": [ @@ -174,7 +174,7 @@ var createTree = '''{ "truncated": true }'''; -var searchResults = '''{ +String searchResults = '''{ "total_count": 17, "incomplete_results": false, "items": [ @@ -1473,7 +1473,7 @@ var searchResults = '''{ ] }'''; -var mergedPR1 = '''{ +String mergedPR1 = '''{ "sha": "someSHA", "merged": true, "message": "Pull Request successfully merged" diff --git a/test/common/github_test.dart b/test/common/github_test.dart index 45c3b68f..7b50ef54 100644 --- a/test/common/github_test.dart +++ b/test/common/github_test.dart @@ -6,7 +6,7 @@ import 'package:http/testing.dart'; import 'package:test/test.dart'; void main() { - group(GitHub, () { + group(GitHub, () { test('passes calendar version header', () async { Request? request; final client = MockClient((r) async { diff --git a/test/experiment/error_handling.dart b/test/experiment/error_handling.dart index 5456b237..e76b7e9d 100644 --- a/test/experiment/error_handling.dart +++ b/test/experiment/error_handling.dart @@ -27,8 +27,4 @@ void main() { print(e); exit(0); } - - print('Invalid Entity Error Handling Failed'); - - exit(1); } diff --git a/test/git_test.dart b/test/git_test.dart index f769571b..34487b95 100644 --- a/test/git_test.dart +++ b/test/git_test.dart @@ -1,4 +1,3 @@ -import 'dart:io'; import 'package:github/github.dart'; import 'package:nock/nock.dart'; import 'package:test/test.dart'; diff --git a/test/scenarios_test.dart b/test/scenarios_test.dart index 6486553d..c39ceb53 100644 --- a/test/scenarios_test.dart +++ b/test/scenarios_test.dart @@ -1,3 +1,5 @@ +// ignore_for_file: unused_local_variable + @Tags(['scenarios']) @TestOn('vm') diff --git a/test/unit/issues_test.dart b/test/unit/issues_test.dart index 88b06086..512d83a3 100644 --- a/test/unit/issues_test.dart +++ b/test/unit/issues_test.dart @@ -3,7 +3,6 @@ import 'package:github/src/common/model/issues.dart'; import 'package:test/test.dart'; - const String testIssueCommentJson = ''' { "url": "https://api.github.com/repos/flutter/cocoon/issues/comments/1352355796", @@ -54,7 +53,8 @@ const String testIssueCommentJson = ''' void main() { group('Issue Comments', () { test('IssueComment from Json', () { - final issueComment = IssueComment.fromJson(jsonDecode(testIssueCommentJson)); + final issueComment = + IssueComment.fromJson(jsonDecode(testIssueCommentJson)); expect(1352355796, issueComment.id); expect('MEMBER', issueComment.authorAssociation); expect('CaseyHillers', issueComment.user!.login); diff --git a/tool/release_unreleased_prs.dart b/tool/release_unreleased_prs.dart index 2eb1d273..b8cf8b17 100644 --- a/tool/release_unreleased_prs.dart +++ b/tool/release_unreleased_prs.dart @@ -103,7 +103,7 @@ Future> getUnreleasedPRs() async { } String getNextVersion(Version currentVersion, List unreleased) { - var semvers = Set(); + var semvers = {}; for (final pr in unreleased) { var prlabels = pr.labels .where((element) => element.name.startsWith('semver:')) From 2c4dfa0456e0fb894d9f4761216a40c01aeb9139 Mon Sep 17 00:00:00 2001 From: Casey Hillers Date: Thu, 23 Feb 2023 14:00:09 -0800 Subject: [PATCH 332/390] Add required UserAgent HTTP header (#352) * Add required UserAgent header * Prep 9.10.1 --- CHANGELOG.md | 6 ++++++ lib/src/common/github.dart | 3 +++ pubspec.yaml | 2 +- test/common/github_test.dart | 16 ++++++++++++++++ 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eae3873b..4f36eb35 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## 9.10.1 + +* Pass required User-Agent HTTP header on all requests + * If `Authentication.basic` is used, it will be your GitHub username/application + * Otherwise, it will default to `github.dart` + ## 9.10.0-dev * Require Dart 2.18 diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index fdfbdc1c..0aead228 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -377,6 +377,9 @@ class GitHub { headers.putIfAbsent('Authorization', () => 'basic $userAndPass'); } + // See https://docs.github.com/en/rest/overview/resources-in-the-rest-api?apiVersion=2022-11-28#user-agent-required + headers.putIfAbsent('User-Agent', () => auth?.username ?? 'github.dart'); + if (method == 'PUT' && body == null) { headers.putIfAbsent('Content-Length', () => '0'); } diff --git a/pubspec.yaml b/pubspec.yaml index 188c93ec..afd47919 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 9.10.0-dev +version: 9.10.1 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart diff --git a/test/common/github_test.dart b/test/common/github_test.dart index 7b50ef54..4f7d6727 100644 --- a/test/common/github_test.dart +++ b/test/common/github_test.dart @@ -22,5 +22,21 @@ void main() { final version = request!.headers[GitHub.versionHeader]; expect(version, github.version); }); + + test('passes required user-agent header', () async { + Request? request; + final client = MockClient((r) async { + request = r; + return Response('{}', HttpStatus.ok); + }); + + final github = GitHub(client: client); + await github.getJSON(''); // Make HTTP request + + expect(request, isNotNull); + expect(request!.headers.containsKey('User-Agent'), isTrue); + final userAgent = request!.headers['User-Agent']; + expect(userAgent, 'github.dart'); + }); }); } From 0b8f3fe984cd2f95056c8cf698390495e3018aac Mon Sep 17 00:00:00 2001 From: Casey Hillers Date: Thu, 23 Feb 2023 15:00:07 -0800 Subject: [PATCH 333/390] [actions] Use pub.dev release process (#354) --- .github/workflows/publish_release.yml | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/.github/workflows/publish_release.yml b/.github/workflows/publish_release.yml index 0287d22a..658e690d 100644 --- a/.github/workflows/publish_release.yml +++ b/.github/workflows/publish_release.yml @@ -1,21 +1,10 @@ -name: Publish to pub +name: Publish to pub.dev on: - release: - types: [published] + push: + tags: + - '[0-9]+.[0-9]+.[0-9]+*' jobs: publish: - - runs-on: ubuntu-latest - container: - image: dart - steps: - - name: Checkout - uses: actions/checkout@v1 - - name: Setup credentials - run: | - mkdir -p ~/.pub-cache - echo ${{ secrets.CREDENTIAL_JSON }} > ~/.pub-cache/credentials.json - - name: Publish package - run: dart pub publish -f \ No newline at end of file + uses: dart-lang/setup-dart/.github/workflows/publish.yml From cc3ef8fa288a193bc2ea3e5efcdad6f581f796e6 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Fri, 24 Feb 2023 11:15:25 -0700 Subject: [PATCH 334/390] use machine github token for unreleased labels --- .github/workflows/label_prs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/label_prs.yml b/.github/workflows/label_prs.yml index 8f30b23d..c631e84c 100644 --- a/.github/workflows/label_prs.yml +++ b/.github/workflows/label_prs.yml @@ -12,7 +12,7 @@ jobs: - name: Apply unreleased label uses: actions/github-script@v6 with: - github-token: ${{secrets.GITHUB_TOKEN}} + github-token: ${{secrets.MACHINE_GITHUB_API_TOKEN}} script: | github.rest.issues.addLabels({ issue_number: context.issue.number, From 3206fbe1f9965faf89c921217cf5f09d58f8bab2 Mon Sep 17 00:00:00 2001 From: Devon Carew Date: Mon, 13 Mar 2023 07:36:26 -0700 Subject: [PATCH 335/390] update dart CI; update action versions (#358) --- .github/dependabot.yaml | 10 ++++-- .github/workflows/dart.yml | 42 ++++++++++++++-------- .github/workflows/label_prs.yml | 2 +- .github/workflows/publish_demos.yml | 2 +- .github/workflows/publish_release.yml | 2 +- .github/workflows/require_semver_label.yml | 4 +-- .github/workflows/tests.yml | 24 ------------- .github/workflows/triage.yml | 2 +- README.md | 4 +-- 9 files changed, 44 insertions(+), 48 deletions(-) delete mode 100644 .github/workflows/tests.yml diff --git a/.github/dependabot.yaml b/.github/dependabot.yaml index 39bd9ac1..ad6ef734 100644 --- a/.github/dependabot.yaml +++ b/.github/dependabot.yaml @@ -1,7 +1,13 @@ +# Dependabot configuration file. version: 2 -enable-beta-ecosystems: true + updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "monthly" + - package-ecosystem: "pub" directory: "/" schedule: - interval: "weekly" \ No newline at end of file + interval: "monthly" diff --git a/.github/workflows/dart.yml b/.github/workflows/dart.yml index bb1838d7..151d23f4 100644 --- a/.github/workflows/dart.yml +++ b/.github/workflows/dart.yml @@ -1,19 +1,33 @@ -name: Dart Checks (analyze,format,publishable) +name: Dart Checks -on: [push] +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] jobs: build: - runs-on: ubuntu-latest - container: - image: dart + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest] + # Test with at least the declared minimum Dart version + sdk: [2.18.7, stable] steps: - - uses: actions/checkout@v1 - - name: Install dependencies - run: dart pub get - - name: Dart Analyzer - run: dart analyze - - name: Check Dart Format - run: dart format --set-exit-if-changed -o none lib test tool example integration_test && echo Dart Format 👍 || echo Files needed Dart formatting 😢 - - name: Check if Publishable - run: dart pub publish --dry-run + - uses: actions/checkout@v3 + - uses: dart-lang/setup-dart@v1 + with: + sdk: ${{ matrix.sdk }} + + - name: Install dependencies + run: dart pub get + - name: Dart Analyzer + run: dart analyze + - name: Check Dart Format + if: ${{ matrix.sdk == 'stable' }} + run: dart format --set-exit-if-changed -onone . + - name: Unit tests + run: dart test + - name: Check if Publishable + run: dart pub publish --dry-run diff --git a/.github/workflows/label_prs.yml b/.github/workflows/label_prs.yml index c631e84c..d0285052 100644 --- a/.github/workflows/label_prs.yml +++ b/.github/workflows/label_prs.yml @@ -8,7 +8,7 @@ jobs: name: Unreleased runs-on: ubuntu-latest steps: - - uses: actions/checkout@master + - uses: actions/checkout@v3 - name: Apply unreleased label uses: actions/github-script@v6 with: diff --git a/.github/workflows/publish_demos.yml b/.github/workflows/publish_demos.yml index 25a2bb12..1066357a 100644 --- a/.github/workflows/publish_demos.yml +++ b/.github/workflows/publish_demos.yml @@ -10,7 +10,7 @@ jobs: image: dart steps: - name: Checkout 🛎️ - uses: actions/checkout@v2.3.1 + uses: actions/checkout@v3 - name: Install rsync 📚 run: | diff --git a/.github/workflows/publish_release.yml b/.github/workflows/publish_release.yml index 658e690d..bdc52863 100644 --- a/.github/workflows/publish_release.yml +++ b/.github/workflows/publish_release.yml @@ -7,4 +7,4 @@ on: jobs: publish: - uses: dart-lang/setup-dart/.github/workflows/publish.yml + uses: dart-lang/setup-dart/.github/workflows/publish.yml@v1 diff --git a/.github/workflows/require_semver_label.yml b/.github/workflows/require_semver_label.yml index a1b0bbe8..b764baaf 100644 --- a/.github/workflows/require_semver_label.yml +++ b/.github/workflows/require_semver_label.yml @@ -6,12 +6,12 @@ jobs: label: runs-on: ubuntu-latest steps: - - uses: mheap/github-action-required-labels@v1 + - uses: mheap/github-action-required-labels@v3 with: mode: exactly count: 1 labels: "semver:patch, semver:minor, semver:major" - - uses: mheap/github-action-required-labels@v1 + - uses: mheap/github-action-required-labels@v3 with: mode: exactly count: 1 diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml deleted file mode 100644 index b5a0c40d..00000000 --- a/.github/workflows/tests.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: Tests -on: - push: - branches: [ master ] - pull_request: - branches: [ master ] -jobs: - test: - runs-on: ${{ matrix.os }} - strategy: - matrix: - os: [ubuntu-latest] - sdk: [2.18.7, stable] # Test with at least the declared minimum Dart version - steps: - - uses: actions/checkout@v2 - - uses: dart-lang/setup-dart@v1.3 - with: - sdk: ${{ matrix.sdk }} - - name: Install dependencies - run: dart pub get - - name: Unit tests - run: dart test - # - name: Integration tests - # run: dart test integration_test diff --git a/.github/workflows/triage.yml b/.github/workflows/triage.yml index 90dddd83..224ea1ca 100644 --- a/.github/workflows/triage.yml +++ b/.github/workflows/triage.yml @@ -8,7 +8,7 @@ jobs: name: Assign Rob runs-on: ubuntu-latest steps: - - uses: actions/checkout@master + - uses: actions/checkout@v3 - name: Apply untriaged label uses: actions/github-script@v6 with: diff --git a/README.md b/README.md index fc8aa669..24be2836 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # GitHub for Dart -![](https://github.com/SpinlockLabs/github.dart/workflows/Dart%20CI/badge.svg) +[![Dart Checks](https://github.com/SpinlockLabs/github.dart/actions/workflows/dart.yml/badge.svg)](https://github.com/SpinlockLabs/github.dart/actions/workflows/dart.yml) [![Pub](https://img.shields.io/pub/v/github.svg)](https://pub.dartlang.org/packages/github) This is a library for interacting with GitHub in Dart. It works on all platforms including web, server, and Flutter. @@ -35,4 +35,4 @@ Post a question or idea: https://github.com/SpinlockLabs/github.dart/discussions ## Star History -[![Star History Chart](https://api.star-history.com/svg?repos=SpinlockLabs/github.dart&type=Date)](https://star-history.com/#SpinlockLabs/github.dart&Date) \ No newline at end of file +[![Star History Chart](https://api.star-history.com/svg?repos=SpinlockLabs/github.dart&type=Date)](https://star-history.com/#SpinlockLabs/github.dart&Date) From 0a0ab4509eb9f92d3f49745ef990448228792acf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Mar 2023 11:33:46 -0600 Subject: [PATCH 336/390] Bump JamesIves/github-pages-deploy-action from 4.0.0 to 4.4.1 (#359) Bumps [JamesIves/github-pages-deploy-action](https://github.com/JamesIves/github-pages-deploy-action) from 4.0.0 to 4.4.1. - [Release notes](https://github.com/JamesIves/github-pages-deploy-action/releases) - [Commits](https://github.com/JamesIves/github-pages-deploy-action/compare/4.0.0...v4.4.1) --- updated-dependencies: - dependency-name: JamesIves/github-pages-deploy-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/publish_demos.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish_demos.yml b/.github/workflows/publish_demos.yml index 1066357a..dec1be49 100644 --- a/.github/workflows/publish_demos.yml +++ b/.github/workflows/publish_demos.yml @@ -24,7 +24,7 @@ jobs: rm build/example/packages - name: Publish 🚀 - uses: JamesIves/github-pages-deploy-action@4.0.0 + uses: JamesIves/github-pages-deploy-action@v4.4.1 with: branch: gh-pages # The branch the action should deploy to. folder: build/example # The folder the action should deploy. From 158673874dab67d11e225f75299d1068e69725d1 Mon Sep 17 00:00:00 2001 From: Devon Carew Date: Tue, 14 Mar 2023 18:31:46 -0700 Subject: [PATCH 337/390] expose IssueLabel.description; update labels REST APIs (#355) * expose IssueLabel.description; update labels REST APIs * add a deprecated forwarding method * Update issues_service.dart --------- Co-authored-by: Rob Becker --- lib/src/common/issues_service.dart | 44 +++++++++++++++++++++++++----- lib/src/common/model/issues.dart | 3 ++ lib/src/common/model/issues.g.dart | 2 ++ 3 files changed, 42 insertions(+), 7 deletions(-) diff --git a/lib/src/common/issues_service.dart b/lib/src/common/issues_service.dart index 490396fb..9d8eb4ab 100644 --- a/lib/src/common/issues_service.dart +++ b/lib/src/common/issues_service.dart @@ -290,19 +290,49 @@ class IssuesService extends Service { /// /// API docs: https://developer.github.com/v3/issues/labels/#create-a-label Future createLabel( - RepositorySlug slug, String name, String color) { - return github.postJSON('/repos/${slug.fullName}/labels', - body: GitHubJson.encode({'name': name, 'color': color}), - convert: IssueLabel.fromJson); + RepositorySlug slug, + String name, { + String? color, + String? description, + }) { + return github.postJSON( + '/repos/${slug.fullName}/labels', + body: GitHubJson.encode({ + 'name': name, + if (color != null) 'color': color, + if (description != null) 'description': description, + }), + convert: IssueLabel.fromJson, + ); } /// Edits a label. /// /// API docs: https://developer.github.com/v3/issues/labels/#update-a-label + @Deprecated('See updateLabel instead.') Future editLabel(RepositorySlug slug, String name, String color) { - return github.postJSON('/repos/${slug.fullName}/labels/$name', - body: GitHubJson.encode({'name': name, 'color': color}), - convert: IssueLabel.fromJson); + return updateLabel(slug, name, color: color); + } + + /// Update a label. + /// + /// API docs: https://developer.github.com/v3/issues/labels/#update-a-label + Future updateLabel( + RepositorySlug slug, + String name, { + String? newName, + String? color, + String? description, + }) { + return github.patchJSON( + '/repos/${slug.fullName}/labels/$name', + body: GitHubJson.encode({ + if (newName != null) 'new_name': newName, + if (color != null) 'color': color, + if (description != null) 'description': description, + }), + convert: IssueLabel.fromJson, + ); } /// Deletes a label. diff --git a/lib/src/common/model/issues.dart b/lib/src/common/model/issues.dart index 4534892e..6746a305 100644 --- a/lib/src/common/model/issues.dart +++ b/lib/src/common/model/issues.dart @@ -172,12 +172,15 @@ class IssueLabel { IssueLabel({ this.name = '', this.color = '', + this.description = '', }); String name; String color; + String description; + factory IssueLabel.fromJson(Map input) => _$IssueLabelFromJson(input); Map toJson() => _$IssueLabelToJson(this); diff --git a/lib/src/common/model/issues.g.dart b/lib/src/common/model/issues.g.dart index 12e03103..0a027f67 100644 --- a/lib/src/common/model/issues.g.dart +++ b/lib/src/common/model/issues.g.dart @@ -142,12 +142,14 @@ Map _$IssueCommentToJson(IssueComment instance) => IssueLabel _$IssueLabelFromJson(Map json) => IssueLabel( name: json['name'] as String? ?? '', color: json['color'] as String? ?? '', + description: json['description'] as String? ?? '', ); Map _$IssueLabelToJson(IssueLabel instance) => { 'name': instance.name, 'color': instance.color, + 'description': instance.description, }; Milestone _$MilestoneFromJson(Map json) => Milestone( From 885e5bb9dd65fabc94aaccc878a517e54402a8d9 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Tue, 14 Mar 2023 19:36:27 -0600 Subject: [PATCH 338/390] prep 9.8.0 --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index afd47919..fe8a734f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 9.10.1 +version: 9.8.0 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From ea130cefce3eed826acac83a6a56e8b662af4945 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Tue, 14 Mar 2023 19:52:11 -0600 Subject: [PATCH 339/390] prep 9.11.0 --- CHANGELOG.md | 4 ++++ pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4f36eb35..7456f7d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 9.11.0 + +* expose IssueLabel.description; update labels REST APIs by @devoncarew in https://github.com/SpinlockLabs/github.dart/pull/355 + ## 9.10.1 * Pass required User-Agent HTTP header on all requests diff --git a/pubspec.yaml b/pubspec.yaml index fe8a734f..62d162e6 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 9.8.0 +version: 9.11.0 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From 0d65d6032a4927d9f14a48edd3ef5733bdddf340 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Tue, 14 Mar 2023 20:30:56 -0600 Subject: [PATCH 340/390] update label workflows --- .github/workflows/label_prs.yml | 17 +++++------------ .github/workflows/require_semver_label.yml | 10 +++++++++- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/.github/workflows/label_prs.yml b/.github/workflows/label_prs.yml index d0285052..7de111ba 100644 --- a/.github/workflows/label_prs.yml +++ b/.github/workflows/label_prs.yml @@ -5,18 +5,11 @@ on: jobs: assignUnreleased: - name: Unreleased + name: Add Unreleased Label runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - name: Apply unreleased label - uses: actions/github-script@v6 + - uses: buildsville/add-remove-label@v2.0.0 with: - github-token: ${{secrets.MACHINE_GITHUB_API_TOKEN}} - script: | - github.rest.issues.addLabels({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - labels: ['unreleased'] - }) + token: ${{secrets.GITHUB_TOKEN}} + labels: Unreleased + type: add diff --git a/.github/workflows/require_semver_label.yml b/.github/workflows/require_semver_label.yml index b764baaf..7cb0feb9 100644 --- a/.github/workflows/require_semver_label.yml +++ b/.github/workflows/require_semver_label.yml @@ -11,8 +11,16 @@ jobs: mode: exactly count: 1 labels: "semver:patch, semver:minor, semver:major" + token: ${{secrets.MACHINE_GITHUB_API_TOKEN}} + add_comment: | + Add a semantic version label + semver:patch - non-breaking bug fixes or internal changes + semver:minor - non-breaking changes (additions, deprecations) + semver:major - contains changes that may break consumers - uses: mheap/github-action-required-labels@v3 with: mode: exactly count: 1 - labels: "unreleased" \ No newline at end of file + labels: "unreleased" + token: ${{secrets.MACHINE_GITHUB_API_TOKEN}} + add_comment: The unrelease label is required to track which PRs have yet to be released. \ No newline at end of file From fc6e0881edc70c49fb1f4e1b0dd6606f9f1f19fa Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Tue, 14 Mar 2023 20:42:06 -0600 Subject: [PATCH 341/390] tweak label workflow again --- .github/workflows/label_prs.yml | 15 --------------- .github/workflows/require_semver_label.yml | 16 +++++++++++++++- 2 files changed, 15 insertions(+), 16 deletions(-) delete mode 100644 .github/workflows/label_prs.yml diff --git a/.github/workflows/label_prs.yml b/.github/workflows/label_prs.yml deleted file mode 100644 index 7de111ba..00000000 --- a/.github/workflows/label_prs.yml +++ /dev/null @@ -1,15 +0,0 @@ -name: Add PR labels on open -on: - pull_request: - types: [opened] - -jobs: - assignUnreleased: - name: Add Unreleased Label - runs-on: ubuntu-latest - steps: - - uses: buildsville/add-remove-label@v2.0.0 - with: - token: ${{secrets.GITHUB_TOKEN}} - labels: Unreleased - type: add diff --git a/.github/workflows/require_semver_label.yml b/.github/workflows/require_semver_label.yml index 7cb0feb9..9f00798a 100644 --- a/.github/workflows/require_semver_label.yml +++ b/.github/workflows/require_semver_label.yml @@ -2,8 +2,22 @@ name: Require semver:* and unreleased Label on: pull_request: types: [opened, labeled, unlabeled, synchronize] + +jobs: + assignUnreleased: + name: Add Unreleased Label + runs-on: ubuntu-latest + if: github.event.action == 'opened' + steps: + - uses: buildsville/add-remove-label@v2.0.0 + with: + token: ${{secrets.GITHUB_TOKEN}} + labels: Unreleased + type: add + jobs: label: + needs: assignUnreleased runs-on: ubuntu-latest steps: - uses: mheap/github-action-required-labels@v3 @@ -23,4 +37,4 @@ jobs: count: 1 labels: "unreleased" token: ${{secrets.MACHINE_GITHUB_API_TOKEN}} - add_comment: The unrelease label is required to track which PRs have yet to be released. \ No newline at end of file + add_comment: The unrelease label is required to track which PRs have yet to be released. From fef45b8aafb2928bd2ca60547f5edf6302647fc6 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Tue, 14 Mar 2023 20:45:43 -0600 Subject: [PATCH 342/390] tweak 2 --- .github/workflows/require_semver_label.yml | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/.github/workflows/require_semver_label.yml b/.github/workflows/require_semver_label.yml index 9f00798a..87d919fa 100644 --- a/.github/workflows/require_semver_label.yml +++ b/.github/workflows/require_semver_label.yml @@ -4,22 +4,15 @@ on: types: [opened, labeled, unlabeled, synchronize] jobs: - assignUnreleased: - name: Add Unreleased Label + label: runs-on: ubuntu-latest - if: github.event.action == 'opened' steps: - uses: buildsville/add-remove-label@v2.0.0 + if: github.event.action == 'opened' with: token: ${{secrets.GITHUB_TOKEN}} labels: Unreleased type: add - -jobs: - label: - needs: assignUnreleased - runs-on: ubuntu-latest - steps: - uses: mheap/github-action-required-labels@v3 with: mode: exactly From 728e119046d82405bede2a918de165bafbf5a1ec Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Tue, 14 Mar 2023 20:52:21 -0600 Subject: [PATCH 343/390] tweak 3 --- .github/workflows/require_semver_label.yml | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/.github/workflows/require_semver_label.yml b/.github/workflows/require_semver_label.yml index 87d919fa..0a6c2afd 100644 --- a/.github/workflows/require_semver_label.yml +++ b/.github/workflows/require_semver_label.yml @@ -18,16 +18,12 @@ jobs: mode: exactly count: 1 labels: "semver:patch, semver:minor, semver:major" - token: ${{secrets.MACHINE_GITHUB_API_TOKEN}} - add_comment: | - Add a semantic version label - semver:patch - non-breaking bug fixes or internal changes - semver:minor - non-breaking changes (additions, deprecations) - semver:major - contains changes that may break consumers + token: ${{secrets.GITHUB_TOKEN}} + add_comment: Add a semantic version label (semver:patch semver:minor semver:major) - uses: mheap/github-action-required-labels@v3 with: mode: exactly count: 1 labels: "unreleased" - token: ${{secrets.MACHINE_GITHUB_API_TOKEN}} + token: ${{secrets.GITHUB_TOKEN}} add_comment: The unrelease label is required to track which PRs have yet to be released. From d11724e8ec14d7d592175e11e5cd5fe3025be91b Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Tue, 14 Mar 2023 21:11:03 -0600 Subject: [PATCH 344/390] comment out required semver label for now --- .github/workflows/require_semver_label.yml | 28 +++++++++++----------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/.github/workflows/require_semver_label.yml b/.github/workflows/require_semver_label.yml index 0a6c2afd..0ac40231 100644 --- a/.github/workflows/require_semver_label.yml +++ b/.github/workflows/require_semver_label.yml @@ -13,17 +13,17 @@ jobs: token: ${{secrets.GITHUB_TOKEN}} labels: Unreleased type: add - - uses: mheap/github-action-required-labels@v3 - with: - mode: exactly - count: 1 - labels: "semver:patch, semver:minor, semver:major" - token: ${{secrets.GITHUB_TOKEN}} - add_comment: Add a semantic version label (semver:patch semver:minor semver:major) - - uses: mheap/github-action-required-labels@v3 - with: - mode: exactly - count: 1 - labels: "unreleased" - token: ${{secrets.GITHUB_TOKEN}} - add_comment: The unrelease label is required to track which PRs have yet to be released. + # - uses: mheap/github-action-required-labels@v3 + # with: + # mode: exactly + # count: 1 + # labels: "semver:patch, semver:minor, semver:major" + # token: ${{secrets.GITHUB_TOKEN}} + # add_comment: Add a semantic version label (semver:patch semver:minor semver:major) + # - uses: mheap/github-action-required-labels@v3 + # with: + # mode: exactly + # count: 1 + # labels: "unreleased" + # token: ${{secrets.GITHUB_TOKEN}} + # add_comment: The unrelease label is required to track which PRs have yet to be released. From 7b4563a0a5468aecdf3e0004a714f767a9b1d596 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Wed, 15 Mar 2023 08:27:02 -0600 Subject: [PATCH 345/390] only do manual release action --- .github/workflows/release_unreleased_prs.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release_unreleased_prs.yml b/.github/workflows/release_unreleased_prs.yml index 9b33737d..97f16aa3 100644 --- a/.github/workflows/release_unreleased_prs.yml +++ b/.github/workflows/release_unreleased_prs.yml @@ -4,9 +4,12 @@ name: Release unreleased PRs # See https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#running-your-workflow-when-a-pull-request-merges on: workflow_dispatch: - pull_request: - types: - - closed + + # Comment out for now and just use manual kickoff of the action + # until we can figure our permissions + # pull_request: + # types: + # - closed jobs: release: From 44cc3580172f4b8b5711c852ae1d877e8cc359bf Mon Sep 17 00:00:00 2001 From: Ricardo Amador <32242716+ricardoamador@users.noreply.github.com> Date: Tue, 21 Mar 2023 14:56:14 -0700 Subject: [PATCH 346/390] Add updated methods to get teams and team membership for a user (#362) * Add updated methods to get teams and team membership for a user. * Fix formatting * Add tests and cleanup the orgs service. * Formatting. * Update formatting. * Cleanup error codes. * Formatting. --- lib/src/common/orgs_service.dart | 244 ++++++++++++++++++++++--------- test/unit/orgs_service_test.dart | 175 ++++++++++++++++++++++ 2 files changed, 349 insertions(+), 70 deletions(-) create mode 100644 test/unit/orgs_service_test.dart diff --git a/lib/src/common/orgs_service.dart b/lib/src/common/orgs_service.dart index c0774bda..d793a8b9 100644 --- a/lib/src/common/orgs_service.dart +++ b/lib/src/common/orgs_service.dart @@ -21,8 +21,11 @@ class OrganizationsService extends Service { if (userName == null) { requestPath = '/user/orgs'; } - return PaginationHelper(github) - .objects('GET', requestPath, Organization.fromJson); + return PaginationHelper(github).objects( + 'GET', + requestPath, + Organization.fromJson, + ); } /// Fetches the organization specified by [name]. @@ -31,7 +34,7 @@ class OrganizationsService extends Service { Future get(String? name) => github.getJSON('/orgs/$name', convert: Organization.fromJson, statusCode: StatusCodes.OK, fail: (http.Response response) { - if (response.statusCode == 404) { + if (response.statusCode == StatusCodes.NOT_FOUND) { throw OrganizationNotFound(github, name); } }); @@ -47,13 +50,15 @@ class OrganizationsService extends Service { /// Edits an Organization /// /// API docs: https://developer.github.com/v3/orgs/#edit-an-organization - Future edit(String org, - {String? billingEmail, - String? company, - String? email, - String? location, - String? name, - String? description}) { + Future edit( + String org, { + String? billingEmail, + String? company, + String? email, + String? location, + String? name, + String? description, + }) { final map = createNonNullMap({ 'billing_email': billingEmail, 'company': company, @@ -64,7 +69,7 @@ class OrganizationsService extends Service { }); return github.postJSON('/orgs/$org', - statusCode: 200, + statusCode: StatusCodes.OK, convert: Organization.fromJson, body: GitHubJson.encode(map)); } @@ -73,8 +78,11 @@ class OrganizationsService extends Service { /// /// API docs: https://developer.github.com/v3/orgs/teams/#list-teams Stream listTeams(String orgName) { - return PaginationHelper(github) - .objects('GET', '/orgs/$orgName/teams', Team.fromJson); + return PaginationHelper(github).objects( + 'GET', + '/orgs/$orgName/teams', + Team.fromJson, + ); } /// Gets the team specified by the [teamId]. @@ -82,14 +90,34 @@ class OrganizationsService extends Service { /// API docs: https://developer.github.com/v3/orgs/teams/#get-team Future getTeam(int teamId) { return github.getJSON('/teams/$teamId', - convert: Organization.fromJson, statusCode: 200) as Future; + convert: Organization.fromJson, + statusCode: StatusCodes.OK) as Future; + } + + /// Gets the team specified by its [teamName]. + /// + /// https://docs.github.com/en/rest/teams/teams?apiVersion=2022-11-28#get-a-team-by-name + Future getTeamByName( + String orgName, + String teamName, + ) { + return github.getJSON( + 'orgs/$orgName/teams/$teamName', + convert: Team.fromJson, + statusCode: StatusCodes.OK, + ); } /// Creates a Team. /// /// API docs: https://developer.github.com/v3/orgs/teams/#create-team - Future createTeam(String org, String name, - {String? description, List? repos, String? permission}) { + Future createTeam( + String org, + String name, { + String? description, + List? repos, + String? permission, + }) { final map = createNonNullMap({ 'name': name, 'description': description, @@ -98,14 +126,20 @@ class OrganizationsService extends Service { }); return github.postJSON('/orgs/$org/teams', - statusCode: 201, convert: Team.fromJson, body: GitHubJson.encode(map)); + statusCode: StatusCodes.CREATED, + convert: Team.fromJson, + body: GitHubJson.encode(map)); } /// Edits a Team. /// /// API docs: https://developer.github.com/v3/orgs/teams/#edit-team - Future editTeam(int teamId, String name, - {String? description, String? permission}) { + Future editTeam( + int teamId, + String name, { + String? description, + String? permission, + }) { final map = createNonNullMap({ 'name': name, 'description': description, @@ -114,7 +148,7 @@ class OrganizationsService extends Service { return github.postJSON( '/teams/$teamId', - statusCode: 200, + statusCode: StatusCodes.OK, convert: Team.fromJson, body: GitHubJson.encode(map), ); @@ -125,7 +159,7 @@ class OrganizationsService extends Service { /// API docs: https://developer.github.com/v3/orgs/teams/#delete-team Future deleteTeam(int teamId) { return github.request('DELETE', '/teams/$teamId').then((response) { - return response.statusCode == 204; + return response.statusCode == StatusCodes.NO_CONTENT; }); } @@ -133,8 +167,11 @@ class OrganizationsService extends Service { /// /// API docs: https://developer.github.com/v3/orgs/teams/#list-team-members Stream listTeamMembers(int teamId) { - return PaginationHelper(github) - .objects('GET', '/teams/$teamId/members', TeamMember.fromJson); + return PaginationHelper(github).objects( + 'GET', + '/teams/$teamId/members', + TeamMember.fromJson, + ); } Future getTeamMemberStatus(int teamId, String user) { @@ -143,85 +180,129 @@ class OrganizationsService extends Service { }); } - /// Returns the membership status for a user in a team. + /// Returns the membership status for a [user] in a team with [teamId]. /// /// API docs: https://developer.github.com/v3/orgs/teams/#get-team-membership - Future getTeamMembership(int teamId, String user) { - final completer = Completer(); - - github - .getJSON( - '/teams/$teamId/memberships/$user', - statusCode: 200, - fail: (http.Response response) { - if (response.statusCode == 404) { - completer.complete(TeamMembershipState(null)); - } else { - github.handleStatusCode(response); - } - }, - convert: (dynamic json) => TeamMembershipState(json['state']), - ) - .then(completer.complete); + Future getTeamMembership( + int teamId, + String user, + ) { + return github.getJSON( + '/teams/$teamId/memberships/$user', + statusCode: StatusCodes.OK, + convert: (dynamic json) => TeamMembershipState( + json['state'], + ), + ); + } - return completer.future; + /// Returns the membership status for [user] in [teamName] given the [orgName]. + /// + /// Note that this will throw on NotFound if the user is not a member of the + /// team. Adding a fail function to set the value does not help unless you + /// throw out of the fail function. + Future getTeamMembershipByName( + String orgName, + String teamName, + String user, + ) { + return github.getJSON( + '/orgs/$orgName/teams/$teamName/memberships/$user', + statusCode: StatusCodes.OK, + convert: (dynamic json) => TeamMembershipState( + json['state'], + ), + ); } /// Invites a user to the specified team. /// /// API docs: https://developer.github.com/v3/teams/members/#add-or-update-team-membership - Future addTeamMembership(int teamId, String user) async { - final response = await github - .request('PUT', '/teams/$teamId/memberships/$user', statusCode: 200); + Future addTeamMembership( + int teamId, + String user, + ) async { + final response = await github.request( + 'PUT', + '/teams/$teamId/memberships/$user', + statusCode: StatusCodes.OK, + ); return TeamMembershipState(jsonDecode(response.body)['state']); } /// Removes a user from the specified team. /// /// API docs: https://developer.github.com/v3/orgs/teams/#get-team-membership - Future removeTeamMembership(int teamId, String user) { - return github.request('DELETE', '/teams/$teamId/memberships/$user', - statusCode: 204); + Future removeTeamMembership( + int teamId, + String user, + ) { + return github.request( + 'DELETE', + '/teams/$teamId/memberships/$user', + statusCode: StatusCodes.NO_CONTENT, + ); } /// Lists the repositories that the specified team has access to. /// /// API docs: https://developer.github.com/v3/orgs/teams/#list-team-repos Stream listTeamRepositories(int teamId) { - return PaginationHelper(github) - .objects('GET', '/teams/$teamId/repos', Repository.fromJson); + return PaginationHelper(github).objects( + 'GET', + '/teams/$teamId/repos', + Repository.fromJson, + ); } /// Checks if a team manages the specified repository. /// /// API docs: https://developer.github.com/v3/orgs/teams/#get-team-repo - Future isTeamRepository(int teamId, RepositorySlug slug) { + Future isTeamRepository( + int teamId, + RepositorySlug slug, + ) { return github - .request('GET', '/teams/$teamId/repos/${slug.fullName}') + .request( + 'GET', + '/teams/$teamId/repos/${slug.fullName}', + ) .then((response) { - return response.statusCode == 204; + return response.statusCode == StatusCodes.NO_CONTENT; }); } /// Adds a repository to be managed by the specified team. /// /// API docs: https://developer.github.com/v3/orgs/teams/#add-team-repo - Future addTeamRepository(int teamId, RepositorySlug slug) { + Future addTeamRepository( + int teamId, + RepositorySlug slug, + ) { return github - .request('PUT', '/teams/$teamId/repos/${slug.fullName}') + .request( + 'PUT', + '/teams/$teamId/repos/${slug.fullName}', + ) .then((response) { - return response.statusCode == 204; + return response.statusCode == StatusCodes.NO_CONTENT; }); } /// Removes a repository from being managed by the specified team. /// /// API docs: https://developer.github.com/v3/orgs/teams/#remove-team-repo - Future removeTeamRepository(int teamId, RepositorySlug slug) { + Future removeTeamRepository( + int teamId, + RepositorySlug slug, + ) { return github - .request('DELETE', '/teams/$teamId/repos/${slug.fullName}') + .request( + 'DELETE', + '/teams/$teamId/repos/${slug.fullName}', + ) .then((response) { - return response.statusCode == 204; + return response.statusCode == StatusCodes.NO_CONTENT; }); } @@ -229,16 +310,22 @@ class OrganizationsService extends Service { /// /// API docs: https://developer.github.com/v3/orgs/teams/#list-user-teams Stream listUserTeams() { - return PaginationHelper(github) - .objects('GET', '/user/teams', Team.fromJson); + return PaginationHelper(github).objects( + 'GET', + '/user/teams', + Team.fromJson, + ); } /// Lists all of the users in an organization /// /// API docs: https://developer.github.com/v3/orgs/teams/#list-user-teams Stream listUsers(String org) { - return PaginationHelper(github) - .objects('GET', '/orgs/$org/members', User.fromJson); + return PaginationHelper(github).objects( + 'GET', + '/orgs/$org/members', + User.fromJson, + ); } /// Lists the hooks for the specified organization. @@ -252,14 +339,20 @@ class OrganizationsService extends Service { /// Fetches a single hook by [id]. /// /// API docs: https://developer.github.com/v3/orgs/hooks/#get-single-hook - Future getHook(String org, int id) => + Future getHook( + String org, + int id, + ) => github.getJSON('/orgs/$org/hooks/$id', convert: (dynamic i) => Hook.fromJson(i)..repoName = org); /// Creates an organization hook based on the specified [hook]. /// /// API docs: https://developer.github.com/v3/orgs/hooks/#create-a-hook - Future createHook(String org, CreateHook hook) { + Future createHook( + String org, + CreateHook hook, + ) { return github.postJSON('/orgs/$org/hooks', convert: (Map i) => Hook.fromJson(i)..repoName = org, body: GitHubJson.encode(hook)); @@ -270,16 +363,27 @@ class OrganizationsService extends Service { /// Pings the organization hook. /// /// API docs: https://developer.github.com/v3/orgs/hooks/#ping-a-hook - Future pingHook(String org, int id) { + Future pingHook( + String org, + int id, + ) { return github - .request('POST', '/orgs/$org/hooks/$id/pings') - .then((response) => response.statusCode == 204); + .request( + 'POST', + '/orgs/$org/hooks/$id/pings', + ) + .then((response) => response.statusCode == StatusCodes.NO_CONTENT); } /// Deletes the specified hook. Future deleteHook(String org, int id) { - return github.request('DELETE', '/orgs/$org/hooks/$id').then((response) { - return response.statusCode == 204; + return github + .request( + 'DELETE', + '/orgs/$org/hooks/$id', + ) + .then((response) { + return response.statusCode == StatusCodes.NO_CONTENT; }); } } diff --git a/test/unit/orgs_service_test.dart b/test/unit/orgs_service_test.dart new file mode 100644 index 00000000..04fff9e1 --- /dev/null +++ b/test/unit/orgs_service_test.dart @@ -0,0 +1,175 @@ +import 'dart:io'; + +import 'package:github/github.dart'; +import 'package:http/http.dart'; +import 'package:http/testing.dart'; +import 'package:test/test.dart'; + +void main() { + const teamResponse = ''' + { + "name": "flutter-hackers", + "id": 1753404, + "slug": "flutter-hackers", + "permission": "pull", + "members_count": 255, + "repos_count": 34, + "organization": { + "login": "flutter", + "id": 14101776, + "url": "https://api.github.com/orgs/flutter", + "avatar_url": "https://avatars.githubusercontent.com/u/14101776?v=4", + "name": "Flutter", + "company": null, + "blog": "https://flutter.dev", + "location": null, + "email": null, + "public_repos": 30, + "public_gists": 0, + "followers": 6642, + "following": 0, + "html_url": "https://github.com/flutter", + "created_at": "2015-09-03T00:37:37Z", + "updated_at": "2022-03-17T17:35:40Z" + } + } +'''; + + const teamNotFoundResponse = ''' + { + "message": "Not Found", + "documentation_url": "https://docs.github.com/rest/reference/teams#list-teams" + } + '''; + + const activeMemberResponse = ''' + { + "state": "active", + "role": "member", + "url": "https://api.github.com/organizations/14101776/team/1753404/memberships/ricardoamador" + } + '''; + + const pendingMemberResponse = ''' + { + "state": "pending", + "role": "member", + "url": "https://api.github.com/organizations/14101776/team/1753404/memberships/ricardoamador" + } + '''; + + group(GitHub, () { + test('getTeamByName is successful', () async { + Request? request; + + final client = MockClient((r) async { + request = r; + return Response(teamResponse, HttpStatus.ok); + }); + + final github = GitHub(client: client); + final organizationsService = OrganizationsService(github); + + final team = await organizationsService.getTeamByName( + 'flutter', 'flutter-hackers'); + expect(team.name, 'flutter-hackers'); + expect(team.id, 1753404); + expect(team.organization!.login, 'flutter'); + expect(request, isNotNull); + }); + + test('getTeamByName not found', () async { + Request? request; + + final headers = {}; + headers['content-type'] = 'application/json'; + + final client = MockClient((r) async { + request = r; + return Response(teamNotFoundResponse, HttpStatus.notFound, + headers: headers); + }); + + final github = GitHub(client: client); + final organizationsService = OrganizationsService(github); + + // ignore: omit_local_variable_types + expect( + () async => organizationsService.getTeamByName( + 'flutter', 'flutter-programmers'), + throwsException); + expect(request, isNull); + }); + + test('getTeamMembership using string name, active', () async { + Request? request; + + final client = MockClient((r) async { + request = r; + return Response(activeMemberResponse, HttpStatus.ok); + }); + + final github = GitHub(client: client); + final organizationsService = OrganizationsService(github); + + final teamMembershipState = + await organizationsService.getTeamMembershipByName( + 'flutter', + 'flutter-hackers', + 'ricardoamador', + ); + expect(teamMembershipState.isActive, isTrue); + expect(request, isNotNull); + }); + + test('getTeamMembership using string name, pending', () async { + Request? request; + + final client = MockClient((r) async { + request = r; + return Response(pendingMemberResponse, HttpStatus.ok); + }); + + final github = GitHub(client: client); + final organizationsService = OrganizationsService(github); + + final teamMembershipState = + await organizationsService.getTeamMembershipByName( + 'flutter', + 'flutter-hackers', + 'ricardoamador', + ); + expect(teamMembershipState.isActive, isFalse); + expect(teamMembershipState.isPending, isTrue); + expect(request, isNotNull); + }); + + test('getTeamMembership using string name, null', () async { + Request? request; + + final headers = {}; + headers['content-type'] = 'application/json'; + + final client = MockClient((r) async { + request = r; + return Response( + teamNotFoundResponse, + HttpStatus.notFound, + headers: headers, + ); + }); + + final github = GitHub(client: client); + final organizationsService = OrganizationsService(github); + + expect( + () async => organizationsService.getTeamMembershipByName( + 'flutter', + 'flutter-hackers', + 'garfield', + ), + throwsException); + expect(request, isNull); + }); + }); +} From 043e0edcd65e9a608ac30e5d1646baa2d512383b Mon Sep 17 00:00:00 2001 From: Ian Hickson Date: Fri, 31 Mar 2023 10:26:05 -0700 Subject: [PATCH 347/390] Avoid printing messages to the console. (#365) --- CONTRIBUTING.md | 12 ++++++++++++ lib/src/common/github.dart | 3 +-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ac480095..15f2d03b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -30,6 +30,18 @@ GitHub.dart is committed to efficiency as much as possible. If your code is not Pull Request rejections are not a bad thing. It just means you need to fix something. Perhaps it is important to define 'rejection' as it is used in this case. A rejection is when a GitHub.dart committer comments on a Pull Request with a comment like 'rejected due to incorrect formatting'. +## Tests + +To run the complete test suite you will need to install +`octokit/fixtures-server`. + +``` +npm install --global @octokit/fixtures-server +``` + +Tests can be run using `make test`, which will start up a local mock +GitHub and execute tests against it using your localhost port 3000. + ## Contacting Us - IRC: `#directcode on irc.esper.net and irc.freenode.net` diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index 0aead228..62358bd8 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -433,7 +433,6 @@ class GitHub { /// Internal method to handle status codes /// Never handleStatusCode(http.Response response) { - print(response.body); String? message = ''; List>? errors; if (response.headers['content-type']!.contains('application/json')) { @@ -450,7 +449,7 @@ class GitHub { } } } catch (ex) { - print(ex); + throw UnknownError(this, ex.toString()); } } switch (response.statusCode) { From a3081681da68383d9a5f18ef3502f47f7144e7d8 Mon Sep 17 00:00:00 2001 From: Ian Hickson Date: Mon, 17 Apr 2023 07:50:18 -0700 Subject: [PATCH 348/390] Add support for Timeline events (#366) This is primarily based on the timeline API response schema (using code generated from the schema by the script in `tool/process_github_schema.dart`). Where I could find existing model classes compatible with bits of that schema I tried to re-use them, extending them as necessary. I took some liberties where the GitHub API documentation was vague, contradictory, or otherwise dubious. The comments on the new code are based on the comments in the response schema. They're not super helpful, if I'm honest. I found that some of the model classes were inconsistent in various ways and tried to clean up the code near what I touched to be more consistent. For example, I made a bunch of fields on a bunch of model classes mutable where previously they were `final`, to be more consistent with other model classes. I also moved some constructors to be above their corresponding fields to be more consistent with other code that already did that. --- CHANGELOG.md | 4 + CONTRIBUTING.md | 8 + lib/src/common.dart | 2 + lib/src/common/issues_service.dart | 11 + lib/src/common/model/issues.dart | 82 ++- lib/src/common/model/issues.g.dart | 51 ++ lib/src/common/model/orgs.dart | 173 +++-- lib/src/common/model/orgs.g.dart | 55 +- lib/src/common/model/pulls.dart | 211 +++++- lib/src/common/model/pulls.g.dart | 83 +++ lib/src/common/model/reaction.dart | 49 +- lib/src/common/model/reaction.g.dart | 28 + lib/src/common/model/repos.dart | 557 +++++++++++---- lib/src/common/model/repos.g.dart | 138 ++++ lib/src/common/model/repos_commits.dart | 39 +- lib/src/common/model/repos_commits.g.dart | 12 + lib/src/common/model/timeline.dart | 582 ++++++++++++++++ lib/src/common/model/timeline.g.dart | 671 +++++++++++++++++++ lib/src/common/model/timeline_support.dart | 562 ++++++++++++++++ lib/src/common/model/timeline_support.g.dart | 409 +++++++++++ lib/src/common/model/users.dart | 73 +- lib/src/common/model/users.g.dart | 60 ++ tool/process_github_schema.dart | 621 +++++++++++++++++ 23 files changed, 4264 insertions(+), 217 deletions(-) create mode 100644 lib/src/common/model/timeline.dart create mode 100644 lib/src/common/model/timeline.g.dart create mode 100644 lib/src/common/model/timeline_support.dart create mode 100644 lib/src/common/model/timeline_support.g.dart create mode 100644 tool/process_github_schema.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index 7456f7d4..df8472a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 9.12.0 + +* Add support for issue and PR timeline events via `Issue.listTimeline`. + ## 9.11.0 * expose IssueLabel.description; update labels REST APIs by @devoncarew in https://github.com/SpinlockLabs/github.dart/pull/355 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 15f2d03b..47a2036f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -30,6 +30,14 @@ GitHub.dart is committed to efficiency as much as possible. If your code is not Pull Request rejections are not a bad thing. It just means you need to fix something. Perhaps it is important to define 'rejection' as it is used in this case. A rejection is when a GitHub.dart committer comments on a Pull Request with a comment like 'rejected due to incorrect formatting'. +## Generated code + +To regenerate the JSON logic for the models, run: + +``` +dart run build_runner build -d +``` + ## Tests To run the complete test suite you will need to install diff --git a/lib/src/common.dart b/lib/src/common.dart index f8be345c..8ec0f7ae 100644 --- a/lib/src/common.dart +++ b/lib/src/common.dart @@ -31,6 +31,8 @@ export 'package:github/src/common/model/repos_releases.dart'; export 'package:github/src/common/model/repos_stats.dart'; export 'package:github/src/common/model/repos_statuses.dart'; export 'package:github/src/common/model/search.dart'; +export 'package:github/src/common/model/timeline.dart'; +export 'package:github/src/common/model/timeline_support.dart'; export 'package:github/src/common/model/users.dart'; export 'package:github/src/common/orgs_service.dart'; export 'package:github/src/common/pulls_service.dart'; diff --git a/lib/src/common/issues_service.dart b/lib/src/common/issues_service.dart index 9d8eb4ab..3b5e013f 100644 --- a/lib/src/common/issues_service.dart +++ b/lib/src/common/issues_service.dart @@ -432,4 +432,15 @@ class IssuesService extends Service { .request('DELETE', '/repos/${slug.fullName}/milestones/$number') .then((response) => response.statusCode == StatusCodes.NO_CONTENT); } + + /// Lists all timeline events for an issue. + /// + /// API docs: https://docs.github.com/en/rest/issues/timeline?apiVersion=2022-11-28 + Stream listTimeline(RepositorySlug slug, int issueNumber) { + return PaginationHelper(github).objects( + 'GET', + '/repos/${slug.fullName}/issues/$issueNumber/timeline', + TimelineEvent.fromJson, + ); + } } diff --git a/lib/src/common/model/issues.dart b/lib/src/common/model/issues.dart index 6746a305..12b40172 100644 --- a/lib/src/common/model/issues.dart +++ b/lib/src/common/model/issues.dart @@ -1,5 +1,4 @@ import 'package:github/src/common.dart'; -import 'package:github/src/common/model/users.dart'; import 'package:json_annotation/json_annotation.dart'; part 'issues.g.dart'; @@ -26,6 +25,24 @@ class Issue { this.updatedAt, this.body = '', this.closedBy, + + // Properties from the Timeline API + this.activeLockReason, + this.authorAssociation, + this.bodyHtml, + this.bodyText, + this.commentsUrl, + this.draft, + this.eventsUrl, + this.labelsUrl, + this.locked, + this.nodeId, + this.performedViaGithubApp, + this.reactions, + this.repository, + this.repositoryUrl, + this.stateReason, + this.timelineUrl, }) { if (labels != null) { this.labels = labels; @@ -89,6 +106,46 @@ class Issue { bool get isOpen => state == 'open'; bool get isClosed => state == 'closed'; + // The following properties were added to support the Timeline API. + + String? activeLockReason; + + /// How the author is associated with the repository. + /// + /// Example: `OWNER` + String? authorAssociation; + + String? bodyHtml; + + String? bodyText; + + String? commentsUrl; + + bool? draft; + + String? eventsUrl; + + String? labelsUrl; + + bool? locked; + + String? nodeId; + + GitHubApp? performedViaGithubApp; + + ReactionRollup? reactions; + + Repository? repository; + + String? repositoryUrl; + + /// The reason for the current state + /// + /// Example: `not_planned` + String? stateReason; + + String? timelineUrl; + factory Issue.fromJson(Map input) => _$IssueFromJson(input); Map toJson() => _$IssueToJson(this); } @@ -204,6 +261,13 @@ class Milestone { this.createdAt, this.updatedAt, this.dueOn, + + // Properties from the Timeline API + this.closedAt, + this.htmlUrl, + this.labelsUrl, + this.nodeId, + this.url, }); /// Unique Identifier for Milestone @@ -241,6 +305,22 @@ class Milestone { /// The due date for this milestone DateTime? dueOn; + // The following properties were added to support the Timeline API. + + DateTime? closedAt; + + /// Example: `https://github.com/octocat/Hello-World/milestones/v1.0` + String? htmlUrl; + + /// Example: `https://api.github.com/repos/octocat/Hello-World/milestones/1/labels` + String? labelsUrl; + + /// Example: `MDk6TWlsZXN0b25lMTAwMjYwNA==` + String? nodeId; + + /// Example: `https://api.github.com/repos/octocat/Hello-World/milestones/1` + String? url; + factory Milestone.fromJson(Map input) => _$MilestoneFromJson(input); Map toJson() => _$MilestoneToJson(this); diff --git a/lib/src/common/model/issues.g.dart b/lib/src/common/model/issues.g.dart index 0a027f67..40bbfa94 100644 --- a/lib/src/common/model/issues.g.dart +++ b/lib/src/common/model/issues.g.dart @@ -47,6 +47,29 @@ Issue _$IssueFromJson(Map json) => Issue( closedBy: json['closed_by'] == null ? null : User.fromJson(json['closed_by'] as Map), + activeLockReason: json['active_lock_reason'] as String?, + authorAssociation: json['author_association'] as String?, + bodyHtml: json['body_html'] as String?, + bodyText: json['body_text'] as String?, + commentsUrl: json['comments_url'] as String?, + draft: json['draft'] as bool?, + eventsUrl: json['events_url'] as String?, + labelsUrl: json['labels_url'] as String?, + locked: json['locked'] as bool?, + nodeId: json['node_id'] as String?, + performedViaGithubApp: json['performed_via_github_app'] == null + ? null + : GitHubApp.fromJson( + json['performed_via_github_app'] as Map), + reactions: json['reactions'] == null + ? null + : ReactionRollup.fromJson(json['reactions'] as Map), + repository: json['repository'] == null + ? null + : Repository.fromJson(json['repository'] as Map), + repositoryUrl: json['repository_url'] as String?, + stateReason: json['state_reason'] as String?, + timelineUrl: json['timeline_url'] as String?, ); Map _$IssueToJson(Issue instance) => { @@ -68,6 +91,22 @@ Map _$IssueToJson(Issue instance) => { 'updated_at': instance.updatedAt?.toIso8601String(), 'body': instance.body, 'closed_by': instance.closedBy, + 'active_lock_reason': instance.activeLockReason, + 'author_association': instance.authorAssociation, + 'body_html': instance.bodyHtml, + 'body_text': instance.bodyText, + 'comments_url': instance.commentsUrl, + 'draft': instance.draft, + 'events_url': instance.eventsUrl, + 'labels_url': instance.labelsUrl, + 'locked': instance.locked, + 'node_id': instance.nodeId, + 'performed_via_github_app': instance.performedViaGithubApp, + 'reactions': instance.reactions, + 'repository': instance.repository, + 'repository_url': instance.repositoryUrl, + 'state_reason': instance.stateReason, + 'timeline_url': instance.timelineUrl, }; IssueRequest _$IssueRequestFromJson(Map json) => IssueRequest( @@ -172,6 +211,13 @@ Milestone _$MilestoneFromJson(Map json) => Milestone( dueOn: json['due_on'] == null ? null : DateTime.parse(json['due_on'] as String), + closedAt: json['closed_at'] == null + ? null + : DateTime.parse(json['closed_at'] as String), + htmlUrl: json['html_url'] as String?, + labelsUrl: json['labels_url'] as String?, + nodeId: json['node_id'] as String?, + url: json['url'] as String?, ); Map _$MilestoneToJson(Milestone instance) => { @@ -186,6 +232,11 @@ Map _$MilestoneToJson(Milestone instance) => { 'created_at': instance.createdAt?.toIso8601String(), 'updated_at': instance.updatedAt?.toIso8601String(), 'due_on': instance.dueOn?.toIso8601String(), + 'closed_at': instance.closedAt?.toIso8601String(), + 'html_url': instance.htmlUrl, + 'labels_url': instance.labelsUrl, + 'node_id': instance.nodeId, + 'url': instance.url, }; CreateMilestone _$CreateMilestoneFromJson(Map json) => diff --git a/lib/src/common/model/orgs.dart b/lib/src/common/model/orgs.dart index 21f7b417..5a26bb2c 100644 --- a/lib/src/common/model/orgs.dart +++ b/lib/src/common/model/orgs.dart @@ -24,57 +24,57 @@ class Organization { }); /// Organization Login - final String? login; + String? login; /// Organization ID - final int? id; + int? id; /// Url to Organization Profile @JsonKey(name: 'html_url') - final String? htmlUrl; + String? htmlUrl; /// Url to the Organization Avatar @JsonKey(name: 'avatar_url') - final String? avatarUrl; + String? avatarUrl; /// Organization Name - final String? name; + String? name; /// Organization Company - final String? company; + String? company; /// Organization Blog - final String? blog; + String? blog; /// Organization Location - final String? location; + String? location; /// Organization Email - final String? email; + String? email; /// Number of Public Repositories @JsonKey(name: 'public_repos') - final int? publicReposCount; + int? publicReposCount; /// Number of Public Gists @JsonKey(name: 'public_gists') - final int? publicGistsCount; + int? publicGistsCount; /// Number of Followers @JsonKey(name: 'followers') - final int? followersCount; + int? followersCount; /// Number of People this Organization is Following @JsonKey(name: 'following') - final int? followingCount; + int? followingCount; /// Time this organization was created @JsonKey(name: 'created_at') - final DateTime? createdAt; + DateTime? createdAt; /// Time this organization was updated @JsonKey(name: 'updated_at') - final DateTime? updatedAt; + DateTime? updatedAt; factory Organization.fromJson(Map input) => _$OrganizationFromJson(input); @@ -88,8 +88,9 @@ class OrganizationMembership { this.state, this.organization, }); - final String? state; - final Organization? organization; + + String? state; + Organization? organization; factory OrganizationMembership.fromJson(Map input) { return _$OrganizationMembershipFromJson(input); @@ -98,49 +99,139 @@ class OrganizationMembership { } /// Model class for a GitHub team. +/// +/// Different end-points populate different sets of properties. +/// +/// Groups of organization members that gives permissions on specified repositories. @JsonSerializable() class Team { Team({ - this.name, + this.description, + this.htmlUrl, this.id, - this.permission, + this.ldapDn, this.membersCount, - this.reposCount, + this.membersUrl, + this.name, + this.nodeId, this.organization, + this.parent, + this.permission, + this.permissions, + this.privacy, + this.reposCount, + this.repositoriesUrl, + this.slug, + this.url, }); - /// Team Name - final String? name; + /// Description of the team + /// + /// Example: `A great team.` + String? description; - /// Team ID - final int? id; + /// Format: uri + /// + /// Example: `https://github.com/orgs/rails/teams/core` + String? htmlUrl; - /// Team Permission - final String? permission; + /// Unique identifier of the team + /// + /// Example: `1` + int? id; + + /// Distinguished Name (DN) that team maps to within LDAP environment + /// + /// Example: `uid=example,ou=users,dc=github,dc=com` + String? ldapDn; /// Number of Members @JsonKey(name: 'members_count') - final int? membersCount; + int? membersCount; + + /// Example: `https://api.github.com/organizations/1/team/1/members{/member}` + String? membersUrl; + + /// Name of the team + /// + /// Example: `Justice League` + String? name; + + /// Example: `MDQ6VGVhbTE=` + String? nodeId; + + /// Organization + Organization? organization; + + /// Team Simple + /// + /// Groups of organization members that gives permissions on specified repositories. + Team? parent; + + /// Permission that the team will have for its repositories + /// + /// Example: `admin` + String? permission; + + Permissions? permissions; + + /// The level of privacy this team should have + /// + /// Example: `closed` + String? privacy; /// Number of Repositories @JsonKey(name: 'repos_count') - final int? reposCount; + int? reposCount; - /// Organization - final Organization? organization; + /// Format: uri + /// + /// Example: `https://api.github.com/organizations/1/team/1/repos` + String? repositoriesUrl; + + /// Example: `justice-league` + String? slug; + + /// URL for the team + /// + /// Format: uri + /// + /// Example: `https://api.github.com/organizations/1/team/1` + String? url; - factory Team.fromJson(Map input) { - return _$TeamFromJson(input); - } Map toJson() => _$TeamToJson(this); + + factory Team.fromJson(Map input) => _$TeamFromJson(input); +} + +@JsonSerializable() +class Permissions { + Permissions({ + this.admin, + this.maintain, + this.pull, + this.push, + this.triage, + }); + + bool? admin; + bool? maintain; + bool? pull; + bool? push; + bool? triage; + + Map toJson() => _$PermissionsToJson(this); + + factory Permissions.fromJson(Map input) => + _$PermissionsFromJson(input); } /// Model class for the team membership state. class TeamMembershipState { - final String? name; - TeamMembershipState(this.name); + String? name; + bool get isPending => name == 'pending'; bool get isActive => name == 'active'; bool get isInactive => name == null; @@ -158,25 +249,25 @@ class TeamMember { this.htmlUrl}); /// Member Username - final String? login; + String? login; /// Member ID - final int? id; + int? id; /// Url to Member Avatar @JsonKey(name: 'avatar_url') - final String? avatarUrl; + String? avatarUrl; /// Member Type - final String? type; + String? type; /// If the member is a site administrator @JsonKey(name: 'site_admin') - final bool? siteAdmin; + bool? siteAdmin; /// Profile of the Member @JsonKey(name: 'html_url') - final String? htmlUrl; + String? htmlUrl; factory TeamMember.fromJson(Map input) { return _$TeamMemberFromJson(input); diff --git a/lib/src/common/model/orgs.g.dart b/lib/src/common/model/orgs.g.dart index 0e19f2cf..c32f6702 100644 --- a/lib/src/common/model/orgs.g.dart +++ b/lib/src/common/model/orgs.g.dart @@ -64,23 +64,66 @@ Map _$OrganizationMembershipToJson( }; Team _$TeamFromJson(Map json) => Team( - name: json['name'] as String?, + description: json['description'] as String?, + htmlUrl: json['html_url'] as String?, id: json['id'] as int?, - permission: json['permission'] as String?, + ldapDn: json['ldap_dn'] as String?, membersCount: json['members_count'] as int?, - reposCount: json['repos_count'] as int?, + membersUrl: json['members_url'] as String?, + name: json['name'] as String?, + nodeId: json['node_id'] as String?, organization: json['organization'] == null ? null : Organization.fromJson(json['organization'] as Map), + parent: json['parent'] == null + ? null + : Team.fromJson(json['parent'] as Map), + permission: json['permission'] as String?, + permissions: json['permissions'] == null + ? null + : Permissions.fromJson(json['permissions'] as Map), + privacy: json['privacy'] as String?, + reposCount: json['repos_count'] as int?, + repositoriesUrl: json['repositories_url'] as String?, + slug: json['slug'] as String?, + url: json['url'] as String?, ); Map _$TeamToJson(Team instance) => { - 'name': instance.name, + 'description': instance.description, + 'html_url': instance.htmlUrl, 'id': instance.id, - 'permission': instance.permission, + 'ldap_dn': instance.ldapDn, 'members_count': instance.membersCount, - 'repos_count': instance.reposCount, + 'members_url': instance.membersUrl, + 'name': instance.name, + 'node_id': instance.nodeId, 'organization': instance.organization, + 'parent': instance.parent, + 'permission': instance.permission, + 'permissions': instance.permissions, + 'privacy': instance.privacy, + 'repos_count': instance.reposCount, + 'repositories_url': instance.repositoriesUrl, + 'slug': instance.slug, + 'url': instance.url, + }; + +Permissions _$PermissionsFromJson(Map json) => Permissions( + admin: json['admin'] as bool?, + maintain: json['maintain'] as bool?, + pull: json['pull'] as bool?, + push: json['push'] as bool?, + triage: json['triage'] as bool?, + ); + +Map _$PermissionsToJson(Permissions instance) => + { + 'admin': instance.admin, + 'maintain': instance.maintain, + 'pull': instance.pull, + 'push': instance.push, + 'triage': instance.triage, }; TeamMember _$TeamMemberFromJson(Map json) => TeamMember( diff --git a/lib/src/common/model/pulls.dart b/lib/src/common/model/pulls.dart index fd6e8d70..b6f20e55 100644 --- a/lib/src/common/model/pulls.dart +++ b/lib/src/common/model/pulls.dart @@ -90,6 +90,7 @@ class PullRequest { /// Whether or not the pull request is a draft bool? draft; + String? mergeCommitSha; /// If the pull request was merged @@ -157,6 +158,7 @@ class PullRequestMerge { this.sha, this.message, }); + bool? merged; String? sha; String? message; @@ -194,16 +196,16 @@ class CreatePullRequest { CreatePullRequest(this.title, this.head, this.base, {this.draft = false, this.body}); - final String? title; - final String? head; - final String? base; + String? title; + String? head; + String? base; /// Whether a draft PR should be created. /// /// This is currently experimental functionality since the way draft PRs are /// created through Github's REST API is in developer preview only - and could change at any time. @experimental - final bool? draft; + bool? draft; String? body; @@ -231,6 +233,7 @@ class PullRequestComment { this.pullRequestUrl, this.links, }); + int? id; String? diffHunk; String? path; @@ -280,6 +283,7 @@ class PullRequestFile { this.contentsUrl, this.patch, }); + String? sha; String? filename; String? status; @@ -308,6 +312,7 @@ class PullRequestReview { this.state, this.htmlUrl, this.pullRequestUrl}); + int id; User user; String? body; @@ -326,17 +331,209 @@ class PullRequestReview { @JsonSerializable() class CreatePullRequestReview { CreatePullRequestReview(this.owner, this.repo, this.pullNumber, this.event, - {this.body}); + {this.body, this.comments}); String owner; String repo; String event; String? body; int pullNumber; - // TODO List comments; + List? comments; factory CreatePullRequestReview.fromJson(Map input) => _$CreatePullRequestReviewFromJson(input); Map toJson() => _$CreatePullRequestReviewToJson(this); } -// TODO PullRequestReviewComment https://docs.github.com/en/rest/reference/pulls#create-a-review-for-a-pull-request + +/// Pull Request Review Comment +/// +/// Pull Request Review Comments are comments on a portion of the Pull Request's +/// diff. +@JsonSerializable() +class PullRequestReviewComment { + PullRequestReviewComment({ + this.authorAssociation, + this.body, + this.bodyHtml, + this.bodyText, + this.commitId, + this.createdAt, + this.diffHunk, + this.htmlUrl, + this.id, + this.inReplyToId, + this.line, + this.links, + this.nodeId, + this.originalCommitId, + this.originalLine, + this.originalPosition, + this.originalStartLine, + this.path, + this.position, + this.pullRequestReviewId, + this.pullRequestUrl, + this.reactions, + this.side, + this.startLine, + this.startSide, + this.subjectType, + this.updatedAt, + this.url, + this.user, + }); + + /// How the author is associated with the repository. + /// + /// Example: `OWNER` + String? authorAssociation; + + /// The text of the comment. + /// + /// Example: `We should probably include a check for null values here.` + String? body; + + /// Example: `"

comment body

"` + String? bodyHtml; + + /// Example: `"comment body"` + String? bodyText; + + /// The SHA of the commit to which the comment applies. + /// + /// Example: `6dcb09b5b57875f334f61aebed695e2e4193db5e` + String? commitId; + + DateTime? createdAt; + + /// The diff of the line that the comment refers to. + /// + /// Example: `@@ -16,33 +16,40 @@ public class Connection : IConnection...` + String? diffHunk; + + /// HTML URL for the pull request review comment. + /// + /// Example: `https://github.com/octocat/Hello-World/pull/1#discussion-diff-1` + String? htmlUrl; + + /// The ID of the pull request review comment. + int? id; + + /// The comment ID to reply to. + int? inReplyToId; + + /// The line of the blob to which the comment applies. The last line of the range + /// for a multi-line comment + int? line; + + @JsonKey(name: '_links') + ReviewLinks? links; + + /// The node ID of the pull request review comment. + /// + /// Example: `MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDEw` + String? nodeId; + + /// The SHA of the original commit to which the comment applies. + /// + /// Example: `9c48853fa3dc5c1c3d6f1f1cd1f2743e72652840` + String? originalCommitId; + + /// The line of the blob to which the comment applies. The last line of the range + /// for a multi-line comment + int? originalLine; + + /// The index of the original line in the diff to which the comment applies. This + /// field is deprecated; use `original_line` instead. + int? originalPosition; + + /// The first line of the range for a multi-line comment. + int? originalStartLine; + + /// The relative path of the file to which the comment applies. + /// + /// Example: `config/database.yaml` + String? path; + + /// The line index in the diff to which the comment applies. This field is deprecated; + /// use `line` instead. + int? position; + + /// The ID of the pull request review to which the comment belongs. + int? pullRequestReviewId; + + /// URL for the pull request that the review comment belongs to. + /// + /// Example: `https://api.github.com/repos/octocat/Hello-World/pulls/1` + String? pullRequestUrl; + + /// Reaction Rollup + ReactionRollup? reactions; + + /// The side of the diff to which the comment applies. The side of the last line + /// of the range for a multi-line comment + String? side; + + /// The first line of the range for a multi-line comment. + int? startLine; + + /// The side of the first line of the range for a multi-line comment. + String? startSide; + + /// The level at which the comment is targeted, can be a diff line or a file. + String? subjectType; + + DateTime? updatedAt; + + /// URL for the pull request review comment + /// + /// Example: `https://api.github.com/repos/octocat/Hello-World/pulls/comments/1` + String? url; + + User? user; + + Map toJson() => _$PullRequestReviewCommentToJson(this); + + factory PullRequestReviewComment.fromJson(Map input) => + _$PullRequestReviewCommentFromJson(input); +} + +/// This is similar to [Links] but represents a different serialization +/// in the GitHub API. +/// +/// It is used for [PullRequestReviewComment.links] and +/// [ReviewEvent.links]. +class ReviewLinks { + ReviewLinks({ + this.html, + this.pullRequest, + this.self, + }); + + Uri? html; + Uri? pullRequest; + Uri? self; + + Map toJson() { + return { + 'html': {'href': html?.toString()}, + 'pullRequest': {'href': pullRequest?.toString()}, + 'self': {'href': self?.toString()}, + }; + } + + static Uri? _parseBlock(Map input, String key) { + if (input[key] is Map && input[key]['href'] is String) { + return Uri.parse(input[key]['href']! as String); + } + return null; + } + + factory ReviewLinks.fromJson(Map input) { + return ReviewLinks( + html: _parseBlock(input, 'html'), + pullRequest: _parseBlock(input, 'pull_request'), + self: _parseBlock(input, 'self'), + ); + } +} diff --git a/lib/src/common/model/pulls.g.dart b/lib/src/common/model/pulls.g.dart index 62d2bba6..3608260c 100644 --- a/lib/src/common/model/pulls.g.dart +++ b/lib/src/common/model/pulls.g.dart @@ -284,6 +284,10 @@ CreatePullRequestReview _$CreatePullRequestReviewFromJson( json['pull_number'] as int, json['event'] as String, body: json['body'] as String?, + comments: (json['comments'] as List?) + ?.map((e) => + PullRequestReviewComment.fromJson(e as Map)) + .toList(), ); Map _$CreatePullRequestReviewToJson( @@ -294,4 +298,83 @@ Map _$CreatePullRequestReviewToJson( 'event': instance.event, 'body': instance.body, 'pull_number': instance.pullNumber, + 'comments': instance.comments, + }; + +PullRequestReviewComment _$PullRequestReviewCommentFromJson( + Map json) => + PullRequestReviewComment( + authorAssociation: json['author_association'] as String?, + body: json['body'] as String?, + bodyHtml: json['body_html'] as String?, + bodyText: json['body_text'] as String?, + commitId: json['commit_id'] as String?, + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + diffHunk: json['diff_hunk'] as String?, + htmlUrl: json['html_url'] as String?, + id: json['id'] as int?, + inReplyToId: json['in_reply_to_id'] as int?, + line: json['line'] as int?, + links: json['_links'] == null + ? null + : ReviewLinks.fromJson(json['_links'] as Map), + nodeId: json['node_id'] as String?, + originalCommitId: json['original_commit_id'] as String?, + originalLine: json['original_line'] as int?, + originalPosition: json['original_position'] as int?, + originalStartLine: json['original_start_line'] as int?, + path: json['path'] as String?, + position: json['position'] as int?, + pullRequestReviewId: json['pull_request_review_id'] as int?, + pullRequestUrl: json['pull_request_url'] as String?, + reactions: json['reactions'] == null + ? null + : ReactionRollup.fromJson(json['reactions'] as Map), + side: json['side'] as String?, + startLine: json['start_line'] as int?, + startSide: json['start_side'] as String?, + subjectType: json['subject_type'] as String?, + updatedAt: json['updated_at'] == null + ? null + : DateTime.parse(json['updated_at'] as String), + url: json['url'] as String?, + user: json['user'] == null + ? null + : User.fromJson(json['user'] as Map), + ); + +Map _$PullRequestReviewCommentToJson( + PullRequestReviewComment instance) => + { + 'author_association': instance.authorAssociation, + 'body': instance.body, + 'body_html': instance.bodyHtml, + 'body_text': instance.bodyText, + 'commit_id': instance.commitId, + 'created_at': instance.createdAt?.toIso8601String(), + 'diff_hunk': instance.diffHunk, + 'html_url': instance.htmlUrl, + 'id': instance.id, + 'in_reply_to_id': instance.inReplyToId, + 'line': instance.line, + '_links': instance.links, + 'node_id': instance.nodeId, + 'original_commit_id': instance.originalCommitId, + 'original_line': instance.originalLine, + 'original_position': instance.originalPosition, + 'original_start_line': instance.originalStartLine, + 'path': instance.path, + 'position': instance.position, + 'pull_request_review_id': instance.pullRequestReviewId, + 'pull_request_url': instance.pullRequestUrl, + 'reactions': instance.reactions, + 'side': instance.side, + 'start_line': instance.startLine, + 'start_side': instance.startSide, + 'subject_type': instance.subjectType, + 'updated_at': instance.updatedAt?.toIso8601String(), + 'url': instance.url, + 'user': instance.user, }; diff --git a/lib/src/common/model/reaction.dart b/lib/src/common/model/reaction.dart index 00b8e4ac..a9b73d7f 100644 --- a/lib/src/common/model/reaction.dart +++ b/lib/src/common/model/reaction.dart @@ -10,12 +10,6 @@ part 'reaction.g.dart'; /// See https://developer.github.com/v3/reactions/ @JsonSerializable() class Reaction { - final int? id; - final String? nodeId; - final User? user; - final String? content; - final DateTime? createdAt; - Reaction({ this.id, this.nodeId, @@ -24,6 +18,12 @@ class Reaction { this.createdAt, }); + int? id; + String? nodeId; + User? user; + String? content; + DateTime? createdAt; + ReactionType? get type => ReactionType.fromString(content); factory Reaction.fromJson(Map json) => @@ -34,9 +34,10 @@ class Reaction { @immutable class ReactionType { + const ReactionType._(this.content, this.emoji); + final String content; final String emoji; - const ReactionType._(this.content, this.emoji); @override String toString() => content; @@ -71,3 +72,37 @@ class ReactionType { static ReactionType? fromString(String? content) => _types[content!]; } + +@JsonSerializable() +class ReactionRollup { + ReactionRollup({ + this.plusOne, + this.minusOne, + this.confused, + this.eyes, + this.heart, + this.hooray, + this.laugh, + this.rocket, + this.totalCount, + this.url, + }); + + @JsonKey(name: '+1') + int? plusOne; + @JsonKey(name: '-1') + int? minusOne; + int? confused; + int? eyes; + int? heart; + int? hooray; + int? laugh; + int? rocket; + int? totalCount; + String? url; + + Map toJson() => _$ReactionRollupToJson(this); + + factory ReactionRollup.fromJson(Map input) => + _$ReactionRollupFromJson(input); +} diff --git a/lib/src/common/model/reaction.g.dart b/lib/src/common/model/reaction.g.dart index dc2ff705..d94eede4 100644 --- a/lib/src/common/model/reaction.g.dart +++ b/lib/src/common/model/reaction.g.dart @@ -25,3 +25,31 @@ Map _$ReactionToJson(Reaction instance) => { 'content': instance.content, 'created_at': instance.createdAt?.toIso8601String(), }; + +ReactionRollup _$ReactionRollupFromJson(Map json) => + ReactionRollup( + plusOne: json['+1'] as int?, + minusOne: json['-1'] as int?, + confused: json['confused'] as int?, + eyes: json['eyes'] as int?, + heart: json['heart'] as int?, + hooray: json['hooray'] as int?, + laugh: json['laugh'] as int?, + rocket: json['rocket'] as int?, + totalCount: json['total_count'] as int?, + url: json['url'] as String?, + ); + +Map _$ReactionRollupToJson(ReactionRollup instance) => + { + '+1': instance.plusOne, + '-1': instance.minusOne, + 'confused': instance.confused, + 'eyes': instance.eyes, + 'heart': instance.heart, + 'hooray': instance.hooray, + 'laugh': instance.laugh, + 'rocket': instance.rocket, + 'total_count': instance.totalCount, + 'url': instance.url, + }; diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart index 3612aa34..d09c1a7e 100644 --- a/lib/src/common/model/repos.dart +++ b/lib/src/common/model/repos.dart @@ -5,17 +5,17 @@ part 'repos.g.dart'; @JsonSerializable() class GitHubComparison { - final String? url; - final String? status; - final int? aheadBy; - final int? behindBy; - final int? totalCommits; - final List? files; - final List? commits; - GitHubComparison(this.url, this.status, this.aheadBy, this.behindBy, this.totalCommits, this.files, this.commits); + String? url; + String? status; + int? aheadBy; + int? behindBy; + int? totalCommits; + List? files; + List? commits; + factory GitHubComparison.fromJson(Map json) => _$GitHubComparisonFromJson(json); Map toJson() => _$GitHubComparisonToJson(this); @@ -40,135 +40,416 @@ class GitHubComparison { /// Model class for a repository. @JsonSerializable() class Repository { - Repository( - {this.name = '', - this.id = 0, - this.fullName = '', - this.owner, - this.htmlUrl = '', - this.description = '', - this.cloneUrl = '', - this.gitUrl = '', - this.sshUrl = '', - this.svnUrl = '', - this.defaultBranch = '', - this.createdAt, - this.isPrivate = false, - this.isFork = false, - this.stargazersCount = 0, - this.watchersCount = 0, - this.language = '', - this.hasWiki = false, - this.hasDownloads = false, - this.forksCount = 0, - this.openIssuesCount = 0, - this.subscribersCount = 0, - this.networkCount = 0, - this.hasIssues = false, - this.size = 0, - this.archived = false, - this.disabled = false, - this.homepage = '', - this.updatedAt, - this.pushedAt, - this.license, - this.hasPages = false, - this.permissions}); + Repository({ + this.name = '', + this.id = 0, + this.fullName = '', + this.owner, + this.htmlUrl = '', + this.description = '', + this.cloneUrl = '', + this.gitUrl = '', + this.sshUrl = '', + this.svnUrl = '', + this.defaultBranch = '', + this.createdAt, + this.isPrivate = false, + this.isFork = false, + this.stargazersCount = 0, + this.watchersCount = 0, + this.language = '', + this.hasWiki = false, + this.hasDownloads = false, + this.forksCount = 0, + this.openIssuesCount = 0, + this.subscribersCount = 0, + this.networkCount = 0, + this.hasIssues = false, + this.size = 0, + this.archived = false, + this.disabled = false, + this.homepage = '', + this.updatedAt, + this.pushedAt, + this.license, + this.hasPages = false, + this.permissions, + + // Properties from the Timeline API + this.allowAutoMerge, + this.allowForking, + this.allowMergeCommit, + this.allowRebaseMerge, + this.allowSquashMerge, + this.allowUpdateBranch, + this.anonymousAccessEnabled, + this.archiveUrl, + this.assigneesUrl, + this.blobsUrl, + this.branchesUrl, + this.collaboratorsUrl, + this.commentsUrl, + this.commitsUrl, + this.compareUrl, + this.contentsUrl, + this.contributorsUrl, + this.deleteBranchOnMerge, + this.deploymentsUrl, + this.downloadsUrl, + this.eventsUrl, + this.forks, + this.forksUrl, + this.gitCommitsUrl, + this.gitRefsUrl, + this.gitTagsUrl, + this.hasDiscussions, + this.hasProjects, + this.hooksUrl, + this.isTemplate, + this.issueCommentUrl, + this.issueEventsUrl, + this.issuesUrl, + this.keysUrl, + this.labelsUrl, + this.languagesUrl, + this.masterBranch, + this.mergeCommitMessage, + this.mergeCommitTitle, + this.mergesUrl, + this.milestonesUrl, + this.mirrorUrl, + this.nodeId, + this.notificationsUrl, + this.openIssues, + this.organization, + this.pullsUrl, + this.releasesUrl, + this.squashMergeCommitMessage, + this.squashMergeCommitTitle, + this.stargazersUrl, + this.starredAt, + this.statusesUrl, + this.subscribersUrl, + this.subscriptionUrl, + this.tagsUrl, + this.teamsUrl, + this.tempCloneToken, + this.templateRepository, + this.topics, + this.treesUrl, + this.url, + this.visibility, + this.watchers, + this.webCommitSignoffRequired, + }); /// Repository Name - final String name; + String name; /// Repository ID - final int id; + int id; /// Full Repository Name - final String fullName; + String fullName; /// Repository Owner @JsonKey(defaultValue: null) - final UserInformation? owner; + UserInformation? owner; /// If the Repository is Private @JsonKey(name: 'private') - final bool isPrivate; + bool isPrivate; /// If the Repository is a fork @JsonKey(name: 'fork') - final bool isFork; + bool isFork; /// Url to the GitHub Repository Page - final String htmlUrl; + String htmlUrl; /// Repository Description - final String description; + String description; // https clone URL - final String cloneUrl; + String cloneUrl; - final String sshUrl; + String sshUrl; - final String svnUrl; + String svnUrl; - final String gitUrl; + String gitUrl; /// Url to the Repository Homepage - final String homepage; + String homepage; /// Repository Size - final int size; + // + /// The size of the repository. Size is calculated hourly. When a repository is + /// initially created, the size is 0. + int size; /// Repository Stars - final int stargazersCount; + int stargazersCount; /// Repository Watchers - final int watchersCount; + int watchersCount; /// Repository Language - final String language; + String language; /// If the Repository has Issues Enabled - final bool hasIssues; + bool hasIssues; /// If the Repository has the Wiki Enabled - final bool hasWiki; + bool hasWiki; /// If the Repository has any Downloads - final bool hasDownloads; + bool hasDownloads; /// If the Repository has any Github Pages - final bool hasPages; + bool hasPages; /// Number of Forks - final int forksCount; + int forksCount; /// Number of Open Issues - final int openIssuesCount; + int openIssuesCount; /// Repository Default Branch - final String defaultBranch; + String defaultBranch; /// Number of Subscribers - final int subscribersCount; + int subscribersCount; /// Number of users in the network - final int networkCount; + int networkCount; /// The time the repository was created at - final DateTime? createdAt; + DateTime? createdAt; /// The last time the repository was pushed at - final DateTime? pushedAt; + DateTime? pushedAt; - final DateTime? updatedAt; + DateTime? updatedAt; - final LicenseKind? license; + LicenseKind? license; - final bool archived; + bool archived; - final bool disabled; + bool disabled; RepositoryPermissions? permissions; + // The following properties were added to support the Timeline API. + + /// Whether to allow Auto-merge to be used on pull requests. + bool? allowAutoMerge; + + /// Whether to allow forking this repo + bool? allowForking; + + /// Whether to allow merge commits for pull requests. + bool? allowMergeCommit; + + /// Whether to allow rebase merges for pull requests. + bool? allowRebaseMerge; + + /// Whether to allow squash merges for pull requests. + bool? allowSquashMerge; + + /// Whether or not a pull request head branch that is behind its base branch can + /// always be updated even if it is not required to be up to date before merging. + bool? allowUpdateBranch; + + /// Whether anonymous git access is enabled for this repository + bool? anonymousAccessEnabled; + + /// Example: `http://api.github.com/repos/octocat/Hello-World/{archive_format}{/ref}` + String? archiveUrl; + + /// Example: `http://api.github.com/repos/octocat/Hello-World/assignees{/user}` + String? assigneesUrl; + + /// Example: `http://api.github.com/repos/octocat/Hello-World/git/blobs{/sha}` + String? blobsUrl; + + /// Example: `http://api.github.com/repos/octocat/Hello-World/branches{/branch}` + String? branchesUrl; + + /// Example: `http://api.github.com/repos/octocat/Hello-World/collaborators{/collaborator}` + String? collaboratorsUrl; + + /// Example: `http://api.github.com/repos/octocat/Hello-World/comments{/number}` + String? commentsUrl; + + /// Example: `http://api.github.com/repos/octocat/Hello-World/commits{/sha}` + String? commitsUrl; + + /// Example: `http://api.github.com/repos/octocat/Hello-World/compare/{base}...{head}` + String? compareUrl; + + /// Example: `http://api.github.com/repos/octocat/Hello-World/contents/{+path}` + String? contentsUrl; + + /// Example: `http://api.github.com/repos/octocat/Hello-World/contributors` + String? contributorsUrl; + + /// Whether to delete head branches when pull requests are merged + bool? deleteBranchOnMerge; + + /// Example: `http://api.github.com/repos/octocat/Hello-World/deployments` + String? deploymentsUrl; + + /// Example: `http://api.github.com/repos/octocat/Hello-World/downloads` + String? downloadsUrl; + + /// Example: `http://api.github.com/repos/octocat/Hello-World/events` + String? eventsUrl; + + int? forks; + + /// Example: `http://api.github.com/repos/octocat/Hello-World/forks` + String? forksUrl; + + /// Example: `http://api.github.com/repos/octocat/Hello-World/git/commits{/sha}` + String? gitCommitsUrl; + + /// Example: `http://api.github.com/repos/octocat/Hello-World/git/refs{/sha}` + String? gitRefsUrl; + + /// Example: `http://api.github.com/repos/octocat/Hello-World/git/tags{/sha}` + String? gitTagsUrl; + + /// Whether discussions are enabled. + bool? hasDiscussions; + + /// Whether projects are enabled. + bool? hasProjects; + + /// Example: `http://api.github.com/repos/octocat/Hello-World/hooks` + String? hooksUrl; + + /// Whether this repository acts as a template that can be used to generate new + /// repositories. + bool? isTemplate; + + /// Example: `http://api.github.com/repos/octocat/Hello-World/issues/comments{/number}` + String? issueCommentUrl; + + /// Example: `http://api.github.com/repos/octocat/Hello-World/issues/events{/number}` + String? issueEventsUrl; + + /// Example: `http://api.github.com/repos/octocat/Hello-World/issues{/number}` + String? issuesUrl; + + /// Example: `http://api.github.com/repos/octocat/Hello-World/keys{/key_id}` + String? keysUrl; + + /// Example: `http://api.github.com/repos/octocat/Hello-World/labels{/name}` + String? labelsUrl; + + /// Example: `http://api.github.com/repos/octocat/Hello-World/languages` + String? languagesUrl; + + String? masterBranch; + + /// The default value for a merge commit message. + /// + /// - `PR_TITLE` - default to the pull request's title. + /// - `PR_BODY` - default to the pull request's body. + /// - `BLANK` - default to a blank commit message. + String? mergeCommitMessage; + + /// The default value for a merge commit title. + /// + /// - `PR_TITLE` - default to the pull request's title. + /// - `MERGE_MESSAGE` - default to the classic title for a merge message (e.g., + /// Merge pull request #123 from branch-name). + String? mergeCommitTitle; + + /// Format: uri + /// + /// Example: `http://api.github.com/repos/octocat/Hello-World/merges` + String? mergesUrl; + + /// Example: `http://api.github.com/repos/octocat/Hello-World/milestones{/number}` + String? milestonesUrl; + + /// Format: uri + /// + /// Example: `git:git.example.com/octocat/Hello-World` + String? mirrorUrl; + + /// Example: `MDEwOlJlcG9zaXRvcnkxMjk2MjY5` + String? nodeId; + + /// Example: `http://api.github.com/repos/octocat/Hello-World/notifications{?since,all,participating}` + String? notificationsUrl; + + int? openIssues; + + User? organization; + + /// Example: `http://api.github.com/repos/octocat/Hello-World/pulls{/number}` + String? pullsUrl; + + /// Example: `http://api.github.com/repos/octocat/Hello-World/releases{/id}` + String? releasesUrl; + + /// The default value for a squash merge commit message: + /// + /// - `PR_BODY` - default to the pull request's body. + /// - `COMMIT_MESSAGES` - default to the branch's commit messages. + /// - `BLANK` - default to a blank commit message. + String? squashMergeCommitMessage; + + /// The default value for a squash merge commit title: + /// + /// - `PR_TITLE` - default to the pull request's title. + /// - `COMMIT_OR_PR_TITLE` - default to the commit's title (if only one commit) + /// or the pull request's title (when more than one commit). + String? squashMergeCommitTitle; + + /// Example: `http://api.github.com/repos/octocat/Hello-World/stargazers` + String? stargazersUrl; + + DateTime? starredAt; + + /// Example: `http://api.github.com/repos/octocat/Hello-World/statuses/{sha}` + String? statusesUrl; + + /// Example: `http://api.github.com/repos/octocat/Hello-World/subscribers` + String? subscribersUrl; + + /// Example: `http://api.github.com/repos/octocat/Hello-World/subscription` + String? subscriptionUrl; + + /// Example: `http://api.github.com/repos/octocat/Hello-World/tags` + String? tagsUrl; + + /// Example: `http://api.github.com/repos/octocat/Hello-World/teams` + String? teamsUrl; + + String? tempCloneToken; + + TemplateRepository? templateRepository; + + List? topics; + + /// Example: `http://api.github.com/repos/octocat/Hello-World/git/trees{/sha}` + String? treesUrl; + + /// Example: `https://api.github.com/repos/octocat/Hello-World` + String? url; + + /// The repository visibility: public, private, or internal. + String? visibility; + + int? watchers; + + /// Whether to require contributors to sign off on web-based commits + bool? webCommitSignoffRequired; + factory Repository.fromJson(Map input) => _$RepositoryFromJson(input); Map toJson() => _$RepositoryToJson(this); @@ -187,13 +468,13 @@ class RepositoryPermissions { {this.admin = false, this.push = false, this.pull = false}); /// Administrative Access - final bool admin; + bool admin; /// Push Access - final bool push; + bool push; /// Pull Access - final bool pull; + bool pull; factory RepositoryPermissions.fromJson(Map json) => _$RepositoryPermissionsFromJson(json); @@ -203,14 +484,14 @@ class RepositoryPermissions { @JsonSerializable() class Tag { - final String name; - final CommitInfo commit; + Tag(this.name, this.commit, this.zipUrl, this.tarUrl); + + String name; + CommitInfo commit; @JsonKey(name: 'zipball_url') - final String zipUrl; + String zipUrl; @JsonKey(name: 'tarball_url') - final String tarUrl; - - Tag(this.name, this.commit, this.zipUrl, this.tarUrl); + String tarUrl; factory Tag.fromJson(Map input) => _$TagFromJson(input); Map toJson() => _$TagToJson(this); @@ -221,18 +502,18 @@ class Tag { @JsonSerializable() class CommitData { - final String? sha; - final GitCommit? commit; - final String? url; - final String? htmlUrl; - final String? commentsUrl; - - final CommitDataUser? author, committer; - final List>? parents; - CommitData(this.sha, this.commit, this.url, this.htmlUrl, this.commentsUrl, this.author, this.committer, this.parents); + String? sha; + GitCommit? commit; + String? url; + String? htmlUrl; + String? commentsUrl; + + CommitDataUser? author, committer; + List>? parents; + factory CommitData.fromJson(Map input) => _$CommitDataFromJson(input); Map toJson() => _$CommitDataToJson(this); @@ -240,11 +521,11 @@ class CommitData { @JsonSerializable() class CommitDataUser { - final String? login, type; + CommitDataUser(this.login, this.id, this.type); - final int? id; + String? login, type; - CommitDataUser(this.login, this.id, this.type); + int? id; factory CommitDataUser.fromJson(Map input) => _$CommitDataUserFromJson(input); @@ -253,11 +534,11 @@ class CommitDataUser { @JsonSerializable() class CommitInfo { - final String? sha; - final GitTree? tree; - CommitInfo(this.sha, this.tree); + String? sha; + GitTree? tree; + factory CommitInfo.fromJson(Map input) => _$CommitInfoFromJson(input); Map toJson() => _$CommitInfoToJson(this); @@ -266,19 +547,19 @@ class CommitInfo { /// User Information @JsonSerializable() class UserInformation { + UserInformation(this.login, this.id, this.avatarUrl, this.htmlUrl); + /// Owner Username - final String login; + String login; /// Owner ID - final int id; + int id; /// Avatar Url - final String avatarUrl; + String avatarUrl; /// Url to the user's GitHub Profile - final String htmlUrl; - - UserInformation(this.login, this.id, this.avatarUrl, this.htmlUrl); + String htmlUrl; factory UserInformation.fromJson(Map input) => _$UserInformationFromJson(input); @@ -288,14 +569,14 @@ class UserInformation { /// A Repository Slug @JsonSerializable() class RepositorySlug { + RepositorySlug(this.owner, this.name); + /// Repository Owner String owner; /// Repository Name String name; - RepositorySlug(this.owner, this.name); - /// Creates a Repository Slug from a full name. factory RepositorySlug.full(String f) { final split = f.split('/'); @@ -340,7 +621,7 @@ class CreateRepository { this.hasWiki}); /// Repository Name - final String? name; + String? name; /// Repository Description String? description; @@ -383,13 +664,13 @@ class CreateRepository { /// Model class for a branch. @JsonSerializable() class Branch { + Branch(this.name, this.commit); + /// The name of the branch. - final String? name; + String? name; /// Commit Information - final CommitData? commit; - - Branch(this.name, this.commit); + CommitData? commit; factory Branch.fromJson(Map json) => _$BranchFromJson(json); Map toJson() => _$BranchToJson(this); @@ -397,10 +678,10 @@ class Branch { /// A Breakdown of the Languages a repository uses. class LanguageBreakdown { - final Map _data; - LanguageBreakdown(Map data) : _data = data; + final Map _data; + /// The Primary Language String get primary { final list = mapToList(_data); @@ -439,25 +720,6 @@ class LanguageBreakdown { @JsonSerializable() class LicenseDetails { - final String? name; - final String? path; - final String? sha; - final int? size; - final Uri? url; - - final Uri? htmlUrl; - final Uri? gitUrl; - final Uri? downloadUrl; - - final String? type; - final String? content; - final String? encoding; - - @JsonKey(name: '_links') - final Links? links; - - final LicenseKind? license; - LicenseDetails( {this.name, this.path, @@ -473,6 +735,25 @@ class LicenseDetails { this.links, this.license}); + String? name; + String? path; + String? sha; + int? size; + Uri? url; + + Uri? htmlUrl; + Uri? gitUrl; + Uri? downloadUrl; + + String? type; + String? content; + String? encoding; + + @JsonKey(name: '_links') + Links? links; + + LicenseKind? license; + factory LicenseDetails.fromJson(Map json) => _$LicenseDetailsFromJson(json); @@ -481,14 +762,14 @@ class LicenseDetails { @JsonSerializable() class LicenseKind { - final String? key; - final String? name; - final String? spdxId; - final Uri? url; - final String? nodeId; - LicenseKind({this.key, this.name, this.spdxId, this.url, this.nodeId}); + String? key; + String? name; + String? spdxId; + Uri? url; + String? nodeId; + factory LicenseKind.fromJson(Map json) => _$LicenseKindFromJson(json); diff --git a/lib/src/common/model/repos.g.dart b/lib/src/common/model/repos.g.dart index b2e395bd..490b18b1 100644 --- a/lib/src/common/model/repos.g.dart +++ b/lib/src/common/model/repos.g.dart @@ -79,6 +79,79 @@ Repository _$RepositoryFromJson(Map json) => Repository( ? null : RepositoryPermissions.fromJson( json['permissions'] as Map), + allowAutoMerge: json['allow_auto_merge'] as bool?, + allowForking: json['allow_forking'] as bool?, + allowMergeCommit: json['allow_merge_commit'] as bool?, + allowRebaseMerge: json['allow_rebase_merge'] as bool?, + allowSquashMerge: json['allow_squash_merge'] as bool?, + allowUpdateBranch: json['allow_update_branch'] as bool?, + anonymousAccessEnabled: json['anonymous_access_enabled'] as bool?, + archiveUrl: json['archive_url'] as String?, + assigneesUrl: json['assignees_url'] as String?, + blobsUrl: json['blobs_url'] as String?, + branchesUrl: json['branches_url'] as String?, + collaboratorsUrl: json['collaborators_url'] as String?, + commentsUrl: json['comments_url'] as String?, + commitsUrl: json['commits_url'] as String?, + compareUrl: json['compare_url'] as String?, + contentsUrl: json['contents_url'] as String?, + contributorsUrl: json['contributors_url'] as String?, + deleteBranchOnMerge: json['delete_branch_on_merge'] as bool?, + deploymentsUrl: json['deployments_url'] as String?, + downloadsUrl: json['downloads_url'] as String?, + eventsUrl: json['events_url'] as String?, + forks: json['forks'] as int?, + forksUrl: json['forks_url'] as String?, + gitCommitsUrl: json['git_commits_url'] as String?, + gitRefsUrl: json['git_refs_url'] as String?, + gitTagsUrl: json['git_tags_url'] as String?, + hasDiscussions: json['has_discussions'] as bool?, + hasProjects: json['has_projects'] as bool?, + hooksUrl: json['hooks_url'] as String?, + isTemplate: json['is_template'] as bool?, + issueCommentUrl: json['issue_comment_url'] as String?, + issueEventsUrl: json['issue_events_url'] as String?, + issuesUrl: json['issues_url'] as String?, + keysUrl: json['keys_url'] as String?, + labelsUrl: json['labels_url'] as String?, + languagesUrl: json['languages_url'] as String?, + masterBranch: json['master_branch'] as String?, + mergeCommitMessage: json['merge_commit_message'] as String?, + mergeCommitTitle: json['merge_commit_title'] as String?, + mergesUrl: json['merges_url'] as String?, + milestonesUrl: json['milestones_url'] as String?, + mirrorUrl: json['mirror_url'] as String?, + nodeId: json['node_id'] as String?, + notificationsUrl: json['notifications_url'] as String?, + openIssues: json['open_issues'] as int?, + organization: json['organization'] == null + ? null + : User.fromJson(json['organization'] as Map), + pullsUrl: json['pulls_url'] as String?, + releasesUrl: json['releases_url'] as String?, + squashMergeCommitMessage: json['squash_merge_commit_message'] as String?, + squashMergeCommitTitle: json['squash_merge_commit_title'] as String?, + stargazersUrl: json['stargazers_url'] as String?, + starredAt: json['starred_at'] == null + ? null + : DateTime.parse(json['starred_at'] as String), + statusesUrl: json['statuses_url'] as String?, + subscribersUrl: json['subscribers_url'] as String?, + subscriptionUrl: json['subscription_url'] as String?, + tagsUrl: json['tags_url'] as String?, + teamsUrl: json['teams_url'] as String?, + tempCloneToken: json['temp_clone_token'] as String?, + templateRepository: json['template_repository'] == null + ? null + : TemplateRepository.fromJson( + json['template_repository'] as Map), + topics: + (json['topics'] as List?)?.map((e) => e as String).toList(), + treesUrl: json['trees_url'] as String?, + url: json['url'] as String?, + visibility: json['visibility'] as String?, + watchers: json['watchers'] as int?, + webCommitSignoffRequired: json['web_commit_signoff_required'] as bool?, ); Map _$RepositoryToJson(Repository instance) => @@ -116,6 +189,71 @@ Map _$RepositoryToJson(Repository instance) => 'archived': instance.archived, 'disabled': instance.disabled, 'permissions': instance.permissions, + 'allow_auto_merge': instance.allowAutoMerge, + 'allow_forking': instance.allowForking, + 'allow_merge_commit': instance.allowMergeCommit, + 'allow_rebase_merge': instance.allowRebaseMerge, + 'allow_squash_merge': instance.allowSquashMerge, + 'allow_update_branch': instance.allowUpdateBranch, + 'anonymous_access_enabled': instance.anonymousAccessEnabled, + 'archive_url': instance.archiveUrl, + 'assignees_url': instance.assigneesUrl, + 'blobs_url': instance.blobsUrl, + 'branches_url': instance.branchesUrl, + 'collaborators_url': instance.collaboratorsUrl, + 'comments_url': instance.commentsUrl, + 'commits_url': instance.commitsUrl, + 'compare_url': instance.compareUrl, + 'contents_url': instance.contentsUrl, + 'contributors_url': instance.contributorsUrl, + 'delete_branch_on_merge': instance.deleteBranchOnMerge, + 'deployments_url': instance.deploymentsUrl, + 'downloads_url': instance.downloadsUrl, + 'events_url': instance.eventsUrl, + 'forks': instance.forks, + 'forks_url': instance.forksUrl, + 'git_commits_url': instance.gitCommitsUrl, + 'git_refs_url': instance.gitRefsUrl, + 'git_tags_url': instance.gitTagsUrl, + 'has_discussions': instance.hasDiscussions, + 'has_projects': instance.hasProjects, + 'hooks_url': instance.hooksUrl, + 'is_template': instance.isTemplate, + 'issue_comment_url': instance.issueCommentUrl, + 'issue_events_url': instance.issueEventsUrl, + 'issues_url': instance.issuesUrl, + 'keys_url': instance.keysUrl, + 'labels_url': instance.labelsUrl, + 'languages_url': instance.languagesUrl, + 'master_branch': instance.masterBranch, + 'merge_commit_message': instance.mergeCommitMessage, + 'merge_commit_title': instance.mergeCommitTitle, + 'merges_url': instance.mergesUrl, + 'milestones_url': instance.milestonesUrl, + 'mirror_url': instance.mirrorUrl, + 'node_id': instance.nodeId, + 'notifications_url': instance.notificationsUrl, + 'open_issues': instance.openIssues, + 'organization': instance.organization, + 'pulls_url': instance.pullsUrl, + 'releases_url': instance.releasesUrl, + 'squash_merge_commit_message': instance.squashMergeCommitMessage, + 'squash_merge_commit_title': instance.squashMergeCommitTitle, + 'stargazers_url': instance.stargazersUrl, + 'starred_at': instance.starredAt?.toIso8601String(), + 'statuses_url': instance.statusesUrl, + 'subscribers_url': instance.subscribersUrl, + 'subscription_url': instance.subscriptionUrl, + 'tags_url': instance.tagsUrl, + 'teams_url': instance.teamsUrl, + 'temp_clone_token': instance.tempCloneToken, + 'template_repository': instance.templateRepository, + 'topics': instance.topics, + 'trees_url': instance.treesUrl, + 'url': instance.url, + 'visibility': instance.visibility, + 'watchers': instance.watchers, + 'web_commit_signoff_required': instance.webCommitSignoffRequired, }; RepositoryPermissions _$RepositoryPermissionsFromJson( diff --git a/lib/src/common/model/repos_commits.dart b/lib/src/common/model/repos_commits.dart index 940917ab..f79c774f 100644 --- a/lib/src/common/model/repos_commits.dart +++ b/lib/src/common/model/repos_commits.dart @@ -133,37 +133,56 @@ class CommitComment { this.htmlUrl, this.updatedAt, this.body, + + // Properties from the Timeline API + this.authorAssociation, + this.nodeId, + this.reactions, + this.user, }); /// Id of the comment - final int? id; + int? id; /// Relative path of the file on which the comment has been posted - final String? path; + String? path; /// Line on file - final int? line; + int? line; /// Position on the diff - final int? position; + int? position; /// SHA of the commit where the comment has been made - final String? commitId; + String? commitId; - final DateTime? createdAt; + DateTime? createdAt; /// Can be equals to [createdAt] - final DateTime? updatedAt; + DateTime? updatedAt; /// Ex: https://github.com/... - final String? htmlUrl; + String? htmlUrl; /// Ex: https://api.github.com/... @JsonKey(name: 'url') - final String? apiUrl; + String? apiUrl; /// Content of the comment - final String? body; + String? body; + + // The following properties were added to support the Timeline API. + + /// How the author is associated with the repository. + /// + /// Example: `OWNER` + String? authorAssociation; + + String? nodeId; + + ReactionRollup? reactions; + + User? user; factory CommitComment.fromJson(Map input) => _$CommitCommentFromJson(input); diff --git a/lib/src/common/model/repos_commits.g.dart b/lib/src/common/model/repos_commits.g.dart index c91901fc..5e74c999 100644 --- a/lib/src/common/model/repos_commits.g.dart +++ b/lib/src/common/model/repos_commits.g.dart @@ -98,6 +98,14 @@ CommitComment _$CommitCommentFromJson(Map json) => ? null : DateTime.parse(json['updated_at'] as String), body: json['body'] as String?, + authorAssociation: json['author_association'] as String?, + nodeId: json['node_id'] as String?, + reactions: json['reactions'] == null + ? null + : ReactionRollup.fromJson(json['reactions'] as Map), + user: json['user'] == null + ? null + : User.fromJson(json['user'] as Map), ); Map _$CommitCommentToJson(CommitComment instance) => @@ -112,4 +120,8 @@ Map _$CommitCommentToJson(CommitComment instance) => 'html_url': instance.htmlUrl, 'url': instance.apiUrl, 'body': instance.body, + 'author_association': instance.authorAssociation, + 'node_id': instance.nodeId, + 'reactions': instance.reactions, + 'user': instance.user, }; diff --git a/lib/src/common/model/timeline.dart b/lib/src/common/model/timeline.dart new file mode 100644 index 00000000..ae2c48ef --- /dev/null +++ b/lib/src/common/model/timeline.dart @@ -0,0 +1,582 @@ +import 'package:github/src/common.dart'; +import 'package:json_annotation/json_annotation.dart'; + +part 'timeline.g.dart'; + +// Parts of this file were originally automatically generated from the response +// schema provided in the API documentation for GitHub's "List timeline events +// for an issue" API [1], using the `tool/process_github_schema.dart` script. +// +// Unfortunately, that schema contradicts the prose documentation [2] in a great +// variety of ways (for example none of the "common properties" are actually +// common to all the event types), so this code is an attempt to find the most +// pragmatic middleground between what is documented and what actually works. +// +// [1] https://docs.github.com/en/rest/issues/timeline?apiVersion=2022-11-28 +// [2] https://docs.github.com/en/webhooks-and-events/events/issue-event-types + +/// Model class for an issue or PR timeline event. +/// +/// This is a base class for the various event types. Events that only use the +/// default fields use this class; events that have additional fields use one +/// of the subclasses. +/// +/// The [TimelineEvent.fromJson] factory selects the right subclass based on +/// the [event] field. +/// +/// If the [event] type is not known, [TimelineEvent] is used. +/// +/// See also: https://docs.github.com/en/webhooks-and-events/events/issue-event-types +@JsonSerializable() +class TimelineEvent { + TimelineEvent({ + this.id = 0, + this.nodeId, + this.url, + this.actor, + this.event = '', + this.commitId, + this.commitUrl, + this.createdAt, + this.performedViaGithubApp, + }); + + int id; + String? nodeId; + String? url; + User? actor; + String event; + String? commitId; + String? commitUrl; + DateTime? createdAt; + GitHubApp? performedViaGithubApp; + + Map toJson() => _$TimelineEventToJson(this); + + factory TimelineEvent.fromJson(Map input) { + switch (input['event']) { + case 'added_to_project': + return ProjectEvent.fromJson(input); + case 'assigned': + return AssigneeEvent.fromJson(input); + case 'commented': + return CommentEvent.fromJson(input); + case 'committed': + return TimelineCommitEvent.fromJson(input); + case 'cross-referenced': + return CrossReferenceEvent.fromJson(input); + case 'demilestoned': + return MilestoneEvent.fromJson(input); + case 'labeled': + return LabelEvent.fromJson(input); + case 'locked': + return LockEvent.fromJson(input); + case 'milestoned': + return MilestoneEvent.fromJson(input); + case 'moved_columns_in_project': + return ProjectEvent.fromJson(input); + case 'removed_from_project': + return ProjectEvent.fromJson(input); + case 'renamed': + return RenameEvent.fromJson(input); + case 'review_dismissed': + return ReviewDismissedEvent.fromJson(input); + case 'review_requested': + return ReviewRequestEvent.fromJson(input); + case 'review_request_removed': + return ReviewRequestEvent.fromJson(input); + case 'reviewed': + return ReviewEvent.fromJson(input); + case 'unassigned': + return AssigneeEvent.fromJson(input); + case 'unlabeled': + return LabelEvent.fromJson(input); + default: + return _$TimelineEventFromJson(input); + } + } +} + +/// Labeled and Unlabeled Issue Events +@JsonSerializable() +class LabelEvent extends TimelineEvent { + LabelEvent({ + super.id = 0, + super.nodeId, + super.url, + super.actor, + super.event = '', // typically 'labeled' or 'unlabeled' + super.commitId, + super.commitUrl, + super.createdAt, + super.performedViaGithubApp, + this.label, + }); + + IssueLabel? label; + + @override + Map toJson() => _$LabelEventToJson(this); + + factory LabelEvent.fromJson(Map input) => + _$LabelEventFromJson(input); +} + +/// Milestoned and Demilestoned Issue Event +@JsonSerializable() +class MilestoneEvent extends TimelineEvent { + MilestoneEvent({ + super.id = 0, + super.nodeId, + super.url, + super.actor, + super.event = '', // typically 'milestoned' or 'demilestoned' + super.commitId, + super.commitUrl, + super.createdAt, + super.performedViaGithubApp, + this.milestone, + }); + + Milestone? milestone; + + @override + Map toJson() => _$MilestoneEventToJson(this); + + factory MilestoneEvent.fromJson(Map input) => + _$MilestoneEventFromJson(input); +} + +/// Renamed Issue Event +@JsonSerializable() +class RenameEvent extends TimelineEvent { + RenameEvent({ + super.id = 0, + super.nodeId, + super.url, + super.actor, + super.event = 'renamed', + super.commitId, + super.commitUrl, + super.createdAt, + super.performedViaGithubApp, + this.rename, + }); + + Rename? rename; + + @override + Map toJson() => _$RenameEventToJson(this); + + factory RenameEvent.fromJson(Map input) => + _$RenameEventFromJson(input); +} + +/// Review Requested and Review Request Removed Issue Events +@JsonSerializable() +class ReviewRequestEvent extends TimelineEvent { + ReviewRequestEvent({ + super.id = 0, + super.nodeId, + super.url, + super.actor, + super.event = + '', // typically 'review_requested' or 'review_request_removed' + super.commitId, + super.commitUrl, + super.createdAt, + this.requestedReviewer, + this.requestedTeam, + this.reviewRequester, + }); + + User? requestedReviewer; + + /// Team + /// + /// Groups of organization members that gives permissions on specified repositories. + Team? requestedTeam; + + User? reviewRequester; + + @override + Map toJson() => _$ReviewRequestEventToJson(this); + + factory ReviewRequestEvent.fromJson(Map input) => + _$ReviewRequestEventFromJson(input); +} + +/// Review Dismissed Issue Event +@JsonSerializable() +class ReviewDismissedEvent extends TimelineEvent { + ReviewDismissedEvent({ + super.id = 0, + super.nodeId, + super.url, + super.actor, + super.event = 'review_dismissed', + super.commitId, + super.commitUrl, + super.createdAt, + super.performedViaGithubApp, + this.dismissedReview, + }); + + DismissedReview? dismissedReview; + + @override + Map toJson() => _$ReviewDismissedEventToJson(this); + + factory ReviewDismissedEvent.fromJson(Map input) => + _$ReviewDismissedEventFromJson(input); +} + +/// Locked Issue Event +@JsonSerializable() +class LockEvent extends TimelineEvent { + LockEvent({ + super.id = 0, + super.nodeId, + super.url, + super.actor, + super.event = 'locked', + super.commitId, + super.commitUrl, + super.createdAt, + super.performedViaGithubApp, + this.lockReason, + }); + + /// Example: `"off-topic"` + String? lockReason; + + @override + Map toJson() => _$LockEventToJson(this); + + factory LockEvent.fromJson(Map input) => + _$LockEventFromJson(input); +} + +/// Added to Project, +/// Moved Columns in Project, +/// Removed from Project, and +/// Converted Note to Issue +/// Issue Events. +@JsonSerializable() +class ProjectEvent extends TimelineEvent { + ProjectEvent({ + super.id = 0, + super.nodeId, + super.url, + super.actor, + super.event, // typically one of 'added_to_project', 'moved_columns_in_project', 'removed_from_project', 'converted_note_to_issue' + super.commitId, + super.commitUrl, + super.createdAt, + super.performedViaGithubApp, + this.projectCard, + }); + + ProjectCard? projectCard; + + @override + Map toJson() => _$ProjectEventToJson(this); + + factory ProjectEvent.fromJson(Map input) => + _$ProjectEventFromJson(input); +} + +/// Timeline Comment Event +@JsonSerializable() +class CommentEvent extends TimelineEvent { + CommentEvent({ + super.id = 0, + super.nodeId, + super.url, + super.actor, + super.event = 'commented', + super.commitId, + super.commitUrl, + super.createdAt, + super.performedViaGithubApp, + this.authorAssociation, + this.body, + this.bodyHtml, + this.bodyText, + this.htmlUrl, + this.issueUrl, + this.reactions, + this.updatedAt, + this.user, + }); + + /// How the author is associated with the repository. + /// + /// Example: `OWNER` + String? authorAssociation; + + /// Contents of the issue comment + /// + /// Example: `What version of Safari were you using when you observed this bug?` + String? body; + + String? bodyHtml; + String? bodyText; + + String? htmlUrl; + + String? issueUrl; + + ReactionRollup? reactions; + + DateTime? updatedAt; + + User? user; + + @override + Map toJson() => _$CommentEventToJson(this); + + factory CommentEvent.fromJson(Map input) => + _$CommentEventFromJson(input); +} + +/// Timeline Cross Referenced Event +@JsonSerializable() +class CrossReferenceEvent extends TimelineEvent { + CrossReferenceEvent({ + super.id = 0, + super.nodeId, + super.url, + super.actor, + super.event = 'cross-referenced', + super.commitId, + super.commitUrl, + super.createdAt, + super.performedViaGithubApp, + this.source, + this.updatedAt, + }); + + Source? source; + + DateTime? updatedAt; + + @override + Map toJson() => _$CrossReferenceEventToJson(this); + + factory CrossReferenceEvent.fromJson(Map input) => + _$CrossReferenceEventFromJson(input); +} + +/// Timeline Committed Event +@JsonSerializable() +class TimelineCommitEvent extends TimelineEvent { + TimelineCommitEvent({ + super.id = 0, + super.nodeId, + super.url, + super.actor, + super.event = 'committed', + super.commitId, + super.commitUrl, + super.createdAt, + super.performedViaGithubApp, + this.author, + this.committer, + this.htmlUrl, + this.message, + this.parents, + this.sha, + this.tree, + this.verification, + }); + + User? author; + + /// Identifying information for the git-user + User? committer; + + /// Format: uri + String? htmlUrl; + + /// Message describing the purpose of the commit + String? message; + + List? parents; + + /// SHA for the commit + /// + /// Example: `7638417db6d59f3c431d3e1f261cc637155684cd` + String? sha; + + Tree? tree; + + Verification? verification; + + @override + Map toJson() => _$TimelineCommitEventToJson(this); + + factory TimelineCommitEvent.fromJson(Map input) => + _$TimelineCommitEventFromJson(input); +} + +/// Timeline Reviewed Event +@JsonSerializable() +class ReviewEvent extends TimelineEvent { + ReviewEvent({ + super.id = 0, + super.nodeId, + super.url, + super.actor, + super.event = 'reviewed', + super.commitId, + super.commitUrl, + super.createdAt, + super.performedViaGithubApp, + this.authorAssociation, + this.body, + this.bodyHtml, + this.bodyText, + this.htmlUrl, + this.links, + this.pullRequestUrl, + this.state, + this.submittedAt, + this.user, + }); + + /// How the author is associated with the repository. + /// + /// Example: `OWNER` + String? authorAssociation; + + /// The text of the review. + /// + /// Example: `This looks great.` + String? body; + + String? bodyHtml; + String? bodyText; + + /// Example: `https://github.com/octocat/Hello-World/pull/12#pullrequestreview-80` + String? htmlUrl; + + @JsonKey(name: '_links') + ReviewLinks? links; + + /// Example: `https://api.github.com/repos/octocat/Hello-World/pulls/12` + String? pullRequestUrl; + + /// Example: `CHANGES_REQUESTED` + String? state; + + DateTime? submittedAt; + + User? user; + + @override + Map toJson() => _$ReviewEventToJson(this); + + factory ReviewEvent.fromJson(Map input) => + _$ReviewEventFromJson(input); +} + +/// Timeline Line Commented Event +@JsonSerializable() +class TimelineLineCommentedEvent extends TimelineEvent { + TimelineLineCommentedEvent({ + super.id = 0, + super.nodeId, + super.url, + super.actor, + super.event = '', + super.commitId, + super.commitUrl, + super.createdAt, + super.performedViaGithubApp, + this.comments, + }); + + List? comments; + + @override + Map toJson() => _$TimelineLineCommentedEventToJson(this); + + factory TimelineLineCommentedEvent.fromJson(Map input) => + _$TimelineLineCommentedEventFromJson(input); +} + +/// Timeline Commit Commented Event +@JsonSerializable() +class TimelineCommitCommentedEvent extends TimelineEvent { + TimelineCommitCommentedEvent({ + super.id = 0, + super.nodeId, + super.url, + super.actor, + super.event = '', + super.commitId, + super.commitUrl, + super.createdAt, + super.performedViaGithubApp, + this.comments, + }); + + List? comments; + + @override + Map toJson() => _$TimelineCommitCommentedEventToJson(this); + + factory TimelineCommitCommentedEvent.fromJson(Map input) => + _$TimelineCommitCommentedEventFromJson(input); +} + +/// Timeline Assigned and Timeline Unassigned Issue Events +@JsonSerializable() +class AssigneeEvent extends TimelineEvent { + AssigneeEvent({ + super.id = 0, + super.nodeId, + super.url, + super.actor, + super.event, // typically 'assigned' or 'unassigned' + super.commitId, + super.commitUrl, + super.createdAt, + super.performedViaGithubApp, + this.assignee, + }); + + User? assignee; + + @override + Map toJson() => _$AssigneeEventToJson(this); + + factory AssigneeEvent.fromJson(Map input) => + _$AssigneeEventFromJson(input); +} + +/// State Change Issue Event +@JsonSerializable() +class StateChangeIssueEvent extends TimelineEvent { + StateChangeIssueEvent({ + super.id = 0, + super.nodeId, + super.url, + super.actor, + super.event = '', + super.commitId, + super.commitUrl, + super.createdAt, + super.performedViaGithubApp, + this.stateReason, + }); + + String? stateReason; + + @override + Map toJson() => _$StateChangeIssueEventToJson(this); + + factory StateChangeIssueEvent.fromJson(Map input) => + _$StateChangeIssueEventFromJson(input); +} diff --git a/lib/src/common/model/timeline.g.dart b/lib/src/common/model/timeline.g.dart new file mode 100644 index 00000000..9d0bfc5a --- /dev/null +++ b/lib/src/common/model/timeline.g.dart @@ -0,0 +1,671 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'timeline.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +TimelineEvent _$TimelineEventFromJson(Map json) => + TimelineEvent( + id: json['id'] as int? ?? 0, + nodeId: json['node_id'] as String?, + url: json['url'] as String?, + actor: json['actor'] == null + ? null + : User.fromJson(json['actor'] as Map), + event: json['event'] as String? ?? '', + commitId: json['commit_id'] as String?, + commitUrl: json['commit_url'] as String?, + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + performedViaGithubApp: json['performed_via_github_app'] == null + ? null + : GitHubApp.fromJson( + json['performed_via_github_app'] as Map), + ); + +Map _$TimelineEventToJson(TimelineEvent instance) => + { + 'id': instance.id, + 'node_id': instance.nodeId, + 'url': instance.url, + 'actor': instance.actor, + 'event': instance.event, + 'commit_id': instance.commitId, + 'commit_url': instance.commitUrl, + 'created_at': instance.createdAt?.toIso8601String(), + 'performed_via_github_app': instance.performedViaGithubApp, + }; + +LabelEvent _$LabelEventFromJson(Map json) => LabelEvent( + id: json['id'] as int? ?? 0, + nodeId: json['node_id'] as String?, + url: json['url'] as String?, + actor: json['actor'] == null + ? null + : User.fromJson(json['actor'] as Map), + event: json['event'] as String? ?? '', + commitId: json['commit_id'] as String?, + commitUrl: json['commit_url'] as String?, + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + performedViaGithubApp: json['performed_via_github_app'] == null + ? null + : GitHubApp.fromJson( + json['performed_via_github_app'] as Map), + label: json['label'] == null + ? null + : IssueLabel.fromJson(json['label'] as Map), + ); + +Map _$LabelEventToJson(LabelEvent instance) => + { + 'id': instance.id, + 'node_id': instance.nodeId, + 'url': instance.url, + 'actor': instance.actor, + 'event': instance.event, + 'commit_id': instance.commitId, + 'commit_url': instance.commitUrl, + 'created_at': instance.createdAt?.toIso8601String(), + 'performed_via_github_app': instance.performedViaGithubApp, + 'label': instance.label, + }; + +MilestoneEvent _$MilestoneEventFromJson(Map json) => + MilestoneEvent( + id: json['id'] as int? ?? 0, + nodeId: json['node_id'] as String?, + url: json['url'] as String?, + actor: json['actor'] == null + ? null + : User.fromJson(json['actor'] as Map), + event: json['event'] as String? ?? '', + commitId: json['commit_id'] as String?, + commitUrl: json['commit_url'] as String?, + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + performedViaGithubApp: json['performed_via_github_app'] == null + ? null + : GitHubApp.fromJson( + json['performed_via_github_app'] as Map), + milestone: json['milestone'] == null + ? null + : Milestone.fromJson(json['milestone'] as Map), + ); + +Map _$MilestoneEventToJson(MilestoneEvent instance) => + { + 'id': instance.id, + 'node_id': instance.nodeId, + 'url': instance.url, + 'actor': instance.actor, + 'event': instance.event, + 'commit_id': instance.commitId, + 'commit_url': instance.commitUrl, + 'created_at': instance.createdAt?.toIso8601String(), + 'performed_via_github_app': instance.performedViaGithubApp, + 'milestone': instance.milestone, + }; + +RenameEvent _$RenameEventFromJson(Map json) => RenameEvent( + id: json['id'] as int? ?? 0, + nodeId: json['node_id'] as String?, + url: json['url'] as String?, + actor: json['actor'] == null + ? null + : User.fromJson(json['actor'] as Map), + event: json['event'] as String? ?? 'renamed', + commitId: json['commit_id'] as String?, + commitUrl: json['commit_url'] as String?, + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + performedViaGithubApp: json['performed_via_github_app'] == null + ? null + : GitHubApp.fromJson( + json['performed_via_github_app'] as Map), + rename: json['rename'] == null + ? null + : Rename.fromJson(json['rename'] as Map), + ); + +Map _$RenameEventToJson(RenameEvent instance) => + { + 'id': instance.id, + 'node_id': instance.nodeId, + 'url': instance.url, + 'actor': instance.actor, + 'event': instance.event, + 'commit_id': instance.commitId, + 'commit_url': instance.commitUrl, + 'created_at': instance.createdAt?.toIso8601String(), + 'performed_via_github_app': instance.performedViaGithubApp, + 'rename': instance.rename, + }; + +ReviewRequestEvent _$ReviewRequestEventFromJson(Map json) => + ReviewRequestEvent( + id: json['id'] as int? ?? 0, + nodeId: json['node_id'] as String?, + url: json['url'] as String?, + actor: json['actor'] == null + ? null + : User.fromJson(json['actor'] as Map), + event: json['event'] as String? ?? '', + commitId: json['commit_id'] as String?, + commitUrl: json['commit_url'] as String?, + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + requestedReviewer: json['requested_reviewer'] == null + ? null + : User.fromJson(json['requested_reviewer'] as Map), + requestedTeam: json['requested_team'] == null + ? null + : Team.fromJson(json['requested_team'] as Map), + reviewRequester: json['review_requester'] == null + ? null + : User.fromJson(json['review_requester'] as Map), + )..performedViaGithubApp = json['performed_via_github_app'] == null + ? null + : GitHubApp.fromJson( + json['performed_via_github_app'] as Map); + +Map _$ReviewRequestEventToJson(ReviewRequestEvent instance) => + { + 'id': instance.id, + 'node_id': instance.nodeId, + 'url': instance.url, + 'actor': instance.actor, + 'event': instance.event, + 'commit_id': instance.commitId, + 'commit_url': instance.commitUrl, + 'created_at': instance.createdAt?.toIso8601String(), + 'performed_via_github_app': instance.performedViaGithubApp, + 'requested_reviewer': instance.requestedReviewer, + 'requested_team': instance.requestedTeam, + 'review_requester': instance.reviewRequester, + }; + +ReviewDismissedEvent _$ReviewDismissedEventFromJson( + Map json) => + ReviewDismissedEvent( + id: json['id'] as int? ?? 0, + nodeId: json['node_id'] as String?, + url: json['url'] as String?, + actor: json['actor'] == null + ? null + : User.fromJson(json['actor'] as Map), + event: json['event'] as String? ?? 'review_dismissed', + commitId: json['commit_id'] as String?, + commitUrl: json['commit_url'] as String?, + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + performedViaGithubApp: json['performed_via_github_app'] == null + ? null + : GitHubApp.fromJson( + json['performed_via_github_app'] as Map), + dismissedReview: json['dismissed_review'] == null + ? null + : DismissedReview.fromJson( + json['dismissed_review'] as Map), + ); + +Map _$ReviewDismissedEventToJson( + ReviewDismissedEvent instance) => + { + 'id': instance.id, + 'node_id': instance.nodeId, + 'url': instance.url, + 'actor': instance.actor, + 'event': instance.event, + 'commit_id': instance.commitId, + 'commit_url': instance.commitUrl, + 'created_at': instance.createdAt?.toIso8601String(), + 'performed_via_github_app': instance.performedViaGithubApp, + 'dismissed_review': instance.dismissedReview, + }; + +LockEvent _$LockEventFromJson(Map json) => LockEvent( + id: json['id'] as int? ?? 0, + nodeId: json['node_id'] as String?, + url: json['url'] as String?, + actor: json['actor'] == null + ? null + : User.fromJson(json['actor'] as Map), + event: json['event'] as String? ?? 'locked', + commitId: json['commit_id'] as String?, + commitUrl: json['commit_url'] as String?, + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + performedViaGithubApp: json['performed_via_github_app'] == null + ? null + : GitHubApp.fromJson( + json['performed_via_github_app'] as Map), + lockReason: json['lock_reason'] as String?, + ); + +Map _$LockEventToJson(LockEvent instance) => { + 'id': instance.id, + 'node_id': instance.nodeId, + 'url': instance.url, + 'actor': instance.actor, + 'event': instance.event, + 'commit_id': instance.commitId, + 'commit_url': instance.commitUrl, + 'created_at': instance.createdAt?.toIso8601String(), + 'performed_via_github_app': instance.performedViaGithubApp, + 'lock_reason': instance.lockReason, + }; + +ProjectEvent _$ProjectEventFromJson(Map json) => ProjectEvent( + id: json['id'] as int? ?? 0, + nodeId: json['node_id'] as String?, + url: json['url'] as String?, + actor: json['actor'] == null + ? null + : User.fromJson(json['actor'] as Map), + event: json['event'] as String? ?? '', + commitId: json['commit_id'] as String?, + commitUrl: json['commit_url'] as String?, + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + performedViaGithubApp: json['performed_via_github_app'] == null + ? null + : GitHubApp.fromJson( + json['performed_via_github_app'] as Map), + projectCard: json['project_card'] == null + ? null + : ProjectCard.fromJson(json['project_card'] as Map), + ); + +Map _$ProjectEventToJson(ProjectEvent instance) => + { + 'id': instance.id, + 'node_id': instance.nodeId, + 'url': instance.url, + 'actor': instance.actor, + 'event': instance.event, + 'commit_id': instance.commitId, + 'commit_url': instance.commitUrl, + 'created_at': instance.createdAt?.toIso8601String(), + 'performed_via_github_app': instance.performedViaGithubApp, + 'project_card': instance.projectCard, + }; + +CommentEvent _$CommentEventFromJson(Map json) => CommentEvent( + id: json['id'] as int? ?? 0, + nodeId: json['node_id'] as String?, + url: json['url'] as String?, + actor: json['actor'] == null + ? null + : User.fromJson(json['actor'] as Map), + event: json['event'] as String? ?? 'commented', + commitId: json['commit_id'] as String?, + commitUrl: json['commit_url'] as String?, + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + performedViaGithubApp: json['performed_via_github_app'] == null + ? null + : GitHubApp.fromJson( + json['performed_via_github_app'] as Map), + authorAssociation: json['author_association'] as String?, + body: json['body'] as String?, + bodyHtml: json['body_html'] as String?, + bodyText: json['body_text'] as String?, + htmlUrl: json['html_url'] as String?, + issueUrl: json['issue_url'] as String?, + reactions: json['reactions'] == null + ? null + : ReactionRollup.fromJson(json['reactions'] as Map), + updatedAt: json['updated_at'] == null + ? null + : DateTime.parse(json['updated_at'] as String), + user: json['user'] == null + ? null + : User.fromJson(json['user'] as Map), + ); + +Map _$CommentEventToJson(CommentEvent instance) => + { + 'id': instance.id, + 'node_id': instance.nodeId, + 'url': instance.url, + 'actor': instance.actor, + 'event': instance.event, + 'commit_id': instance.commitId, + 'commit_url': instance.commitUrl, + 'created_at': instance.createdAt?.toIso8601String(), + 'performed_via_github_app': instance.performedViaGithubApp, + 'author_association': instance.authorAssociation, + 'body': instance.body, + 'body_html': instance.bodyHtml, + 'body_text': instance.bodyText, + 'html_url': instance.htmlUrl, + 'issue_url': instance.issueUrl, + 'reactions': instance.reactions, + 'updated_at': instance.updatedAt?.toIso8601String(), + 'user': instance.user, + }; + +CrossReferenceEvent _$CrossReferenceEventFromJson(Map json) => + CrossReferenceEvent( + id: json['id'] as int? ?? 0, + nodeId: json['node_id'] as String?, + url: json['url'] as String?, + actor: json['actor'] == null + ? null + : User.fromJson(json['actor'] as Map), + event: json['event'] as String? ?? 'cross-referenced', + commitId: json['commit_id'] as String?, + commitUrl: json['commit_url'] as String?, + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + performedViaGithubApp: json['performed_via_github_app'] == null + ? null + : GitHubApp.fromJson( + json['performed_via_github_app'] as Map), + source: json['source'] == null + ? null + : Source.fromJson(json['source'] as Map), + updatedAt: json['updated_at'] == null + ? null + : DateTime.parse(json['updated_at'] as String), + ); + +Map _$CrossReferenceEventToJson( + CrossReferenceEvent instance) => + { + 'id': instance.id, + 'node_id': instance.nodeId, + 'url': instance.url, + 'actor': instance.actor, + 'event': instance.event, + 'commit_id': instance.commitId, + 'commit_url': instance.commitUrl, + 'created_at': instance.createdAt?.toIso8601String(), + 'performed_via_github_app': instance.performedViaGithubApp, + 'source': instance.source, + 'updated_at': instance.updatedAt?.toIso8601String(), + }; + +TimelineCommitEvent _$TimelineCommitEventFromJson(Map json) => + TimelineCommitEvent( + id: json['id'] as int? ?? 0, + nodeId: json['node_id'] as String?, + url: json['url'] as String?, + actor: json['actor'] == null + ? null + : User.fromJson(json['actor'] as Map), + event: json['event'] as String? ?? 'committed', + commitId: json['commit_id'] as String?, + commitUrl: json['commit_url'] as String?, + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + performedViaGithubApp: json['performed_via_github_app'] == null + ? null + : GitHubApp.fromJson( + json['performed_via_github_app'] as Map), + author: json['author'] == null + ? null + : User.fromJson(json['author'] as Map), + committer: json['committer'] == null + ? null + : User.fromJson(json['committer'] as Map), + htmlUrl: json['html_url'] as String?, + message: json['message'] as String?, + parents: (json['parents'] as List?) + ?.map((e) => Tree.fromJson(e as Map)) + .toList(), + sha: json['sha'] as String?, + tree: json['tree'] == null + ? null + : Tree.fromJson(json['tree'] as Map), + verification: json['verification'] == null + ? null + : Verification.fromJson(json['verification'] as Map), + ); + +Map _$TimelineCommitEventToJson( + TimelineCommitEvent instance) => + { + 'id': instance.id, + 'node_id': instance.nodeId, + 'url': instance.url, + 'actor': instance.actor, + 'event': instance.event, + 'commit_id': instance.commitId, + 'commit_url': instance.commitUrl, + 'created_at': instance.createdAt?.toIso8601String(), + 'performed_via_github_app': instance.performedViaGithubApp, + 'author': instance.author, + 'committer': instance.committer, + 'html_url': instance.htmlUrl, + 'message': instance.message, + 'parents': instance.parents, + 'sha': instance.sha, + 'tree': instance.tree, + 'verification': instance.verification, + }; + +ReviewEvent _$ReviewEventFromJson(Map json) => ReviewEvent( + id: json['id'] as int? ?? 0, + nodeId: json['node_id'] as String?, + url: json['url'] as String?, + actor: json['actor'] == null + ? null + : User.fromJson(json['actor'] as Map), + event: json['event'] as String? ?? 'reviewed', + commitId: json['commit_id'] as String?, + commitUrl: json['commit_url'] as String?, + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + performedViaGithubApp: json['performed_via_github_app'] == null + ? null + : GitHubApp.fromJson( + json['performed_via_github_app'] as Map), + authorAssociation: json['author_association'] as String?, + body: json['body'] as String?, + bodyHtml: json['body_html'] as String?, + bodyText: json['body_text'] as String?, + htmlUrl: json['html_url'] as String?, + links: json['_links'] == null + ? null + : ReviewLinks.fromJson(json['_links'] as Map), + pullRequestUrl: json['pull_request_url'] as String?, + state: json['state'] as String?, + submittedAt: json['submitted_at'] == null + ? null + : DateTime.parse(json['submitted_at'] as String), + user: json['user'] == null + ? null + : User.fromJson(json['user'] as Map), + ); + +Map _$ReviewEventToJson(ReviewEvent instance) => + { + 'id': instance.id, + 'node_id': instance.nodeId, + 'url': instance.url, + 'actor': instance.actor, + 'event': instance.event, + 'commit_id': instance.commitId, + 'commit_url': instance.commitUrl, + 'created_at': instance.createdAt?.toIso8601String(), + 'performed_via_github_app': instance.performedViaGithubApp, + 'author_association': instance.authorAssociation, + 'body': instance.body, + 'body_html': instance.bodyHtml, + 'body_text': instance.bodyText, + 'html_url': instance.htmlUrl, + '_links': instance.links, + 'pull_request_url': instance.pullRequestUrl, + 'state': instance.state, + 'submitted_at': instance.submittedAt?.toIso8601String(), + 'user': instance.user, + }; + +TimelineLineCommentedEvent _$TimelineLineCommentedEventFromJson( + Map json) => + TimelineLineCommentedEvent( + id: json['id'] as int? ?? 0, + nodeId: json['node_id'] as String?, + url: json['url'] as String?, + actor: json['actor'] == null + ? null + : User.fromJson(json['actor'] as Map), + event: json['event'] as String? ?? '', + commitId: json['commit_id'] as String?, + commitUrl: json['commit_url'] as String?, + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + performedViaGithubApp: json['performed_via_github_app'] == null + ? null + : GitHubApp.fromJson( + json['performed_via_github_app'] as Map), + comments: (json['comments'] as List?) + ?.map((e) => + PullRequestReviewComment.fromJson(e as Map)) + .toList(), + ); + +Map _$TimelineLineCommentedEventToJson( + TimelineLineCommentedEvent instance) => + { + 'id': instance.id, + 'node_id': instance.nodeId, + 'url': instance.url, + 'actor': instance.actor, + 'event': instance.event, + 'commit_id': instance.commitId, + 'commit_url': instance.commitUrl, + 'created_at': instance.createdAt?.toIso8601String(), + 'performed_via_github_app': instance.performedViaGithubApp, + 'comments': instance.comments, + }; + +TimelineCommitCommentedEvent _$TimelineCommitCommentedEventFromJson( + Map json) => + TimelineCommitCommentedEvent( + id: json['id'] as int? ?? 0, + nodeId: json['node_id'] as String?, + url: json['url'] as String?, + actor: json['actor'] == null + ? null + : User.fromJson(json['actor'] as Map), + event: json['event'] as String? ?? '', + commitId: json['commit_id'] as String?, + commitUrl: json['commit_url'] as String?, + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + performedViaGithubApp: json['performed_via_github_app'] == null + ? null + : GitHubApp.fromJson( + json['performed_via_github_app'] as Map), + comments: (json['comments'] as List?) + ?.map((e) => CommitComment.fromJson(e as Map)) + .toList(), + ); + +Map _$TimelineCommitCommentedEventToJson( + TimelineCommitCommentedEvent instance) => + { + 'id': instance.id, + 'node_id': instance.nodeId, + 'url': instance.url, + 'actor': instance.actor, + 'event': instance.event, + 'commit_id': instance.commitId, + 'commit_url': instance.commitUrl, + 'created_at': instance.createdAt?.toIso8601String(), + 'performed_via_github_app': instance.performedViaGithubApp, + 'comments': instance.comments, + }; + +AssigneeEvent _$AssigneeEventFromJson(Map json) => + AssigneeEvent( + id: json['id'] as int? ?? 0, + nodeId: json['node_id'] as String?, + url: json['url'] as String?, + actor: json['actor'] == null + ? null + : User.fromJson(json['actor'] as Map), + event: json['event'] as String? ?? '', + commitId: json['commit_id'] as String?, + commitUrl: json['commit_url'] as String?, + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + performedViaGithubApp: json['performed_via_github_app'] == null + ? null + : GitHubApp.fromJson( + json['performed_via_github_app'] as Map), + assignee: json['assignee'] == null + ? null + : User.fromJson(json['assignee'] as Map), + ); + +Map _$AssigneeEventToJson(AssigneeEvent instance) => + { + 'id': instance.id, + 'node_id': instance.nodeId, + 'url': instance.url, + 'actor': instance.actor, + 'event': instance.event, + 'commit_id': instance.commitId, + 'commit_url': instance.commitUrl, + 'created_at': instance.createdAt?.toIso8601String(), + 'performed_via_github_app': instance.performedViaGithubApp, + 'assignee': instance.assignee, + }; + +StateChangeIssueEvent _$StateChangeIssueEventFromJson( + Map json) => + StateChangeIssueEvent( + id: json['id'] as int? ?? 0, + nodeId: json['node_id'] as String?, + url: json['url'] as String?, + actor: json['actor'] == null + ? null + : User.fromJson(json['actor'] as Map), + event: json['event'] as String? ?? '', + commitId: json['commit_id'] as String?, + commitUrl: json['commit_url'] as String?, + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + performedViaGithubApp: json['performed_via_github_app'] == null + ? null + : GitHubApp.fromJson( + json['performed_via_github_app'] as Map), + stateReason: json['state_reason'] as String?, + ); + +Map _$StateChangeIssueEventToJson( + StateChangeIssueEvent instance) => + { + 'id': instance.id, + 'node_id': instance.nodeId, + 'url': instance.url, + 'actor': instance.actor, + 'event': instance.event, + 'commit_id': instance.commitId, + 'commit_url': instance.commitUrl, + 'created_at': instance.createdAt?.toIso8601String(), + 'performed_via_github_app': instance.performedViaGithubApp, + 'state_reason': instance.stateReason, + }; diff --git a/lib/src/common/model/timeline_support.dart b/lib/src/common/model/timeline_support.dart new file mode 100644 index 00000000..f2b03c62 --- /dev/null +++ b/lib/src/common/model/timeline_support.dart @@ -0,0 +1,562 @@ +import 'package:github/src/common.dart'; +import 'package:json_annotation/json_annotation.dart'; + +part 'timeline_support.g.dart'; + +/// GitHub app +/// +/// GitHub apps are a new way to extend GitHub. They can be installed directly +/// on organizations and user accounts and granted access to specific repositories. +/// They come with granular permissions and built-in webhooks. GitHub apps are +/// first class actors within GitHub. +@JsonSerializable() +class GitHubApp { + GitHubApp({ + this.clientId, + this.clientSecret, + this.createdAt, + this.description, + this.events, + this.externalUrl, + this.htmlUrl, + this.id, + this.installationsCount, + this.name, + this.nodeId, + this.owner, + this.pem, + this.permissions, + this.slug, + this.updatedAt, + this.webhookSecret, + }); + + /// Example: `"Iv1.25b5d1e65ffc4022"` + final String? clientId; + + /// Example: `"1d4b2097ac622ba702d19de498f005747a8b21d3"` + final String? clientSecret; + + final DateTime? createdAt; + + final String? description; + + /// The list of events for the GitHub app + /// + /// Example: `label` + /// + /// Example: `deployment` + final List? events; + + /// Example: `https://example.com` + final String? externalUrl; + + /// Example: `https://github.com/apps/super-ci` + final String? htmlUrl; + + /// Unique identifier of the GitHub app + final int? id; + + /// The number of installations associated with the GitHub app + final int? installationsCount; + + /// The name of the GitHub app + /// + /// Example: `Probot Owners` + final String? name; + + /// Example: `MDExOkludGVncmF0aW9uMQ==` + final String? nodeId; + + final User? owner; + + /// Example: + /// + /// ``` + /// -----BEGIN RSA PRIVATE KEY----- + /// MIIEogIBAAKCAQEArYxrNYD/iT5CZVpRJu4rBKmmze3PVmT/gCo2ATUvDvZTPTey + /// xcGJ3vvrJXazKk06pN05TN29o98jrYz4cengG3YGsXPNEpKsIrEl8NhbnxapEnM9 + /// JCMRe0P5JcPsfZlX6hmiT7136GRWiGOUba2X9+HKh8QJVLG5rM007TBER9/z9mWm + /// rJuNh+m5l320oBQY/Qq3A7wzdEfZw8qm/mIN0FCeoXH1L6B8xXWaAYBwhTEh6SSn + /// ZHlO1Xu1JWDmAvBCi0RO5aRSKM8q9QEkvvHP4yweAtK3N8+aAbZ7ovaDhyGz8r6r + /// zhU1b8Uo0Z2ysf503WqzQgIajr7Fry7/kUwpgQIDAQABAoIBADwJp80Ko1xHPZDy + /// fcCKBDfIuPvkmSW6KumbsLMaQv1aGdHDwwTGv3t0ixSay8CGlxMRtRDyZPib6SvQ + /// 6OH/lpfpbMdW2ErkksgtoIKBVrDilfrcAvrNZu7NxRNbhCSvN8q0s4ICecjbbVQh + /// nueSdlA6vGXbW58BHMq68uRbHkP+k+mM9U0mDJ1HMch67wlg5GbayVRt63H7R2+r + /// Vxcna7B80J/lCEjIYZznawgiTvp3MSanTglqAYi+m1EcSsP14bJIB9vgaxS79kTu + /// oiSo93leJbBvuGo8QEiUqTwMw4tDksmkLsoqNKQ1q9P7LZ9DGcujtPy4EZsamSJT + /// y8OJt0ECgYEA2lxOxJsQk2kI325JgKFjo92mQeUObIvPfSNWUIZQDTjniOI6Gv63 + /// GLWVFrZcvQBWjMEQraJA9xjPbblV8PtfO87MiJGLWCHFxmPz2dzoedN+2Coxom8m + /// V95CLz8QUShuao6u/RYcvUaZEoYs5bHcTmy5sBK80JyEmafJPtCQVxMCgYEAy3ar + /// Zr3yv4xRPEPMat4rseswmuMooSaK3SKub19WFI5IAtB/e7qR1Rj9JhOGcZz+OQrl + /// T78O2OFYlgOIkJPvRMrPpK5V9lslc7tz1FSh3BZMRGq5jSyD7ETSOQ0c8T2O/s7v + /// beEPbVbDe4mwvM24XByH0GnWveVxaDl51ABD65sCgYB3ZAspUkOA5egVCh8kNpnd + /// Sd6SnuQBE3ySRlT2WEnCwP9Ph6oPgn+oAfiPX4xbRqkL8q/k0BdHQ4h+zNwhk7+h + /// WtPYRAP1Xxnc/F+jGjb+DVaIaKGU18MWPg7f+FI6nampl3Q0KvfxwX0GdNhtio8T + /// Tj1E+SnFwh56SRQuxSh2gwKBgHKjlIO5NtNSflsUYFM+hyQiPiqnHzddfhSG+/3o + /// m5nNaSmczJesUYreH5San7/YEy2UxAugvP7aSY2MxB+iGsiJ9WD2kZzTUlDZJ7RV + /// UzWsoqBR+eZfVJ2FUWWvy8TpSG6trh4dFxImNtKejCR1TREpSiTV3Zb1dmahK9GV + /// rK9NAoGAbBxRLoC01xfxCTgt5BDiBcFVh4fp5yYKwavJPLzHSpuDOrrI9jDn1oKN + /// onq5sDU1i391zfQvdrbX4Ova48BN+B7p63FocP/MK5tyyBoT8zQEk2+vWDOw7H/Z + /// u5dTCPxTIsoIwUw1I+7yIxqJzLPFgR2gVBwY1ra/8iAqCj+zeBw= + /// -----END RSA PRIVATE KEY----- + /// ``` + final String? pem; + + /// The set of permissions for the GitHub app + final Permissions? permissions; + + /// The slug name of the GitHub app + /// + /// Example: `probot-owners` + final String? slug; + + final DateTime? updatedAt; + + /// Example: `"6fba8f2fc8a7e8f2cca5577eddd82ca7586b3b6b"` + final String? webhookSecret; + + Map toJson() => _$GitHubAppToJson(this); + + factory GitHubApp.fromJson(Map input) => + _$GitHubAppFromJson(input); +} + +@JsonSerializable() +class Rename { + Rename({ + this.from, + this.to, + }); + + final String? from; + final String? to; + + Map toJson() => _$RenameToJson(this); + + factory Rename.fromJson(Map input) => + _$RenameFromJson(input); +} + +@JsonSerializable() +class DismissedReview { + DismissedReview({ + this.dismissalCommitId, + this.dismissalMessage, + this.reviewId, + this.state, + }); + + final String? dismissalCommitId; + final String? dismissalMessage; + final int? reviewId; + final String? state; + + Map toJson() => _$DismissedReviewToJson(this); + + factory DismissedReview.fromJson(Map input) => + _$DismissedReviewFromJson(input); +} + +@JsonSerializable() +class ProjectCard { + ProjectCard({ + this.columnName, + this.id, + this.previousColumnName, + this.projectId, + this.projectUrl, + this.url, + }); + + final String? columnName; + final int? id; + final String? previousColumnName; + final int? projectId; + final String? projectUrl; + final String? url; + + Map toJson() => _$ProjectCardToJson(this); + + factory ProjectCard.fromJson(Map input) => + _$ProjectCardFromJson(input); +} + +@JsonSerializable() +class Source { + Source({ + this.issue, + this.type, + }); + + final Issue? issue; + final String? type; + + Map toJson() => _$SourceToJson(this); + + factory Source.fromJson(Map input) => + _$SourceFromJson(input); +} + +/// License +@JsonSerializable() +class License { + License({ + this.htmlUrl, + this.key, + this.name, + this.nodeId, + this.spdxId, + this.url, + }); + + final String? htmlUrl; + + /// Example: `mit` + final String? key; + + /// Example: `MIT License` + final String? name; + + /// Example: `MDc6TGljZW5zZW1pdA==` + final String? nodeId; + + /// Example: `MIT` + final String? spdxId; + + /// Example: `https://api.github.com/licenses/mit` + final String? url; + + Map toJson() => _$LicenseToJson(this); + + factory License.fromJson(Map input) => + _$LicenseFromJson(input); +} + +@JsonSerializable() +class TemplateRepository { + TemplateRepository({ + this.allowAutoMerge, + this.allowMergeCommit, + this.allowRebaseMerge, + this.allowSquashMerge, + this.allowUpdateBranch, + this.archiveUrl, + this.archived, + this.assigneesUrl, + this.blobsUrl, + this.branchesUrl, + this.cloneUrl, + this.collaboratorsUrl, + this.commentsUrl, + this.commitsUrl, + this.compareUrl, + this.contentsUrl, + this.contributorsUrl, + this.createdAt, + this.defaultBranch, + this.deleteBranchOnMerge, + this.deploymentsUrl, + this.description, + this.disabled, + this.downloadsUrl, + this.eventsUrl, + this.fork, + this.forksCount, + this.forksUrl, + this.fullName, + this.gitCommitsUrl, + this.gitRefsUrl, + this.gitTagsUrl, + this.gitUrl, + this.hasDownloads, + this.hasIssues, + this.hasPages, + this.hasProjects, + this.hasWiki, + this.homepage, + this.hooksUrl, + this.htmlUrl, + this.id, + this.isTemplate, + this.issueCommentUrl, + this.issueEventsUrl, + this.issuesUrl, + this.keysUrl, + this.labelsUrl, + this.language, + this.languagesUrl, + this.mergeCommitMessage, + this.mergeCommitTitle, + this.mergesUrl, + this.milestonesUrl, + this.mirrorUrl, + this.name, + this.networkCount, + this.nodeId, + this.notificationsUrl, + this.openIssuesCount, + this.owner, + this.permissions, + this.private, + this.pullsUrl, + this.pushedAt, + this.releasesUrl, + this.size, + this.squashMergeCommitMessage, + this.squashMergeCommitTitle, + this.sshUrl, + this.stargazersCount, + this.stargazersUrl, + this.statusesUrl, + this.subscribersCount, + this.subscribersUrl, + this.subscriptionUrl, + this.svnUrl, + this.tagsUrl, + this.teamsUrl, + this.tempCloneToken, + this.topics, + this.treesUrl, + this.updatedAt, + this.url, + this.visibility, + this.watchersCount, + }); + + final bool? allowAutoMerge; + final bool? allowMergeCommit; + final bool? allowRebaseMerge; + final bool? allowSquashMerge; + final bool? allowUpdateBranch; + final String? archiveUrl; + final bool? archived; + final String? assigneesUrl; + final String? blobsUrl; + final String? branchesUrl; + final String? cloneUrl; + final String? collaboratorsUrl; + final String? commentsUrl; + final String? commitsUrl; + final String? compareUrl; + final String? contentsUrl; + final String? contributorsUrl; + final DateTime? createdAt; + final String? defaultBranch; + final bool? deleteBranchOnMerge; + final String? deploymentsUrl; + final String? description; + final bool? disabled; + final String? downloadsUrl; + final String? eventsUrl; + final bool? fork; + final int? forksCount; + final String? forksUrl; + final String? fullName; + final String? gitCommitsUrl; + final String? gitRefsUrl; + final String? gitTagsUrl; + final String? gitUrl; + final bool? hasDownloads; + final bool? hasIssues; + final bool? hasPages; + final bool? hasProjects; + final bool? hasWiki; + final String? homepage; + final String? hooksUrl; + final String? htmlUrl; + final int? id; + final bool? isTemplate; + final String? issueCommentUrl; + final String? issueEventsUrl; + final String? issuesUrl; + final String? keysUrl; + final String? labelsUrl; + final String? language; + final String? languagesUrl; + + /// The default value for a merge commit message. + /// + /// - `PR_TITLE` - default to the pull request's title. + /// - `PR_BODY` - default to the pull request's body. + /// - `BLANK` - default to a blank commit message. + final String? mergeCommitMessage; + + /// The default value for a merge commit title. + /// + /// - `PR_TITLE` - default to the pull request's title. + /// - `MERGE_MESSAGE` - default to the classic title for a merge message (e.g., + /// Merge pull request #123 from branch-name). + final String? mergeCommitTitle; + + final String? mergesUrl; + final String? milestonesUrl; + final String? mirrorUrl; + final String? name; + final int? networkCount; + final String? nodeId; + final String? notificationsUrl; + final int? openIssuesCount; + final Owner? owner; + final Permissions? permissions; + final bool? private; + final String? pullsUrl; + final DateTime? pushedAt; + final String? releasesUrl; + final int? size; + + /// The default value for a squash merge commit message: + /// + /// - `PR_BODY` - default to the pull request's body. + /// - `COMMIT_MESSAGES` - default to the branch's commit messages. + /// - `BLANK` - default to a blank commit message. + final String? squashMergeCommitMessage; + + /// The default value for a squash merge commit title: + /// + /// - `PR_TITLE` - default to the pull request's title. + /// - `COMMIT_OR_PR_TITLE` - default to the commit's title (if only one commit) + /// or the pull request's title (when more than one commit). + final String? squashMergeCommitTitle; + + final String? sshUrl; + final int? stargazersCount; + final String? stargazersUrl; + final String? statusesUrl; + final int? subscribersCount; + final String? subscribersUrl; + final String? subscriptionUrl; + final String? svnUrl; + final String? tagsUrl; + final String? teamsUrl; + final String? tempCloneToken; + final List? topics; + final String? treesUrl; + final DateTime? updatedAt; + final String? url; + final String? visibility; + final int? watchersCount; + + Map toJson() => _$TemplateRepositoryToJson(this); + + factory TemplateRepository.fromJson(Map input) => + _$TemplateRepositoryFromJson(input); +} + +@JsonSerializable() +class Owner { + Owner({ + this.avatarUrl, + this.eventsUrl, + this.followersUrl, + this.followingUrl, + this.gistsUrl, + this.gravatarId, + this.htmlUrl, + this.id, + this.login, + this.nodeId, + this.organizationsUrl, + this.receivedEventsUrl, + this.reposUrl, + this.siteAdmin, + this.starredUrl, + this.subscriptionsUrl, + this.type, + this.url, + }); + + final String? avatarUrl; + final String? eventsUrl; + final String? followersUrl; + final String? followingUrl; + final String? gistsUrl; + final String? gravatarId; + final String? htmlUrl; + final int? id; + final String? login; + final String? nodeId; + final String? organizationsUrl; + final String? receivedEventsUrl; + final String? reposUrl; + final bool? siteAdmin; + final String? starredUrl; + final String? subscriptionsUrl; + final String? type; + final String? url; + + Map toJson() => _$OwnerToJson(this); + + factory Owner.fromJson(Map input) => _$OwnerFromJson(input); +} + +@JsonSerializable() +class Tree { + Tree({ + this.sha, + this.url, + this.htmlUrl, + }); + + /// SHA for the commit + /// + /// Example: `7638417db6d59f3c431d3e1f261cc637155684cd` + final String? sha; + + final String? url; + + final String? htmlUrl; + + Map toJson() => _$TreeToJson(this); + + factory Tree.fromJson(Map input) => _$TreeFromJson(input); +} + +@JsonSerializable() +class Verification { + Verification({ + this.payload, + this.reason, + this.signature, + this.verified, + }); + + final String? payload; + final String? reason; + final String? signature; + final bool? verified; + + Map toJson() => _$VerificationToJson(this); + + factory Verification.fromJson(Map input) => + _$VerificationFromJson(input); +} + +@JsonSerializable() +class HtmlLink { + HtmlLink({ + this.href, + }); + + final String? href; + + Map toJson() => _$HtmlLinkToJson(this); + + factory HtmlLink.fromJson(Map input) => + _$HtmlLinkFromJson(input); +} + +@JsonSerializable() +class PullRequestLink { + PullRequestLink({ + this.href, + }); + + /// Example: `https://api.github.com/repos/octocat/Hello-World/pulls/1` + final String? href; + + Map toJson() => _$PullRequestLinkToJson(this); + + factory PullRequestLink.fromJson(Map input) => + _$PullRequestLinkFromJson(input); +} diff --git a/lib/src/common/model/timeline_support.g.dart b/lib/src/common/model/timeline_support.g.dart new file mode 100644 index 00000000..c1e441f2 --- /dev/null +++ b/lib/src/common/model/timeline_support.g.dart @@ -0,0 +1,409 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'timeline_support.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +GitHubApp _$GitHubAppFromJson(Map json) => GitHubApp( + clientId: json['client_id'] as String?, + clientSecret: json['client_secret'] as String?, + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + description: json['description'] as String?, + events: + (json['events'] as List?)?.map((e) => e as String).toList(), + externalUrl: json['external_url'] as String?, + htmlUrl: json['html_url'] as String?, + id: json['id'] as int?, + installationsCount: json['installations_count'] as int?, + name: json['name'] as String?, + nodeId: json['node_id'] as String?, + owner: json['owner'] == null + ? null + : User.fromJson(json['owner'] as Map), + pem: json['pem'] as String?, + permissions: json['permissions'] == null + ? null + : Permissions.fromJson(json['permissions'] as Map), + slug: json['slug'] as String?, + updatedAt: json['updated_at'] == null + ? null + : DateTime.parse(json['updated_at'] as String), + webhookSecret: json['webhook_secret'] as String?, + ); + +Map _$GitHubAppToJson(GitHubApp instance) => { + 'client_id': instance.clientId, + 'client_secret': instance.clientSecret, + 'created_at': instance.createdAt?.toIso8601String(), + 'description': instance.description, + 'events': instance.events, + 'external_url': instance.externalUrl, + 'html_url': instance.htmlUrl, + 'id': instance.id, + 'installations_count': instance.installationsCount, + 'name': instance.name, + 'node_id': instance.nodeId, + 'owner': instance.owner, + 'pem': instance.pem, + 'permissions': instance.permissions, + 'slug': instance.slug, + 'updated_at': instance.updatedAt?.toIso8601String(), + 'webhook_secret': instance.webhookSecret, + }; + +Rename _$RenameFromJson(Map json) => Rename( + from: json['from'] as String?, + to: json['to'] as String?, + ); + +Map _$RenameToJson(Rename instance) => { + 'from': instance.from, + 'to': instance.to, + }; + +DismissedReview _$DismissedReviewFromJson(Map json) => + DismissedReview( + dismissalCommitId: json['dismissal_commit_id'] as String?, + dismissalMessage: json['dismissal_message'] as String?, + reviewId: json['review_id'] as int?, + state: json['state'] as String?, + ); + +Map _$DismissedReviewToJson(DismissedReview instance) => + { + 'dismissal_commit_id': instance.dismissalCommitId, + 'dismissal_message': instance.dismissalMessage, + 'review_id': instance.reviewId, + 'state': instance.state, + }; + +ProjectCard _$ProjectCardFromJson(Map json) => ProjectCard( + columnName: json['column_name'] as String?, + id: json['id'] as int?, + previousColumnName: json['previous_column_name'] as String?, + projectId: json['project_id'] as int?, + projectUrl: json['project_url'] as String?, + url: json['url'] as String?, + ); + +Map _$ProjectCardToJson(ProjectCard instance) => + { + 'column_name': instance.columnName, + 'id': instance.id, + 'previous_column_name': instance.previousColumnName, + 'project_id': instance.projectId, + 'project_url': instance.projectUrl, + 'url': instance.url, + }; + +Source _$SourceFromJson(Map json) => Source( + issue: json['issue'] == null + ? null + : Issue.fromJson(json['issue'] as Map), + type: json['type'] as String?, + ); + +Map _$SourceToJson(Source instance) => { + 'issue': instance.issue, + 'type': instance.type, + }; + +License _$LicenseFromJson(Map json) => License( + htmlUrl: json['html_url'] as String?, + key: json['key'] as String?, + name: json['name'] as String?, + nodeId: json['node_id'] as String?, + spdxId: json['spdx_id'] as String?, + url: json['url'] as String?, + ); + +Map _$LicenseToJson(License instance) => { + 'html_url': instance.htmlUrl, + 'key': instance.key, + 'name': instance.name, + 'node_id': instance.nodeId, + 'spdx_id': instance.spdxId, + 'url': instance.url, + }; + +TemplateRepository _$TemplateRepositoryFromJson(Map json) => + TemplateRepository( + allowAutoMerge: json['allow_auto_merge'] as bool?, + allowMergeCommit: json['allow_merge_commit'] as bool?, + allowRebaseMerge: json['allow_rebase_merge'] as bool?, + allowSquashMerge: json['allow_squash_merge'] as bool?, + allowUpdateBranch: json['allow_update_branch'] as bool?, + archiveUrl: json['archive_url'] as String?, + archived: json['archived'] as bool?, + assigneesUrl: json['assignees_url'] as String?, + blobsUrl: json['blobs_url'] as String?, + branchesUrl: json['branches_url'] as String?, + cloneUrl: json['clone_url'] as String?, + collaboratorsUrl: json['collaborators_url'] as String?, + commentsUrl: json['comments_url'] as String?, + commitsUrl: json['commits_url'] as String?, + compareUrl: json['compare_url'] as String?, + contentsUrl: json['contents_url'] as String?, + contributorsUrl: json['contributors_url'] as String?, + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), + defaultBranch: json['default_branch'] as String?, + deleteBranchOnMerge: json['delete_branch_on_merge'] as bool?, + deploymentsUrl: json['deployments_url'] as String?, + description: json['description'] as String?, + disabled: json['disabled'] as bool?, + downloadsUrl: json['downloads_url'] as String?, + eventsUrl: json['events_url'] as String?, + fork: json['fork'] as bool?, + forksCount: json['forks_count'] as int?, + forksUrl: json['forks_url'] as String?, + fullName: json['full_name'] as String?, + gitCommitsUrl: json['git_commits_url'] as String?, + gitRefsUrl: json['git_refs_url'] as String?, + gitTagsUrl: json['git_tags_url'] as String?, + gitUrl: json['git_url'] as String?, + hasDownloads: json['has_downloads'] as bool?, + hasIssues: json['has_issues'] as bool?, + hasPages: json['has_pages'] as bool?, + hasProjects: json['has_projects'] as bool?, + hasWiki: json['has_wiki'] as bool?, + homepage: json['homepage'] as String?, + hooksUrl: json['hooks_url'] as String?, + htmlUrl: json['html_url'] as String?, + id: json['id'] as int?, + isTemplate: json['is_template'] as bool?, + issueCommentUrl: json['issue_comment_url'] as String?, + issueEventsUrl: json['issue_events_url'] as String?, + issuesUrl: json['issues_url'] as String?, + keysUrl: json['keys_url'] as String?, + labelsUrl: json['labels_url'] as String?, + language: json['language'] as String?, + languagesUrl: json['languages_url'] as String?, + mergeCommitMessage: json['merge_commit_message'] as String?, + mergeCommitTitle: json['merge_commit_title'] as String?, + mergesUrl: json['merges_url'] as String?, + milestonesUrl: json['milestones_url'] as String?, + mirrorUrl: json['mirror_url'] as String?, + name: json['name'] as String?, + networkCount: json['network_count'] as int?, + nodeId: json['node_id'] as String?, + notificationsUrl: json['notifications_url'] as String?, + openIssuesCount: json['open_issues_count'] as int?, + owner: json['owner'] == null + ? null + : Owner.fromJson(json['owner'] as Map), + permissions: json['permissions'] == null + ? null + : Permissions.fromJson(json['permissions'] as Map), + private: json['private'] as bool?, + pullsUrl: json['pulls_url'] as String?, + pushedAt: json['pushed_at'] == null + ? null + : DateTime.parse(json['pushed_at'] as String), + releasesUrl: json['releases_url'] as String?, + size: json['size'] as int?, + squashMergeCommitMessage: json['squash_merge_commit_message'] as String?, + squashMergeCommitTitle: json['squash_merge_commit_title'] as String?, + sshUrl: json['ssh_url'] as String?, + stargazersCount: json['stargazers_count'] as int?, + stargazersUrl: json['stargazers_url'] as String?, + statusesUrl: json['statuses_url'] as String?, + subscribersCount: json['subscribers_count'] as int?, + subscribersUrl: json['subscribers_url'] as String?, + subscriptionUrl: json['subscription_url'] as String?, + svnUrl: json['svn_url'] as String?, + tagsUrl: json['tags_url'] as String?, + teamsUrl: json['teams_url'] as String?, + tempCloneToken: json['temp_clone_token'] as String?, + topics: + (json['topics'] as List?)?.map((e) => e as String).toList(), + treesUrl: json['trees_url'] as String?, + updatedAt: json['updated_at'] == null + ? null + : DateTime.parse(json['updated_at'] as String), + url: json['url'] as String?, + visibility: json['visibility'] as String?, + watchersCount: json['watchers_count'] as int?, + ); + +Map _$TemplateRepositoryToJson(TemplateRepository instance) => + { + 'allow_auto_merge': instance.allowAutoMerge, + 'allow_merge_commit': instance.allowMergeCommit, + 'allow_rebase_merge': instance.allowRebaseMerge, + 'allow_squash_merge': instance.allowSquashMerge, + 'allow_update_branch': instance.allowUpdateBranch, + 'archive_url': instance.archiveUrl, + 'archived': instance.archived, + 'assignees_url': instance.assigneesUrl, + 'blobs_url': instance.blobsUrl, + 'branches_url': instance.branchesUrl, + 'clone_url': instance.cloneUrl, + 'collaborators_url': instance.collaboratorsUrl, + 'comments_url': instance.commentsUrl, + 'commits_url': instance.commitsUrl, + 'compare_url': instance.compareUrl, + 'contents_url': instance.contentsUrl, + 'contributors_url': instance.contributorsUrl, + 'created_at': instance.createdAt?.toIso8601String(), + 'default_branch': instance.defaultBranch, + 'delete_branch_on_merge': instance.deleteBranchOnMerge, + 'deployments_url': instance.deploymentsUrl, + 'description': instance.description, + 'disabled': instance.disabled, + 'downloads_url': instance.downloadsUrl, + 'events_url': instance.eventsUrl, + 'fork': instance.fork, + 'forks_count': instance.forksCount, + 'forks_url': instance.forksUrl, + 'full_name': instance.fullName, + 'git_commits_url': instance.gitCommitsUrl, + 'git_refs_url': instance.gitRefsUrl, + 'git_tags_url': instance.gitTagsUrl, + 'git_url': instance.gitUrl, + 'has_downloads': instance.hasDownloads, + 'has_issues': instance.hasIssues, + 'has_pages': instance.hasPages, + 'has_projects': instance.hasProjects, + 'has_wiki': instance.hasWiki, + 'homepage': instance.homepage, + 'hooks_url': instance.hooksUrl, + 'html_url': instance.htmlUrl, + 'id': instance.id, + 'is_template': instance.isTemplate, + 'issue_comment_url': instance.issueCommentUrl, + 'issue_events_url': instance.issueEventsUrl, + 'issues_url': instance.issuesUrl, + 'keys_url': instance.keysUrl, + 'labels_url': instance.labelsUrl, + 'language': instance.language, + 'languages_url': instance.languagesUrl, + 'merge_commit_message': instance.mergeCommitMessage, + 'merge_commit_title': instance.mergeCommitTitle, + 'merges_url': instance.mergesUrl, + 'milestones_url': instance.milestonesUrl, + 'mirror_url': instance.mirrorUrl, + 'name': instance.name, + 'network_count': instance.networkCount, + 'node_id': instance.nodeId, + 'notifications_url': instance.notificationsUrl, + 'open_issues_count': instance.openIssuesCount, + 'owner': instance.owner, + 'permissions': instance.permissions, + 'private': instance.private, + 'pulls_url': instance.pullsUrl, + 'pushed_at': instance.pushedAt?.toIso8601String(), + 'releases_url': instance.releasesUrl, + 'size': instance.size, + 'squash_merge_commit_message': instance.squashMergeCommitMessage, + 'squash_merge_commit_title': instance.squashMergeCommitTitle, + 'ssh_url': instance.sshUrl, + 'stargazers_count': instance.stargazersCount, + 'stargazers_url': instance.stargazersUrl, + 'statuses_url': instance.statusesUrl, + 'subscribers_count': instance.subscribersCount, + 'subscribers_url': instance.subscribersUrl, + 'subscription_url': instance.subscriptionUrl, + 'svn_url': instance.svnUrl, + 'tags_url': instance.tagsUrl, + 'teams_url': instance.teamsUrl, + 'temp_clone_token': instance.tempCloneToken, + 'topics': instance.topics, + 'trees_url': instance.treesUrl, + 'updated_at': instance.updatedAt?.toIso8601String(), + 'url': instance.url, + 'visibility': instance.visibility, + 'watchers_count': instance.watchersCount, + }; + +Owner _$OwnerFromJson(Map json) => Owner( + avatarUrl: json['avatar_url'] as String?, + eventsUrl: json['events_url'] as String?, + followersUrl: json['followers_url'] as String?, + followingUrl: json['following_url'] as String?, + gistsUrl: json['gists_url'] as String?, + gravatarId: json['gravatar_id'] as String?, + htmlUrl: json['html_url'] as String?, + id: json['id'] as int?, + login: json['login'] as String?, + nodeId: json['node_id'] as String?, + organizationsUrl: json['organizations_url'] as String?, + receivedEventsUrl: json['received_events_url'] as String?, + reposUrl: json['repos_url'] as String?, + siteAdmin: json['site_admin'] as bool?, + starredUrl: json['starred_url'] as String?, + subscriptionsUrl: json['subscriptions_url'] as String?, + type: json['type'] as String?, + url: json['url'] as String?, + ); + +Map _$OwnerToJson(Owner instance) => { + 'avatar_url': instance.avatarUrl, + 'events_url': instance.eventsUrl, + 'followers_url': instance.followersUrl, + 'following_url': instance.followingUrl, + 'gists_url': instance.gistsUrl, + 'gravatar_id': instance.gravatarId, + 'html_url': instance.htmlUrl, + 'id': instance.id, + 'login': instance.login, + 'node_id': instance.nodeId, + 'organizations_url': instance.organizationsUrl, + 'received_events_url': instance.receivedEventsUrl, + 'repos_url': instance.reposUrl, + 'site_admin': instance.siteAdmin, + 'starred_url': instance.starredUrl, + 'subscriptions_url': instance.subscriptionsUrl, + 'type': instance.type, + 'url': instance.url, + }; + +Tree _$TreeFromJson(Map json) => Tree( + sha: json['sha'] as String?, + url: json['url'] as String?, + htmlUrl: json['html_url'] as String?, + ); + +Map _$TreeToJson(Tree instance) => { + 'sha': instance.sha, + 'url': instance.url, + 'html_url': instance.htmlUrl, + }; + +Verification _$VerificationFromJson(Map json) => Verification( + payload: json['payload'] as String?, + reason: json['reason'] as String?, + signature: json['signature'] as String?, + verified: json['verified'] as bool?, + ); + +Map _$VerificationToJson(Verification instance) => + { + 'payload': instance.payload, + 'reason': instance.reason, + 'signature': instance.signature, + 'verified': instance.verified, + }; + +HtmlLink _$HtmlLinkFromJson(Map json) => HtmlLink( + href: json['href'] as String?, + ); + +Map _$HtmlLinkToJson(HtmlLink instance) => { + 'href': instance.href, + }; + +PullRequestLink _$PullRequestLinkFromJson(Map json) => + PullRequestLink( + href: json['href'] as String?, + ); + +Map _$PullRequestLinkToJson(PullRequestLink instance) => + { + 'href': instance.href, + }; diff --git a/lib/src/common/model/users.dart b/lib/src/common/model/users.dart index 8044983a..f66fd395 100644 --- a/lib/src/common/model/users.dart +++ b/lib/src/common/model/users.dart @@ -24,6 +24,22 @@ class User { this.followingCount, this.createdAt, this.updatedAt, + + // Properties from the Timeline API + this.eventsUrl, + this.followersUrl, + this.followingUrl, + this.gistsUrl, + this.gravatarId, + this.nodeId, + this.organizationsUrl, + this.receivedEventsUrl, + this.reposUrl, + this.starredAt, + this.starredUrl, + this.subscriptionsUrl, + this.type, + this.url, }); @JsonKey(includeToJson: false, includeFromJson: false) @@ -90,6 +106,49 @@ class User { /// The username of the twitter account (without leading @) String? twitterUsername; + // The following properties were added to support the Timeline API. + + /// Example: `https://api.github.com/users/octocat/events{/privacy}` + String? eventsUrl; + + /// Example: `https://api.github.com/users/octocat/followers` + String? followersUrl; + + /// Example: `https://api.github.com/users/octocat/following{/other_user}` + String? followingUrl; + + /// Example: `https://api.github.com/users/octocat/gists{/gist_id}` + String? gistsUrl; + + /// Example: `41d064eb2195891e12d0413f63227ea7` + String? gravatarId; + + /// Example: `MDQ6VXNlcjE=` + String? nodeId; + + /// Example: `https://api.github.com/users/octocat/orgs` + String? organizationsUrl; + + /// Example: `https://api.github.com/users/octocat/received_events` + String? receivedEventsUrl; + + /// Example: `https://api.github.com/users/octocat/repos` + String? reposUrl; + + DateTime? starredAt; + + /// Example: `https://api.github.com/users/octocat/starred{/owner}{/repo}` + String? starredUrl; + + /// Example: `https://api.github.com/users/octocat/subscriptions` + String? subscriptionsUrl; + + /// Example: `User` + String? type; + + /// Example: `https://api.github.com/users/octocat` + String? url; + factory User.fromJson(Map input) => _$UserFromJson(input); Map toJson() => _$UserToJson(this); } @@ -98,13 +157,6 @@ class User { // https://developer.github.com/v3/repos/collaborators/#response @JsonSerializable() class Collaborator { - final String? login; - final int? id; - final String? htmlUrl; - final String? type; - final bool? siteAdmin; - final Map? permissions; - Collaborator( this.login, this.id, @@ -114,6 +166,13 @@ class Collaborator { this.permissions, ); + String? login; + int? id; + String? htmlUrl; + String? type; + bool? siteAdmin; + Map? permissions; + factory Collaborator.fromJson(Map json) => _$CollaboratorFromJson(json); Map toJson() => _$CollaboratorToJson(this); diff --git a/lib/src/common/model/users.g.dart b/lib/src/common/model/users.g.dart index 2713125a..40e4a306 100644 --- a/lib/src/common/model/users.g.dart +++ b/lib/src/common/model/users.g.dart @@ -29,6 +29,22 @@ User _$UserFromJson(Map json) => User( updatedAt: json['updated_at'] == null ? null : DateTime.parse(json['updated_at'] as String), + eventsUrl: json['events_url'] as String?, + followersUrl: json['followers_url'] as String?, + followingUrl: json['following_url'] as String?, + gistsUrl: json['gists_url'] as String?, + gravatarId: json['gravatar_id'] as String?, + nodeId: json['node_id'] as String?, + organizationsUrl: json['organizations_url'] as String?, + receivedEventsUrl: json['received_events_url'] as String?, + reposUrl: json['repos_url'] as String?, + starredAt: json['starred_at'] == null + ? null + : DateTime.parse(json['starred_at'] as String), + starredUrl: json['starred_url'] as String?, + subscriptionsUrl: json['subscriptions_url'] as String?, + type: json['type'] as String?, + url: json['url'] as String?, )..twitterUsername = json['twitter_username'] as String?; Map _$UserToJson(User instance) => { @@ -51,6 +67,20 @@ Map _$UserToJson(User instance) => { 'created_at': instance.createdAt?.toIso8601String(), 'updated_at': instance.updatedAt?.toIso8601String(), 'twitter_username': instance.twitterUsername, + 'events_url': instance.eventsUrl, + 'followers_url': instance.followersUrl, + 'following_url': instance.followingUrl, + 'gists_url': instance.gistsUrl, + 'gravatar_id': instance.gravatarId, + 'node_id': instance.nodeId, + 'organizations_url': instance.organizationsUrl, + 'received_events_url': instance.receivedEventsUrl, + 'repos_url': instance.reposUrl, + 'starred_at': instance.starredAt?.toIso8601String(), + 'starred_url': instance.starredUrl, + 'subscriptions_url': instance.subscriptionsUrl, + 'type': instance.type, + 'url': instance.url, }; Collaborator _$CollaboratorFromJson(Map json) => Collaborator( @@ -119,6 +149,22 @@ CurrentUser _$CurrentUserFromJson(Map json) => CurrentUser() ? null : DateTime.parse(json['updated_at'] as String) ..twitterUsername = json['twitter_username'] as String? + ..eventsUrl = json['events_url'] as String? + ..followersUrl = json['followers_url'] as String? + ..followingUrl = json['following_url'] as String? + ..gistsUrl = json['gists_url'] as String? + ..gravatarId = json['gravatar_id'] as String? + ..nodeId = json['node_id'] as String? + ..organizationsUrl = json['organizations_url'] as String? + ..receivedEventsUrl = json['received_events_url'] as String? + ..reposUrl = json['repos_url'] as String? + ..starredAt = json['starred_at'] == null + ? null + : DateTime.parse(json['starred_at'] as String) + ..starredUrl = json['starred_url'] as String? + ..subscriptionsUrl = json['subscriptions_url'] as String? + ..type = json['type'] as String? + ..url = json['url'] as String? ..privateReposCount = json['total_private_repos'] as int? ..ownedPrivateReposCount = json['owned_private_repos'] as int? ..diskUsage = json['disk_usage'] as int? @@ -147,6 +193,20 @@ Map _$CurrentUserToJson(CurrentUser instance) => 'created_at': instance.createdAt?.toIso8601String(), 'updated_at': instance.updatedAt?.toIso8601String(), 'twitter_username': instance.twitterUsername, + 'events_url': instance.eventsUrl, + 'followers_url': instance.followersUrl, + 'following_url': instance.followingUrl, + 'gists_url': instance.gistsUrl, + 'gravatar_id': instance.gravatarId, + 'node_id': instance.nodeId, + 'organizations_url': instance.organizationsUrl, + 'received_events_url': instance.receivedEventsUrl, + 'repos_url': instance.reposUrl, + 'starred_at': instance.starredAt?.toIso8601String(), + 'starred_url': instance.starredUrl, + 'subscriptions_url': instance.subscriptionsUrl, + 'type': instance.type, + 'url': instance.url, 'total_private_repos': instance.privateReposCount, 'owned_private_repos': instance.ownedPrivateReposCount, 'disk_usage': instance.diskUsage, diff --git a/tool/process_github_schema.dart b/tool/process_github_schema.dart new file mode 100644 index 00000000..e3850df5 --- /dev/null +++ b/tool/process_github_schema.dart @@ -0,0 +1,621 @@ +import 'dart:convert'; +import 'dart:io'; + +const int width = 72; + +List wordWrap(String body) { + var result = []; + var start = 0; + for (var index = 0; index < body.length; index += 1) { + if ((index == body.length - 1) || + (body[index] == '\n') || + ((body[index] == ' ') && (index - start > width))) { + result.add(body.substring(start, index + 1).trimRight()); + start = index + 1; + } + } + assert(start == body.length); + return result; +} + +typedef GenTypeVisitor = void Function(GenType type); + +abstract class GenType extends Comparable { + GenType(); + + String get name; + String get comment => ''; + + String get signature; + + void cleanup() {} + + String generateDeclaration(); + + void visit(GenTypeVisitor visitor) { + visitor(this); + } + + GenType mergeWith(GenType other, GenAbstractClass? superclass) { + assert(signature == other.signature, + 'cannot merge types with different signatures'); + throw StateError( + 'not sure how to merge $runtimeType with ${other.runtimeType}'); + } + + @override + int compareTo(GenType other) { + return signature.compareTo(other.signature); + } + + @override + String toString() => '$runtimeType($name)'; +} + +class GenPrimitive extends GenType { + GenPrimitive(this.type, this.comment); + + @override + String get name => type.toString(); + + @override + String get signature => name; + + @override + String generateDeclaration() => ''; + + @override + final String comment; + + final Type type; + + @override + GenType mergeWith(GenType other, GenAbstractClass? superclass) { + assert(superclass == null); + if (other is GenPrimitive) { + assert(type == other.type); + if (comment != other.comment) { + return GenPrimitive( + type, + '$comment\n\n${other.comment}', + ); + } + return this; + } + return super.mergeWith(other, superclass); + } +} + +class GenUnion extends GenType { + GenUnion(this.subtypes); + + @override + String get name => 'Object'; + + @override + String get comment { + var result = StringBuffer(); + result.writeln('One of the following:'); + for (final subtype in subtypes) { + if (subtype.comment.isNotEmpty) { + result.writeln( + ' * [${subtype.name}]: ${subtype.comment.split('\n').first}'); + } else { + result.writeln(' * [${subtype.name}]'); + } + } + return result.toString(); + } + + @override + String get signature { + var subsignatures = + subtypes.map((GenType type) => type.signature).toList() + ..sort() + ..join(','); + return 'Union<$subsignatures>'; + } + + final List subtypes; + + @override + String generateDeclaration() => ''; + + @override + void visit(GenTypeVisitor visitor) { + super.visit(visitor); + for (final subtype in subtypes) { + subtype.visit(visitor); + } + } + + @override + GenType mergeWith(GenType other, GenAbstractClass? superclass) { + assert(superclass == null); + if (other is GenUnion) { + assert(subtypes.length == other.subtypes.length); + var subtypesA = subtypes..sort(); + var subtypesB = other.subtypes..sort(); + var subtypesC = []; + for (var index = 0; index < subtypesA.length; index += 1) { + subtypesC.add(subtypesA[index].mergeWith(subtypesB[index], null)); + } + return GenUnion(subtypesC); + } + return super.mergeWith(other, superclass); + } +} + +class GenList extends GenType { + GenList(this.members, this.comment); + + @override + String get name => 'List<${members.name}>'; + + @override + final String comment; + + final GenType members; + + @override + String get signature { + return 'List<${members.signature}>'; + } + + @override + String generateDeclaration() => ''; + + @override + void visit(GenTypeVisitor visitor) { + super.visit(visitor); + members.visit(visitor); + } + + @override + GenType mergeWith(GenType other, GenAbstractClass? superclass) { + assert(superclass == null); + if (other is GenList) { + var newComment = + comment != other.comment ? '$comment\n\n${other.comment}' : comment; + var newMembers = members.mergeWith(other.members, null); + return GenList(newMembers, newComment); + } + return super.mergeWith(other, superclass); + } +} + +class GenAbstractClass extends GenType { + GenAbstractClass(this.name, this.comment, {Map? properties}) + : properties = properties ?? {}; + + @override + final String name; + + @override + final String comment; + + final List subclasses = []; + final Map properties; + + @override + String get signature { + var propertySignatures = properties.keys + .map((String propertyName) => + '$propertyName:${properties[propertyName]!.signature}') + .toList() + ..sort() + ..join(','); + return 'abstract class $name { $propertySignatures }'; + } + + @override + void cleanup() { + if (subclasses.length > 1) { + var names = subclasses.first.properties.keys.toSet(); + properties: + for (final name in names) { + var signature = subclasses.first.properties[name]!.signature; + for (final subclass in subclasses.skip(1)) { + if (!subclass.properties.containsKey(name) || + subclass.properties[name]!.signature != signature) { + continue properties; + } + } + var property = subclasses.first.properties[name]!; + for (final subclass in subclasses.skip(1)) { + property = property.mergeWith(subclass.properties[name]!, null); + } + properties[name] = property; + for (final subclass in subclasses) { + subclass.properties.remove(name); + } + } + } + } + + @override + String generateDeclaration() { + var output = StringBuffer(); + if (comment.isNotEmpty) { + for (final line in wordWrap(comment)) { + output.writeln('/// $line'); + } + } + output.writeln('@JsonSerializable()'); + output.writeln('abstract class $name {'); + output.write(' $name('); + if (properties.isNotEmpty) { + output.writeln('{'); + for (final propertyName in properties.keys.toList()..sort()) { + output.writeln(' this.$propertyName,'); + } + output.write(' }'); + } + output.writeln(');'); + output.writeln(''); + var lastLineWasBlank = true; + for (final propertyName in properties.keys.toList()..sort()) { + if (properties[propertyName]!.comment.isNotEmpty) { + if (!lastLineWasBlank) { + output.writeln(''); + lastLineWasBlank = true; + } + for (final line in wordWrap(properties[propertyName]!.comment)) { + output.writeln(' /// $line'); + } + } else { + lastLineWasBlank = false; + } + output.writeln(' ${properties[propertyName]!.name}? $propertyName;'); + if (lastLineWasBlank) { + output.writeln(''); + lastLineWasBlank = true; + } + } + output.writeln('}'); + return output.toString(); + } + + @override + void visit(GenTypeVisitor visitor) { + super.visit(visitor); + for (final subclass in subclasses) { + subclass.visit(visitor); + } + } + + @override + GenType mergeWith(GenType other, GenAbstractClass? superclass) { + assert(superclass == null); + if (other is GenAbstractClass) { + assert(name == other.name); + assert(properties.length == other.properties.length); + var newComment = + comment != other.comment ? '$comment\n\n${other.comment}' : comment; + var newProperties = {}; + for (final propertyName in properties.keys) { + newProperties[propertyName] = properties[propertyName]! + .mergeWith(other.properties[propertyName]!, null); + } + var result = + GenAbstractClass(name, newComment, properties: newProperties); + var subclassesA = subclasses..sort(); + var subclassesB = other.subclasses..sort(); + for (var index = 0; index < subclassesA.length; index += 1) { + subclassesA[index].mergeWith(subclassesB[index], result); + } + assert(result.subclasses.length == subclasses.length); + assert(result.subclasses.length == other.subclasses.length); + return result; + } + return super.mergeWith(other, superclass); + } +} + +class GenClass extends GenType { + GenClass(this.name, this.comment, this.superclass, this.properties) { + if (superclass != null) { + superclass!.subclasses.add(this); + } + } + + @override + final String name; + + @override + final String comment; + + final GenAbstractClass? superclass; + final Map properties; + + @override + String get signature { + var propertySignatures = properties.keys + .map((String propertyName) => + '$propertyName:${properties[propertyName]!.signature}') + .toList() + ..sort() + ..join(','); + return 'class $name extends { ${superclass?.signature} } with { $propertySignatures }'; + } + + @override + String generateDeclaration() { + var output = StringBuffer(); + if (comment.isNotEmpty) { + for (final line in wordWrap(comment)) { + output.writeln('/// $line'); + } + } + output.writeln('@JsonSerializable()'); + output.write('class $name '); + if (superclass != null) { + output.write('extends ${superclass!.name} '); + } + output.writeln('{'); + output.writeln(' $name({'); + if (superclass != null) { + for (final propertyName in superclass!.properties.keys.toList()..sort()) { + output.writeln(' super.$propertyName,'); + } + } + for (final propertyName in properties.keys.toList()..sort()) { + output.writeln(' this.$propertyName,'); + } + output.writeln(' });'); + output.writeln(''); + var lastLineWasBlank = true; + for (final propertyName in properties.keys.toList()..sort()) { + if (properties[propertyName]!.comment.isNotEmpty) { + if (!lastLineWasBlank) { + output.writeln(''); + lastLineWasBlank = true; + } + for (final line in wordWrap(properties[propertyName]!.comment)) { + output.writeln(' /// $line'); + } + } else { + lastLineWasBlank = false; + } + output.writeln(' ${properties[propertyName]!.name}? $propertyName;'); + if (lastLineWasBlank) { + output.writeln(''); + lastLineWasBlank = true; + } + } + if (!lastLineWasBlank) { + output.writeln(''); + } + output + .writeln(' Map toJson() => _\$${name}ToJson(this);'); + output.writeln(''); + output.writeln(' factory $name.fromJson(Map input) =>'); + output.writeln(' _\$${name}FromJson(input);'); + output.writeln('}'); + return output.toString(); + } + + @override + void visit(GenTypeVisitor visitor) { + super.visit(visitor); + for (final property in properties.values) { + property.visit(visitor); + } + } + + @override + GenType mergeWith(GenType other, GenAbstractClass? superclass) { + assert((superclass == null) == (this.superclass == null)); + if (other is GenClass) { + assert((other.superclass == null) == (this.superclass == null)); + assert(name == other.name); + assert(properties.length == other.properties.length); + var newComment = + comment != other.comment ? '$comment\n\n${other.comment}' : comment; + var newProperties = {}; + for (final propertyName in properties.keys) { + newProperties[propertyName] = properties[propertyName]! + .mergeWith(other.properties[propertyName]!, null); + } + return GenClass(name, newComment, superclass, newProperties); + } + return super.mergeWith(other, superclass); + } +} + +void assure(bool condition, String Function() callback) { + if (!condition) { + print(callback()); + exit(1); + } +} + +String? camelCase(String? text, {bool uppercase = false}) { + if (text == null) { + return null; + } + var bits = text.split(RegExp('[- _]')); + var result = StringBuffer(); + for (final bit in bits) { + if (bit.isNotEmpty) { + if (result.isNotEmpty || uppercase) { + result.write(String.fromCharCode(bit.runes.first).toUpperCase()); + result.write(String.fromCharCodes(bit.runes.skip(1))); + } else { + result.write(bit); + } + } + } + return result.toString(); +} + +String buildComment(Map schema) { + var description = StringBuffer(); + if (schema['title'] != null) { + description.writeln(schema['title']); + } + if (schema['description'] != null && + schema['description'] != schema['title']) { + if (description.isNotEmpty) { + description.writeln(''); + } + description.writeln(schema['description']); + } + if (schema['format'] != null) { + if (description.isNotEmpty) { + description.writeln(''); + } + description.write('Format: '); + description.writeln(schema['format']); + } + if (schema['examples'] != null) { + assure(schema['examples'] is List, + () => 'examples should be a list, not as in $schema'); + for (final example in schema['examples'] as List) { + if (description.isNotEmpty) { + description.writeln(''); + } + description.writeln('Example: `$example`'); + } + } + return description.toString().trimRight(); +} + +GenType process(Map schema, {String? defaultName}) { + final comment = buildComment(schema); + String type; + if (schema['type'] is List) { + var types = schema['type'] as List; + if (types.length == 2) { + if (types[0] == 'null' && types[1] is String) { + type = types[1] as String; + } else if (types[1] == 'null' && types[0] is String) { + type = types[0] as String; + } else { + print('Arbitrary union types not supported: $types'); + exit(1); + } + } else { + print('Arbitrary union types not supported: $types'); + exit(1); + } + } else if (schema['type'] is String) { + type = schema['type'] as String; + } else { + var anyOf = schema['anyOf'] ?? schema['oneOf']; + if (anyOf != null) { + assure(comment.isEmpty, () => 'lost comment to anyOf/oneOf: $comment'); + assure( + anyOf is List, () => 'anyOf/oneOf key is not a JSON list'); + var subtypes = []; + for (final subtype in anyOf as List) { + assure(subtype is Map, + () => 'type in anyOf/oneOf is not a JSON object'); + subtypes.add(process(subtype as Map)); + } + if (subtypes.length == 2) { + if (subtypes[0] is GenPrimitive && + (subtypes[0] as GenPrimitive).type == Null) { + return subtypes[1]; + } + if (subtypes[1] is GenPrimitive && + (subtypes[1] as GenPrimitive).type == Null) { + return subtypes[0]; + } + } + return GenUnion(subtypes); + } + if (schema['type'] == null) { + print('missing type: $schema'); + exit(1); + } + print('unknown type ${schema['type']}'); + exit(1); + } + if (type == 'array') { + assure(schema['items'] is Map, + () => 'array items are not a JSON object'); + return GenList(process(schema['items'] as Map), comment); + } + if (type == 'object') { + var anyOf = schema['anyOf']; + if (anyOf != null) { + assure(anyOf is List, () => 'anyOf key is not a JSON list'); + var result = GenAbstractClass( + camelCase(schema['title'] as String?) ?? '##unnamed##', + comment, + ); + for (final subschema in anyOf as List) { + assure(subschema is Map, + () => 'anyOf value is not a JSON object'); + var subclass = processObject(subschema as Map, + superclass: result); + assert(result.subclasses.last == subclass); + } + return result; + } + return processObject(schema, defaultName: defaultName); + } + if (type == 'null') { + return GenPrimitive(Null, comment); + } + if (type == 'boolean') { + return GenPrimitive(bool, comment); + } + if (type == 'integer') { + return GenPrimitive(int, comment); + } + if (type == 'string') { + return GenPrimitive(String, comment); + } + print('unknown type $type'); + exit(1); +} + +GenClass processObject(Map schema, + {GenAbstractClass? superclass, String? comment, String? defaultName}) { + assert(schema['anyOf'] == null); + comment ??= buildComment(schema); + var properties = {}; + var propertiesData = schema['properties']; + assure(propertiesData is Map, + () => 'properties key is not a JSON map'); + for (final propertyName in (propertiesData as Map).keys) { + var propertyData = propertiesData[propertyName]; + assure(propertyData is Map, + () => 'property $propertyName is not a JSON object'); + properties[camelCase(propertyName)!] = process( + propertyData as Map, + defaultName: camelCase(propertyName, uppercase: true)); + } + return GenClass( + camelCase(schema['title'] as String?) ?? defaultName ?? '##unnamed##', + comment, + superclass, + properties, + ); +} + +void main(List arguments) { + if (arguments.length != 1) { + print( + 'Command must be run with one argument, the file name of the schema to process.'); + exit(1); + } + Object schema = json.decode(File(arguments.single).readAsStringSync()); + assure(schema is Map, () => 'schema is not a JSON object'); + var rootType = process(schema as Map); + rootType.visit((GenType type) { + type.cleanup(); + }); + var declarations = {}; + rootType.visit((GenType type) { + var declaration = type.generateDeclaration().trimRight(); + declarations.add(declaration); + }); + for (final declaration in declarations) { + print(declaration); + print(''); + } + print('// root type is: ${rootType.name}'); +} From 3771b3c9ab1912d32a0d0baffaf489d561caf558 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Mon, 17 Apr 2023 08:55:14 -0600 Subject: [PATCH 349/390] prep 9.12.0 --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 62d162e6..5449f961 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 9.11.0 +version: 9.12.0 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From 20588d01bc0fd3b9a4ada482078b1190695bda72 Mon Sep 17 00:00:00 2001 From: Ricardo Amador <32242716+ricardoamador@users.noreply.github.com> Date: Tue, 9 May 2023 19:53:24 -0700 Subject: [PATCH 350/390] Add node_id to the pull request model (#367) --- lib/src/common/model/pulls.dart | 4 + lib/src/common/model/pulls.g.dart | 2 + test/unit/common/model/pulls_test.dart | 246 +++++++++++++++++++++++++ 3 files changed, 252 insertions(+) create mode 100644 test/unit/common/model/pulls_test.dart diff --git a/lib/src/common/model/pulls.dart b/lib/src/common/model/pulls.dart index b6f20e55..cdbf6ed8 100644 --- a/lib/src/common/model/pulls.dart +++ b/lib/src/common/model/pulls.dart @@ -9,6 +9,7 @@ part 'pulls.g.dart'; class PullRequest { PullRequest({ this.id, + this.nodeId, this.htmlUrl, this.diffUrl, this.patchUrl, @@ -46,6 +47,9 @@ class PullRequest { /// Pull Request ID int? id; + /// Unique node identification string. + String? nodeId; + /// Url to the Pull Request Page String? htmlUrl; diff --git a/lib/src/common/model/pulls.g.dart b/lib/src/common/model/pulls.g.dart index 3608260c..dfe3a3b3 100644 --- a/lib/src/common/model/pulls.g.dart +++ b/lib/src/common/model/pulls.g.dart @@ -8,6 +8,7 @@ part of 'pulls.dart'; PullRequest _$PullRequestFromJson(Map json) => PullRequest( id: json['id'] as int?, + nodeId: json['node_id'] as String?, htmlUrl: json['html_url'] as String?, diffUrl: json['diff_url'] as String?, patchUrl: json['patch_url'] as String?, @@ -69,6 +70,7 @@ PullRequest _$PullRequestFromJson(Map json) => PullRequest( Map _$PullRequestToJson(PullRequest instance) => { 'id': instance.id, + 'node_id': instance.nodeId, 'html_url': instance.htmlUrl, 'diff_url': instance.diffUrl, 'patch_url': instance.patchUrl, diff --git a/test/unit/common/model/pulls_test.dart b/test/unit/common/model/pulls_test.dart new file mode 100644 index 00000000..f4d5fe65 --- /dev/null +++ b/test/unit/common/model/pulls_test.dart @@ -0,0 +1,246 @@ +import 'dart:convert'; + +import 'package:github/src/common/model/pulls.dart'; +import 'package:test/test.dart'; + +const String samplePullRequest = ''' + { + "url": "https://api.github.com/repos/flutter/cocoon/pulls/2703", + "id": 1344460863, + "node_id": "PR_kwDOA8VHis5QItg_", + "html_url": "https://github.com/flutter/cocoon/pull/2703", + "diff_url": "https://github.com/flutter/cocoon/pull/2703.diff", + "patch_url": "https://github.com/flutter/cocoon/pull/2703.patch", + "issue_url": "https://api.github.com/repos/flutter/cocoon/issues/2703", + "number": 2703, + "state": "open", + "locked": false, + "title": "Bump url_launcher from 6.1.10 to 6.1.11 in /dashboard", + "user": { + "login": "dependabot[bot]", + "id": 49699333, + "node_id": "MDM6Qm90NDk2OTkzMzM=", + "avatar_url": "https://avatars.githubusercontent.com/in/29110?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/dependabot%5Bbot%5D", + "html_url": "https://github.com/apps/dependabot", + "type": "Bot", + "site_admin": false + }, + "body": "Bumps [url_launcher](https://github.com/flutter/packages/tree/main/packages/url_launcher) from 6.1.10 to 6.1.11.", + "created_at": "2023-05-09T22:23:34Z", + "updated_at": "2023-05-09T22:23:35Z", + "closed_at": null, + "merged_at": null, + "merge_commit_sha": "252a1a4370e30631b090eeeda182879985cc8f08", + "assignee": null, + "assignees": [ + + ], + "requested_reviewers": [ + + ], + "requested_teams": [ + + ], + "labels": [ + { + "id": 3960015931, + "node_id": "LA_kwDOA8VHis7sCQw7", + "url": "https://api.github.com/repos/flutter/cocoon/labels/autosubmit", + "name": "autosubmit", + "color": "0E8A16", + "default": false, + "description": "Merge PR when tree becomes green via auto submit App" + } + ], + "milestone": null, + "draft": false, + "commits_url": "https://api.github.com/repos/flutter/cocoon/pulls/2703/commits", + "review_comments_url": "https://api.github.com/repos/flutter/cocoon/pulls/2703/comments", + "review_comment_url": "https://api.github.com/repos/flutter/cocoon/pulls/comments{/number}", + "comments_url": "https://api.github.com/repos/flutter/cocoon/issues/2703/comments", + "statuses_url": "https://api.github.com/repos/flutter/cocoon/statuses/57ec5a040c8a631e39b3f3dee82a77fdf79b6e19", + "head": { + "label": "flutter:dependabot/pub/dashboard/url_launcher-6.1.11", + "ref": "dependabot/pub/dashboard/url_launcher-6.1.11", + "sha": "57ec5a040c8a631e39b3f3dee82a77fdf79b6e19", + "user": { + "login": "flutter", + "id": 14101776, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjE0MTAxNzc2", + "avatar_url": "https://avatars.githubusercontent.com/u/14101776?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/flutter", + "html_url": "https://github.com/flutter", + "type": "Organization", + "site_admin": false + }, + "repo": { + "id": 63260554, + "node_id": "MDEwOlJlcG9zaXRvcnk2MzI2MDU1NA==", + "name": "cocoon", + "full_name": "flutter/cocoon", + "private": false, + "owner": { + "login": "flutter", + "id": 14101776, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjE0MTAxNzc2", + "avatar_url": "https://avatars.githubusercontent.com/u/14101776?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/flutter", + "html_url": "https://github.com/flutter", + "type": "Organization", + "site_admin": false + }, + "html_url": "https://github.com/flutter/cocoon", + "description": "Flutter's build coordinator and aggregator", + "fork": false, + "url": "https://api.github.com/repos/flutter/cocoon", + "forks_url": "https://api.github.com/repos/flutter/cocoon/forks", + "created_at": "2016-07-13T16:04:04Z", + "updated_at": "2023-04-12T16:34:46Z", + "pushed_at": "2023-05-09T22:23:35Z", + "git_url": "git://github.com/flutter/cocoon.git", + "ssh_url": "git@github.com:flutter/cocoon.git", + "clone_url": "https://github.com/flutter/cocoon.git", + "svn_url": "https://github.com/flutter/cocoon", + "homepage": null, + "size": 13247, + "stargazers_count": 171, + "watchers_count": 171, + "license": { + "key": "bsd-3-clause", + "name": "BSD 3-Clause New or Revised License", + "spdx_id": "BSD-3-Clause", + "url": "https://api.github.com/licenses/bsd-3-clause", + "node_id": "MDc6TGljZW5zZTU=" + }, + "allow_forking": true, + "is_template": false, + "web_commit_signoff_required": false, + "topics": [ + + ], + "visibility": "public", + "forks": 91, + "open_issues": 2, + "watchers": 171, + "default_branch": "main", + "allow_squash_merge": true, + "allow_merge_commit": false, + "allow_rebase_merge": false, + "allow_auto_merge": false, + "delete_branch_on_merge": false, + "allow_update_branch": false, + "use_squash_pr_title_as_default": true, + "squash_merge_commit_message": "PR_BODY", + "squash_merge_commit_title": "PR_TITLE", + "merge_commit_message": "PR_TITLE", + "merge_commit_title": "MERGE_MESSAGE" + } + }, + "base": { + "label": "flutter:main", + "ref": "main", + "sha": "152dd99368b8417b2ede8ed49d5923e594a3b0f2", + "user": { + "login": "flutter", + "id": 14101776, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjE0MTAxNzc2", + "avatar_url": "https://avatars.githubusercontent.com/u/14101776?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/flutter", + "html_url": "https://github.com/flutter", + "type": "Organization", + "site_admin": false + }, + "repo": { + "id": 63260554, + "node_id": "MDEwOlJlcG9zaXRvcnk2MzI2MDU1NA==", + "name": "cocoon", + "full_name": "flutter/cocoon", + "private": false, + "owner": { + "login": "flutter", + "id": 14101776, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjE0MTAxNzc2", + "avatar_url": "https://avatars.githubusercontent.com/u/14101776?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/flutter", + "html_url": "https://github.com/flutter", + "type": "Organization", + "site_admin": false + }, + "html_url": "https://github.com/flutter/cocoon", + "description": "Flutter's build coordinator and aggregator", + "fork": false, + "url": "https://api.github.com/repos/flutter/cocoon", + "forks_url": "https://api.github.com/repos/flutter/cocoon/forks", + "created_at": "2016-07-13T16:04:04Z", + "updated_at": "2023-04-12T16:34:46Z", + "pushed_at": "2023-05-09T22:23:35Z", + "git_url": "git://github.com/flutter/cocoon.git", + "ssh_url": "git@github.com:flutter/cocoon.git", + "clone_url": "https://github.com/flutter/cocoon.git", + "svn_url": "https://github.com/flutter/cocoon", + "homepage": null, + "size": 13247, + "license": { + "key": "bsd-3-clause", + "name": "BSD 3-Clause New or Revised License", + "spdx_id": "BSD-3-Clause", + "url": "https://api.github.com/licenses/bsd-3-clause", + "node_id": "MDc6TGljZW5zZTU=" + }, + "allow_forking": true, + "is_template": false, + "web_commit_signoff_required": false, + "topics": [ + + ], + "visibility": "public", + "forks": 91, + "open_issues": 2, + "watchers": 171, + "default_branch": "main", + "allow_squash_merge": true, + "allow_merge_commit": false, + "allow_rebase_merge": false, + "allow_auto_merge": false, + "delete_branch_on_merge": false, + "allow_update_branch": false, + "use_squash_pr_title_as_default": true, + "squash_merge_commit_message": "PR_BODY", + "squash_merge_commit_title": "PR_TITLE", + "merge_commit_message": "PR_TITLE", + "merge_commit_title": "MERGE_MESSAGE" + } + }, + "author_association": "CONTRIBUTOR", + "auto_merge": null, + "active_lock_reason": null, + "merged": false, + "mergeable": true, + "rebaseable": true, + "mergeable_state": "unstable", + "merged_by": null, + "comments": 0, + "review_comments": 0, + "maintainer_can_modify": false, + "commits": 1, + "additions": 119, + "deletions": 202, + "changed_files": 2 + } +'''; + +void main() { + group('Pull Request fromJson', () { + test('Node ID is collected', () { + final pullRequest = PullRequest.fromJson(jsonDecode(samplePullRequest)); + expect(pullRequest, isNotNull); + expect(pullRequest.nodeId, "PR_kwDOA8VHis5QItg_"); + }); + }); +} From 87babe4af82a7cff2564ada331ccdd2256f3a8d6 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Tue, 9 May 2023 21:17:50 -0600 Subject: [PATCH 351/390] prep 9.13.0 --- CHANGELOG.md | 7 +++++++ pubspec.yaml | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index df8472a1..efd7d81c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## 9.13.0 + +* Add node_id to the pull request model by @ricardoamador in https://github.com/SpinlockLabs/github.dart/pull/367 + + +**Full Changelog**: https://github.com/SpinlockLabs/github.dart/compare/9.12.0...9.13.0 + ## 9.12.0 * Add support for issue and PR timeline events via `Issue.listTimeline`. diff --git a/pubspec.yaml b/pubspec.yaml index 5449f961..c3efddc9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 9.12.0 +version: 9.13.0 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From 4986ac130fd006bfaabe57c0ba1887ccd16628ec Mon Sep 17 00:00:00 2001 From: Casey Hillers Date: Thu, 11 May 2023 09:21:12 -0700 Subject: [PATCH 352/390] Add optional filter params on Repositories.listCommits (#368) * Add optional filter params on Repositories.listCommits * dart format --------- Co-authored-by: Rob Becker --- lib/src/common/repos_service.dart | 29 ++++++++++- test/common/data/repos_json.dart | 81 +++++++++++++++++++++++++++++ test/common/repos_service_test.dart | 49 +++++++++++++++++ 3 files changed, 158 insertions(+), 1 deletion(-) create mode 100644 test/common/data/repos_json.dart create mode 100644 test/common/repos_service_test.dart diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 535e1060..a274710e 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -448,14 +448,41 @@ class RepositoriesService extends Service { /// Lists the commits of the provided repository [slug]. /// + /// [sha] is the SHA or branch to start listing commits from. Default: the + /// repository’s default branch (usually main). + /// + /// [path] will only show commits that changed that file path. + /// + /// [author] and [committer] are the GitHub username to filter commits for. + /// + /// [since] shows commit after this time, and [until] shows commits before + /// this time. + /// /// API docs: https://developer.github.com/v3/repos/commits/#list-commits-on-a-repository - Stream listCommits(RepositorySlug slug) { + Stream listCommits( + RepositorySlug slug, { + String? sha, + String? path, + String? author, + String? committer, + DateTime? since, + DateTime? until, + }) { ArgumentError.checkNotNull(slug); + final params = { + if (author != null) 'author': author, + if (committer != null) 'committer': committer, + if (sha != null) 'sha': sha, + if (path != null) 'path': path, + if (since != null) 'since': since.toIso8601String(), + if (until != null) 'until': until.toIso8601String(), + }; return PaginationHelper(github) .objects, RepositoryCommit>( 'GET', '/repos/${slug.fullName}/commits', RepositoryCommit.fromJson, + params: params, ); } diff --git a/test/common/data/repos_json.dart b/test/common/data/repos_json.dart new file mode 100644 index 00000000..f5087cf7 --- /dev/null +++ b/test/common/data/repos_json.dart @@ -0,0 +1,81 @@ +const String listCommits = ''' +[ + { + "sha": "3771b3c9ab1912d32a0d0baffaf489d561caf558", + "node_id": "C_kwDOAVT0d9oAKDM3NzFiM2M5YWIxOTEyZDMyYTBkMGJhZmZhZjQ4OWQ1NjFjYWY1NTg", + "commit": { + "author": { + "name": "Rob Becker", + "email": "rob.becker@workiva.com", + "date": "2023-04-17T14:55:14Z" + }, + "committer": { + "name": "Rob Becker", + "email": "rob.becker@workiva.com", + "date": "2023-04-17T14:55:14Z" + }, + "message": "prep 9.12.0", + "tree": { + "sha": "282532b41e8fead81ec6d68e7e603139e7dd7581", + "url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/trees/282532b41e8fead81ec6d68e7e603139e7dd7581" + }, + "url": "https://api.github.com/repos/SpinlockLabs/github.dart/git/commits/3771b3c9ab1912d32a0d0baffaf489d561caf558", + "comment_count": 0, + "verification": { + "verified": true, + "reason": "valid" + } + }, + "url": "https://api.github.com/repos/SpinlockLabs/github.dart/commits/3771b3c9ab1912d32a0d0baffaf489d561caf558", + "html_url": "https://github.com/SpinlockLabs/github.dart/commit/3771b3c9ab1912d32a0d0baffaf489d561caf558", + "comments_url": "https://api.github.com/repos/SpinlockLabs/github.dart/commits/3771b3c9ab1912d32a0d0baffaf489d561caf558/comments", + "author": { + "login": "robbecker-wf", + "id": 6053699, + "node_id": "MDQ6VXNlcjYwNTM2OTk=", + "avatar_url": "https://avatars.githubusercontent.com/u/6053699?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/robbecker-wf", + "html_url": "https://github.com/robbecker-wf", + "followers_url": "https://api.github.com/users/robbecker-wf/followers", + "following_url": "https://api.github.com/users/robbecker-wf/following{/other_user}", + "gists_url": "https://api.github.com/users/robbecker-wf/gists{/gist_id}", + "starred_url": "https://api.github.com/users/robbecker-wf/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/robbecker-wf/subscriptions", + "organizations_url": "https://api.github.com/users/robbecker-wf/orgs", + "repos_url": "https://api.github.com/users/robbecker-wf/repos", + "events_url": "https://api.github.com/users/robbecker-wf/events{/privacy}", + "received_events_url": "https://api.github.com/users/robbecker-wf/received_events", + "type": "User", + "site_admin": false + }, + "committer": { + "login": "robbecker-wf", + "id": 6053699, + "node_id": "MDQ6VXNlcjYwNTM2OTk=", + "avatar_url": "https://avatars.githubusercontent.com/u/6053699?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/robbecker-wf", + "html_url": "https://github.com/robbecker-wf", + "followers_url": "https://api.github.com/users/robbecker-wf/followers", + "following_url": "https://api.github.com/users/robbecker-wf/following{/other_user}", + "gists_url": "https://api.github.com/users/robbecker-wf/gists{/gist_id}", + "starred_url": "https://api.github.com/users/robbecker-wf/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/robbecker-wf/subscriptions", + "organizations_url": "https://api.github.com/users/robbecker-wf/orgs", + "repos_url": "https://api.github.com/users/robbecker-wf/repos", + "events_url": "https://api.github.com/users/robbecker-wf/events{/privacy}", + "received_events_url": "https://api.github.com/users/robbecker-wf/received_events", + "type": "User", + "site_admin": false + }, + "parents": [ + { + "sha": "a3081681da68383d9a5f18ef3502f47f7144e7d8", + "url": "https://api.github.com/repos/SpinlockLabs/github.dart/commits/a3081681da68383d9a5f18ef3502f47f7144e7d8", + "html_url": "https://github.com/SpinlockLabs/github.dart/commit/a3081681da68383d9a5f18ef3502f47f7144e7d8" + } + ] + } +] +'''; diff --git a/test/common/repos_service_test.dart b/test/common/repos_service_test.dart new file mode 100644 index 00000000..feebe05c --- /dev/null +++ b/test/common/repos_service_test.dart @@ -0,0 +1,49 @@ +import 'package:github/src/common.dart'; +import 'package:http/http.dart'; +import 'package:http/testing.dart'; +import 'package:test/test.dart'; + +import 'data/repos_json.dart'; + +void main() { + final slug = RepositorySlug('SpinlockLabs', 'github.dart'); + RepositoriesService create(Future Function(Request) f) { + final client = MockClient(f); + final github = GitHub(client: client); + return RepositoriesService(github); + } + + test('listCommits', () async { + final repositories = create((request) async { + expect(request.url.path, '/repos/${slug.fullName}/commits'); + expect(request.url.query, 'page=1'); + + return Response(listCommits, StatusCodes.OK); + }); + final commits = await repositories.listCommits(slug).toList(); + expect(commits, hasLength(1)); + }); + + test('listCommits with query params', () async { + final repositories = create((request) async { + expect(request.url.path, '/repos/${slug.fullName}/commits'); + expect( + request.url.query, + 'author=octocat&committer=octodog&sha=abc&path=%2Fpath&since=2022-02-22T00%3A00%3A00.000&until=2023-02-22T00%3A00%3A00.000&page=1', + ); + return Response(listCommits, StatusCodes.OK); + }); + final commits = await repositories + .listCommits( + slug, + sha: 'abc', + path: '/path', + author: 'octocat', + committer: 'octodog', + since: DateTime(2022, 2, 22), + until: DateTime(2023, 2, 22), + ) + .toList(); + expect(commits, hasLength(1)); + }); +} From 7e01a0de2716f7c3fdad0a8da55ee9989ad9924c Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Thu, 11 May 2023 10:22:34 -0600 Subject: [PATCH 353/390] prep 9.14.0 --- CHANGELOG.md | 7 +++++++ pubspec.yaml | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index efd7d81c..b6ec9d9d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## 9.14.0 + +* Add optional filter params on Repositories.listCommits by @CaseyHillers in https://github.com/SpinlockLabs/github.dart/pull/368 + + +**Full Changelog**: https://github.com/SpinlockLabs/github.dart/compare/9.13.0...9.14.0 + ## 9.13.0 * Add node_id to the pull request model by @ricardoamador in https://github.com/SpinlockLabs/github.dart/pull/367 diff --git a/pubspec.yaml b/pubspec.yaml index c3efddc9..ef9f83a7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 9.13.0 +version: 9.14.0 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From 4effb605ea687025e82b50aefb6e8f261d6e8379 Mon Sep 17 00:00:00 2001 From: Ian Hickson Date: Tue, 20 Jun 2023 01:27:45 -0700 Subject: [PATCH 354/390] Implement IssuesService.lock/unlock (#376) --- lib/src/common/issues_service.dart | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/lib/src/common/issues_service.dart b/lib/src/common/issues_service.dart index 3b5e013f..243c81dd 100644 --- a/lib/src/common/issues_service.dart +++ b/lib/src/common/issues_service.dart @@ -443,4 +443,30 @@ class IssuesService extends Service { TimelineEvent.fromJson, ); } + + /// Lock an issue. + /// + /// API docs: https://docs.github.com/en/rest/issues/issues?apiVersion=2022-11-28#lock-an-issue + /// + /// The `lockReason`, if specified, must be one of: `off-topic`, `too heated`, `resolved`, `spam`. + Future lock(RepositorySlug slug, int number, + {String? lockReason}) async { + String body; + if (lockReason != null) { + body = GitHubJson.encode({'lock_reason': lockReason}); + } else { + body = '{}'; + } + await github.postJSON('/repos/${slug.fullName}/issues/$number/lock', + body: body, statusCode: 204); + } + + /// Unlock an issue. + /// + /// API docs: https://docs.github.com/en/rest/issues/issues?apiVersion=2022-11-28#unlock-an-issue + Future unlock(RepositorySlug slug, int number) async { + await github.request( + 'DELETE', '/repos/${slug.fullName}/issues/$number/lock', + statusCode: 204); + } } From fccb90ea05b356bf9e7b98534601cd97f603afcb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 20 Jun 2023 10:28:11 +0200 Subject: [PATCH 355/390] Bump JamesIves/github-pages-deploy-action from 4.4.1 to 4.4.2 (#371) Bumps [JamesIves/github-pages-deploy-action](https://github.com/JamesIves/github-pages-deploy-action) from 4.4.1 to 4.4.2. - [Release notes](https://github.com/JamesIves/github-pages-deploy-action/releases) - [Commits](https://github.com/JamesIves/github-pages-deploy-action/compare/v4.4.1...v4.4.2) --- updated-dependencies: - dependency-name: JamesIves/github-pages-deploy-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/publish_demos.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish_demos.yml b/.github/workflows/publish_demos.yml index dec1be49..965e7949 100644 --- a/.github/workflows/publish_demos.yml +++ b/.github/workflows/publish_demos.yml @@ -24,7 +24,7 @@ jobs: rm build/example/packages - name: Publish 🚀 - uses: JamesIves/github-pages-deploy-action@v4.4.1 + uses: JamesIves/github-pages-deploy-action@v4.4.2 with: branch: gh-pages # The branch the action should deploy to. folder: build/example # The folder the action should deploy. From c07c6347e448a4b933c84b12b0f2bbe1f5bf3288 Mon Sep 17 00:00:00 2001 From: Casey Hillers Date: Tue, 20 Jun 2023 13:11:58 +0200 Subject: [PATCH 356/390] Make GitHub.auth non-nullable (#377) * add const everywhere --- example/index.dart | 2 +- example/user_info.dart | 4 ++-- lib/src/browser/xplat_browser.dart | 2 +- lib/src/common/github.dart | 21 ++++++++------------- lib/src/common/util/auth.dart | 4 ++-- lib/src/common/xplat_common.dart | 2 +- lib/src/server/xplat_server.dart | 2 +- test/common/github_test.dart | 19 ++++++++++++++++++- test/experiment/crawler.dart | 2 +- test/git_test.dart | 4 ++-- test/scenarios_test.dart | 4 ++-- 11 files changed, 39 insertions(+), 27 deletions(-) diff --git a/example/index.dart b/example/index.dart index 3a0f10b2..42851c96 100644 --- a/example/index.dart +++ b/example/index.dart @@ -3,7 +3,7 @@ import 'common.dart'; void main() { final tokenInput = querySelector('#token') as InputElement; - tokenInput.value = github.auth!.token ?? ''; + tokenInput.value = github.auth.token ?? ''; window.sessionStorage['GITHUB_TOKEN'] = tokenInput.value!; tokenInput.onKeyUp.listen((_) { window.sessionStorage['GITHUB_TOKEN'] = tokenInput.value!; diff --git a/example/user_info.dart b/example/user_info.dart index a5113646..071c2820 100644 --- a/example/user_info.dart +++ b/example/user_info.dart @@ -59,8 +59,8 @@ void loadUser() { }); }); - if (github.auth!.token != null) { - localToken!.value = github.auth!.token; + if (github.auth.token != null) { + localToken!.value = github.auth.token; loadBtn.click(); } } diff --git a/lib/src/browser/xplat_browser.dart b/lib/src/browser/xplat_browser.dart index 79aeeb17..71bed55a 100644 --- a/lib/src/browser/xplat_browser.dart +++ b/lib/src/browser/xplat_browser.dart @@ -11,7 +11,7 @@ Authentication findAuthenticationFromEnvironment() { // search the query string parameters first var auth = findAuthenticationInMap(_parseQuery(window.location.href)); auth ??= findAuthenticationInMap(window.sessionStorage); - return auth ?? Authentication.anonymous(); + return auth ?? const Authentication.anonymous(); } /// Parse the query string to a parameter `Map` diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index 62358bd8..ffddef00 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -19,12 +19,11 @@ class GitHub { /// [endpoint] is the api endpoint to use /// [auth] is the authentication information GitHub({ - Authentication? auth, + this.auth = const Authentication.anonymous(), this.endpoint = 'https://api.github.com', this.version = '2022-11-28', http.Client? client, - }) : auth = auth ?? Authentication.anonymous(), - client = client ?? http.Client(); + }) : client = client ?? http.Client(); static const _ratelimitLimitHeader = 'x-ratelimit-limit'; static const _ratelimitResetHeader = 'x-ratelimit-reset'; @@ -34,7 +33,7 @@ class GitHub { static const versionHeader = 'X-GitHub-Api-Version'; /// Authentication Information - Authentication? auth; + final Authentication auth; /// API Endpoint final String endpoint; @@ -369,16 +368,16 @@ class GitHub { headers['Accept'] = preview; } - if (auth!.isToken) { - headers.putIfAbsent('Authorization', () => 'token ${auth!.token}'); - } else if (auth!.isBasic) { + if (auth.isToken) { + headers.putIfAbsent('Authorization', () => 'token ${auth.token}'); + } else if (auth.isBasic) { final userAndPass = - base64Encode(utf8.encode('${auth!.username}:${auth!.password}')); + base64Encode(utf8.encode('${auth.username}:${auth.password}')); headers.putIfAbsent('Authorization', () => 'basic $userAndPass'); } // See https://docs.github.com/en/rest/overview/resources-in-the-rest-api?apiVersion=2022-11-28#user-agent-required - headers.putIfAbsent('User-Agent', () => auth?.username ?? 'github.dart'); + headers.putIfAbsent('User-Agent', () => auth.username ?? 'github.dart'); if (method == 'PUT' && body == null) { headers.putIfAbsent('Content-Length', () => '0'); @@ -493,10 +492,6 @@ class GitHub { /// Disposes of this GitHub Instance. /// No other methods on this instance should be called after this method is called. void dispose() { - // Destroy the Authentication Information - // This is needed for security reasons. - auth = null; - // Closes the HTTP Client client.close(); } diff --git a/lib/src/common/util/auth.dart b/lib/src/common/util/auth.dart index 925ffc93..b287f16c 100644 --- a/lib/src/common/util/auth.dart +++ b/lib/src/common/util/auth.dart @@ -10,12 +10,12 @@ class Authentication { final String? password; /// Creates an [Authentication] instance that uses the specified OAuth2 [token]. - Authentication.withToken(this.token) + const Authentication.withToken(this.token) : username = null, password = null; /// Creates an [Authentication] instance that has no authentication. - Authentication.anonymous() + const Authentication.anonymous() : token = null, username = null, password = null; diff --git a/lib/src/common/xplat_common.dart b/lib/src/common/xplat_common.dart index cc0bfcbb..1c60f906 100644 --- a/lib/src/common/xplat_common.dart +++ b/lib/src/common/xplat_common.dart @@ -10,7 +10,7 @@ import 'package:github/src/common.dart'; /// In both contexts it delegates to [findAuthenticationInMap] to find the /// github token or username and password. Authentication findAuthenticationFromEnvironment() => - Authentication.anonymous(); + const Authentication.anonymous(); /// Checks the passed in map for keys in [COMMON_GITHUB_TOKEN_ENV_KEYS]. /// The first one that exists is used as the github token to call [Authentication.withToken] with. diff --git a/lib/src/server/xplat_server.dart b/lib/src/server/xplat_server.dart index 3bd6e100..a6c85d02 100644 --- a/lib/src/server/xplat_server.dart +++ b/lib/src/server/xplat_server.dart @@ -27,5 +27,5 @@ Authentication findAuthenticationFromEnvironment() { } return findAuthenticationInMap(Platform.environment) ?? - Authentication.anonymous(); + const Authentication.anonymous(); } diff --git a/test/common/github_test.dart b/test/common/github_test.dart index 4f7d6727..97ce2930 100644 --- a/test/common/github_test.dart +++ b/test/common/github_test.dart @@ -1,6 +1,6 @@ import 'dart:io'; -import 'package:github/src/common/github.dart'; +import 'package:github/src/common.dart'; import 'package:http/http.dart'; import 'package:http/testing.dart'; import 'package:test/test.dart'; @@ -38,5 +38,22 @@ void main() { final userAgent = request!.headers['User-Agent']; expect(userAgent, 'github.dart'); }); + + test('anonymous auth passes no authorization header', () async { + Request? request; + final client = MockClient((r) async { + request = r; + return Response('{}', HttpStatus.ok); + }); + + final github = GitHub( + client: client, + auth: const Authentication.anonymous(), + ); + await github.getJSON(''); // Make HTTP request + + expect(request, isNotNull); + expect(request!.headers.containsKey('Authorization'), isFalse); + }); }); } diff --git a/test/experiment/crawler.dart b/test/experiment/crawler.dart index cc4e23ee..7dd8e737 100644 --- a/test/experiment/crawler.dart +++ b/test/experiment/crawler.dart @@ -1,7 +1,7 @@ import 'package:github/github.dart'; void main() { - final github = GitHub(auth: Authentication.anonymous()); + final github = GitHub(auth: const Authentication.anonymous()); final crawler = RepositoryCrawler( github, diff --git a/test/git_test.dart b/test/git_test.dart index 34487b95..228b3a0b 100644 --- a/test/git_test.dart +++ b/test/git_test.dart @@ -10,8 +10,8 @@ const date = '2014-10-02T15:21:29Z'; GitHub createGithub() { return GitHub( endpoint: fakeApiUrl, - auth: - Authentication.withToken('0000000000000000000000000000000000000001')); + auth: const Authentication.withToken( + '0000000000000000000000000000000000000001')); } void main() { diff --git a/test/scenarios_test.dart b/test/scenarios_test.dart index c39ceb53..70f1a789 100644 --- a/test/scenarios_test.dart +++ b/test/scenarios_test.dart @@ -28,8 +28,8 @@ Future createGithubWithScenario(String scenario, var j = json.decode(resp.body); return GitHub( endpoint: j['url'], - auth: - Authentication.withToken('0000000000000000000000000000000000000001')); + auth: const Authentication.withToken( + '0000000000000000000000000000000000000001')); } /// Run scenario tests against ockokits fixtures-server From f53f02142294e10282f944d69c8714d984b6dede Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Tue, 20 Jun 2023 16:32:38 -0600 Subject: [PATCH 357/390] prep 9.15.0 --- CHANGELOG.md | 9 +++++++++ pubspec.yaml | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b6ec9d9d..0c4cf6ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +## 9.15.0 + +* Implement IssuesService.lock/unlock by @Hixie in https://github.com/SpinlockLabs/github.dart/pull/376 +* Bump JamesIves/github-pages-deploy-action from 4.4.1 to 4.4.2 by @dependabot in https://github.com/SpinlockLabs/github.dart/pull/371 +* Make GitHub.auth non-nullable by @CaseyHillers in https://github.com/SpinlockLabs/github.dart/pull/377 + + +**Full Changelog**: https://github.com/SpinlockLabs/github.dart/compare/9.14.0...9.15.0 + ## 9.14.0 * Add optional filter params on Repositories.listCommits by @CaseyHillers in https://github.com/SpinlockLabs/github.dart/pull/368 diff --git a/pubspec.yaml b/pubspec.yaml index ef9f83a7..2f10dcb8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 9.14.0 +version: 9.15.0 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From 5d880caa5a218fbf6fd763f5f64eacb39bca13fe Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Tue, 20 Jun 2023 16:39:54 -0600 Subject: [PATCH 358/390] add permissions to pub publish workflow --- .github/workflows/publish_release.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/publish_release.yml b/.github/workflows/publish_release.yml index bdc52863..853f8c53 100644 --- a/.github/workflows/publish_release.yml +++ b/.github/workflows/publish_release.yml @@ -5,6 +5,10 @@ on: tags: - '[0-9]+.[0-9]+.[0-9]+*' +permissions: + contents: read + id-token: write + jobs: publish: uses: dart-lang/setup-dart/.github/workflows/publish.yml@v1 From 256ef341a4f445545006467f225540ff70a65f7e Mon Sep 17 00:00:00 2001 From: Casey Hillers Date: Mon, 26 Jun 2023 18:02:53 +0200 Subject: [PATCH 359/390] Revert immutable auth (#378) --- lib/src/common/github.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index ffddef00..c08140bf 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -33,7 +33,7 @@ class GitHub { static const versionHeader = 'X-GitHub-Api-Version'; /// Authentication Information - final Authentication auth; + Authentication auth; /// API Endpoint final String endpoint; From eafa5ac50a733f136c994162a98177b89e28d46d Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Mon, 26 Jun 2023 10:05:46 -0600 Subject: [PATCH 360/390] prep 9.15.1 --- CHANGELOG.md | 7 +++++++ pubspec.yaml | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c4cf6ef..b2b1464e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## 9.15.1 + +* Revert immutable auth by @CaseyHillers in https://github.com/SpinlockLabs/github.dart/pull/378 + + +**Full Changelog**: https://github.com/SpinlockLabs/github.dart/compare/9.15.0...9.15.1 + ## 9.15.0 * Implement IssuesService.lock/unlock by @Hixie in https://github.com/SpinlockLabs/github.dart/pull/376 diff --git a/pubspec.yaml b/pubspec.yaml index 2f10dcb8..b511b9f6 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 9.15.0 +version: 9.15.1 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From 33f2a4c5f584970fa17d734130998b9d6b9e1cb1 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Tue, 11 Jul 2023 09:45:38 -0700 Subject: [PATCH 361/390] Fix links and spelling nits in markdown files (#379) --- CONTRIBUTING.md | 18 +++++++++--------- README.md | 8 ++++---- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 47a2036f..c9a832b4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,7 +5,7 @@ GitHub.dart is of course Open Source! We love it when people contribute! ## Getting Started - Make sure you have a [GitHub Account](https://github.com/signup/free). -- Make sure the [Dart SDK](https://www.dartlang.org/tools/sdk/) is installed on your system. +- Make sure the [Dart SDK](https://dart.dev/tools/sdk) is installed on your system. - Make sure you have [Git](http://git-scm.com/) installed on your system. - [Fork](https://help.github.com/articles/fork-a-repo) the [repository](https://github.com/SpinlockLabs/github.dart) on GitHub. @@ -20,7 +20,7 @@ GitHub.dart is of course Open Source! We love it when people contribute! ## Code Style -GitHub.dart follows the [Dart Style Guide](https://www.dartlang.org/articles/style-guide/). Please note that if your code is not formatted according to the guide as much as possible, we will reject your Pull Request until it is fixed. Some things such as long lines will generally be accepted, however try to make it smaller if possible. +GitHub.dart follows the [Dart Style Guide](https://dart.dev/effective-dart/style). Please note that if your code is not formatted according to the guide as much as possible, we will reject your Pull Request until it is fixed. Some things such as long lines will generally be accepted, however try to make it smaller if possible. ## Efficiency @@ -28,7 +28,7 @@ GitHub.dart is committed to efficiency as much as possible. If your code is not ## Rejections -Pull Request rejections are not a bad thing. It just means you need to fix something. Perhaps it is important to define 'rejection' as it is used in this case. A rejection is when a GitHub.dart committer comments on a Pull Request with a comment like 'rejected due to incorrect formatting'. +Pull Request rejections are not a bad thing. It just means you need to fix something. Perhaps it is important to define 'rejection' as it is used in this case. A rejection is when a `GitHub.dart` committer comments on a Pull Request with a comment like 'rejected due to incorrect formatting'. ## Generated code @@ -61,20 +61,20 @@ If you get on IRC and ask us, we can review your work and add you as a committer ## Releasing & Publishing -This repo is now configured to release after every PR merge. This means a couple things for PRs that are put up: +This repo is now configured to release after every PR merge. This means a couple of things for PRs that are put up: -1. A semver label is required. A github check will remind you that you need one. Reviewers should check that it is correct. See https://semver.org/ to understand more. +1. A semver label is required. A GitHub check will remind you that you need one. Reviewers should check that it is correct. See https://semver.org/ to understand more. 2. There is no need to modify the version in the pubspec.yaml in your PRs. The tooling will update the version according to the semver label applied to your PR. 3. Same thing for the CHANGELOG.md. Tooling will update it automatically after merge. -4. A github release will be created and published to pub.dev for you. +4. A GitHub release will be created and published to pub.dev for you. For example if your PR has `semver:minor` label applied and the latest version is 1.2.3, once merged, the tooling will: - update the pubspec.yaml to 1.3.0 -- Add the github auto-generated release notes with 1.3.0 to the top of the CHANGELOG.md -- Create a release in github for 1.3.0 (which creates a git tag of 1.3.0) +- Add the GitHub auto-generated release notes with 1.3.0 to the top of the CHANGELOG.md +- Create a release in GitHub for 1.3.0 (which creates a git tag of 1.3.0) - Remove the `unreleased` label from the PR and add the `released` label - Comment on the PR stating the version that it was released in and link to the release - When the release is created, it will automatically be published to pub.dev NOTE: If you want the ability to merge a PR **WITHOUT** automatically releasing and publishing, simply add the `no_release_on_merge` label before merging. Do note that the PR has been merged though and whatever the next PR is that triggers a release will release and publish everything that has been merged. So if you want to batch a few PRs into 1 release, label them all `no_release_on_merge`. Then whichever is the last to be merged, remove that label before merging to trigger the release. -You may also manually trigger the action to release unreleased PRs from the Actions tab in Github. +You may also manually trigger the action to release unreleased PRs from the Actions tab in GitHub. diff --git a/README.md b/README.md index 24be2836..08dc8e09 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,19 @@ # GitHub for Dart [![Dart Checks](https://github.com/SpinlockLabs/github.dart/actions/workflows/dart.yml/badge.svg)](https://github.com/SpinlockLabs/github.dart/actions/workflows/dart.yml) -[![Pub](https://img.shields.io/pub/v/github.svg)](https://pub.dartlang.org/packages/github) +[![Pub](https://img.shields.io/pub/v/github.svg)](https://pub.dev/packages/github) This is a library for interacting with GitHub in Dart. It works on all platforms including web, server, and Flutter. Please submit issues and pull requests, help out, or just give encouragement. -**Notice**: This is not an official Github project. It is maintained by volunteers. +**Notice**: This is not an official GitHub project. It is maintained by volunteers. We are looking for contributors. If you're interested or have questions, head over to discussions https://github.com/SpinlockLabs/github.dart/discussions ## Features - Works on the Server, Browser, and Flutter - Really Fast -- Plugable API +- Pluggable API - Supports Authentication - Builtin OAuth2 Flow - Hook Server Helper @@ -21,7 +21,7 @@ We are looking for contributors. If you're interested or have questions, head ov ## Links - [Library Demos](https://spinlocklabs.github.io/github.dart/) (based on the [sample code](https://github.com/SpinlockLabs/github.dart/tree/master/example)) -- [Pub Package](https://pub.dartlang.org/packages/github) +- [Pub Package](https://pub.dev/packages/github) - [Wiki](https://github.com/SpinlockLabs/github.dart/wiki) - [Latest API reference](https://pub.dev/documentation/github/latest/) From 6480a79d9de3c9321916fcad9eff7d9fcc49270c Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Tue, 11 Jul 2023 09:45:51 -0700 Subject: [PATCH 362/390] Support latest pkg:http (#380) --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index b511b9f6..dbe9fb9a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -7,7 +7,7 @@ environment: sdk: '>=2.18.0 <3.0.0' dependencies: - http: ^0.13.0 + http: '>=0.13.0 <2.0.0' http_parser: ^4.0.0 json_annotation: ^4.8.0 meta: ^1.3.0 From 42e405e412807ba6fc5337441b3a6ee4bf7293b3 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Thu, 13 Jul 2023 14:54:23 -0600 Subject: [PATCH 363/390] prep 9.16.0 --- CHANGELOG.md | 8 ++++++++ pubspec.yaml | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b2b1464e..b1443106 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +## 9.16.0 + +* Fix links and spelling nits in markdown files by @kevmoo in https://github.com/SpinlockLabs/github.dart/pull/379 +* Support latest pkg:http by @kevmoo in https://github.com/SpinlockLabs/github.dart/pull/380 + + +**Full Changelog**: https://github.com/SpinlockLabs/github.dart/compare/9.15.1...9.16.0 + ## 9.15.1 * Revert immutable auth by @CaseyHillers in https://github.com/SpinlockLabs/github.dart/pull/378 diff --git a/pubspec.yaml b/pubspec.yaml index dbe9fb9a..e6a7ced3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 9.15.1 +version: 9.16.0 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From 2bee1096a2b83ad76c7d0ccfc0427c5096ca678e Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Tue, 25 Jul 2023 14:11:14 -0700 Subject: [PATCH 364/390] Add bearerToken constructor to Authentication class (#381) Also added `authorizationHeaderValue()` function. Also added `const` qualifier to `basic` constructor. --- lib/src/common/github.dart | 9 +++---- lib/src/common/util/auth.dart | 49 ++++++++++++++++++++++++++++++++--- 2 files changed, 48 insertions(+), 10 deletions(-) diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index c08140bf..ef803ea0 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -368,12 +368,9 @@ class GitHub { headers['Accept'] = preview; } - if (auth.isToken) { - headers.putIfAbsent('Authorization', () => 'token ${auth.token}'); - } else if (auth.isBasic) { - final userAndPass = - base64Encode(utf8.encode('${auth.username}:${auth.password}')); - headers.putIfAbsent('Authorization', () => 'basic $userAndPass'); + final authHeaderValue = auth.authorizationHeaderValue(); + if (authHeaderValue != null) { + headers.putIfAbsent('Authorization', () => authHeaderValue); } // See https://docs.github.com/en/rest/overview/resources-in-the-rest-api?apiVersion=2022-11-28#user-agent-required diff --git a/lib/src/common/util/auth.dart b/lib/src/common/util/auth.dart index b287f16c..1c4d6798 100644 --- a/lib/src/common/util/auth.dart +++ b/lib/src/common/util/auth.dart @@ -1,3 +1,5 @@ +import 'dart:convert'; + /// Authentication information. class Authentication { /// OAuth2 Token @@ -9,26 +11,65 @@ class Authentication { /// GitHub Password final String? password; + final String? bearerToken; + + // TODO: mark the pram as `String` to REQUIRE a non-null value. + // NEXT major version /// Creates an [Authentication] instance that uses the specified OAuth2 [token]. const Authentication.withToken(this.token) : username = null, - password = null; + password = null, + bearerToken = null; + + /// Creates an [Authentication] instance that uses the specified + /// [bearerToken]. + const Authentication.bearerToken(String this.bearerToken) + : username = null, + password = null, + token = null; /// Creates an [Authentication] instance that has no authentication. const Authentication.anonymous() : token = null, username = null, - password = null; + password = null, + bearerToken = null; + // TODO: mark the `username` and `password` params as `String` to REQUIRE + // non-null values. - NEXT major version /// Creates an [Authentication] instance that uses a username and password. - Authentication.basic(this.username, this.password) : token = null; + const Authentication.basic(this.username, this.password) + : token = null, + bearerToken = null; /// Anonymous Authentication Flag - bool get isAnonymous => !isBasic && !isToken; + bool get isAnonymous => !isBasic && !isToken && !isBearer; /// Basic Authentication Flag bool get isBasic => username != null; /// Token Authentication Flag bool get isToken => token != null; + + // This instance represents a authentication with a "Bearer" token. + bool get isBearer => bearerToken != null; + + /// Returns a value for the `Authorization` HTTP request header or `null` + /// if [isAnonymous] is `true`. + String? authorizationHeaderValue() { + if (isToken) { + return 'token $token'; + } + + if (isBasic) { + final userAndPass = base64Encode(utf8.encode('$username:$password')); + return 'basic $userAndPass'; + } + + if (isBearer) { + return 'Bearer $bearerToken'; + } + + return null; + } } From 5ef10ff19858e21c66e14c0569439af488f39260 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Tue, 25 Jul 2023 16:12:26 -0600 Subject: [PATCH 365/390] prep 9.17.0 --- CHANGELOG.md | 7 +++++++ pubspec.yaml | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b1443106..8027a432 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## 9.17.0 + +* Add bearerToken constructor to Authentication class by @kevmoo in https://github.com/SpinlockLabs/github.dart/pull/381 + + +**Full Changelog**: https://github.com/SpinlockLabs/github.dart/compare/9.16.0...9.17.0 + ## 9.16.0 * Fix links and spelling nits in markdown files by @kevmoo in https://github.com/SpinlockLabs/github.dart/pull/379 diff --git a/pubspec.yaml b/pubspec.yaml index e6a7ced3..0a917ea4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 9.16.0 +version: 9.17.0 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From a3b000641113f235196d9d3cfb8fed5ccca18117 Mon Sep 17 00:00:00 2001 From: Drew Roen <102626803+drewroengoogle@users.noreply.github.com> Date: Sun, 10 Sep 2023 18:10:57 -0500 Subject: [PATCH 366/390] Add the 'PushEvent' webhook and associated PushCommit object (#386) * Add the 'PushEvent' webhook and associated PushCommit object * Add a test, handle integer times that come in from the Repository object in PushEvents only * Remove unnecessary decorator + update changelog * Add a comment about the time weirdness --- CHANGELOG.md | 23 +++-- lib/src/common/model/git.dart | 22 +++++ lib/src/common/model/git.g.dart | 18 ++++ lib/src/common/model/repos.dart | 14 +++ lib/src/common/model/repos.g.dart | 8 +- lib/src/server/hooks.dart | 37 ++++++++ lib/src/server/hooks.g.dart | 28 ++++++ test/data_object_test.dart | 139 ++++++++++++++++++++++++++++++ 8 files changed, 274 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8027a432..6193c995 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## 9.18.0 + +* Adds the initial `PushEvent` object in https://github.com/SpinlockLabs/github.dart/pull/386 +* Update the `Repository` values `created_at` and `pushed_at` to handle integer times + ## 9.17.0 * Add bearerToken constructor to Authentication class by @kevmoo in https://github.com/SpinlockLabs/github.dart/pull/381 @@ -307,7 +312,7 @@ Map? files; - Clean up lints https://github.com/SpinlockLabs/github.dart/pull/202 ## 6.0.5 - - Fix null errors issue https://github.com/SpinlockLabs/github.dart/issues/199 + - Fix null errors issue https://github.com/SpinlockLabs/github.dart/issues/199 ## 6.0.4 - This fixes #196 (https://github.com/SpinlockLabs/github.dart/issues/196) @@ -357,10 +362,10 @@ Map? files; Deprecations: -- The `draft` and `prerelease` properties in the CreateRelease and Release +- The `draft` and `prerelease` properties in the CreateRelease and Release - classes have been renamed to `isDraft` and `isPrerelease` for clarity. -- Release.targetCommitsh has been renamed to Release.targetCommitish. -- The `release` parameter in RepositoriesService.createRelease +- Release.targetCommitsh has been renamed to Release.targetCommitish. +- The `release` parameter in RepositoriesService.createRelease has been renamed to `createRelease`. - `RepositoriesService.getRelease` has been renamed to `RepositoriesService.getReleaseById` @@ -369,7 +374,7 @@ has been renamed to `createRelease`. - Add access to labels on Pull Requests https://github.com/SpinlockLabs/github.dart/pull/163 - Adding draft property to PR model https://github.com/SpinlockLabs/github.dart/pull/162 - updateFile request must be a PUT https://github.com/SpinlockLabs/github.dart/pull/160 - + ## v5.1.0 - `Repository`: added `updatedAt` and `license` fields. @@ -386,7 +391,7 @@ has been renamed to `createRelease`. ## v5.0.0 -- **BREAKING** `RepositoriesService.listCollaborators` now returns +- **BREAKING** `RepositoriesService.listCollaborators` now returns `Stream` instead of `Stream`. - `Collaborator` is a new type that includes collaborator-specific information. @@ -403,7 +408,7 @@ has been renamed to `createRelease`. - Removed unsupported `limit` parameter. - Removed flaky retry logic. Instead, `NotReady` is thrown, which can be used to decide to retry at the call site. - - Made associated classes `ContributorStatistics` and + - Made associated classes `ContributorStatistics` and `ContributorWeekStatistics` immutable. Since these classes are only meant as return values, we're not treating this as a breaking change. - Added `Stream github.search.code(...)` search API @@ -433,7 +438,7 @@ has been renamed to `createRelease`. ## v2.3.2 -- Automatically attempt to find GitHub user information in the process environment when running on the standalone VM. +- Automatically attempt to find GitHub user information in the process environment when running on the standalone VM. - Add `ref` parameter to `getReadme` method for the repository service. ## v2.3.1 @@ -447,7 +452,7 @@ has been renamed to `createRelease`. - Moved `CHANGELOG` content back to repo. - Added `rateLimitLimit`, `rateLimitRemaining` and `rateLimitReset` to `GitHub`. - Added `id` to `Issue` -- Added `direction`, `sort` and `since` optional arguments to +- Added `direction`, `sort` and `since` optional arguments to `IssueService.listByRepo`. ## v2.1.0 diff --git a/lib/src/common/model/git.dart b/lib/src/common/model/git.dart index 136c01c4..0e655572 100644 --- a/lib/src/common/model/git.dart +++ b/lib/src/common/model/git.dart @@ -98,6 +98,28 @@ class CreateGitCommit { Map toJson() => _$CreateGitCommitToJson(this); } +/// Model class for a pushed commit. +@JsonSerializable() +class PushGitCommit { + PushGitCommit(this.id, this.message, this.timestamp, this.url); + + /// The commit hash. + String? id; + + /// The commit message. + String? message; + + /// The timestamp of the commit. + DateTime? timestamp; + + /// The direct url to the commit. + String? url; + + factory PushGitCommit.fromJson(Map input) => + _$PushGitCommitFromJson(input); + Map toJson() => _$PushGitCommitToJson(this); +} + /// Model class for an author or committer of a commit. The [GitCommitUser] may /// not correspond to a GitHub [User]. @JsonSerializable(includeIfNull: false) diff --git a/lib/src/common/model/git.g.dart b/lib/src/common/model/git.g.dart index 61d5fc44..7b2ba940 100644 --- a/lib/src/common/model/git.g.dart +++ b/lib/src/common/model/git.g.dart @@ -88,6 +88,24 @@ Map _$CreateGitCommitToJson(CreateGitCommit instance) => 'author': instance.author, }; +PushGitCommit _$PushGitCommitFromJson(Map json) => + PushGitCommit( + json['id'] as String?, + json['message'] as String?, + json['timestamp'] == null + ? null + : DateTime.parse(json['timestamp'] as String), + json['url'] as String?, + ); + +Map _$PushGitCommitToJson(PushGitCommit instance) => + { + 'id': instance.id, + 'message': instance.message, + 'timestamp': instance.timestamp?.toIso8601String(), + 'url': instance.url, + }; + GitCommitUser _$GitCommitUserFromJson(Map json) => GitCommitUser( json['name'] as String?, diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart index d09c1a7e..4e46566d 100644 --- a/lib/src/common/model/repos.dart +++ b/lib/src/common/model/repos.dart @@ -225,9 +225,11 @@ class Repository { int networkCount; /// The time the repository was created at + @JsonKey(fromJson: Repository.dynamicToDateTime) DateTime? createdAt; /// The last time the repository was pushed at + @JsonKey(fromJson: Repository.dynamicToDateTime) DateTime? pushedAt; DateTime? updatedAt; @@ -459,6 +461,18 @@ class Repository { @override String toString() => 'Repository: $owner/$name'; + + /// In some cases, github webhooks send time values as an integer. This method + /// is added to handle those cases, but otherwise parse like normal. + static DateTime? dynamicToDateTime(dynamic time) { + if (time == null) { + return null; + } + if (time.runtimeType == int) { + return DateTime.fromMillisecondsSinceEpoch(time * 1000); + } + return DateTime.parse(time as String); + } } /// Model class for repository permissions. diff --git a/lib/src/common/model/repos.g.dart b/lib/src/common/model/repos.g.dart index 490b18b1..871a3284 100644 --- a/lib/src/common/model/repos.g.dart +++ b/lib/src/common/model/repos.g.dart @@ -46,9 +46,7 @@ Repository _$RepositoryFromJson(Map json) => Repository( sshUrl: json['ssh_url'] as String? ?? '', svnUrl: json['svn_url'] as String? ?? '', defaultBranch: json['default_branch'] as String? ?? '', - createdAt: json['created_at'] == null - ? null - : DateTime.parse(json['created_at'] as String), + createdAt: Repository.dynamicToDateTime(json['created_at']), isPrivate: json['private'] as bool? ?? false, isFork: json['fork'] as bool? ?? false, stargazersCount: json['stargazers_count'] as int? ?? 0, @@ -68,9 +66,7 @@ Repository _$RepositoryFromJson(Map json) => Repository( updatedAt: json['updated_at'] == null ? null : DateTime.parse(json['updated_at'] as String), - pushedAt: json['pushed_at'] == null - ? null - : DateTime.parse(json['pushed_at'] as String), + pushedAt: Repository.dynamicToDateTime(json['pushed_at']), license: json['license'] == null ? null : LicenseKind.fromJson(json['license'] as Map), diff --git a/lib/src/server/hooks.dart b/lib/src/server/hooks.dart index ea250c48..3f8987d2 100644 --- a/lib/src/server/hooks.dart +++ b/lib/src/server/hooks.dart @@ -235,3 +235,40 @@ class CreateEvent extends HookEvent { Map toJson() => _$CreateEventToJson(this); } + +@JsonSerializable(fieldRename: FieldRename.snake) +class PushEvent extends HookEvent { + PushEvent({ + this.ref, + this.before, + this.after, + this.repository, + this.headCommit, + this.commits, + this.sender, + }); + + factory PushEvent.fromJson(Map input) => + _$PushEventFromJson(input); + String? ref; + String? before; + String? after; + @JsonKey(toJson: handleIntegerTimes) + Repository? repository; + PushGitCommit? headCommit; + List? commits; + User? sender; + + Map toJson() => _$PushEventToJson(this); + + static Map? handleIntegerTimes(Repository? repository) { + var repositoryMap = repository?.toJson(); + for (final parameter in ['created_at', 'pushed_at']) { + if (repositoryMap?[parameter] != null) { + final createdAt = DateTime.parse(repositoryMap?[parameter]); + repositoryMap?[parameter] = createdAt.millisecondsSinceEpoch ~/ 1000; + } + } + return repositoryMap; + } +} diff --git a/lib/src/server/hooks.g.dart b/lib/src/server/hooks.g.dart index 3babd5cf..0e4ca02e 100644 --- a/lib/src/server/hooks.g.dart +++ b/lib/src/server/hooks.g.dart @@ -173,3 +173,31 @@ Map _$CreateEventToJson(CreateEvent instance) => 'repository': instance.repository, 'sender': instance.sender, }; + +PushEvent _$PushEventFromJson(Map json) => PushEvent( + ref: json['ref'] as String?, + before: json['before'] as String?, + after: json['after'] as String?, + repository: json['repository'] == null + ? null + : Repository.fromJson(json['repository'] as Map), + headCommit: json['head_commit'] == null + ? null + : PushGitCommit.fromJson(json['head_commit'] as Map), + commits: (json['commits'] as List?) + ?.map((e) => PushGitCommit.fromJson(e as Map)) + .toList(), + sender: json['sender'] == null + ? null + : User.fromJson(json['sender'] as Map), + ); + +Map _$PushEventToJson(PushEvent instance) => { + 'ref': instance.ref, + 'before': instance.before, + 'after': instance.after, + 'repository': PushEvent.handleIntegerTimes(instance.repository), + 'head_commit': instance.headCommit, + 'commits': instance.commits, + 'sender': instance.sender, + }; diff --git a/test/data_object_test.dart b/test/data_object_test.dart index f1d1d5db..1654b0a6 100644 --- a/test/data_object_test.dart +++ b/test/data_object_test.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'package:github/github.dart'; +import 'package:github/hooks.dart'; import 'package:test/test.dart'; const _licenseJson = r''' { @@ -29,6 +30,134 @@ const _licenseJson = r''' { } }'''; +const _pushEventJson = r'''{ + "ref": "refs/heads/main", + "before": "def456def456", + "after": "abc123abc123", + "base_ref": null, + "repository": { + "name": "fake-repository", + "id": 680238321, + "full_name": "fakeuser/fake-repository", + "owner": { + "login": "fakeuser", + "id": 102626803, + "avatar_url": "https://avatars.githubusercontent.com/u/102626803?v=4", + "html_url": "https://github.com/fakeuser" + }, + "private": false, + "fork": false, + "html_url": "https://github.com/fakeuser/fake-repository", + "description": "", + "clone_url": "https://github.com/fakeuser/fake-repository.git", + "ssh_url": "git@github.com:fakeuser/fake-repository.git", + "svn_url": "https://github.com/fakeuser/fake-repository", + "git_url": "git://github.com/fakeuser/fake-repository.git", + "homepage": "", + "size": 1, + "stargazers_count": 0, + "watchers_count": 0, + "language": "", + "has_issues": true, + "has_wiki": true, + "has_downloads": true, + "has_pages": false, + "forks_count": 0, + "open_issues_count": 0, + "default_branch": "main", + "subscribers_count": 0, + "network_count": 0, + "created_at": 1692379465, + "pushed_at": 1694031233, + "updated_at": "2023-08-18T17:24:25.000Z", + "archived": false, + "disabled": false, + "allow_forking": true, + "assignees_url": "https://api.github.com/repos/fakeuser/fake-repository/assignees{/user}", + "blobs_url": "https://api.github.com/repos/fakeuser/fake-repository/git/blobs{/sha}", + "branches_url": "https://api.github.com/repos/fakeuser/fake-repository/branches{/branch}", + "collaborators_url": "https://api.github.com/repos/fakeuser/fake-repository/collaborators{/collaborator}", + "comments_url": "https://api.github.com/repos/fakeuser/fake-repository/comments{/number}", + "commits_url": "https://api.github.com/repos/fakeuser/fake-repository/commits{/sha}", + "compare_url": "https://api.github.com/repos/fakeuser/fake-repository/compare/{base}...{head}", + "contents_url": "https://api.github.com/repos/fakeuser/fake-repository/contents/{+path}", + "contributors_url": "https://api.github.com/repos/fakeuser/fake-repository/contributors", + "deployments_url": "https://api.github.com/repos/fakeuser/fake-repository/deployments", + "downloads_url": "https://api.github.com/repos/fakeuser/fake-repository/downloads", + "events_url": "https://api.github.com/repos/fakeuser/fake-repository/events", + "forks": 0, + "forks_url": "https://api.github.com/repos/fakeuser/fake-repository/forks", + "git_commits_url": "https://api.github.com/repos/fakeuser/fake-repository/git/commits{/sha}", + "git_refs_url": "https://api.github.com/repos/fakeuser/fake-repository/git/refs{/sha}", + "git_tags_url": "https://api.github.com/repos/fakeuser/fake-repository/git/tags{/sha}", + "has_discussions": false, + "has_projects": true, + "hooks_url": "https://api.github.com/repos/fakeuser/fake-repository/hooks", + "is_template": false, + "issue_comment_url": "https://api.github.com/repos/fakeuser/fake-repository/issues/comments{/number}", + "issue_events_url": "https://api.github.com/repos/fakeuser/fake-repository/issues/events{/number}", + "issues_url": "https://api.github.com/repos/fakeuser/fake-repository/issues{/number}", + "keys_url": "https://api.github.com/repos/fakeuser/fake-repository/keys{/key_id}", + "labels_url": "https://api.github.com/repos/fakeuser/fake-repository/labels{/name}", + "languages_url": "https://api.github.com/repos/fakeuser/fake-repository/languages", + "master_branch": "main", + "merges_url": "https://api.github.com/repos/fakeuser/fake-repository/merges", + "milestones_url": "https://api.github.com/repos/fakeuser/fake-repository/milestones{/number}", + "node_id": "R_kgDOKIuc8Q", + "notifications_url": "https://api.github.com/repos/fakeuser/fake-repository/notifications{?since,all,participating}", + "open_issues": 0, + "pulls_url": "https://api.github.com/repos/fakeuser/fake-repository/pulls{/number}", + "releases_url": "https://api.github.com/repos/fakeuser/fake-repository/releases{/id}", + "stargazers_url": "https://api.github.com/repos/fakeuser/fake-repository/stargazers", + "statuses_url": "https://api.github.com/repos/fakeuser/fake-repository/statuses/{sha}", + "subscribers_url": "https://api.github.com/repos/fakeuser/fake-repository/subscribers", + "subscription_url": "https://api.github.com/repos/fakeuser/fake-repository/subscription", + "tags_url": "https://api.github.com/repos/fakeuser/fake-repository/tags", + "teams_url": "https://api.github.com/repos/fakeuser/fake-repository/teams", + "topics": [], + "trees_url": "https://api.github.com/repos/fakeuser/fake-repository/git/trees{/sha}", + "url": "https://github.com/fakeuser/fake-repository", + "visibility": "public", + "watchers": 0, + "web_commit_signoff_required": false + }, + "head_commit": { + "id": "f1eab4d20a72fe5495183136e36584dfab447faf", + "message": "A message", + "timestamp": "2023-09-06T15:14:10.000Z", + "url": "fake-github-url.com" + }, + "commits": [ + { + "id": "f1eab4d20a72fe5495183136e36584dfab447faf", + "message": "A message", + "timestamp": "2023-09-06T15:14:10.000Z", + "url": "fake-github-url.com" + } + ], + "sender": { + "login": "fakeuser", + "id": 102626803, + "avatar_url": "https://avatars.githubusercontent.com/u/102626803?v=4", + "html_url": "https://github.com/fakeuser", + "site_admin": false, + "events_url": "https://api.github.com/users/fakeuser/events{/privacy}", + "followers_url": "https://api.github.com/users/fakeuser/followers", + "following_url": "https://api.github.com/users/fakeuser/following{/other_user}", + "gists_url": "https://api.github.com/users/fakeuser/gists{/gist_id}", + "gravatar_id": "", + "node_id": "U_kgDOBh318w", + "organizations_url": "https://api.github.com/users/fakeuser/orgs", + "received_events_url": "https://api.github.com/users/fakeuser/received_events", + "repos_url": "https://api.github.com/users/fakeuser/repos", + "starred_url": "https://api.github.com/users/fakeuser/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/fakeuser/subscriptions", + "type": "User", + "url": "https://api.github.com/users/fakeuser" + } +} +'''; + void main() { test('License round-trip', () { final licenseJson = jsonDecode(_licenseJson) as Map; @@ -39,6 +168,16 @@ void main() { expect(_prettyEncode(toJson), _prettyEncode(licenseJson)); }); + + test('PushEvent round-trip', () { + final pushEventJson = jsonDecode(_pushEventJson) as Map; + + final instance = PushEvent.fromJson(pushEventJson); + + final toJson = instance.toJson(); + + expect(_prettyEncode(toJson), _prettyEncode(pushEventJson)); + }); } String _prettyEncode(obj) => GitHubJson.encode(obj, indent: ' '); From 8ffe0d0ad2e246a2dc1b1e1b54809644d8a7bd3f Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sun, 10 Sep 2023 17:13:10 -0600 Subject: [PATCH 367/390] prep 9.18.0 --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 0a917ea4..9de50e38 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 9.17.0 +version: 9.18.0 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From 1249a52d43a2c5212345355479625b28e88032c8 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Thu, 14 Sep 2023 14:25:12 -0600 Subject: [PATCH 368/390] Revert "Add the 'PushEvent' webhook and associated PushCommit object" (#387) * Revert "Add the 'PushEvent' webhook and associated PushCommit object (#386)" This reverts commit a3b000641113f235196d9d3cfb8fed5ccca18117. * update changelog --------- Co-authored-by: Rob Becker --- CHANGELOG.md | 21 +++-- lib/src/common/model/git.dart | 22 ----- lib/src/common/model/git.g.dart | 18 ---- lib/src/common/model/repos.dart | 14 --- lib/src/common/model/repos.g.dart | 8 +- lib/src/server/hooks.dart | 37 -------- lib/src/server/hooks.g.dart | 28 ------ test/data_object_test.dart | 139 ------------------------------ 8 files changed, 16 insertions(+), 271 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6193c995..836d730e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,6 @@ ## 9.18.0 -* Adds the initial `PushEvent` object in https://github.com/SpinlockLabs/github.dart/pull/386 -* Update the `Repository` values `created_at` and `pushed_at` to handle integer times +- Bad Release. Was: Add the 'PushEvent' webhook and associated PushCommit ## 9.17.0 @@ -312,7 +311,7 @@ Map? files; - Clean up lints https://github.com/SpinlockLabs/github.dart/pull/202 ## 6.0.5 - - Fix null errors issue https://github.com/SpinlockLabs/github.dart/issues/199 + - Fix null errors issue https://github.com/SpinlockLabs/github.dart/issues/199 ## 6.0.4 - This fixes #196 (https://github.com/SpinlockLabs/github.dart/issues/196) @@ -362,10 +361,10 @@ Map? files; Deprecations: -- The `draft` and `prerelease` properties in the CreateRelease and Release +- The `draft` and `prerelease` properties in the CreateRelease and Release - classes have been renamed to `isDraft` and `isPrerelease` for clarity. -- Release.targetCommitsh has been renamed to Release.targetCommitish. -- The `release` parameter in RepositoriesService.createRelease +- Release.targetCommitsh has been renamed to Release.targetCommitish. +- The `release` parameter in RepositoriesService.createRelease has been renamed to `createRelease`. - `RepositoriesService.getRelease` has been renamed to `RepositoriesService.getReleaseById` @@ -374,7 +373,7 @@ has been renamed to `createRelease`. - Add access to labels on Pull Requests https://github.com/SpinlockLabs/github.dart/pull/163 - Adding draft property to PR model https://github.com/SpinlockLabs/github.dart/pull/162 - updateFile request must be a PUT https://github.com/SpinlockLabs/github.dart/pull/160 - + ## v5.1.0 - `Repository`: added `updatedAt` and `license` fields. @@ -391,7 +390,7 @@ has been renamed to `createRelease`. ## v5.0.0 -- **BREAKING** `RepositoriesService.listCollaborators` now returns +- **BREAKING** `RepositoriesService.listCollaborators` now returns `Stream` instead of `Stream`. - `Collaborator` is a new type that includes collaborator-specific information. @@ -408,7 +407,7 @@ has been renamed to `createRelease`. - Removed unsupported `limit` parameter. - Removed flaky retry logic. Instead, `NotReady` is thrown, which can be used to decide to retry at the call site. - - Made associated classes `ContributorStatistics` and + - Made associated classes `ContributorStatistics` and `ContributorWeekStatistics` immutable. Since these classes are only meant as return values, we're not treating this as a breaking change. - Added `Stream github.search.code(...)` search API @@ -438,7 +437,7 @@ has been renamed to `createRelease`. ## v2.3.2 -- Automatically attempt to find GitHub user information in the process environment when running on the standalone VM. +- Automatically attempt to find GitHub user information in the process environment when running on the standalone VM. - Add `ref` parameter to `getReadme` method for the repository service. ## v2.3.1 @@ -452,7 +451,7 @@ has been renamed to `createRelease`. - Moved `CHANGELOG` content back to repo. - Added `rateLimitLimit`, `rateLimitRemaining` and `rateLimitReset` to `GitHub`. - Added `id` to `Issue` -- Added `direction`, `sort` and `since` optional arguments to +- Added `direction`, `sort` and `since` optional arguments to `IssueService.listByRepo`. ## v2.1.0 diff --git a/lib/src/common/model/git.dart b/lib/src/common/model/git.dart index 0e655572..136c01c4 100644 --- a/lib/src/common/model/git.dart +++ b/lib/src/common/model/git.dart @@ -98,28 +98,6 @@ class CreateGitCommit { Map toJson() => _$CreateGitCommitToJson(this); } -/// Model class for a pushed commit. -@JsonSerializable() -class PushGitCommit { - PushGitCommit(this.id, this.message, this.timestamp, this.url); - - /// The commit hash. - String? id; - - /// The commit message. - String? message; - - /// The timestamp of the commit. - DateTime? timestamp; - - /// The direct url to the commit. - String? url; - - factory PushGitCommit.fromJson(Map input) => - _$PushGitCommitFromJson(input); - Map toJson() => _$PushGitCommitToJson(this); -} - /// Model class for an author or committer of a commit. The [GitCommitUser] may /// not correspond to a GitHub [User]. @JsonSerializable(includeIfNull: false) diff --git a/lib/src/common/model/git.g.dart b/lib/src/common/model/git.g.dart index 7b2ba940..61d5fc44 100644 --- a/lib/src/common/model/git.g.dart +++ b/lib/src/common/model/git.g.dart @@ -88,24 +88,6 @@ Map _$CreateGitCommitToJson(CreateGitCommit instance) => 'author': instance.author, }; -PushGitCommit _$PushGitCommitFromJson(Map json) => - PushGitCommit( - json['id'] as String?, - json['message'] as String?, - json['timestamp'] == null - ? null - : DateTime.parse(json['timestamp'] as String), - json['url'] as String?, - ); - -Map _$PushGitCommitToJson(PushGitCommit instance) => - { - 'id': instance.id, - 'message': instance.message, - 'timestamp': instance.timestamp?.toIso8601String(), - 'url': instance.url, - }; - GitCommitUser _$GitCommitUserFromJson(Map json) => GitCommitUser( json['name'] as String?, diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart index 4e46566d..d09c1a7e 100644 --- a/lib/src/common/model/repos.dart +++ b/lib/src/common/model/repos.dart @@ -225,11 +225,9 @@ class Repository { int networkCount; /// The time the repository was created at - @JsonKey(fromJson: Repository.dynamicToDateTime) DateTime? createdAt; /// The last time the repository was pushed at - @JsonKey(fromJson: Repository.dynamicToDateTime) DateTime? pushedAt; DateTime? updatedAt; @@ -461,18 +459,6 @@ class Repository { @override String toString() => 'Repository: $owner/$name'; - - /// In some cases, github webhooks send time values as an integer. This method - /// is added to handle those cases, but otherwise parse like normal. - static DateTime? dynamicToDateTime(dynamic time) { - if (time == null) { - return null; - } - if (time.runtimeType == int) { - return DateTime.fromMillisecondsSinceEpoch(time * 1000); - } - return DateTime.parse(time as String); - } } /// Model class for repository permissions. diff --git a/lib/src/common/model/repos.g.dart b/lib/src/common/model/repos.g.dart index 871a3284..490b18b1 100644 --- a/lib/src/common/model/repos.g.dart +++ b/lib/src/common/model/repos.g.dart @@ -46,7 +46,9 @@ Repository _$RepositoryFromJson(Map json) => Repository( sshUrl: json['ssh_url'] as String? ?? '', svnUrl: json['svn_url'] as String? ?? '', defaultBranch: json['default_branch'] as String? ?? '', - createdAt: Repository.dynamicToDateTime(json['created_at']), + createdAt: json['created_at'] == null + ? null + : DateTime.parse(json['created_at'] as String), isPrivate: json['private'] as bool? ?? false, isFork: json['fork'] as bool? ?? false, stargazersCount: json['stargazers_count'] as int? ?? 0, @@ -66,7 +68,9 @@ Repository _$RepositoryFromJson(Map json) => Repository( updatedAt: json['updated_at'] == null ? null : DateTime.parse(json['updated_at'] as String), - pushedAt: Repository.dynamicToDateTime(json['pushed_at']), + pushedAt: json['pushed_at'] == null + ? null + : DateTime.parse(json['pushed_at'] as String), license: json['license'] == null ? null : LicenseKind.fromJson(json['license'] as Map), diff --git a/lib/src/server/hooks.dart b/lib/src/server/hooks.dart index 3f8987d2..ea250c48 100644 --- a/lib/src/server/hooks.dart +++ b/lib/src/server/hooks.dart @@ -235,40 +235,3 @@ class CreateEvent extends HookEvent { Map toJson() => _$CreateEventToJson(this); } - -@JsonSerializable(fieldRename: FieldRename.snake) -class PushEvent extends HookEvent { - PushEvent({ - this.ref, - this.before, - this.after, - this.repository, - this.headCommit, - this.commits, - this.sender, - }); - - factory PushEvent.fromJson(Map input) => - _$PushEventFromJson(input); - String? ref; - String? before; - String? after; - @JsonKey(toJson: handleIntegerTimes) - Repository? repository; - PushGitCommit? headCommit; - List? commits; - User? sender; - - Map toJson() => _$PushEventToJson(this); - - static Map? handleIntegerTimes(Repository? repository) { - var repositoryMap = repository?.toJson(); - for (final parameter in ['created_at', 'pushed_at']) { - if (repositoryMap?[parameter] != null) { - final createdAt = DateTime.parse(repositoryMap?[parameter]); - repositoryMap?[parameter] = createdAt.millisecondsSinceEpoch ~/ 1000; - } - } - return repositoryMap; - } -} diff --git a/lib/src/server/hooks.g.dart b/lib/src/server/hooks.g.dart index 0e4ca02e..3babd5cf 100644 --- a/lib/src/server/hooks.g.dart +++ b/lib/src/server/hooks.g.dart @@ -173,31 +173,3 @@ Map _$CreateEventToJson(CreateEvent instance) => 'repository': instance.repository, 'sender': instance.sender, }; - -PushEvent _$PushEventFromJson(Map json) => PushEvent( - ref: json['ref'] as String?, - before: json['before'] as String?, - after: json['after'] as String?, - repository: json['repository'] == null - ? null - : Repository.fromJson(json['repository'] as Map), - headCommit: json['head_commit'] == null - ? null - : PushGitCommit.fromJson(json['head_commit'] as Map), - commits: (json['commits'] as List?) - ?.map((e) => PushGitCommit.fromJson(e as Map)) - .toList(), - sender: json['sender'] == null - ? null - : User.fromJson(json['sender'] as Map), - ); - -Map _$PushEventToJson(PushEvent instance) => { - 'ref': instance.ref, - 'before': instance.before, - 'after': instance.after, - 'repository': PushEvent.handleIntegerTimes(instance.repository), - 'head_commit': instance.headCommit, - 'commits': instance.commits, - 'sender': instance.sender, - }; diff --git a/test/data_object_test.dart b/test/data_object_test.dart index 1654b0a6..f1d1d5db 100644 --- a/test/data_object_test.dart +++ b/test/data_object_test.dart @@ -1,7 +1,6 @@ import 'dart:convert'; import 'package:github/github.dart'; -import 'package:github/hooks.dart'; import 'package:test/test.dart'; const _licenseJson = r''' { @@ -30,134 +29,6 @@ const _licenseJson = r''' { } }'''; -const _pushEventJson = r'''{ - "ref": "refs/heads/main", - "before": "def456def456", - "after": "abc123abc123", - "base_ref": null, - "repository": { - "name": "fake-repository", - "id": 680238321, - "full_name": "fakeuser/fake-repository", - "owner": { - "login": "fakeuser", - "id": 102626803, - "avatar_url": "https://avatars.githubusercontent.com/u/102626803?v=4", - "html_url": "https://github.com/fakeuser" - }, - "private": false, - "fork": false, - "html_url": "https://github.com/fakeuser/fake-repository", - "description": "", - "clone_url": "https://github.com/fakeuser/fake-repository.git", - "ssh_url": "git@github.com:fakeuser/fake-repository.git", - "svn_url": "https://github.com/fakeuser/fake-repository", - "git_url": "git://github.com/fakeuser/fake-repository.git", - "homepage": "", - "size": 1, - "stargazers_count": 0, - "watchers_count": 0, - "language": "", - "has_issues": true, - "has_wiki": true, - "has_downloads": true, - "has_pages": false, - "forks_count": 0, - "open_issues_count": 0, - "default_branch": "main", - "subscribers_count": 0, - "network_count": 0, - "created_at": 1692379465, - "pushed_at": 1694031233, - "updated_at": "2023-08-18T17:24:25.000Z", - "archived": false, - "disabled": false, - "allow_forking": true, - "assignees_url": "https://api.github.com/repos/fakeuser/fake-repository/assignees{/user}", - "blobs_url": "https://api.github.com/repos/fakeuser/fake-repository/git/blobs{/sha}", - "branches_url": "https://api.github.com/repos/fakeuser/fake-repository/branches{/branch}", - "collaborators_url": "https://api.github.com/repos/fakeuser/fake-repository/collaborators{/collaborator}", - "comments_url": "https://api.github.com/repos/fakeuser/fake-repository/comments{/number}", - "commits_url": "https://api.github.com/repos/fakeuser/fake-repository/commits{/sha}", - "compare_url": "https://api.github.com/repos/fakeuser/fake-repository/compare/{base}...{head}", - "contents_url": "https://api.github.com/repos/fakeuser/fake-repository/contents/{+path}", - "contributors_url": "https://api.github.com/repos/fakeuser/fake-repository/contributors", - "deployments_url": "https://api.github.com/repos/fakeuser/fake-repository/deployments", - "downloads_url": "https://api.github.com/repos/fakeuser/fake-repository/downloads", - "events_url": "https://api.github.com/repos/fakeuser/fake-repository/events", - "forks": 0, - "forks_url": "https://api.github.com/repos/fakeuser/fake-repository/forks", - "git_commits_url": "https://api.github.com/repos/fakeuser/fake-repository/git/commits{/sha}", - "git_refs_url": "https://api.github.com/repos/fakeuser/fake-repository/git/refs{/sha}", - "git_tags_url": "https://api.github.com/repos/fakeuser/fake-repository/git/tags{/sha}", - "has_discussions": false, - "has_projects": true, - "hooks_url": "https://api.github.com/repos/fakeuser/fake-repository/hooks", - "is_template": false, - "issue_comment_url": "https://api.github.com/repos/fakeuser/fake-repository/issues/comments{/number}", - "issue_events_url": "https://api.github.com/repos/fakeuser/fake-repository/issues/events{/number}", - "issues_url": "https://api.github.com/repos/fakeuser/fake-repository/issues{/number}", - "keys_url": "https://api.github.com/repos/fakeuser/fake-repository/keys{/key_id}", - "labels_url": "https://api.github.com/repos/fakeuser/fake-repository/labels{/name}", - "languages_url": "https://api.github.com/repos/fakeuser/fake-repository/languages", - "master_branch": "main", - "merges_url": "https://api.github.com/repos/fakeuser/fake-repository/merges", - "milestones_url": "https://api.github.com/repos/fakeuser/fake-repository/milestones{/number}", - "node_id": "R_kgDOKIuc8Q", - "notifications_url": "https://api.github.com/repos/fakeuser/fake-repository/notifications{?since,all,participating}", - "open_issues": 0, - "pulls_url": "https://api.github.com/repos/fakeuser/fake-repository/pulls{/number}", - "releases_url": "https://api.github.com/repos/fakeuser/fake-repository/releases{/id}", - "stargazers_url": "https://api.github.com/repos/fakeuser/fake-repository/stargazers", - "statuses_url": "https://api.github.com/repos/fakeuser/fake-repository/statuses/{sha}", - "subscribers_url": "https://api.github.com/repos/fakeuser/fake-repository/subscribers", - "subscription_url": "https://api.github.com/repos/fakeuser/fake-repository/subscription", - "tags_url": "https://api.github.com/repos/fakeuser/fake-repository/tags", - "teams_url": "https://api.github.com/repos/fakeuser/fake-repository/teams", - "topics": [], - "trees_url": "https://api.github.com/repos/fakeuser/fake-repository/git/trees{/sha}", - "url": "https://github.com/fakeuser/fake-repository", - "visibility": "public", - "watchers": 0, - "web_commit_signoff_required": false - }, - "head_commit": { - "id": "f1eab4d20a72fe5495183136e36584dfab447faf", - "message": "A message", - "timestamp": "2023-09-06T15:14:10.000Z", - "url": "fake-github-url.com" - }, - "commits": [ - { - "id": "f1eab4d20a72fe5495183136e36584dfab447faf", - "message": "A message", - "timestamp": "2023-09-06T15:14:10.000Z", - "url": "fake-github-url.com" - } - ], - "sender": { - "login": "fakeuser", - "id": 102626803, - "avatar_url": "https://avatars.githubusercontent.com/u/102626803?v=4", - "html_url": "https://github.com/fakeuser", - "site_admin": false, - "events_url": "https://api.github.com/users/fakeuser/events{/privacy}", - "followers_url": "https://api.github.com/users/fakeuser/followers", - "following_url": "https://api.github.com/users/fakeuser/following{/other_user}", - "gists_url": "https://api.github.com/users/fakeuser/gists{/gist_id}", - "gravatar_id": "", - "node_id": "U_kgDOBh318w", - "organizations_url": "https://api.github.com/users/fakeuser/orgs", - "received_events_url": "https://api.github.com/users/fakeuser/received_events", - "repos_url": "https://api.github.com/users/fakeuser/repos", - "starred_url": "https://api.github.com/users/fakeuser/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/fakeuser/subscriptions", - "type": "User", - "url": "https://api.github.com/users/fakeuser" - } -} -'''; - void main() { test('License round-trip', () { final licenseJson = jsonDecode(_licenseJson) as Map; @@ -168,16 +39,6 @@ void main() { expect(_prettyEncode(toJson), _prettyEncode(licenseJson)); }); - - test('PushEvent round-trip', () { - final pushEventJson = jsonDecode(_pushEventJson) as Map; - - final instance = PushEvent.fromJson(pushEventJson); - - final toJson = instance.toJson(); - - expect(_prettyEncode(toJson), _prettyEncode(pushEventJson)); - }); } String _prettyEncode(obj) => GitHubJson.encode(obj, indent: ' '); From c86afa71aea32e727c02514456432410392a17cb Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Thu, 14 Sep 2023 14:25:45 -0600 Subject: [PATCH 369/390] prep 9.19.0 --- CHANGELOG.md | 7 +++++++ pubspec.yaml | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 836d730e..94e3728c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## 9.19.0 + +* Revert "Add the 'PushEvent' webhook and associated PushCommit object" by @robrbecker in https://github.com/SpinlockLabs/github.dart/pull/387 + + +**Full Changelog**: https://github.com/SpinlockLabs/github.dart/compare/9.18.0...9.19.0 + ## 9.18.0 - Bad Release. Was: Add the 'PushEvent' webhook and associated PushCommit diff --git a/pubspec.yaml b/pubspec.yaml index 9de50e38..8bdc72f6 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 9.18.0 +version: 9.19.0 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From 01a87bf8c75048857d84d60fe50b5ea07463f248 Mon Sep 17 00:00:00 2001 From: Ricardo Amador <32242716+ricardoamador@users.noreply.github.com> Date: Tue, 14 Nov 2023 09:42:30 -0800 Subject: [PATCH 370/390] Add a Changes object to the PullRequestEvent object so we can see what changed in edited PR events (#390) * Add changes object so we can see what changed in edited PR. * Remove unused import * Formatting. * Make objects const --- lib/src/common/model/changes.dart | 68 ++ lib/src/common/model/changes.g.dart | 71 ++ lib/src/server/hooks.dart | 5 + lib/src/server/hooks.g.dart | 4 + test/server/hooks_test.dart | 25 + test/server/hooks_test_data.dart | 1143 +++++++++++++++++++++++++++ 6 files changed, 1316 insertions(+) create mode 100644 lib/src/common/model/changes.dart create mode 100644 lib/src/common/model/changes.g.dart diff --git a/lib/src/common/model/changes.dart b/lib/src/common/model/changes.dart new file mode 100644 index 00000000..edccdbc5 --- /dev/null +++ b/lib/src/common/model/changes.dart @@ -0,0 +1,68 @@ +import 'package:json_annotation/json_annotation.dart'; +import 'package:meta/meta.dart'; + +part 'changes.g.dart'; + +@immutable +@JsonSerializable() +class Ref { + const Ref(this.from); + final String? from; + + factory Ref.fromJson(Map input) => _$RefFromJson(input); + Map toJson() => _$RefToJson(this); +} + +@immutable +@JsonSerializable() +class Sha { + const Sha(this.from); + final String? from; + + factory Sha.fromJson(Map input) => _$ShaFromJson(input); + Map toJson() => _$ShaToJson(this); +} + +@immutable +@JsonSerializable() +class Base { + const Base(this.ref, this.sha); + final Ref? ref; + final Sha? sha; + + factory Base.fromJson(Map input) => _$BaseFromJson(input); + Map toJson() => _$BaseToJson(this); +} + +@immutable +@JsonSerializable() +class Body { + const Body(this.from); + final String? from; + + factory Body.fromJson(Map input) => _$BodyFromJson(input); + Map toJson() => _$BodyToJson(this); +} + +@immutable +@JsonSerializable() +class Title { + const Title({this.from}); + final String? from; + + factory Title.fromJson(Map input) => _$TitleFromJson(input); + Map toJson() => _$TitleToJson(this); +} + +@immutable +@JsonSerializable() +class Changes { + const Changes(this.base, this.body, this.title); + final Base? base; + final Body? body; + final Title? title; + + factory Changes.fromJson(Map input) => + _$ChangesFromJson(input); + Map toJson() => _$ChangesToJson(this); +} diff --git a/lib/src/common/model/changes.g.dart b/lib/src/common/model/changes.g.dart new file mode 100644 index 00000000..13e97d0e --- /dev/null +++ b/lib/src/common/model/changes.g.dart @@ -0,0 +1,71 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'changes.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +Ref _$RefFromJson(Map json) => Ref( + json['from'] as String?, + ); + +Map _$RefToJson(Ref instance) => { + 'from': instance.from, + }; + +Sha _$ShaFromJson(Map json) => Sha( + json['from'] as String?, + ); + +Map _$ShaToJson(Sha instance) => { + 'from': instance.from, + }; + +Base _$BaseFromJson(Map json) => Base( + json['ref'] == null + ? null + : Ref.fromJson(json['ref'] as Map), + json['sha'] == null + ? null + : Sha.fromJson(json['sha'] as Map), + ); + +Map _$BaseToJson(Base instance) => { + 'ref': instance.ref, + 'sha': instance.sha, + }; + +Body _$BodyFromJson(Map json) => Body( + json['from'] as String?, + ); + +Map _$BodyToJson(Body instance) => { + 'from': instance.from, + }; + +Title _$TitleFromJson(Map json) => Title( + from: json['from'] as String?, + ); + +Map _$TitleToJson(Title instance) => { + 'from': instance.from, + }; + +Changes _$ChangesFromJson(Map json) => Changes( + json['base'] == null + ? null + : Base.fromJson(json['base'] as Map), + json['body'] == null + ? null + : Body.fromJson(json['body'] as Map), + json['title'] == null + ? null + : Title.fromJson(json['title'] as Map), + ); + +Map _$ChangesToJson(Changes instance) => { + 'base': instance.base, + 'body': instance.body, + 'title': instance.title, + }; diff --git a/lib/src/server/hooks.dart b/lib/src/server/hooks.dart index ea250c48..ae3fa0bf 100644 --- a/lib/src/server/hooks.dart +++ b/lib/src/server/hooks.dart @@ -1,8 +1,11 @@ import 'dart:async'; import 'dart:convert'; import 'dart:io'; + import 'package:json_annotation/json_annotation.dart'; + import '../common.dart'; +import '../common/model/changes.dart'; part 'hooks.g.dart'; @@ -203,12 +206,14 @@ class PullRequestEvent extends HookEvent { this.pullRequest, this.sender, this.repository, + this.changes, }); String? action; int? number; PullRequest? pullRequest; User? sender; Repository? repository; + Changes? changes; factory PullRequestEvent.fromJson(Map input) => _$PullRequestEventFromJson(input); diff --git a/lib/src/server/hooks.g.dart b/lib/src/server/hooks.g.dart index 3babd5cf..e78b6cc9 100644 --- a/lib/src/server/hooks.g.dart +++ b/lib/src/server/hooks.g.dart @@ -142,6 +142,9 @@ PullRequestEvent _$PullRequestEventFromJson(Map json) => repository: json['repository'] == null ? null : Repository.fromJson(json['repository'] as Map), + changes: json['changes'] == null + ? null + : Changes.fromJson(json['changes'] as Map), ); Map _$PullRequestEventToJson(PullRequestEvent instance) => @@ -151,6 +154,7 @@ Map _$PullRequestEventToJson(PullRequestEvent instance) => 'pull_request': instance.pullRequest, 'sender': instance.sender, 'repository': instance.repository, + 'changes': instance.changes, }; CreateEvent _$CreateEventFromJson(Map json) => CreateEvent( diff --git a/test/server/hooks_test.dart b/test/server/hooks_test.dart index 09deae27..d00cb3de 100644 --- a/test/server/hooks_test.dart +++ b/test/server/hooks_test.dart @@ -57,4 +57,29 @@ void main() { expect(sender.htmlUrl, "https://github.com/Codertocat"); }); }); + + group('EditedPullRequest', () { + test('deserialize with body edit', () { + final pullRequestEditedEvent = PullRequestEvent.fromJson( + jsonDecode(prBodyEditedEvent) as Map); + final changes = pullRequestEditedEvent.changes; + expect(changes, isNotNull); + expect(changes!.body!.from, isNotNull); + assert(changes.body!.from == + '**This should not land until https://github.com/flutter/buildroot/pull/790'); + }); + + test('deserialize with base edit', () { + final pullRequestEditedEvent = PullRequestEvent.fromJson( + jsonDecode(prBaseEditedEvent) as Map); + final changes = pullRequestEditedEvent.changes; + expect(changes, isNotNull); + expect(changes!.body, isNull); + expect(changes.base, isNotNull); + expect(changes.base!.ref, isNotNull); + assert(changes.base!.ref!.from == 'main'); + assert(changes.base!.sha!.from == + 'b3af5d64d3e6e2110b07d71909fc432537339659'); + }); + }); } diff --git a/test/server/hooks_test_data.dart b/test/server/hooks_test_data.dart index c6f12f84..4f5b734b 100644 --- a/test/server/hooks_test_data.dart +++ b/test/server/hooks_test_data.dart @@ -672,3 +672,1146 @@ const String createString = ''' } } '''; + +const String prBodyEditedEvent = ''' +{ + "action": "edited", + "number": 47609, + "pull_request": { + "url": "https://api.github.com/repos/flutter/engine/pulls/47609", + "id": 1584723957, + "node_id": "PR_kwDOAlZRSc5edPf1", + "html_url": "https://github.com/flutter/engine/pull/47609", + "diff_url": "https://github.com/flutter/engine/pull/47609.diff", + "patch_url": "https://github.com/flutter/engine/pull/47609.patch", + "issue_url": "https://api.github.com/repos/flutter/engine/issues/47609", + "number": 47609, + "state": "open", + "locked": false, + "title": "Upgrade Android SDK to 34 UpsideDownCake", + "user": { + "login": "gmackall", + "id": 34871572, + "node_id": "MDQ6VXNlcjM0ODcxNTcy", + "avatar_url": "https://avatars.githubusercontent.com/u/34871572?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/gmackall", + "html_url": "https://github.com/gmackall", + "followers_url": "https://api.github.com/users/gmackall/followers", + "following_url": "https://api.github.com/users/gmackall/following{/other_user}", + "gists_url": "https://api.github.com/users/gmackall/gists{/gist_id}", + "starred_url": "https://api.github.com/users/gmackall/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/gmackall/subscriptions", + "organizations_url": "https://api.github.com/users/gmackall/orgs", + "repos_url": "https://api.github.com/users/gmackall/repos", + "events_url": "https://api.github.com/users/gmackall/events{/privacy}", + "received_events_url": "https://api.github.com/users/gmackall/received_events", + "type": "User", + "site_admin": false + }, + "body": "~**This should not land until https://github.com/flutter/buildroot/pull/790 (re)lands, and I swap the buildroot url back to the latest commit.**~ Reland of PR to update buildroot at https://github.com/flutter/buildroot/pull/792. Upgrades to android api 34 Also: 1. Upgrades to java 17 in DEPS/ci", + "created_at": "2023-11-02T17:09:59Z", + "updated_at": "2023-11-08T21:00:47Z", + "closed_at": null, + "merged_at": null, + "merge_commit_sha": "8e5e3a59a5cba4239c542ed9a914899a246640b7", + "assignee": null, + "assignees": [ + + ], + "requested_reviewers": [ + + ], + "requested_teams": [ + + ], + "labels": [ + { + "id": 246348935, + "node_id": "MDU6TGFiZWwyNDYzNDg5MzU=", + "url": "https://api.github.com/repos/flutter/engine/labels/platform-android", + "name": "platform-android", + "color": "A4C639", + "default": false, + "description": null + } + ], + "milestone": null, + "draft": false, + "commits_url": "https://api.github.com/repos/flutter/engine/pulls/47609/commits", + "review_comments_url": "https://api.github.com/repos/flutter/engine/pulls/47609/comments", + "review_comment_url": "https://api.github.com/repos/flutter/engine/pulls/comments{/number}", + "comments_url": "https://api.github.com/repos/flutter/engine/issues/47609/comments", + "statuses_url": "https://api.github.com/repos/flutter/engine/statuses/a6765b4c309aa082bbebade68e0c7ec308a1cc6c", + "head": { + "label": "gmackall:upgrade_to_android14", + "ref": "upgrade_to_android14", + "sha": "a6765b4c309aa082bbebade68e0c7ec308a1cc6c", + "user": { + "login": "gmackall", + "id": 34871572, + "node_id": "MDQ6VXNlcjM0ODcxNTcy", + "avatar_url": "https://avatars.githubusercontent.com/u/34871572?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/gmackall", + "html_url": "https://github.com/gmackall", + "followers_url": "https://api.github.com/users/gmackall/followers", + "following_url": "https://api.github.com/users/gmackall/following{/other_user}", + "gists_url": "https://api.github.com/users/gmackall/gists{/gist_id}", + "starred_url": "https://api.github.com/users/gmackall/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/gmackall/subscriptions", + "organizations_url": "https://api.github.com/users/gmackall/orgs", + "repos_url": "https://api.github.com/users/gmackall/repos", + "events_url": "https://api.github.com/users/gmackall/events{/privacy}", + "received_events_url": "https://api.github.com/users/gmackall/received_events", + "type": "User", + "site_admin": false + }, + "repo": { + "id": 547558963, + "node_id": "R_kgDOIKMWMw", + "name": "engine", + "full_name": "gmackall/engine", + "private": false, + "owner": { + "login": "gmackall", + "id": 34871572, + "node_id": "MDQ6VXNlcjM0ODcxNTcy", + "avatar_url": "https://avatars.githubusercontent.com/u/34871572?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/gmackall", + "html_url": "https://github.com/gmackall", + "followers_url": "https://api.github.com/users/gmackall/followers", + "following_url": "https://api.github.com/users/gmackall/following{/other_user}", + "gists_url": "https://api.github.com/users/gmackall/gists{/gist_id}", + "starred_url": "https://api.github.com/users/gmackall/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/gmackall/subscriptions", + "organizations_url": "https://api.github.com/users/gmackall/orgs", + "repos_url": "https://api.github.com/users/gmackall/repos", + "events_url": "https://api.github.com/users/gmackall/events{/privacy}", + "received_events_url": "https://api.github.com/users/gmackall/received_events", + "type": "User", + "site_admin": false + }, + "html_url": "https://github.com/gmackall/engine", + "description": "The Flutter engine", + "fork": true, + "url": "https://api.github.com/repos/gmackall/engine", + "forks_url": "https://api.github.com/repos/gmackall/engine/forks", + "keys_url": "https://api.github.com/repos/gmackall/engine/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/gmackall/engine/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/gmackall/engine/teams", + "hooks_url": "https://api.github.com/repos/gmackall/engine/hooks", + "issue_events_url": "https://api.github.com/repos/gmackall/engine/issues/events{/number}", + "events_url": "https://api.github.com/repos/gmackall/engine/events", + "assignees_url": "https://api.github.com/repos/gmackall/engine/assignees{/user}", + "branches_url": "https://api.github.com/repos/gmackall/engine/branches{/branch}", + "tags_url": "https://api.github.com/repos/gmackall/engine/tags", + "blobs_url": "https://api.github.com/repos/gmackall/engine/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/gmackall/engine/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/gmackall/engine/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/gmackall/engine/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/gmackall/engine/statuses/{sha}", + "languages_url": "https://api.github.com/repos/gmackall/engine/languages", + "stargazers_url": "https://api.github.com/repos/gmackall/engine/stargazers", + "contributors_url": "https://api.github.com/repos/gmackall/engine/contributors", + "subscribers_url": "https://api.github.com/repos/gmackall/engine/subscribers", + "subscription_url": "https://api.github.com/repos/gmackall/engine/subscription", + "commits_url": "https://api.github.com/repos/gmackall/engine/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/gmackall/engine/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/gmackall/engine/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/gmackall/engine/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/gmackall/engine/contents/{+path}", + "compare_url": "https://api.github.com/repos/gmackall/engine/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/gmackall/engine/merges", + "archive_url": "https://api.github.com/repos/gmackall/engine/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/gmackall/engine/downloads", + "issues_url": "https://api.github.com/repos/gmackall/engine/issues{/number}", + "pulls_url": "https://api.github.com/repos/gmackall/engine/pulls{/number}", + "milestones_url": "https://api.github.com/repos/gmackall/engine/milestones{/number}", + "notifications_url": "https://api.github.com/repos/gmackall/engine/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/gmackall/engine/labels{/name}", + "releases_url": "https://api.github.com/repos/gmackall/engine/releases{/id}", + "deployments_url": "https://api.github.com/repos/gmackall/engine/deployments", + "created_at": "2022-10-07T22:25:57Z", + "updated_at": "2023-02-02T18:38:07Z", + "pushed_at": "2023-11-08T20:57:02Z", + "git_url": "git://github.com/gmackall/engine.git", + "ssh_url": "git@github.com:gmackall/engine.git", + "clone_url": "https://github.com/gmackall/engine.git", + "svn_url": "https://github.com/gmackall/engine", + "homepage": "https://flutter.dev", + "size": 466778, + "stargazers_count": 0, + "watchers_count": 0, + "language": "C++", + "has_issues": false, + "has_projects": true, + "has_downloads": true, + "has_wiki": false, + "has_pages": false, + "has_discussions": false, + "forks_count": 0, + "mirror_url": null, + "archived": false, + "disabled": false, + "open_issues_count": 0, + "license": { + "key": "bsd-3-clause", + "name": "BSD 3-Clause New or Revised License", + "spdx_id": "BSD-3-Clause", + "url": "https://api.github.com/licenses/bsd-3-clause", + "node_id": "MDc6TGljZW5zZTU=" + }, + "allow_forking": true, + "is_template": false, + "web_commit_signoff_required": false, + "topics": [ + + ], + "visibility": "public", + "forks": 0, + "open_issues": 0, + "watchers": 0, + "default_branch": "main", + "allow_squash_merge": true, + "allow_merge_commit": true, + "allow_rebase_merge": true, + "allow_auto_merge": false, + "delete_branch_on_merge": false, + "allow_update_branch": false, + "use_squash_pr_title_as_default": false, + "squash_merge_commit_message": "COMMIT_MESSAGES", + "squash_merge_commit_title": "COMMIT_OR_PR_TITLE", + "merge_commit_message": "PR_TITLE", + "merge_commit_title": "MERGE_MESSAGE" + } + }, + "base": { + "label": "flutter:main", + "ref": "main", + "sha": "941e246d4851f652cf13312180174ebc9395fac4", + "user": { + "login": "flutter", + "id": 14101776, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjE0MTAxNzc2", + "avatar_url": "https://avatars.githubusercontent.com/u/14101776?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/flutter", + "html_url": "https://github.com/flutter", + "followers_url": "https://api.github.com/users/flutter/followers", + "following_url": "https://api.github.com/users/flutter/following{/other_user}", + "gists_url": "https://api.github.com/users/flutter/gists{/gist_id}", + "starred_url": "https://api.github.com/users/flutter/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/flutter/subscriptions", + "organizations_url": "https://api.github.com/users/flutter/orgs", + "repos_url": "https://api.github.com/users/flutter/repos", + "events_url": "https://api.github.com/users/flutter/events{/privacy}", + "received_events_url": "https://api.github.com/users/flutter/received_events", + "type": "Organization", + "site_admin": false + }, + "repo": { + "id": 39211337, + "node_id": "MDEwOlJlcG9zaXRvcnkzOTIxMTMzNw==", + "name": "engine", + "full_name": "flutter/engine", + "private": false, + "owner": { + "login": "flutter", + "id": 14101776, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjE0MTAxNzc2", + "avatar_url": "https://avatars.githubusercontent.com/u/14101776?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/flutter", + "html_url": "https://github.com/flutter", + "followers_url": "https://api.github.com/users/flutter/followers", + "following_url": "https://api.github.com/users/flutter/following{/other_user}", + "gists_url": "https://api.github.com/users/flutter/gists{/gist_id}", + "starred_url": "https://api.github.com/users/flutter/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/flutter/subscriptions", + "organizations_url": "https://api.github.com/users/flutter/orgs", + "repos_url": "https://api.github.com/users/flutter/repos", + "events_url": "https://api.github.com/users/flutter/events{/privacy}", + "received_events_url": "https://api.github.com/users/flutter/received_events", + "type": "Organization", + "site_admin": false + }, + "html_url": "https://github.com/flutter/engine", + "description": "The Flutter engine", + "fork": false, + "url": "https://api.github.com/repos/flutter/engine", + "forks_url": "https://api.github.com/repos/flutter/engine/forks", + "keys_url": "https://api.github.com/repos/flutter/engine/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/flutter/engine/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/flutter/engine/teams", + "hooks_url": "https://api.github.com/repos/flutter/engine/hooks", + "issue_events_url": "https://api.github.com/repos/flutter/engine/issues/events{/number}", + "events_url": "https://api.github.com/repos/flutter/engine/events", + "assignees_url": "https://api.github.com/repos/flutter/engine/assignees{/user}", + "branches_url": "https://api.github.com/repos/flutter/engine/branches{/branch}", + "tags_url": "https://api.github.com/repos/flutter/engine/tags", + "blobs_url": "https://api.github.com/repos/flutter/engine/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/flutter/engine/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/flutter/engine/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/flutter/engine/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/flutter/engine/statuses/{sha}", + "languages_url": "https://api.github.com/repos/flutter/engine/languages", + "stargazers_url": "https://api.github.com/repos/flutter/engine/stargazers", + "contributors_url": "https://api.github.com/repos/flutter/engine/contributors", + "subscribers_url": "https://api.github.com/repos/flutter/engine/subscribers", + "subscription_url": "https://api.github.com/repos/flutter/engine/subscription", + "commits_url": "https://api.github.com/repos/flutter/engine/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/flutter/engine/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/flutter/engine/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/flutter/engine/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/flutter/engine/contents/{+path}", + "compare_url": "https://api.github.com/repos/flutter/engine/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/flutter/engine/merges", + "archive_url": "https://api.github.com/repos/flutter/engine/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/flutter/engine/downloads", + "issues_url": "https://api.github.com/repos/flutter/engine/issues{/number}", + "pulls_url": "https://api.github.com/repos/flutter/engine/pulls{/number}", + "milestones_url": "https://api.github.com/repos/flutter/engine/milestones{/number}", + "notifications_url": "https://api.github.com/repos/flutter/engine/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/flutter/engine/labels{/name}", + "releases_url": "https://api.github.com/repos/flutter/engine/releases{/id}", + "deployments_url": "https://api.github.com/repos/flutter/engine/deployments", + "created_at": "2015-07-16T17:39:56Z", + "updated_at": "2023-11-08T07:16:25Z", + "pushed_at": "2023-11-08T21:00:38Z", + "git_url": "git://github.com/flutter/engine.git", + "ssh_url": "git@github.com:flutter/engine.git", + "clone_url": "https://github.com/flutter/engine.git", + "svn_url": "https://github.com/flutter/engine", + "homepage": "https://flutter.dev", + "size": 704170, + "stargazers_count": 6848, + "watchers_count": 6848, + "language": "C++", + "has_issues": false, + "has_projects": false, + "has_downloads": true, + "has_wiki": false, + "has_pages": false, + "has_discussions": false, + "forks_count": 5600, + "mirror_url": null, + "archived": false, + "disabled": false, + "open_issues_count": 99, + "license": { + "key": "bsd-3-clause", + "name": "BSD 3-Clause New or Revised License", + "spdx_id": "BSD-3-Clause", + "url": "https://api.github.com/licenses/bsd-3-clause", + "node_id": "MDc6TGljZW5zZTU=" + }, + "allow_forking": true, + "is_template": false, + "web_commit_signoff_required": false, + "topics": [ + "c-plus-plus" + ], + "visibility": "public", + "forks": 5600, + "open_issues": 99, + "watchers": 6848, + "default_branch": "main", + "allow_squash_merge": true, + "allow_merge_commit": false, + "allow_rebase_merge": false, + "allow_auto_merge": false, + "delete_branch_on_merge": true, + "allow_update_branch": true, + "use_squash_pr_title_as_default": true, + "squash_merge_commit_message": "PR_BODY", + "squash_merge_commit_title": "PR_TITLE", + "merge_commit_message": "PR_TITLE", + "merge_commit_title": "MERGE_MESSAGE" + } + }, + "_links": { + "self": { + "href": "https://api.github.com/repos/flutter/engine/pulls/47609" + }, + "html": { + "href": "https://github.com/flutter/engine/pull/47609" + }, + "issue": { + "href": "https://api.github.com/repos/flutter/engine/issues/47609" + }, + "comments": { + "href": "https://api.github.com/repos/flutter/engine/issues/47609/comments" + }, + "review_comments": { + "href": "https://api.github.com/repos/flutter/engine/pulls/47609/comments" + }, + "review_comment": { + "href": "https://api.github.com/repos/flutter/engine/pulls/comments{/number}" + }, + "commits": { + "href": "https://api.github.com/repos/flutter/engine/pulls/47609/commits" + }, + "statuses": { + "href": "https://api.github.com/repos/flutter/engine/statuses/a6765b4c309aa082bbebade68e0c7ec308a1cc6c" + } + }, + "author_association": "MEMBER", + "auto_merge": null, + "active_lock_reason": null, + "merged": false, + "mergeable": true, + "rebaseable": true, + "mergeable_state": "clean", + "merged_by": null, + "comments": 4, + "review_comments": 4, + "maintainer_can_modify": true, + "commits": 32, + "additions": 83, + "deletions": 77, + "changed_files": 18 + }, + "changes": { + "body": { + "from": "**This should not land until https://github.com/flutter/buildroot/pull/790" + } + }, + "repository": { + "id": 39211337, + "node_id": "MDEwOlJlcG9zaXRvcnkzOTIxMTMzNw==", + "name": "engine", + "full_name": "flutter/engine", + "private": false, + "owner": { + "login": "flutter", + "id": 14101776, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjE0MTAxNzc2", + "avatar_url": "https://avatars.githubusercontent.com/u/14101776?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/flutter", + "html_url": "https://github.com/flutter", + "followers_url": "https://api.github.com/users/flutter/followers", + "following_url": "https://api.github.com/users/flutter/following{/other_user}", + "gists_url": "https://api.github.com/users/flutter/gists{/gist_id}", + "starred_url": "https://api.github.com/users/flutter/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/flutter/subscriptions", + "organizations_url": "https://api.github.com/users/flutter/orgs", + "repos_url": "https://api.github.com/users/flutter/repos", + "events_url": "https://api.github.com/users/flutter/events{/privacy}", + "received_events_url": "https://api.github.com/users/flutter/received_events", + "type": "Organization", + "site_admin": false + }, + "html_url": "https://github.com/flutter/engine", + "description": "The Flutter engine", + "fork": false, + "url": "https://api.github.com/repos/flutter/engine", + "forks_url": "https://api.github.com/repos/flutter/engine/forks", + "keys_url": "https://api.github.com/repos/flutter/engine/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/flutter/engine/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/flutter/engine/teams", + "hooks_url": "https://api.github.com/repos/flutter/engine/hooks", + "issue_events_url": "https://api.github.com/repos/flutter/engine/issues/events{/number}", + "events_url": "https://api.github.com/repos/flutter/engine/events", + "assignees_url": "https://api.github.com/repos/flutter/engine/assignees{/user}", + "branches_url": "https://api.github.com/repos/flutter/engine/branches{/branch}", + "tags_url": "https://api.github.com/repos/flutter/engine/tags", + "blobs_url": "https://api.github.com/repos/flutter/engine/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/flutter/engine/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/flutter/engine/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/flutter/engine/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/flutter/engine/statuses/{sha}", + "languages_url": "https://api.github.com/repos/flutter/engine/languages", + "stargazers_url": "https://api.github.com/repos/flutter/engine/stargazers", + "contributors_url": "https://api.github.com/repos/flutter/engine/contributors", + "subscribers_url": "https://api.github.com/repos/flutter/engine/subscribers", + "subscription_url": "https://api.github.com/repos/flutter/engine/subscription", + "commits_url": "https://api.github.com/repos/flutter/engine/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/flutter/engine/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/flutter/engine/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/flutter/engine/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/flutter/engine/contents/{+path}", + "compare_url": "https://api.github.com/repos/flutter/engine/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/flutter/engine/merges", + "archive_url": "https://api.github.com/repos/flutter/engine/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/flutter/engine/downloads", + "issues_url": "https://api.github.com/repos/flutter/engine/issues{/number}", + "pulls_url": "https://api.github.com/repos/flutter/engine/pulls{/number}", + "milestones_url": "https://api.github.com/repos/flutter/engine/milestones{/number}", + "notifications_url": "https://api.github.com/repos/flutter/engine/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/flutter/engine/labels{/name}", + "releases_url": "https://api.github.com/repos/flutter/engine/releases{/id}", + "deployments_url": "https://api.github.com/repos/flutter/engine/deployments", + "created_at": "2015-07-16T17:39:56Z", + "updated_at": "2023-11-08T07:16:25Z", + "pushed_at": "2023-11-08T21:00:38Z", + "git_url": "git://github.com/flutter/engine.git", + "ssh_url": "git@github.com:flutter/engine.git", + "clone_url": "https://github.com/flutter/engine.git", + "svn_url": "https://github.com/flutter/engine", + "homepage": "https://flutter.dev", + "size": 704170, + "stargazers_count": 6848, + "watchers_count": 6848, + "language": "C++", + "has_issues": false, + "has_projects": false, + "has_downloads": true, + "has_wiki": false, + "has_pages": false, + "has_discussions": false, + "forks_count": 5600, + "mirror_url": null, + "archived": false, + "disabled": false, + "open_issues_count": 99, + "license": { + "key": "bsd-3-clause", + "name": "BSD 3-Clause New or Revised License", + "spdx_id": "BSD-3-Clause", + "url": "https://api.github.com/licenses/bsd-3-clause", + "node_id": "MDc6TGljZW5zZTU=" + }, + "allow_forking": true, + "is_template": false, + "web_commit_signoff_required": false, + "topics": [ + "c-plus-plus" + ], + "visibility": "public", + "forks": 5600, + "open_issues": 99, + "watchers": 6848, + "default_branch": "main", + "custom_properties": { + + } + }, + "organization": { + "login": "flutter", + "id": 14101776, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjE0MTAxNzc2", + "url": "https://api.github.com/orgs/flutter", + "repos_url": "https://api.github.com/orgs/flutter/repos", + "events_url": "https://api.github.com/orgs/flutter/events", + "hooks_url": "https://api.github.com/orgs/flutter/hooks", + "issues_url": "https://api.github.com/orgs/flutter/issues", + "members_url": "https://api.github.com/orgs/flutter/members{/member}", + "public_members_url": "https://api.github.com/orgs/flutter/public_members{/member}", + "avatar_url": "https://avatars.githubusercontent.com/u/14101776?v=4", + "description": "Flutter is Google's UI toolkit for building beautiful, natively compiled applications for mobile, web, desktop, and embedded devices from a single codebase." + }, + "enterprise": { + "id": 1732, + "slug": "alphabet", + "name": "Alphabet", + "node_id": "MDEwOkVudGVycHJpc2UxNzMy", + "avatar_url": "https://avatars.githubusercontent.com/b/1732?v=4", + "description": "", + "website_url": "https://abc.xyz/", + "html_url": "https://github.com/enterprises/alphabet", + "created_at": "2019-12-19T00:30:52Z", + "updated_at": "2023-01-20T00:41:48Z" + }, + "sender": { + "login": "gmackall", + "id": 34871572, + "node_id": "MDQ6VXNlcjM0ODcxNTcy", + "avatar_url": "https://avatars.githubusercontent.com/u/34871572?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/gmackall", + "html_url": "https://github.com/gmackall", + "followers_url": "https://api.github.com/users/gmackall/followers", + "following_url": "https://api.github.com/users/gmackall/following{/other_user}", + "gists_url": "https://api.github.com/users/gmackall/gists{/gist_id}", + "starred_url": "https://api.github.com/users/gmackall/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/gmackall/subscriptions", + "organizations_url": "https://api.github.com/users/gmackall/orgs", + "repos_url": "https://api.github.com/users/gmackall/repos", + "events_url": "https://api.github.com/users/gmackall/events{/privacy}", + "received_events_url": "https://api.github.com/users/gmackall/received_events", + "type": "User", + "site_admin": false + }, + "installation": { + "id": 10381585, + "node_id": "MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMTAzODE1ODU=" + } +} +'''; + +const String prBaseEditedEvent = ''' +{ + "action": "edited", + "number": 47609, + "pull_request": { + "url": "https://api.github.com/repos/flutter/engine/pulls/47609", + "id": 1584723957, + "node_id": "PR_kwDOAlZRSc5edPf1", + "html_url": "https://github.com/flutter/engine/pull/47609", + "diff_url": "https://github.com/flutter/engine/pull/47609.diff", + "patch_url": "https://github.com/flutter/engine/pull/47609.patch", + "issue_url": "https://api.github.com/repos/flutter/engine/issues/47609", + "number": 47609, + "state": "open", + "locked": false, + "title": "Upgrade Android SDK to 34 UpsideDownCake", + "user": { + "login": "gmackall", + "id": 34871572, + "node_id": "MDQ6VXNlcjM0ODcxNTcy", + "avatar_url": "https://avatars.githubusercontent.com/u/34871572?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/gmackall", + "html_url": "https://github.com/gmackall", + "followers_url": "https://api.github.com/users/gmackall/followers", + "following_url": "https://api.github.com/users/gmackall/following{/other_user}", + "gists_url": "https://api.github.com/users/gmackall/gists{/gist_id}", + "starred_url": "https://api.github.com/users/gmackall/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/gmackall/subscriptions", + "organizations_url": "https://api.github.com/users/gmackall/orgs", + "repos_url": "https://api.github.com/users/gmackall/repos", + "events_url": "https://api.github.com/users/gmackall/events{/privacy}", + "received_events_url": "https://api.github.com/users/gmackall/received_events", + "type": "User", + "site_admin": false + }, + "body": "~**This should not land until https://github.com/flutter/buildroot/pull/790 (re)lands, and I swap the buildroot url back to the latest commit.**~ Reland of PR to update buildroot at https://github.com/flutter/buildroot/pull/792. Upgrades to android api 34 Also: 1. Upgrades to java 17 in DEPS/ci", + "created_at": "2023-11-02T17:09:59Z", + "updated_at": "2023-11-08T21:00:47Z", + "closed_at": null, + "merged_at": null, + "merge_commit_sha": "8e5e3a59a5cba4239c542ed9a914899a246640b7", + "assignee": null, + "assignees": [ + + ], + "requested_reviewers": [ + + ], + "requested_teams": [ + + ], + "labels": [ + { + "id": 246348935, + "node_id": "MDU6TGFiZWwyNDYzNDg5MzU=", + "url": "https://api.github.com/repos/flutter/engine/labels/platform-android", + "name": "platform-android", + "color": "A4C639", + "default": false, + "description": null + } + ], + "milestone": null, + "draft": false, + "commits_url": "https://api.github.com/repos/flutter/engine/pulls/47609/commits", + "review_comments_url": "https://api.github.com/repos/flutter/engine/pulls/47609/comments", + "review_comment_url": "https://api.github.com/repos/flutter/engine/pulls/comments{/number}", + "comments_url": "https://api.github.com/repos/flutter/engine/issues/47609/comments", + "statuses_url": "https://api.github.com/repos/flutter/engine/statuses/a6765b4c309aa082bbebade68e0c7ec308a1cc6c", + "head": { + "label": "gmackall:upgrade_to_android14", + "ref": "upgrade_to_android14", + "sha": "a6765b4c309aa082bbebade68e0c7ec308a1cc6c", + "user": { + "login": "gmackall", + "id": 34871572, + "node_id": "MDQ6VXNlcjM0ODcxNTcy", + "avatar_url": "https://avatars.githubusercontent.com/u/34871572?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/gmackall", + "html_url": "https://github.com/gmackall", + "followers_url": "https://api.github.com/users/gmackall/followers", + "following_url": "https://api.github.com/users/gmackall/following{/other_user}", + "gists_url": "https://api.github.com/users/gmackall/gists{/gist_id}", + "starred_url": "https://api.github.com/users/gmackall/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/gmackall/subscriptions", + "organizations_url": "https://api.github.com/users/gmackall/orgs", + "repos_url": "https://api.github.com/users/gmackall/repos", + "events_url": "https://api.github.com/users/gmackall/events{/privacy}", + "received_events_url": "https://api.github.com/users/gmackall/received_events", + "type": "User", + "site_admin": false + }, + "repo": { + "id": 547558963, + "node_id": "R_kgDOIKMWMw", + "name": "engine", + "full_name": "gmackall/engine", + "private": false, + "owner": { + "login": "gmackall", + "id": 34871572, + "node_id": "MDQ6VXNlcjM0ODcxNTcy", + "avatar_url": "https://avatars.githubusercontent.com/u/34871572?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/gmackall", + "html_url": "https://github.com/gmackall", + "followers_url": "https://api.github.com/users/gmackall/followers", + "following_url": "https://api.github.com/users/gmackall/following{/other_user}", + "gists_url": "https://api.github.com/users/gmackall/gists{/gist_id}", + "starred_url": "https://api.github.com/users/gmackall/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/gmackall/subscriptions", + "organizations_url": "https://api.github.com/users/gmackall/orgs", + "repos_url": "https://api.github.com/users/gmackall/repos", + "events_url": "https://api.github.com/users/gmackall/events{/privacy}", + "received_events_url": "https://api.github.com/users/gmackall/received_events", + "type": "User", + "site_admin": false + }, + "html_url": "https://github.com/gmackall/engine", + "description": "The Flutter engine", + "fork": true, + "url": "https://api.github.com/repos/gmackall/engine", + "forks_url": "https://api.github.com/repos/gmackall/engine/forks", + "keys_url": "https://api.github.com/repos/gmackall/engine/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/gmackall/engine/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/gmackall/engine/teams", + "hooks_url": "https://api.github.com/repos/gmackall/engine/hooks", + "issue_events_url": "https://api.github.com/repos/gmackall/engine/issues/events{/number}", + "events_url": "https://api.github.com/repos/gmackall/engine/events", + "assignees_url": "https://api.github.com/repos/gmackall/engine/assignees{/user}", + "branches_url": "https://api.github.com/repos/gmackall/engine/branches{/branch}", + "tags_url": "https://api.github.com/repos/gmackall/engine/tags", + "blobs_url": "https://api.github.com/repos/gmackall/engine/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/gmackall/engine/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/gmackall/engine/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/gmackall/engine/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/gmackall/engine/statuses/{sha}", + "languages_url": "https://api.github.com/repos/gmackall/engine/languages", + "stargazers_url": "https://api.github.com/repos/gmackall/engine/stargazers", + "contributors_url": "https://api.github.com/repos/gmackall/engine/contributors", + "subscribers_url": "https://api.github.com/repos/gmackall/engine/subscribers", + "subscription_url": "https://api.github.com/repos/gmackall/engine/subscription", + "commits_url": "https://api.github.com/repos/gmackall/engine/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/gmackall/engine/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/gmackall/engine/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/gmackall/engine/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/gmackall/engine/contents/{+path}", + "compare_url": "https://api.github.com/repos/gmackall/engine/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/gmackall/engine/merges", + "archive_url": "https://api.github.com/repos/gmackall/engine/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/gmackall/engine/downloads", + "issues_url": "https://api.github.com/repos/gmackall/engine/issues{/number}", + "pulls_url": "https://api.github.com/repos/gmackall/engine/pulls{/number}", + "milestones_url": "https://api.github.com/repos/gmackall/engine/milestones{/number}", + "notifications_url": "https://api.github.com/repos/gmackall/engine/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/gmackall/engine/labels{/name}", + "releases_url": "https://api.github.com/repos/gmackall/engine/releases{/id}", + "deployments_url": "https://api.github.com/repos/gmackall/engine/deployments", + "created_at": "2022-10-07T22:25:57Z", + "updated_at": "2023-02-02T18:38:07Z", + "pushed_at": "2023-11-08T20:57:02Z", + "git_url": "git://github.com/gmackall/engine.git", + "ssh_url": "git@github.com:gmackall/engine.git", + "clone_url": "https://github.com/gmackall/engine.git", + "svn_url": "https://github.com/gmackall/engine", + "homepage": "https://flutter.dev", + "size": 466778, + "stargazers_count": 0, + "watchers_count": 0, + "language": "C++", + "has_issues": false, + "has_projects": true, + "has_downloads": true, + "has_wiki": false, + "has_pages": false, + "has_discussions": false, + "forks_count": 0, + "mirror_url": null, + "archived": false, + "disabled": false, + "open_issues_count": 0, + "license": { + "key": "bsd-3-clause", + "name": "BSD 3-Clause New or Revised License", + "spdx_id": "BSD-3-Clause", + "url": "https://api.github.com/licenses/bsd-3-clause", + "node_id": "MDc6TGljZW5zZTU=" + }, + "allow_forking": true, + "is_template": false, + "web_commit_signoff_required": false, + "topics": [ + + ], + "visibility": "public", + "forks": 0, + "open_issues": 0, + "watchers": 0, + "default_branch": "main", + "allow_squash_merge": true, + "allow_merge_commit": true, + "allow_rebase_merge": true, + "allow_auto_merge": false, + "delete_branch_on_merge": false, + "allow_update_branch": false, + "use_squash_pr_title_as_default": false, + "squash_merge_commit_message": "COMMIT_MESSAGES", + "squash_merge_commit_title": "COMMIT_OR_PR_TITLE", + "merge_commit_message": "PR_TITLE", + "merge_commit_title": "MERGE_MESSAGE" + } + }, + "base": { + "label": "flutter:main", + "ref": "main", + "sha": "941e246d4851f652cf13312180174ebc9395fac4", + "user": { + "login": "flutter", + "id": 14101776, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjE0MTAxNzc2", + "avatar_url": "https://avatars.githubusercontent.com/u/14101776?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/flutter", + "html_url": "https://github.com/flutter", + "followers_url": "https://api.github.com/users/flutter/followers", + "following_url": "https://api.github.com/users/flutter/following{/other_user}", + "gists_url": "https://api.github.com/users/flutter/gists{/gist_id}", + "starred_url": "https://api.github.com/users/flutter/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/flutter/subscriptions", + "organizations_url": "https://api.github.com/users/flutter/orgs", + "repos_url": "https://api.github.com/users/flutter/repos", + "events_url": "https://api.github.com/users/flutter/events{/privacy}", + "received_events_url": "https://api.github.com/users/flutter/received_events", + "type": "Organization", + "site_admin": false + }, + "repo": { + "id": 39211337, + "node_id": "MDEwOlJlcG9zaXRvcnkzOTIxMTMzNw==", + "name": "engine", + "full_name": "flutter/engine", + "private": false, + "owner": { + "login": "flutter", + "id": 14101776, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjE0MTAxNzc2", + "avatar_url": "https://avatars.githubusercontent.com/u/14101776?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/flutter", + "html_url": "https://github.com/flutter", + "followers_url": "https://api.github.com/users/flutter/followers", + "following_url": "https://api.github.com/users/flutter/following{/other_user}", + "gists_url": "https://api.github.com/users/flutter/gists{/gist_id}", + "starred_url": "https://api.github.com/users/flutter/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/flutter/subscriptions", + "organizations_url": "https://api.github.com/users/flutter/orgs", + "repos_url": "https://api.github.com/users/flutter/repos", + "events_url": "https://api.github.com/users/flutter/events{/privacy}", + "received_events_url": "https://api.github.com/users/flutter/received_events", + "type": "Organization", + "site_admin": false + }, + "html_url": "https://github.com/flutter/engine", + "description": "The Flutter engine", + "fork": false, + "url": "https://api.github.com/repos/flutter/engine", + "forks_url": "https://api.github.com/repos/flutter/engine/forks", + "keys_url": "https://api.github.com/repos/flutter/engine/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/flutter/engine/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/flutter/engine/teams", + "hooks_url": "https://api.github.com/repos/flutter/engine/hooks", + "issue_events_url": "https://api.github.com/repos/flutter/engine/issues/events{/number}", + "events_url": "https://api.github.com/repos/flutter/engine/events", + "assignees_url": "https://api.github.com/repos/flutter/engine/assignees{/user}", + "branches_url": "https://api.github.com/repos/flutter/engine/branches{/branch}", + "tags_url": "https://api.github.com/repos/flutter/engine/tags", + "blobs_url": "https://api.github.com/repos/flutter/engine/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/flutter/engine/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/flutter/engine/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/flutter/engine/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/flutter/engine/statuses/{sha}", + "languages_url": "https://api.github.com/repos/flutter/engine/languages", + "stargazers_url": "https://api.github.com/repos/flutter/engine/stargazers", + "contributors_url": "https://api.github.com/repos/flutter/engine/contributors", + "subscribers_url": "https://api.github.com/repos/flutter/engine/subscribers", + "subscription_url": "https://api.github.com/repos/flutter/engine/subscription", + "commits_url": "https://api.github.com/repos/flutter/engine/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/flutter/engine/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/flutter/engine/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/flutter/engine/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/flutter/engine/contents/{+path}", + "compare_url": "https://api.github.com/repos/flutter/engine/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/flutter/engine/merges", + "archive_url": "https://api.github.com/repos/flutter/engine/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/flutter/engine/downloads", + "issues_url": "https://api.github.com/repos/flutter/engine/issues{/number}", + "pulls_url": "https://api.github.com/repos/flutter/engine/pulls{/number}", + "milestones_url": "https://api.github.com/repos/flutter/engine/milestones{/number}", + "notifications_url": "https://api.github.com/repos/flutter/engine/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/flutter/engine/labels{/name}", + "releases_url": "https://api.github.com/repos/flutter/engine/releases{/id}", + "deployments_url": "https://api.github.com/repos/flutter/engine/deployments", + "created_at": "2015-07-16T17:39:56Z", + "updated_at": "2023-11-08T07:16:25Z", + "pushed_at": "2023-11-08T21:00:38Z", + "git_url": "git://github.com/flutter/engine.git", + "ssh_url": "git@github.com:flutter/engine.git", + "clone_url": "https://github.com/flutter/engine.git", + "svn_url": "https://github.com/flutter/engine", + "homepage": "https://flutter.dev", + "size": 704170, + "stargazers_count": 6848, + "watchers_count": 6848, + "language": "C++", + "has_issues": false, + "has_projects": false, + "has_downloads": true, + "has_wiki": false, + "has_pages": false, + "has_discussions": false, + "forks_count": 5600, + "mirror_url": null, + "archived": false, + "disabled": false, + "open_issues_count": 99, + "license": { + "key": "bsd-3-clause", + "name": "BSD 3-Clause New or Revised License", + "spdx_id": "BSD-3-Clause", + "url": "https://api.github.com/licenses/bsd-3-clause", + "node_id": "MDc6TGljZW5zZTU=" + }, + "allow_forking": true, + "is_template": false, + "web_commit_signoff_required": false, + "topics": [ + "c-plus-plus" + ], + "visibility": "public", + "forks": 5600, + "open_issues": 99, + "watchers": 6848, + "default_branch": "main", + "allow_squash_merge": true, + "allow_merge_commit": false, + "allow_rebase_merge": false, + "allow_auto_merge": false, + "delete_branch_on_merge": true, + "allow_update_branch": true, + "use_squash_pr_title_as_default": true, + "squash_merge_commit_message": "PR_BODY", + "squash_merge_commit_title": "PR_TITLE", + "merge_commit_message": "PR_TITLE", + "merge_commit_title": "MERGE_MESSAGE" + } + }, + "_links": { + "self": { + "href": "https://api.github.com/repos/flutter/engine/pulls/47609" + }, + "html": { + "href": "https://github.com/flutter/engine/pull/47609" + }, + "issue": { + "href": "https://api.github.com/repos/flutter/engine/issues/47609" + }, + "comments": { + "href": "https://api.github.com/repos/flutter/engine/issues/47609/comments" + }, + "review_comments": { + "href": "https://api.github.com/repos/flutter/engine/pulls/47609/comments" + }, + "review_comment": { + "href": "https://api.github.com/repos/flutter/engine/pulls/comments{/number}" + }, + "commits": { + "href": "https://api.github.com/repos/flutter/engine/pulls/47609/commits" + }, + "statuses": { + "href": "https://api.github.com/repos/flutter/engine/statuses/a6765b4c309aa082bbebade68e0c7ec308a1cc6c" + } + }, + "author_association": "MEMBER", + "auto_merge": null, + "active_lock_reason": null, + "merged": false, + "mergeable": true, + "rebaseable": true, + "mergeable_state": "clean", + "merged_by": null, + "comments": 4, + "review_comments": 4, + "maintainer_can_modify": true, + "commits": 32, + "additions": 83, + "deletions": 77, + "changed_files": 18 + }, + "changes": { + "base": { + "ref": { + "from": "main" + }, + "sha": { + "from": "b3af5d64d3e6e2110b07d71909fc432537339659" + } + } + }, + "repository": { + "id": 39211337, + "node_id": "MDEwOlJlcG9zaXRvcnkzOTIxMTMzNw==", + "name": "engine", + "full_name": "flutter/engine", + "private": false, + "owner": { + "login": "flutter", + "id": 14101776, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjE0MTAxNzc2", + "avatar_url": "https://avatars.githubusercontent.com/u/14101776?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/flutter", + "html_url": "https://github.com/flutter", + "followers_url": "https://api.github.com/users/flutter/followers", + "following_url": "https://api.github.com/users/flutter/following{/other_user}", + "gists_url": "https://api.github.com/users/flutter/gists{/gist_id}", + "starred_url": "https://api.github.com/users/flutter/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/flutter/subscriptions", + "organizations_url": "https://api.github.com/users/flutter/orgs", + "repos_url": "https://api.github.com/users/flutter/repos", + "events_url": "https://api.github.com/users/flutter/events{/privacy}", + "received_events_url": "https://api.github.com/users/flutter/received_events", + "type": "Organization", + "site_admin": false + }, + "html_url": "https://github.com/flutter/engine", + "description": "The Flutter engine", + "fork": false, + "url": "https://api.github.com/repos/flutter/engine", + "forks_url": "https://api.github.com/repos/flutter/engine/forks", + "keys_url": "https://api.github.com/repos/flutter/engine/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/flutter/engine/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/flutter/engine/teams", + "hooks_url": "https://api.github.com/repos/flutter/engine/hooks", + "issue_events_url": "https://api.github.com/repos/flutter/engine/issues/events{/number}", + "events_url": "https://api.github.com/repos/flutter/engine/events", + "assignees_url": "https://api.github.com/repos/flutter/engine/assignees{/user}", + "branches_url": "https://api.github.com/repos/flutter/engine/branches{/branch}", + "tags_url": "https://api.github.com/repos/flutter/engine/tags", + "blobs_url": "https://api.github.com/repos/flutter/engine/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/flutter/engine/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/flutter/engine/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/flutter/engine/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/flutter/engine/statuses/{sha}", + "languages_url": "https://api.github.com/repos/flutter/engine/languages", + "stargazers_url": "https://api.github.com/repos/flutter/engine/stargazers", + "contributors_url": "https://api.github.com/repos/flutter/engine/contributors", + "subscribers_url": "https://api.github.com/repos/flutter/engine/subscribers", + "subscription_url": "https://api.github.com/repos/flutter/engine/subscription", + "commits_url": "https://api.github.com/repos/flutter/engine/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/flutter/engine/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/flutter/engine/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/flutter/engine/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/flutter/engine/contents/{+path}", + "compare_url": "https://api.github.com/repos/flutter/engine/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/flutter/engine/merges", + "archive_url": "https://api.github.com/repos/flutter/engine/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/flutter/engine/downloads", + "issues_url": "https://api.github.com/repos/flutter/engine/issues{/number}", + "pulls_url": "https://api.github.com/repos/flutter/engine/pulls{/number}", + "milestones_url": "https://api.github.com/repos/flutter/engine/milestones{/number}", + "notifications_url": "https://api.github.com/repos/flutter/engine/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/flutter/engine/labels{/name}", + "releases_url": "https://api.github.com/repos/flutter/engine/releases{/id}", + "deployments_url": "https://api.github.com/repos/flutter/engine/deployments", + "created_at": "2015-07-16T17:39:56Z", + "updated_at": "2023-11-08T07:16:25Z", + "pushed_at": "2023-11-08T21:00:38Z", + "git_url": "git://github.com/flutter/engine.git", + "ssh_url": "git@github.com:flutter/engine.git", + "clone_url": "https://github.com/flutter/engine.git", + "svn_url": "https://github.com/flutter/engine", + "homepage": "https://flutter.dev", + "size": 704170, + "stargazers_count": 6848, + "watchers_count": 6848, + "language": "C++", + "has_issues": false, + "has_projects": false, + "has_downloads": true, + "has_wiki": false, + "has_pages": false, + "has_discussions": false, + "forks_count": 5600, + "mirror_url": null, + "archived": false, + "disabled": false, + "open_issues_count": 99, + "license": { + "key": "bsd-3-clause", + "name": "BSD 3-Clause New or Revised License", + "spdx_id": "BSD-3-Clause", + "url": "https://api.github.com/licenses/bsd-3-clause", + "node_id": "MDc6TGljZW5zZTU=" + }, + "allow_forking": true, + "is_template": false, + "web_commit_signoff_required": false, + "topics": [ + "c-plus-plus" + ], + "visibility": "public", + "forks": 5600, + "open_issues": 99, + "watchers": 6848, + "default_branch": "main", + "custom_properties": { + + } + }, + "organization": { + "login": "flutter", + "id": 14101776, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjE0MTAxNzc2", + "url": "https://api.github.com/orgs/flutter", + "repos_url": "https://api.github.com/orgs/flutter/repos", + "events_url": "https://api.github.com/orgs/flutter/events", + "hooks_url": "https://api.github.com/orgs/flutter/hooks", + "issues_url": "https://api.github.com/orgs/flutter/issues", + "members_url": "https://api.github.com/orgs/flutter/members{/member}", + "public_members_url": "https://api.github.com/orgs/flutter/public_members{/member}", + "avatar_url": "https://avatars.githubusercontent.com/u/14101776?v=4", + "description": "Flutter is Google's UI toolkit for building beautiful, natively compiled applications for mobile, web, desktop, and embedded devices from a single codebase." + }, + "enterprise": { + "id": 1732, + "slug": "alphabet", + "name": "Alphabet", + "node_id": "MDEwOkVudGVycHJpc2UxNzMy", + "avatar_url": "https://avatars.githubusercontent.com/b/1732?v=4", + "description": "", + "website_url": "https://abc.xyz/", + "html_url": "https://github.com/enterprises/alphabet", + "created_at": "2019-12-19T00:30:52Z", + "updated_at": "2023-01-20T00:41:48Z" + }, + "sender": { + "login": "gmackall", + "id": 34871572, + "node_id": "MDQ6VXNlcjM0ODcxNTcy", + "avatar_url": "https://avatars.githubusercontent.com/u/34871572?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/gmackall", + "html_url": "https://github.com/gmackall", + "followers_url": "https://api.github.com/users/gmackall/followers", + "following_url": "https://api.github.com/users/gmackall/following{/other_user}", + "gists_url": "https://api.github.com/users/gmackall/gists{/gist_id}", + "starred_url": "https://api.github.com/users/gmackall/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/gmackall/subscriptions", + "organizations_url": "https://api.github.com/users/gmackall/orgs", + "repos_url": "https://api.github.com/users/gmackall/repos", + "events_url": "https://api.github.com/users/gmackall/events{/privacy}", + "received_events_url": "https://api.github.com/users/gmackall/received_events", + "type": "User", + "site_admin": false + }, + "installation": { + "id": 10381585, + "node_id": "MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMTAzODE1ODU=" + } +} +'''; From 94ffec8306dc9c76cb632ae9cf5d6f7265cc7aa8 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Tue, 14 Nov 2023 10:48:31 -0700 Subject: [PATCH 371/390] prep 9.20.0 --- CHANGELOG.md | 7 +++++++ pubspec.yaml | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 94e3728c..9acbade0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## 9.20.0 + +* Add a Changes object to the PullRequestEvent object so we can see what changed in edited PR events by @ricardoamador in https://github.com/SpinlockLabs/github.dart/pull/390 + + +**Full Changelog**: https://github.com/SpinlockLabs/github.dart/compare/9.19.0...9.20.0 + ## 9.19.0 * Revert "Add the 'PushEvent' webhook and associated PushCommit object" by @robrbecker in https://github.com/SpinlockLabs/github.dart/pull/387 diff --git a/pubspec.yaml b/pubspec.yaml index 8bdc72f6..4fb206a9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 9.19.0 +version: 9.20.0 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From 1d4023c62ada078fb624344c842b2344893084e8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Nov 2023 10:53:55 -0700 Subject: [PATCH 372/390] Bump actions/checkout from 3 to 4 (#388) Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/dart.yml | 2 +- .github/workflows/publish_demos.yml | 2 +- .github/workflows/release_unreleased_prs.yml | 2 +- .github/workflows/triage.yml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/dart.yml b/.github/workflows/dart.yml index 151d23f4..5fb5a1c7 100644 --- a/.github/workflows/dart.yml +++ b/.github/workflows/dart.yml @@ -15,7 +15,7 @@ jobs: # Test with at least the declared minimum Dart version sdk: [2.18.7, stable] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: dart-lang/setup-dart@v1 with: sdk: ${{ matrix.sdk }} diff --git a/.github/workflows/publish_demos.yml b/.github/workflows/publish_demos.yml index 965e7949..3c5fa2e0 100644 --- a/.github/workflows/publish_demos.yml +++ b/.github/workflows/publish_demos.yml @@ -10,7 +10,7 @@ jobs: image: dart steps: - name: Checkout 🛎️ - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install rsync 📚 run: | diff --git a/.github/workflows/release_unreleased_prs.yml b/.github/workflows/release_unreleased_prs.yml index 97f16aa3..2307c913 100644 --- a/.github/workflows/release_unreleased_prs.yml +++ b/.github/workflows/release_unreleased_prs.yml @@ -21,7 +21,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 2 ref: master diff --git a/.github/workflows/triage.yml b/.github/workflows/triage.yml index 224ea1ca..84a45759 100644 --- a/.github/workflows/triage.yml +++ b/.github/workflows/triage.yml @@ -8,7 +8,7 @@ jobs: name: Assign Rob runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Apply untriaged label uses: actions/github-script@v6 with: From d2c7bb288b07cb4e6b46bfa7a485523e59681303 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Nov 2023 10:54:14 -0700 Subject: [PATCH 373/390] Bump JamesIves/github-pages-deploy-action from 4.4.2 to 4.4.3 (#382) Bumps [JamesIves/github-pages-deploy-action](https://github.com/jamesives/github-pages-deploy-action) from 4.4.2 to 4.4.3. - [Release notes](https://github.com/jamesives/github-pages-deploy-action/releases) - [Commits](https://github.com/jamesives/github-pages-deploy-action/compare/v4.4.2...v4.4.3) --- updated-dependencies: - dependency-name: JamesIves/github-pages-deploy-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/publish_demos.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish_demos.yml b/.github/workflows/publish_demos.yml index 3c5fa2e0..546140c0 100644 --- a/.github/workflows/publish_demos.yml +++ b/.github/workflows/publish_demos.yml @@ -24,7 +24,7 @@ jobs: rm build/example/packages - name: Publish 🚀 - uses: JamesIves/github-pages-deploy-action@v4.4.2 + uses: JamesIves/github-pages-deploy-action@v4.4.3 with: branch: gh-pages # The branch the action should deploy to. folder: build/example # The folder the action should deploy. From 52f71de142641849cff1121a0d8b33c01549ec57 Mon Sep 17 00:00:00 2001 From: Casey Hillers Date: Wed, 29 Nov 2023 07:36:19 -0800 Subject: [PATCH 374/390] Update release process to use actions (#392) * Update release process to use actions * Add publish pubdev and some minor cleanup --- .github/workflows/create_release.yml | 16 ++ .github/workflows/create_tag.yml | 25 +++ .github/workflows/publish_pubdev.yml | 14 ++ .github/workflows/publish_release.yml | 14 -- .github/workflows/release_unreleased_prs.yml | 36 ---- .github/workflows/require_semver_label.yml | 29 --- CONTRIBUTING.md | 35 ++-- tool/release_unreleased_prs.dart | 178 ------------------- 8 files changed, 65 insertions(+), 282 deletions(-) create mode 100644 .github/workflows/create_release.yml create mode 100644 .github/workflows/create_tag.yml create mode 100644 .github/workflows/publish_pubdev.yml delete mode 100644 .github/workflows/publish_release.yml delete mode 100644 .github/workflows/release_unreleased_prs.yml delete mode 100644 .github/workflows/require_semver_label.yml delete mode 100644 tool/release_unreleased_prs.dart diff --git a/.github/workflows/create_release.yml b/.github/workflows/create_release.yml new file mode 100644 index 00000000..8255c0c0 --- /dev/null +++ b/.github/workflows/create_release.yml @@ -0,0 +1,16 @@ +name: Create Release +on: + push: + tags: + - '*' +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Create a Release + uses: elgohr/Github-Release-Action@v5 + env: + GITHUB_TOKEN: "${{ secrets.RELEASE_TOKEN }}" + with: + title: ${{ github.ref }} diff --git a/.github/workflows/create_tag.yml b/.github/workflows/create_tag.yml new file mode 100644 index 00000000..c5793f0c --- /dev/null +++ b/.github/workflows/create_tag.yml @@ -0,0 +1,25 @@ +name: Release + +# Runs when a PR merges. +# See https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#running-your-workflow-when-a-pull-request-merges +on: + pull_request: + types: + - closed + +jobs: + release: + if: github.event.pull_request.merged == true + runs-on: ubuntu-latest + container: dart + permissions: + contents: write + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + ref: master + - uses: jacopocarlini/action-autotag@3.0.0 + with: + GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" diff --git a/.github/workflows/publish_pubdev.yml b/.github/workflows/publish_pubdev.yml new file mode 100644 index 00000000..336e0cf5 --- /dev/null +++ b/.github/workflows/publish_pubdev.yml @@ -0,0 +1,14 @@ +# .github/workflows/publish.yml +name: Publish to pub.dev + +on: + push: + tags: + - '[0-9]+.[0-9]+.[0-9]+*' + +# Publish using the reusable workflow from dart-lang. +jobs: + publish: + permissions: + id-token: write # Required for authentication using OIDC + uses: dart-lang/setup-dart/.github/workflows/publish.yml@v1 \ No newline at end of file diff --git a/.github/workflows/publish_release.yml b/.github/workflows/publish_release.yml deleted file mode 100644 index 853f8c53..00000000 --- a/.github/workflows/publish_release.yml +++ /dev/null @@ -1,14 +0,0 @@ -name: Publish to pub.dev - -on: - push: - tags: - - '[0-9]+.[0-9]+.[0-9]+*' - -permissions: - contents: read - id-token: write - -jobs: - publish: - uses: dart-lang/setup-dart/.github/workflows/publish.yml@v1 diff --git a/.github/workflows/release_unreleased_prs.yml b/.github/workflows/release_unreleased_prs.yml deleted file mode 100644 index 2307c913..00000000 --- a/.github/workflows/release_unreleased_prs.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: Release unreleased PRs - -# Runs when a PR merges. -# See https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#running-your-workflow-when-a-pull-request-merges -on: - workflow_dispatch: - - # Comment out for now and just use manual kickoff of the action - # until we can figure our permissions - # pull_request: - # types: - # - closed - -jobs: - release: - if: github.event.pull_request.merged == true || github.event_name == 'workflow_dispatch' - runs-on: ubuntu-latest - container: dart - permissions: - contents: write - - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 2 - ref: master - - name: Release - run: | - git config --global user.name ${{ secrets.USER_NAME }} - git config --global user.email ${{ secrets.USER_EMAIL }} - export PATH="$PATH":"$HOME/.pub-cache/bin" - export GITHUB_TOKEN=${{secrets.MACHINE_GITHUB_API_TOKEN}} - export MACHINE_GITHUB_API_TOKEN=${{secrets.MACHINE_GITHUB_API_TOKEN}} - dart pub get - dart tool/release_unreleased_prs.dart \ No newline at end of file diff --git a/.github/workflows/require_semver_label.yml b/.github/workflows/require_semver_label.yml deleted file mode 100644 index 0ac40231..00000000 --- a/.github/workflows/require_semver_label.yml +++ /dev/null @@ -1,29 +0,0 @@ -name: Require semver:* and unreleased Label -on: - pull_request: - types: [opened, labeled, unlabeled, synchronize] - -jobs: - label: - runs-on: ubuntu-latest - steps: - - uses: buildsville/add-remove-label@v2.0.0 - if: github.event.action == 'opened' - with: - token: ${{secrets.GITHUB_TOKEN}} - labels: Unreleased - type: add - # - uses: mheap/github-action-required-labels@v3 - # with: - # mode: exactly - # count: 1 - # labels: "semver:patch, semver:minor, semver:major" - # token: ${{secrets.GITHUB_TOKEN}} - # add_comment: Add a semantic version label (semver:patch semver:minor semver:major) - # - uses: mheap/github-action-required-labels@v3 - # with: - # mode: exactly - # count: 1 - # labels: "unreleased" - # token: ${{secrets.GITHUB_TOKEN}} - # add_comment: The unrelease label is required to track which PRs have yet to be released. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c9a832b4..b574e5a8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -15,7 +15,7 @@ GitHub.dart is of course Open Source! We love it when people contribute! - [Commit your code](http://git-scm.com/book/en/Git-Basics-Recording-Changes-to-the-Repository) for each logical change (see [tips for creating better commit messages](http://robots.thoughtbot.com/5-useful-tips-for-a-better-commit-message)). - [Push your change](https://help.github.com/articles/pushing-to-a-remote) to your fork. - [Create a Pull Request](https://help.github.com/articles/creating-a-pull-request) on GitHub for your change. -- Wait for reviewers (usually kaendfinger) to give feedback. +- Wait for reviewers (usually robrbecker) to give feedback. - When the reviewers think that the Pull Request is ready, they will merge it. ## Code Style @@ -34,12 +34,14 @@ Pull Request rejections are not a bad thing. It just means you need to fix somet To regenerate the JSON logic for the models, run: -``` +```sh dart run build_runner build -d ``` ## Tests +`dart test` will only run the unit tests. + To run the complete test suite you will need to install `octokit/fixtures-server`. @@ -52,29 +54,12 @@ GitHub and execute tests against it using your localhost port 3000. ## Contacting Us -- IRC: `#directcode on irc.esper.net and irc.freenode.net` -- Email: `kaendfinger@gmail.com` - -## Becoming a Committer - -If you get on IRC and ask us, we can review your work and add you as a committer if we think you should have it. - -## Releasing & Publishing - -This repo is now configured to release after every PR merge. This means a couple of things for PRs that are put up: +File issues at https://github.com/SpinlockLabs/github.dart/issues -1. A semver label is required. A GitHub check will remind you that you need one. Reviewers should check that it is correct. See https://semver.org/ to understand more. -2. There is no need to modify the version in the pubspec.yaml in your PRs. The tooling will update the version according to the semver label applied to your PR. -3. Same thing for the CHANGELOG.md. Tooling will update it automatically after merge. -4. A GitHub release will be created and published to pub.dev for you. +## Releases -For example if your PR has `semver:minor` label applied and the latest version is 1.2.3, once merged, the tooling will: -- update the pubspec.yaml to 1.3.0 -- Add the GitHub auto-generated release notes with 1.3.0 to the top of the CHANGELOG.md -- Create a release in GitHub for 1.3.0 (which creates a git tag of 1.3.0) -- Remove the `unreleased` label from the PR and add the `released` label -- Comment on the PR stating the version that it was released in and link to the release -- When the release is created, it will automatically be published to pub.dev +Merged pull requests that edit the `pubspec.yaml` version will create new releases. +Once CI is green, it will create a tag for that commit based on the version, which +gets published by pub.dev. -NOTE: If you want the ability to merge a PR **WITHOUT** automatically releasing and publishing, simply add the `no_release_on_merge` label before merging. Do note that the PR has been merged though and whatever the next PR is that triggers a release will release and publish everything that has been merged. So if you want to batch a few PRs into 1 release, label them all `no_release_on_merge`. Then whichever is the last to be merged, remove that label before merging to trigger the release. -You may also manually trigger the action to release unreleased PRs from the Actions tab in GitHub. +If no new version was created, nothing will be published. diff --git a/tool/release_unreleased_prs.dart b/tool/release_unreleased_prs.dart deleted file mode 100644 index b8cf8b17..00000000 --- a/tool/release_unreleased_prs.dart +++ /dev/null @@ -1,178 +0,0 @@ -import 'dart:io'; -import 'package:github/github.dart'; -import 'package:pub_semver/pub_semver.dart'; -import 'package:yaml_edit/yaml_edit.dart'; - -/////////////////////////////////////////////////////////// -const mainBranchName = 'master'; -const semverMajor = 'semver:major'; -const semverMinor = 'semver:minor'; -const semverPatch = 'semver:patch'; -const semvers = [semverMajor, semverMinor, semverPatch]; -const fullrepo = 'SpinlockLabs/github.dart'; -/////////////////////////////////////////////////////////// - -var _gh = GitHub(auth: findAuthenticationFromEnvironment()); -var _slug = RepositorySlug.full(fullrepo); - -Future main(List args) async { - // get the latest released version - var latestVersion = await getLatestVersion(_slug); - - // get all PRs (issues) that are merged but unreleased - var unreleased = await getUnreleasedPRs(); - - if (unreleased.isEmpty) { - print('No unreleased PRs found'); - return; - } - - // Calculate the next version - var nextVersion = getNextVersion(latestVersion, unreleased); - - // Use the new version to generate release notes - var notes = await generateReleaseNotes(latestVersion.toString(), nextVersion); - - // update the changelog with the new release notes - updateChangeLog(notes, nextVersion); - - // update the version in the pubspec - updatePubspec(nextVersion); - - // commit those changes and push them - commitUpdates(nextVersion); - - // create a new release in github at main - await createRelease(nextVersion, mainBranchName); - - // remove the unreleased labels - for (final i in unreleased) { - await _gh.issues.removeLabelForIssue(_slug, i.number, 'unreleased'); - await _gh.issues.addLabelsToIssue(_slug, i.number, ['released']); - await _gh.issues.createComment(_slug, i.number, - 'Released in version $nextVersion https://github.com/$fullrepo/releases/tag/$nextVersion'); - } - - exit(0); -} - -String run(String cmd, {List? rest}) { - var args = []; - if (rest != null) { - args = rest; - } else { - args = cmd.split(' '); - if (args.isEmpty) { - return ''; - } - cmd = args.removeAt(0); - } - var result = Process.runSync(cmd, args); - if (result.exitCode != 0) { - print('Command failed'); - } - if (result.stdout != null) { - print(result.stdout); - } - if (result.stderr != null) { - print(result.stderr); - } - if (result.exitCode != 0) { - exit(6); - } - - return result.stdout; -} - -Future getLatestVersion(RepositorySlug slug) async { - var latestRelease = await _gh.repositories.getLatestRelease(slug); - var latestTag = latestRelease.tagName!; - print('Latest Tag: $latestTag'); - return Version.parse(latestTag); -} - -Future> getUnreleasedPRs() async { - print('Loading unreleased PRs...'); - var prs = await _gh.search - .issues( - 'repo:${_slug.fullName} is:pull-request label:unreleased -label:no_release_on_merge state:closed', - sort: 'desc') - .toList(); - print('${prs.length} loaded'); - return prs; -} - -String getNextVersion(Version currentVersion, List unreleased) { - var semvers = {}; - for (final pr in unreleased) { - var prlabels = pr.labels - .where((element) => element.name.startsWith('semver:')) - .toList(); - for (final l in prlabels) { - semvers.add(l.name); - } - } - print('Calculating next version based on $semvers'); - var newVersion = ''; - if (semvers.contains('semver:major')) { - newVersion = currentVersion.nextMajor.toString(); - } else if (semvers.contains('semver:minor')) { - newVersion = currentVersion.nextMinor.toString(); - } else if (semvers.contains('semver:patch')) { - newVersion = currentVersion.nextPatch.toString(); - } - print('Next Version: $newVersion'); - return newVersion; -} - -Future generateReleaseNotes( - String fromVersion, String newVersion) async { - var notes = await _gh.repositories.generateReleaseNotes(CreateReleaseNotes( - _slug.owner, _slug.name, newVersion, - previousTagName: fromVersion)); - - var releaseNotes = notes.body.replaceFirst('## What\'s Changed', ''); - - var r = '## $newVersion\n$releaseNotes'; - print(r); - return r; -} - -void updateChangeLog(String notes, String version) { - var log = File('CHANGELOG.md'); - var logdata = log.existsSync() ? log.readAsStringSync() : ''; - if (logdata.contains('## $version')) { - return; - } - log.writeAsStringSync('$notes\n\n$logdata'); -} - -void updatePubspec(String newVersion) { - var f = File('pubspec.yaml'); - var editor = YamlEditor(f.readAsStringSync()); - editor.update(['version'], newVersion); - f.writeAsStringSync(editor.toString()); -} - -Future createRelease(String version, String target) async { - print('Creating release ...'); - var release = await _gh.repositories.createRelease( - _slug, - CreateRelease.from( - tagName: version, - name: version, - generateReleaseNotes: true, - targetCommitish: target, - isDraft: false, - isPrerelease: false)); - - print('Release ${release.name} created ${release.createdAt}'); - print(release.body); - return release; -} - -void commitUpdates(String version) { - run('git add pubspec.yaml CHANGELOG.md'); - run('git', rest: ['commit', '-m', 'prep $version']); - run('git push'); -} From 948c0f9310472c66dc75a8d29b335ee586be0317 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Dec 2023 11:21:45 -0800 Subject: [PATCH 375/390] Bump JamesIves/github-pages-deploy-action from 4.4.3 to 4.5.0 (#396) Bumps [JamesIves/github-pages-deploy-action](https://github.com/jamesives/github-pages-deploy-action) from 4.4.3 to 4.5.0. - [Release notes](https://github.com/jamesives/github-pages-deploy-action/releases) - [Commits](https://github.com/jamesives/github-pages-deploy-action/compare/v4.4.3...v4.5.0) --- updated-dependencies: - dependency-name: JamesIves/github-pages-deploy-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/publish_demos.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish_demos.yml b/.github/workflows/publish_demos.yml index 546140c0..603b4a09 100644 --- a/.github/workflows/publish_demos.yml +++ b/.github/workflows/publish_demos.yml @@ -24,7 +24,7 @@ jobs: rm build/example/packages - name: Publish 🚀 - uses: JamesIves/github-pages-deploy-action@v4.4.3 + uses: JamesIves/github-pages-deploy-action@v4.5.0 with: branch: gh-pages # The branch the action should deploy to. folder: build/example # The folder the action should deploy. From df7118a9b632a8754db07deccf8f5bf3a75d3620 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Dec 2023 11:22:08 -0800 Subject: [PATCH 376/390] Bump actions/checkout from 3 to 4 (#395) Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/create_release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/create_release.yml b/.github/workflows/create_release.yml index 8255c0c0..2c071305 100644 --- a/.github/workflows/create_release.yml +++ b/.github/workflows/create_release.yml @@ -7,7 +7,7 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Create a Release uses: elgohr/Github-Release-Action@v5 env: From 7bc06677699847218e196d86a1839045464fcdec Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Dec 2023 11:22:27 -0800 Subject: [PATCH 377/390] Bump actions/github-script from 6 to 7 (#394) Bumps [actions/github-script](https://github.com/actions/github-script) from 6 to 7. - [Release notes](https://github.com/actions/github-script/releases) - [Commits](https://github.com/actions/github-script/compare/v6...v7) --- updated-dependencies: - dependency-name: actions/github-script dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/triage.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/triage.yml b/.github/workflows/triage.yml index 84a45759..4d51d30c 100644 --- a/.github/workflows/triage.yml +++ b/.github/workflows/triage.yml @@ -10,7 +10,7 @@ jobs: steps: - uses: actions/checkout@v4 - name: Apply untriaged label - uses: actions/github-script@v6 + uses: actions/github-script@v7 with: github-token: ${{secrets.GITHUB_TOKEN}} script: | @@ -21,7 +21,7 @@ jobs: labels: ['untriaged','unreleased'] }) - name: Comment On New Issues - uses: actions/github-script@v6 + uses: actions/github-script@v7 with: github-token: ${{secrets.GITHUB_TOKEN}} script: | From 741c26d0142413b80b89049772a5e693e064ebfb Mon Sep 17 00:00:00 2001 From: Casey Hillers Date: Thu, 28 Dec 2023 09:26:23 -0800 Subject: [PATCH 378/390] Update MiscService.getApiStatus to v2 (#393) * v1 has been deleted Co-authored-by: Rob Becker --- CHANGELOG.md | 5 +++ lib/src/common/misc_service.dart | 4 +- lib/src/common/model/misc.dart | 62 ++++++++++++++++++++++++------ lib/src/common/model/misc.g.dart | 44 ++++++++++++++++----- pubspec.yaml | 2 +- test/common/misc_service_test.dart | 37 ++++++++++++++++++ 6 files changed, 131 insertions(+), 23 deletions(-) create mode 100644 test/common/misc_service_test.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index 9acbade0..953f9937 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## 9.21.0 + +* Update MiscService.getApiStatus() to use the v2 API + * `APIStatus` has been refactored to match, now exposing `page` and `status` + ## 9.20.0 * Add a Changes object to the PullRequestEvent object so we can see what changed in edited PR events by @ricardoamador in https://github.com/SpinlockLabs/github.dart/pull/390 diff --git a/lib/src/common/misc_service.dart b/lib/src/common/misc_service.dart index 4951848f..bb351f3d 100644 --- a/lib/src/common/misc_service.dart +++ b/lib/src/common/misc_service.dart @@ -68,8 +68,10 @@ class MiscService extends Service { } /// Gets the GitHub API Status. + /// + /// API docs: https://www.githubstatus.com/api Future getApiStatus() => - github.getJSON('https://status.github.com/api/status.json', + github.getJSON('https://status.github.com/api/v2/status.json', statusCode: StatusCodes.OK, convert: APIStatus.fromJson); /// Returns an ASCII Octocat with the specified [text]. diff --git a/lib/src/common/model/misc.dart b/lib/src/common/model/misc.dart index adf7b2be..18fc0a54 100644 --- a/lib/src/common/model/misc.dart +++ b/lib/src/common/model/misc.dart @@ -60,27 +60,65 @@ class RateLimit { Map toJson() => _$RateLimitToJson(this); } -/// Model class for the GitHub api status. +/// Model class for the GitHub API status. @JsonSerializable() class APIStatus { APIStatus({ + this.page, this.status, - this.lastUpdatedAt, - this.createdOn, - this.message, }); - final String? status; - @JsonKey(name: 'last_updated') - final DateTime? lastUpdatedAt; + /// Details about where to find more information. + final APIStatusPage? page; - @JsonKey(name: 'created_on') - final DateTime? createdOn; - - @JsonKey(name: 'body') - final String? message; + /// An overview of the current status. + final APIStatusMessage? status; factory APIStatus.fromJson(Map input) => _$APIStatusFromJson(input); Map toJson() => _$APIStatusToJson(this); } + +@JsonSerializable() +class APIStatusPage { + const APIStatusPage({ + this.id, + this.name, + this.url, + this.updatedAt, + }); + + /// Unique identifier for the current status. + final String? id; + + final String? name; + + /// Where to get more detailed information. + final String? url; + + @JsonKey(name: 'updated_at') + final DateTime? updatedAt; + + factory APIStatusPage.fromJson(Map input) => + _$APIStatusPageFromJson(input); + Map toJson() => _$APIStatusPageToJson(this); +} + +/// Overview class of the GitHub API status. +@JsonSerializable() +class APIStatusMessage { + const APIStatusMessage({ + this.description, + this.indicator, + }); + + /// A human description of the blended component status. + final String? description; + + /// An indicator - one of none, minor, major, or critical. + final String? indicator; + + factory APIStatusMessage.fromJson(Map input) => + _$APIStatusMessageFromJson(input); + Map toJson() => _$APIStatusMessageToJson(this); +} diff --git a/lib/src/common/model/misc.g.dart b/lib/src/common/model/misc.g.dart index 34362c50..d7b3896c 100644 --- a/lib/src/common/model/misc.g.dart +++ b/lib/src/common/model/misc.g.dart @@ -31,19 +31,45 @@ Map _$RateLimitToJson(RateLimit instance) => { }; APIStatus _$APIStatusFromJson(Map json) => APIStatus( - status: json['status'] as String?, - lastUpdatedAt: json['last_updated'] == null + page: json['page'] == null ? null - : DateTime.parse(json['last_updated'] as String), - createdOn: json['created_on'] == null + : APIStatusPage.fromJson(json['page'] as Map), + status: json['status'] == null ? null - : DateTime.parse(json['created_on'] as String), - message: json['body'] as String?, + : APIStatusMessage.fromJson(json['status'] as Map), ); Map _$APIStatusToJson(APIStatus instance) => { + 'page': instance.page, 'status': instance.status, - 'last_updated': instance.lastUpdatedAt?.toIso8601String(), - 'created_on': instance.createdOn?.toIso8601String(), - 'body': instance.message, + }; + +APIStatusPage _$APIStatusPageFromJson(Map json) => + APIStatusPage( + id: json['id'] as String?, + name: json['name'] as String?, + url: json['url'] as String?, + updatedAt: json['updated_at'] == null + ? null + : DateTime.parse(json['updated_at'] as String), + ); + +Map _$APIStatusPageToJson(APIStatusPage instance) => + { + 'id': instance.id, + 'name': instance.name, + 'url': instance.url, + 'updated_at': instance.updatedAt?.toIso8601String(), + }; + +APIStatusMessage _$APIStatusMessageFromJson(Map json) => + APIStatusMessage( + description: json['description'] as String?, + indicator: json['indicator'] as String?, + ); + +Map _$APIStatusMessageToJson(APIStatusMessage instance) => + { + 'description': instance.description, + 'indicator': instance.indicator, }; diff --git a/pubspec.yaml b/pubspec.yaml index 4fb206a9..0251b7c7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 9.20.0 +version: 9.21.0 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart diff --git a/test/common/misc_service_test.dart b/test/common/misc_service_test.dart new file mode 100644 index 00000000..2066e271 --- /dev/null +++ b/test/common/misc_service_test.dart @@ -0,0 +1,37 @@ +import 'dart:io'; + +import 'package:github/src/common.dart'; +import 'package:http/http.dart'; +import 'package:http/testing.dart'; +import 'package:test/test.dart'; + +void main() { + MiscService create(Future Function(Request) f) { + final client = MockClient(f); + final github = GitHub(client: client); + return MiscService(github); + } + + test('api status', () async { + final miscService = create( + (_) async => Response(''' +{ + "page":{ + "id":"kctbh9vrtdwd", + "name":"GitHub", + "url":"https://www.githubstatus.com", + "updated_at": "2023-11-29T08:03:04Z" + }, + "status": { + "description": "Partial System Outage", + "indicator": "major" + } +}''', HttpStatus.ok), + ); + final status = await miscService.getApiStatus(); + expect(status.page, isNotNull); + expect(status.page?.id, 'kctbh9vrtdwd'); + expect(status.status, isNotNull); + expect(status.status?.indicator, 'major'); + }); +} From 6b9678e0d207bdf4d74a6d43b84b000e8211de4b Mon Sep 17 00:00:00 2001 From: Moritz Date: Wed, 3 Jan 2024 18:37:11 +0100 Subject: [PATCH 379/390] Make `User` field nullable in `PullRequestReview` (#383) * Make `User` field nullable in `PullRequestReview` * Rev version --- CHANGELOG.md | 4 ++++ lib/src/common/model/pulls.dart | 4 ++-- lib/src/common/model/pulls.g.dart | 4 +++- pubspec.yaml | 2 +- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 953f9937..9665e6e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 9.22.0 + +* Add support for the `Ghost` user when the Github user is deleted. + ## 9.21.0 * Update MiscService.getApiStatus() to use the v2 API diff --git a/lib/src/common/model/pulls.dart b/lib/src/common/model/pulls.dart index cdbf6ed8..2cb10a8e 100644 --- a/lib/src/common/model/pulls.dart +++ b/lib/src/common/model/pulls.dart @@ -311,14 +311,14 @@ class PullRequestFile { class PullRequestReview { PullRequestReview( {required this.id, - required this.user, + this.user, this.body, this.state, this.htmlUrl, this.pullRequestUrl}); int id; - User user; + User? user; String? body; String? state; String? htmlUrl; diff --git a/lib/src/common/model/pulls.g.dart b/lib/src/common/model/pulls.g.dart index dfe3a3b3..cf370e22 100644 --- a/lib/src/common/model/pulls.g.dart +++ b/lib/src/common/model/pulls.g.dart @@ -253,7 +253,9 @@ Map _$PullRequestFileToJson(PullRequestFile instance) => PullRequestReview _$PullRequestReviewFromJson(Map json) => PullRequestReview( id: json['id'] as int, - user: User.fromJson(json['user'] as Map), + user: json['user'] == null + ? null + : User.fromJson(json['user'] as Map), body: json['body'] as String?, state: json['state'] as String?, htmlUrl: json['html_url'] as String?, diff --git a/pubspec.yaml b/pubspec.yaml index 0251b7c7..af2ff765 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 9.21.0 +version: 9.22.0 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From e0bd51a6de77b2278d435cda881a56de0758b3be Mon Sep 17 00:00:00 2001 From: Devon Carew Date: Fri, 23 Feb 2024 11:24:18 -0800 Subject: [PATCH 380/390] require dart 3.0; update to the latest package:lints (#399) * require dart 3.0; update to the latest package:lints * update pubspec and changelog --- .github/workflows/dart.yml | 2 +- CHANGELOG.md | 5 +++++ analysis_options.yaml | 2 -- lib/src/common.dart | 2 ++ lib/src/common/activity_service.dart | 2 +- lib/src/common/authorizations_service.dart | 2 +- lib/src/common/checks_service.dart | 9 ++++----- lib/src/common/gists_service.dart | 2 +- lib/src/common/git_service.dart | 2 +- lib/src/common/issues_service.dart | 2 +- lib/src/common/misc_service.dart | 2 +- lib/src/common/model/checks.dart | 10 +++++----- lib/src/common/orgs_service.dart | 2 +- lib/src/common/pulls_service.dart | 2 +- lib/src/common/repos_service.dart | 2 +- lib/src/common/search_service.dart | 2 +- lib/src/common/url_shortener_service.dart | 2 +- lib/src/common/users_service.dart | 2 +- lib/src/common/util/errors.dart | 16 +++++++--------- lib/src/common/util/utils.dart | 2 +- pubspec.yaml | 8 ++++---- test/helper/http.dart | 4 ++-- test/server/hooks_test_data.dart | 1 + tool/process_github_schema.dart | 2 +- 24 files changed, 45 insertions(+), 42 deletions(-) diff --git a/.github/workflows/dart.yml b/.github/workflows/dart.yml index 5fb5a1c7..2d725e23 100644 --- a/.github/workflows/dart.yml +++ b/.github/workflows/dart.yml @@ -13,7 +13,7 @@ jobs: matrix: os: [ubuntu-latest] # Test with at least the declared minimum Dart version - sdk: [2.18.7, stable] + sdk: ['3.0', stable] steps: - uses: actions/checkout@v4 - uses: dart-lang/setup-dart@v1 diff --git a/CHANGELOG.md b/CHANGELOG.md index 9665e6e4..ea5c0870 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## 9.23.0 + +* Require Dart 3.0. +* Update to the latest `package:lints`. + ## 9.22.0 * Add support for the `Ghost` user when the Github user is deleted. diff --git a/analysis_options.yaml b/analysis_options.yaml index f7a9ff49..1af8628e 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -15,8 +15,6 @@ linter: - avoid_implementing_value_types - avoid_js_rounded_ints - avoid_private_typedef_functions - - avoid_returning_null - - avoid_returning_null_for_future - avoid_returning_this - avoid_setters_without_getters - avoid_slow_async_io diff --git a/lib/src/common.dart b/lib/src/common.dart index 8ec0f7ae..df783a26 100644 --- a/lib/src/common.dart +++ b/lib/src/common.dart @@ -1,5 +1,7 @@ /// The Core of GitHub for Dart. /// Contains the Models and other GitHub stuff. +library; + export 'package:github/src/common/activity_service.dart'; export 'package:github/src/common/authorizations_service.dart'; export 'package:github/src/common/checks_service.dart'; diff --git a/lib/src/common/activity_service.dart b/lib/src/common/activity_service.dart index 0001fcdc..f69e8c49 100644 --- a/lib/src/common/activity_service.dart +++ b/lib/src/common/activity_service.dart @@ -9,7 +9,7 @@ import 'package:http/http.dart' as http; /// /// API docs: https://developer.github.com/v3/activity/ class ActivityService extends Service { - ActivityService(GitHub github) : super(github); + ActivityService(super.github); /// Lists public events. /// diff --git a/lib/src/common/authorizations_service.dart b/lib/src/common/authorizations_service.dart index 3cbe6ef0..68b80c25 100644 --- a/lib/src/common/authorizations_service.dart +++ b/lib/src/common/authorizations_service.dart @@ -10,7 +10,7 @@ import 'package:github/src/common.dart'; /// /// API docs: https://developer.github.com/v3/oauth_authorizations/ class AuthorizationsService extends Service { - AuthorizationsService(GitHub github) : super(github); + AuthorizationsService(super.github); /// Lists all authorizations. /// diff --git a/lib/src/common/checks_service.dart b/lib/src/common/checks_service.dart index 0e87f4d2..f3085197 100644 --- a/lib/src/common/checks_service.dart +++ b/lib/src/common/checks_service.dart @@ -18,14 +18,13 @@ class ChecksService extends Service { /// API docs: https://developer.github.com/v3/checks/suites/ final CheckSuitesService checkSuites; - ChecksService(GitHub github) + ChecksService(super.github) : checkRuns = CheckRunsService._(github), - checkSuites = CheckSuitesService._(github), - super(github); + checkSuites = CheckSuitesService._(github); } class CheckRunsService extends Service { - CheckRunsService._(GitHub github) : super(github); + CheckRunsService._(super.github); /// Creates a new check run for a specific commit in a repository. /// Your GitHub App must have the `checks:write` permission to create check runs. @@ -235,7 +234,7 @@ class CheckRunsService extends Service { } class CheckSuitesService extends Service { - CheckSuitesService._(GitHub github) : super(github); + CheckSuitesService._(super.github); /// Gets a single check suite using its `id`. /// GitHub Apps must have the `checks:read` permission on a private repository or pull access to a public repository to get check suites. diff --git a/lib/src/common/gists_service.dart b/lib/src/common/gists_service.dart index 9078e03d..05ac62bd 100644 --- a/lib/src/common/gists_service.dart +++ b/lib/src/common/gists_service.dart @@ -8,7 +8,7 @@ import 'package:github/src/common.dart'; /// /// API docs: https://developer.github.com/v3/gists/ class GistsService extends Service { - GistsService(GitHub github) : super(github); + GistsService(super.github); /// lists gists for a user. /// diff --git a/lib/src/common/git_service.dart b/lib/src/common/git_service.dart index 7052e4f6..338dbeba 100644 --- a/lib/src/common/git_service.dart +++ b/lib/src/common/git_service.dart @@ -8,7 +8,7 @@ import 'package:github/src/common.dart'; /// /// API docs: https://developer.github.com/v3/git/blobs/ class GitService extends Service { - const GitService(GitHub github) : super(github); + const GitService(super.github); /// Fetches a blob from [slug] for a given [sha]. /// diff --git a/lib/src/common/issues_service.dart b/lib/src/common/issues_service.dart index 243c81dd..ed061846 100644 --- a/lib/src/common/issues_service.dart +++ b/lib/src/common/issues_service.dart @@ -8,7 +8,7 @@ import 'package:github/src/common.dart'; /// /// API docs: https://developer.github.com/v3/issues/ class IssuesService extends Service { - IssuesService(GitHub github) : super(github); + IssuesService(super.github); /// List all issues across all the authenticated user’s visible repositories /// including owned repositories, member repositories, and organization repositories diff --git a/lib/src/common/misc_service.dart b/lib/src/common/misc_service.dart index bb351f3d..30385a18 100644 --- a/lib/src/common/misc_service.dart +++ b/lib/src/common/misc_service.dart @@ -7,7 +7,7 @@ import 'package:github/src/common.dart'; /// /// API docs: https://developer.github.com/v3/misc/ class MiscService extends Service { - MiscService(GitHub github) : super(github); + MiscService(super.github); /// Fetches all emojis available on GitHub /// Returns a map of the name to a url of the image. diff --git a/lib/src/common/model/checks.dart b/lib/src/common/model/checks.dart index 9d7d6e21..5068febc 100644 --- a/lib/src/common/model/checks.dart +++ b/lib/src/common/model/checks.dart @@ -9,7 +9,7 @@ class CheckRunAnnotationLevel extends EnumWithValue { static const warning = CheckRunAnnotationLevel._('warning'); static const failure = CheckRunAnnotationLevel._('failure'); - const CheckRunAnnotationLevel._(String value) : super(value); + const CheckRunAnnotationLevel._(String super.value); factory CheckRunAnnotationLevel._fromValue(String? value) { switch (value) { @@ -51,7 +51,7 @@ class CheckRunConclusion extends EnumWithValue { static const actionRequired = CheckRunConclusion._('action_required'); static const empty = CheckRunConclusion._(null); - const CheckRunConclusion._(String? value) : super(value); + const CheckRunConclusion._(super.value); factory CheckRunConclusion._fromValue(String? value) { if (value == null) { @@ -79,13 +79,13 @@ class CheckRunStatus extends EnumWithValue { static const queued = CheckRunStatus._('queued'); static const inProgress = CheckRunStatus._('in_progress'); static const completed = CheckRunStatus._('completed'); - const CheckRunStatus._(String value) : super(value); + const CheckRunStatus._(String super.value); } class CheckRunFilter extends EnumWithValue { static const all = CheckRunFilter._('all'); static const latest = CheckRunFilter._('latest'); - const CheckRunFilter._(String value) : super(value); + const CheckRunFilter._(String super.value); } @immutable @@ -253,7 +253,7 @@ class CheckRunAnnotation { assert(title.length <= 255); @override - bool operator ==(dynamic other) { + bool operator ==(Object other) { if (other is CheckRunAnnotation) { return other.annotationLevel == annotationLevel && other.path == path && diff --git a/lib/src/common/orgs_service.dart b/lib/src/common/orgs_service.dart index d793a8b9..b2ca7b26 100644 --- a/lib/src/common/orgs_service.dart +++ b/lib/src/common/orgs_service.dart @@ -9,7 +9,7 @@ import 'package:http/http.dart' as http; /// /// API docs: https://developer.github.com/v3/orgs/ class OrganizationsService extends Service { - OrganizationsService(GitHub github) : super(github); + OrganizationsService(super.github); /// Lists all of the memberships in organizations for the given [userName]. /// If [userName] is not specified we list the memberships in organizations diff --git a/lib/src/common/pulls_service.dart b/lib/src/common/pulls_service.dart index 5242f0e3..7fee2bf9 100644 --- a/lib/src/common/pulls_service.dart +++ b/lib/src/common/pulls_service.dart @@ -8,7 +8,7 @@ import 'package:github/src/common.dart'; /// /// API docs: https://developer.github.com/v3/pulls/ class PullRequestsService extends Service { - PullRequestsService(GitHub github) : super(github); + PullRequestsService(super.github); /// Fetches several pull requests. /// diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index a274710e..83fa5ef0 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -9,7 +9,7 @@ import 'package:http/http.dart' as http; /// /// API docs: https://developer.github.com/v3/repos/ class RepositoriesService extends Service { - RepositoriesService(GitHub github) : super(github); + RepositoriesService(super.github); /// Lists the repositories of the currently authenticated user. /// diff --git a/lib/src/common/search_service.dart b/lib/src/common/search_service.dart index bf2b41ec..27cf6eef 100644 --- a/lib/src/common/search_service.dart +++ b/lib/src/common/search_service.dart @@ -8,7 +8,7 @@ import 'package:github/src/common.dart'; /// /// API docs: https://developer.github.com/v3/search/ class SearchService extends Service { - SearchService(GitHub github) : super(github); + SearchService(super.github); /// Search for repositories using [query]. /// Since the Search Rate Limit is small, this is a best effort implementation. diff --git a/lib/src/common/url_shortener_service.dart b/lib/src/common/url_shortener_service.dart index 0b1e296f..60db2958 100644 --- a/lib/src/common/url_shortener_service.dart +++ b/lib/src/common/url_shortener_service.dart @@ -6,7 +6,7 @@ import 'package:github/src/common.dart'; /// /// API docs: https://github.com/blog/985-git-io-github-url-shortener class UrlShortenerService extends Service { - UrlShortenerService(GitHub github) : super(github); + UrlShortenerService(super.github); /// Shortens the provided [url]. An optional [code] can be provided to create /// your own vanity URL. diff --git a/lib/src/common/users_service.dart b/lib/src/common/users_service.dart index bb27ff6d..6485f4b0 100644 --- a/lib/src/common/users_service.dart +++ b/lib/src/common/users_service.dart @@ -8,7 +8,7 @@ import 'package:http/http.dart' as http; /// /// API docs: https://developer.github.com/v3/users/ class UsersService extends Service { - UsersService(GitHub github) : super(github); + UsersService(super.github); /// Fetches the user specified by [name]. /// diff --git a/lib/src/common/util/errors.dart b/lib/src/common/util/errors.dart index 81fa72b2..14625a6c 100644 --- a/lib/src/common/util/errors.dart +++ b/lib/src/common/util/errors.dart @@ -25,14 +25,13 @@ class NotReady extends GitHubError { /// GitHub Entity was not found class NotFound extends GitHubError { const NotFound( - GitHub github, - String msg, - ) : super(github, msg); + super.github, + String super.msg, + ); } class BadRequest extends GitHubError { - const BadRequest(GitHub github, [String? msg = 'Not Found']) - : super(github, msg); + const BadRequest(super.github, [super.msg = 'Not Found']); } /// GitHub Repository was not found @@ -94,11 +93,10 @@ class NotAuthenticated extends GitHubError { } class InvalidJSON extends BadRequest { - const InvalidJSON(GitHub github, [String? message = 'Invalid JSON']) - : super(github, message); + const InvalidJSON(super.github, [super.message = 'Invalid JSON']); } class ValidationFailed extends GitHubError { - const ValidationFailed(GitHub github, [String message = 'Validation Failed']) - : super(github, message); + const ValidationFailed(super.github, + [String super.message = 'Validation Failed']); } diff --git a/lib/src/common/util/utils.dart b/lib/src/common/util/utils.dart index 57bd6712..5c690774 100644 --- a/lib/src/common/util/utils.dart +++ b/lib/src/common/util/utils.dart @@ -21,7 +21,7 @@ abstract class EnumWithValue { /// True iff [other] is an [EnumWithValue] with the same value as this object. @override - bool operator ==(dynamic other) => + bool operator ==(Object other) => other is EnumWithValue && value == other.value; @override diff --git a/pubspec.yaml b/pubspec.yaml index af2ff765..308c3631 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,10 +1,10 @@ name: github -version: 9.22.0 +version: 9.23.0 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart environment: - sdk: '>=2.18.0 <3.0.0' + sdk: ^3.0.0 dependencies: http: '>=0.13.0 <2.0.0' @@ -19,10 +19,10 @@ dev_dependencies: collection: ^1.15.0 dependency_validator: json_serializable: ^6.6.1 - lints: ^2.0.0 + lints: ^3.0.0 mockito: ^5.0.0 nock: ^1.0.0 pub_semver: ^2.0.0 test: ^1.16.0 yaml: ^3.0.0 - yaml_edit: + yaml_edit: ^2.2.0 diff --git a/test/helper/http.dart b/test/helper/http.dart index 2c5eaab4..ffed40d4 100644 --- a/test/helper/http.dart +++ b/test/helper/http.dart @@ -25,8 +25,8 @@ class MockHTTPClient extends http.BaseClient { } class MockResponse extends http.Response { - MockResponse(String body, Map headers, int statusCode) - : super(body, statusCode, headers: headers); + MockResponse(super.body, Map headers, super.statusCode) + : super(headers: headers); factory MockResponse.fromAsset(String name) { final responseData = diff --git a/test/server/hooks_test_data.dart b/test/server/hooks_test_data.dart index 4f5b734b..ad02cc10 100644 --- a/test/server/hooks_test_data.dart +++ b/test/server/hooks_test_data.dart @@ -1,4 +1,5 @@ /// Json messages as dart string used for checks model tests. +library; String checkSuiteString = checkSuiteTemplate('requested'); diff --git a/tool/process_github_schema.dart b/tool/process_github_schema.dart index e3850df5..14994289 100644 --- a/tool/process_github_schema.dart +++ b/tool/process_github_schema.dart @@ -20,7 +20,7 @@ List wordWrap(String body) { typedef GenTypeVisitor = void Function(GenType type); -abstract class GenType extends Comparable { +abstract class GenType implements Comparable { GenType(); String get name; From f5a565f5d8389eccbde05744266be288f980785e Mon Sep 17 00:00:00 2001 From: Devon Carew Date: Mon, 26 Feb 2024 09:42:10 -0800 Subject: [PATCH 381/390] Fix Issue.isOpen and Issue.isClosed getters (#398) * Update issues.dart * require dart 3.0; update to the latest package:lints (#399) * require dart 3.0; update to the latest package:lints * update pubspec and changelog * update the pubspec version; add a changelog entry --- CHANGELOG.md | 4 ++++ lib/src/common/model/issues.dart | 4 ++-- pubspec.yaml | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ea5c0870..3f1f7db8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 9.24.0 + +* Bug fixes to the `Issue.isOpen` and `Issue.isClosed` getters. + ## 9.23.0 * Require Dart 3.0. diff --git a/lib/src/common/model/issues.dart b/lib/src/common/model/issues.dart index 12b40172..028552dd 100644 --- a/lib/src/common/model/issues.dart +++ b/lib/src/common/model/issues.dart @@ -103,8 +103,8 @@ class Issue { /// The user who closed the issue User? closedBy; - bool get isOpen => state == 'open'; - bool get isClosed => state == 'closed'; + bool get isOpen => state == 'OPEN'; + bool get isClosed => state == 'CLOSED'; // The following properties were added to support the Timeline API. diff --git a/pubspec.yaml b/pubspec.yaml index 308c3631..ab43b9e9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 9.23.0 +version: 9.24.0 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart From 816939826734db6c2be208a82bb3d67f8b28cbaa Mon Sep 17 00:00:00 2001 From: Kate Lovett Date: Sat, 13 Apr 2024 09:37:21 -0500 Subject: [PATCH 382/390] Fix case sensitivity in Issue.[isOpen, isClosed] (#402) Fixes https://github.com/SpinlockLabs/github.dart/issues/401 --- lib/src/common/model/issues.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/src/common/model/issues.dart b/lib/src/common/model/issues.dart index 028552dd..3d531e63 100644 --- a/lib/src/common/model/issues.dart +++ b/lib/src/common/model/issues.dart @@ -103,8 +103,8 @@ class Issue { /// The user who closed the issue User? closedBy; - bool get isOpen => state == 'OPEN'; - bool get isClosed => state == 'CLOSED'; + bool get isOpen => state.toUpperCase() == 'OPEN'; + bool get isClosed => state.toUpperCase() == 'CLOSED'; // The following properties were added to support the Timeline API. From d8af9b205c58bc3f1206fd7973bf762921be0e6d Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Mon, 14 Apr 2025 17:02:20 -0500 Subject: [PATCH 383/390] Update some dependencies, bump min SDK (#415) --- .github/workflows/dart.yml | 2 +- CHANGELOG.md | 5 +++++ analysis_options.yaml | 1 - pubspec.yaml | 26 +++++++++++++------------- test/scenarios_test.dart | 1 + 5 files changed, 20 insertions(+), 15 deletions(-) diff --git a/.github/workflows/dart.yml b/.github/workflows/dart.yml index 2d725e23..1dcc0100 100644 --- a/.github/workflows/dart.yml +++ b/.github/workflows/dart.yml @@ -13,7 +13,7 @@ jobs: matrix: os: [ubuntu-latest] # Test with at least the declared minimum Dart version - sdk: ['3.0', stable] + sdk: ['3.1', stable] steps: - uses: actions/checkout@v4 - uses: dart-lang/setup-dart@v1 diff --git a/CHANGELOG.md b/CHANGELOG.md index 3f1f7db8..7939058a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## 9.25.0-wip + +* Require Dart 3.1 +* Require `package:http` `^1.0.0`. + ## 9.24.0 * Bug fixes to the `Issue.isOpen` and `Issue.isClosed` getters. diff --git a/analysis_options.yaml b/analysis_options.yaml index 1af8628e..f2974469 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -31,7 +31,6 @@ linter: - omit_local_variable_types - one_member_abstracts - only_throw_errors - - package_api_docs - prefer_asserts_in_initializer_lists - prefer_const_constructors - prefer_const_constructors_in_immutables diff --git a/pubspec.yaml b/pubspec.yaml index ab43b9e9..e86ed709 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,28 +1,28 @@ name: github -version: 9.24.0 +version: 9.25.0-wip description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart environment: - sdk: ^3.0.0 + sdk: ^3.1.0 dependencies: - http: '>=0.13.0 <2.0.0' + http: ^1.0.0 http_parser: ^4.0.0 json_annotation: ^4.8.0 - meta: ^1.3.0 + meta: ^1.7.0 dev_dependencies: - build_runner: any - build_test: any - build_web_compilers: any + build_runner: ^2.2.1 + build_test: ^2.1.2 + build_web_compilers: ^3.2.6 collection: ^1.15.0 - dependency_validator: + dependency_validator: ^3.0.0 json_serializable: ^6.6.1 - lints: ^3.0.0 - mockito: ^5.0.0 - nock: ^1.0.0 + lints: ^4.0.0 + mockito: ^5.3.2 + nock: ^1.1.3 pub_semver: ^2.0.0 - test: ^1.16.0 - yaml: ^3.0.0 + test: ^1.21.6 + yaml: ^3.1.0 yaml_edit: ^2.2.0 diff --git a/test/scenarios_test.dart b/test/scenarios_test.dart index 70f1a789..fb453845 100644 --- a/test/scenarios_test.dart +++ b/test/scenarios_test.dart @@ -2,6 +2,7 @@ @Tags(['scenarios']) @TestOn('vm') +library; import 'dart:convert'; From edc3f5ae9210e882e692a8cb1e3a0f989eb9aaad Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Mon, 14 Apr 2025 16:19:40 -0600 Subject: [PATCH 384/390] Update json_annotation min and build_web_compilers range --- pubspec.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pubspec.yaml b/pubspec.yaml index e86ed709..9b29ea72 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -9,13 +9,13 @@ environment: dependencies: http: ^1.0.0 http_parser: ^4.0.0 - json_annotation: ^4.8.0 + json_annotation: ^4.9.0 meta: ^1.7.0 dev_dependencies: build_runner: ^2.2.1 build_test: ^2.1.2 - build_web_compilers: ^3.2.6 + build_web_compilers: '>=3.2.6 < 5.0.0' collection: ^1.15.0 dependency_validator: ^3.0.0 json_serializable: ^6.6.1 From 4926022d04082ea72bb74582b31c3b80bd3165d9 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Mon, 14 Apr 2025 17:21:03 -0500 Subject: [PATCH 385/390] Rebuild JSON bits (#416) Co-authored-by: Rob Becker --- lib/src/common/model/authorizations.g.dart | 2 +- lib/src/common/model/gists.g.dart | 14 +++--- lib/src/common/model/git.g.dart | 6 +-- lib/src/common/model/issues.g.dart | 18 +++---- lib/src/common/model/keys.g.dart | 2 +- lib/src/common/model/misc.g.dart | 4 +- lib/src/common/model/orgs.g.dart | 18 +++---- lib/src/common/model/pulls.g.dart | 52 ++++++++++---------- lib/src/common/model/reaction.g.dart | 20 ++++---- lib/src/common/model/repos.g.dart | 36 +++++++------- lib/src/common/model/repos_commits.g.dart | 18 +++---- lib/src/common/model/repos_contents.g.dart | 2 +- lib/src/common/model/repos_hooks.g.dart | 2 +- lib/src/common/model/repos_pages.g.dart | 4 +- lib/src/common/model/repos_releases.g.dart | 8 +-- lib/src/common/model/repos_stats.g.dart | 38 ++++++++------ lib/src/common/model/repos_statuses.g.dart | 2 +- lib/src/common/model/search.g.dart | 2 +- lib/src/common/model/timeline.g.dart | 32 ++++++------ lib/src/common/model/timeline_support.g.dart | 28 +++++------ lib/src/common/model/users.g.dart | 38 +++++++------- lib/src/server/hooks.g.dart | 2 +- 22 files changed, 177 insertions(+), 171 deletions(-) diff --git a/lib/src/common/model/authorizations.g.dart b/lib/src/common/model/authorizations.g.dart index 7c3a2e73..918a8a47 100644 --- a/lib/src/common/model/authorizations.g.dart +++ b/lib/src/common/model/authorizations.g.dart @@ -8,7 +8,7 @@ part of 'authorizations.dart'; Authorization _$AuthorizationFromJson(Map json) => Authorization( - id: json['id'] as int?, + id: (json['id'] as num?)?.toInt(), scopes: (json['scopes'] as List?)?.map((e) => e as String).toList(), token: json['token'] as String?, diff --git a/lib/src/common/model/gists.g.dart b/lib/src/common/model/gists.g.dart index e1d6db23..3438e5ea 100644 --- a/lib/src/common/model/gists.g.dart +++ b/lib/src/common/model/gists.g.dart @@ -20,7 +20,7 @@ Gist _$GistFromJson(Map json) => Gist( (k, e) => MapEntry(k, GistFile.fromJson(e as Map)), ), htmlUrl: json['html_url'] as String?, - commentsCount: json['comments'] as int?, + commentsCount: (json['comments'] as num?)?.toInt(), gitPullUrl: json['git_pull_url'] as String?, gitPushUrl: json['git_push_url'] as String?, createdAt: json['created_at'] == null @@ -48,7 +48,7 @@ Map _$GistToJson(Gist instance) => { GistFile _$GistFileFromJson(Map json) => GistFile( filename: json['filename'] as String?, - size: json['size'] as int?, + size: (json['size'] as num?)?.toInt(), rawUrl: json['raw_url'] as String?, type: json['type'] as String?, language: json['language'] as String?, @@ -70,7 +70,7 @@ GistFork _$GistForkFromJson(Map json) => GistFork( user: json['user'] == null ? null : User.fromJson(json['user'] as Map), - id: json['id'] as int?, + id: (json['id'] as num?)?.toInt(), createdAt: json['created_at'] == null ? null : DateTime.parse(json['created_at'] as String), @@ -92,9 +92,9 @@ GistHistoryEntry _$GistHistoryEntryFromJson(Map json) => user: json['user'] == null ? null : User.fromJson(json['user'] as Map), - deletions: json['change_status/deletions'] as int?, - additions: json['change_status/additions'] as int?, - totalChanges: json['change_status/total'] as int?, + deletions: (json['change_status/deletions'] as num?)?.toInt(), + additions: (json['change_status/additions'] as num?)?.toInt(), + totalChanges: (json['change_status/total'] as num?)?.toInt(), committedAt: json['committed_at'] == null ? null : DateTime.parse(json['committed_at'] as String), @@ -111,7 +111,7 @@ Map _$GistHistoryEntryToJson(GistHistoryEntry instance) => }; GistComment _$GistCommentFromJson(Map json) => GistComment( - id: json['id'] as int?, + id: (json['id'] as num?)?.toInt(), user: json['user'] == null ? null : User.fromJson(json['user'] as Map), diff --git a/lib/src/common/model/git.g.dart b/lib/src/common/model/git.g.dart index 61d5fc44..e041aeb3 100644 --- a/lib/src/common/model/git.g.dart +++ b/lib/src/common/model/git.g.dart @@ -11,7 +11,7 @@ GitBlob _$GitBlobFromJson(Map json) => GitBlob( encoding: json['encoding'] as String?, url: json['url'] as String?, sha: json['sha'] as String?, - size: json['size'] as int?, + size: (json['size'] as num?)?.toInt(), ); Map _$GitBlobToJson(GitBlob instance) => { @@ -50,7 +50,7 @@ GitCommit _$GitCommitFromJson(Map json) => GitCommit( parents: (json['parents'] as List?) ?.map((e) => GitCommit.fromJson(e as Map)) .toList(), - commentCount: json['comment_count'] as int?, + commentCount: (json['comment_count'] as num?)?.toInt(), ); Map _$GitCommitToJson(GitCommit instance) => { @@ -130,7 +130,7 @@ GitTreeEntry _$GitTreeEntryFromJson(Map json) => GitTreeEntry( json['path'] as String?, json['mode'] as String?, json['type'] as String?, - json['size'] as int?, + (json['size'] as num?)?.toInt(), json['sha'] as String?, json['url'] as String?, ); diff --git a/lib/src/common/model/issues.g.dart b/lib/src/common/model/issues.g.dart index 40bbfa94..e4a80082 100644 --- a/lib/src/common/model/issues.g.dart +++ b/lib/src/common/model/issues.g.dart @@ -7,10 +7,10 @@ part of 'issues.dart'; // ************************************************************************** Issue _$IssueFromJson(Map json) => Issue( - id: json['id'] as int? ?? 0, + id: (json['id'] as num?)?.toInt() ?? 0, url: json['url'] as String? ?? '', htmlUrl: json['html_url'] as String? ?? '', - number: json['number'] as int? ?? 0, + number: (json['number'] as num?)?.toInt() ?? 0, state: json['state'] as String? ?? '', title: json['title'] as String? ?? '', user: json['user'] == null @@ -29,7 +29,7 @@ Issue _$IssueFromJson(Map json) => Issue( milestone: json['milestone'] == null ? null : Milestone.fromJson(json['milestone'] as Map), - commentsCount: json['comments'] as int? ?? 0, + commentsCount: (json['comments'] as num?)?.toInt() ?? 0, pullRequest: json['pull_request'] == null ? null : IssuePullRequest.fromJson( @@ -119,7 +119,7 @@ IssueRequest _$IssueRequestFromJson(Map json) => IssueRequest( ?.map((e) => e as String) .toList(), state: json['state'] as String?, - milestone: json['milestone'] as int?, + milestone: (json['milestone'] as num?)?.toInt(), ); Map _$IssueRequestToJson(IssueRequest instance) => @@ -148,7 +148,7 @@ Map _$IssuePullRequestToJson(IssuePullRequest instance) => }; IssueComment _$IssueCommentFromJson(Map json) => IssueComment( - id: json['id'] as int?, + id: (json['id'] as num?)?.toInt(), body: json['body'] as String?, user: json['user'] == null ? null @@ -192,16 +192,16 @@ Map _$IssueLabelToJson(IssueLabel instance) => }; Milestone _$MilestoneFromJson(Map json) => Milestone( - id: json['id'] as int?, - number: json['number'] as int?, + id: (json['id'] as num?)?.toInt(), + number: (json['number'] as num?)?.toInt(), state: json['state'] as String?, title: json['title'] as String?, description: json['description'] as String?, creator: json['creator'] == null ? null : User.fromJson(json['creator'] as Map), - openIssuesCount: json['open_issues'] as int?, - closedIssuesCount: json['closed_issues'] as int?, + openIssuesCount: (json['open_issues'] as num?)?.toInt(), + closedIssuesCount: (json['closed_issues'] as num?)?.toInt(), createdAt: json['created_at'] == null ? null : DateTime.parse(json['created_at'] as String), diff --git a/lib/src/common/model/keys.g.dart b/lib/src/common/model/keys.g.dart index 1db24c87..7cecbcf2 100644 --- a/lib/src/common/model/keys.g.dart +++ b/lib/src/common/model/keys.g.dart @@ -7,7 +7,7 @@ part of 'keys.dart'; // ************************************************************************** PublicKey _$PublicKeyFromJson(Map json) => PublicKey( - id: json['id'] as int?, + id: (json['id'] as num?)?.toInt(), key: json['key'] as String?, title: json['title'] as String?, ); diff --git a/lib/src/common/model/misc.g.dart b/lib/src/common/model/misc.g.dart index d7b3896c..4ad9a310 100644 --- a/lib/src/common/model/misc.g.dart +++ b/lib/src/common/model/misc.g.dart @@ -19,8 +19,8 @@ Map _$GitignoreTemplateToJson(GitignoreTemplate instance) => }; RateLimit _$RateLimitFromJson(Map json) => RateLimit( - json['limit'] as int?, - json['remaining'] as int?, + (json['limit'] as num?)?.toInt(), + (json['remaining'] as num?)?.toInt(), json['resets'] == null ? null : DateTime.parse(json['resets'] as String), ); diff --git a/lib/src/common/model/orgs.g.dart b/lib/src/common/model/orgs.g.dart index c32f6702..dc9dc349 100644 --- a/lib/src/common/model/orgs.g.dart +++ b/lib/src/common/model/orgs.g.dart @@ -8,7 +8,7 @@ part of 'orgs.dart'; Organization _$OrganizationFromJson(Map json) => Organization( login: json['login'] as String?, - id: json['id'] as int?, + id: (json['id'] as num?)?.toInt(), htmlUrl: json['html_url'] as String?, avatarUrl: json['avatar_url'] as String?, name: json['name'] as String?, @@ -16,10 +16,10 @@ Organization _$OrganizationFromJson(Map json) => Organization( blog: json['blog'] as String?, location: json['location'] as String?, email: json['email'] as String?, - publicReposCount: json['public_repos'] as int?, - publicGistsCount: json['public_gists'] as int?, - followersCount: json['followers'] as int?, - followingCount: json['following'] as int?, + publicReposCount: (json['public_repos'] as num?)?.toInt(), + publicGistsCount: (json['public_gists'] as num?)?.toInt(), + followersCount: (json['followers'] as num?)?.toInt(), + followingCount: (json['following'] as num?)?.toInt(), createdAt: json['created_at'] == null ? null : DateTime.parse(json['created_at'] as String), @@ -66,9 +66,9 @@ Map _$OrganizationMembershipToJson( Team _$TeamFromJson(Map json) => Team( description: json['description'] as String?, htmlUrl: json['html_url'] as String?, - id: json['id'] as int?, + id: (json['id'] as num?)?.toInt(), ldapDn: json['ldap_dn'] as String?, - membersCount: json['members_count'] as int?, + membersCount: (json['members_count'] as num?)?.toInt(), membersUrl: json['members_url'] as String?, name: json['name'] as String?, nodeId: json['node_id'] as String?, @@ -83,7 +83,7 @@ Team _$TeamFromJson(Map json) => Team( ? null : Permissions.fromJson(json['permissions'] as Map), privacy: json['privacy'] as String?, - reposCount: json['repos_count'] as int?, + reposCount: (json['repos_count'] as num?)?.toInt(), repositoriesUrl: json['repositories_url'] as String?, slug: json['slug'] as String?, url: json['url'] as String?, @@ -128,7 +128,7 @@ Map _$PermissionsToJson(Permissions instance) => TeamMember _$TeamMemberFromJson(Map json) => TeamMember( login: json['login'] as String?, - id: json['id'] as int?, + id: (json['id'] as num?)?.toInt(), avatarUrl: json['avatar_url'] as String?, type: json['type'] as String?, siteAdmin: json['site_admin'] as bool?, diff --git a/lib/src/common/model/pulls.g.dart b/lib/src/common/model/pulls.g.dart index cf370e22..e7dea0cb 100644 --- a/lib/src/common/model/pulls.g.dart +++ b/lib/src/common/model/pulls.g.dart @@ -7,12 +7,12 @@ part of 'pulls.dart'; // ************************************************************************** PullRequest _$PullRequestFromJson(Map json) => PullRequest( - id: json['id'] as int?, + id: (json['id'] as num?)?.toInt(), nodeId: json['node_id'] as String?, htmlUrl: json['html_url'] as String?, diffUrl: json['diff_url'] as String?, patchUrl: json['patch_url'] as String?, - number: json['number'] as int?, + number: (json['number'] as num?)?.toInt(), state: json['state'] as String?, title: json['title'] as String?, body: json['body'] as String?, @@ -44,18 +44,18 @@ PullRequest _$PullRequestFromJson(Map json) => PullRequest( mergedBy: json['merged_by'] == null ? null : User.fromJson(json['merged_by'] as Map), - commentsCount: json['comments'] as int? ?? 0, - commitsCount: json['commits'] as int? ?? 0, - additionsCount: json['additions'] as int? ?? 0, - deletionsCount: json['deletions'] as int? ?? 0, - changedFilesCount: json['changed_files'] as int? ?? 0, + commentsCount: (json['comments'] as num?)?.toInt() ?? 0, + commitsCount: (json['commits'] as num?)?.toInt() ?? 0, + additionsCount: (json['additions'] as num?)?.toInt() ?? 0, + deletionsCount: (json['deletions'] as num?)?.toInt() ?? 0, + changedFilesCount: (json['changed_files'] as num?)?.toInt() ?? 0, labels: (json['labels'] as List?) ?.map((e) => IssueLabel.fromJson(e as Map)) .toList(), requestedReviewers: (json['requested_reviewers'] as List?) ?.map((e) => User.fromJson(e as Map)) .toList(), - reviewCommentCount: json['review_comments'] as int? ?? 0, + reviewCommentCount: (json['review_comments'] as num?)?.toInt() ?? 0, milestone: json['milestone'] == null ? null : Milestone.fromJson(json['milestone'] as Map), @@ -162,11 +162,11 @@ Map _$CreatePullRequestToJson(CreatePullRequest instance) => PullRequestComment _$PullRequestCommentFromJson(Map json) => PullRequestComment( - id: json['id'] as int?, + id: (json['id'] as num?)?.toInt(), diffHunk: json['diff_hunk'] as String?, path: json['path'] as String?, - position: json['position'] as int?, - originalPosition: json['original_position'] as int?, + position: (json['position'] as num?)?.toInt(), + originalPosition: (json['original_position'] as num?)?.toInt(), commitId: json['commit_id'] as String?, originalCommitId: json['original_commit_id'] as String?, user: json['user'] == null @@ -210,7 +210,7 @@ CreatePullRequestComment _$CreatePullRequestCommentFromJson( json['body'] as String?, json['commit_id'] as String?, json['path'] as String?, - json['position'] as int?, + (json['position'] as num?)?.toInt(), ); Map _$CreatePullRequestCommentToJson( @@ -227,9 +227,9 @@ PullRequestFile _$PullRequestFileFromJson(Map json) => sha: json['sha'] as String?, filename: json['filename'] as String?, status: json['status'] as String?, - additionsCount: json['additions'] as int?, - deletionsCount: json['deletions'] as int?, - changesCount: json['changes'] as int?, + additionsCount: (json['additions'] as num?)?.toInt(), + deletionsCount: (json['deletions'] as num?)?.toInt(), + changesCount: (json['changes'] as num?)?.toInt(), blobUrl: json['blob_url'] as String?, rawUrl: json['raw_url'] as String?, contentsUrl: json['contents_url'] as String?, @@ -252,7 +252,7 @@ Map _$PullRequestFileToJson(PullRequestFile instance) => PullRequestReview _$PullRequestReviewFromJson(Map json) => PullRequestReview( - id: json['id'] as int, + id: (json['id'] as num).toInt(), user: json['user'] == null ? null : User.fromJson(json['user'] as Map), @@ -285,7 +285,7 @@ CreatePullRequestReview _$CreatePullRequestReviewFromJson( CreatePullRequestReview( json['owner'] as String, json['repo'] as String, - json['pull_number'] as int, + (json['pull_number'] as num).toInt(), json['event'] as String, body: json['body'] as String?, comments: (json['comments'] as List?) @@ -318,26 +318,26 @@ PullRequestReviewComment _$PullRequestReviewCommentFromJson( : DateTime.parse(json['created_at'] as String), diffHunk: json['diff_hunk'] as String?, htmlUrl: json['html_url'] as String?, - id: json['id'] as int?, - inReplyToId: json['in_reply_to_id'] as int?, - line: json['line'] as int?, + id: (json['id'] as num?)?.toInt(), + inReplyToId: (json['in_reply_to_id'] as num?)?.toInt(), + line: (json['line'] as num?)?.toInt(), links: json['_links'] == null ? null : ReviewLinks.fromJson(json['_links'] as Map), nodeId: json['node_id'] as String?, originalCommitId: json['original_commit_id'] as String?, - originalLine: json['original_line'] as int?, - originalPosition: json['original_position'] as int?, - originalStartLine: json['original_start_line'] as int?, + originalLine: (json['original_line'] as num?)?.toInt(), + originalPosition: (json['original_position'] as num?)?.toInt(), + originalStartLine: (json['original_start_line'] as num?)?.toInt(), path: json['path'] as String?, - position: json['position'] as int?, - pullRequestReviewId: json['pull_request_review_id'] as int?, + position: (json['position'] as num?)?.toInt(), + pullRequestReviewId: (json['pull_request_review_id'] as num?)?.toInt(), pullRequestUrl: json['pull_request_url'] as String?, reactions: json['reactions'] == null ? null : ReactionRollup.fromJson(json['reactions'] as Map), side: json['side'] as String?, - startLine: json['start_line'] as int?, + startLine: (json['start_line'] as num?)?.toInt(), startSide: json['start_side'] as String?, subjectType: json['subject_type'] as String?, updatedAt: json['updated_at'] == null diff --git a/lib/src/common/model/reaction.g.dart b/lib/src/common/model/reaction.g.dart index d94eede4..4647e160 100644 --- a/lib/src/common/model/reaction.g.dart +++ b/lib/src/common/model/reaction.g.dart @@ -7,7 +7,7 @@ part of 'reaction.dart'; // ************************************************************************** Reaction _$ReactionFromJson(Map json) => Reaction( - id: json['id'] as int?, + id: (json['id'] as num?)?.toInt(), nodeId: json['node_id'] as String?, user: json['user'] == null ? null @@ -28,15 +28,15 @@ Map _$ReactionToJson(Reaction instance) => { ReactionRollup _$ReactionRollupFromJson(Map json) => ReactionRollup( - plusOne: json['+1'] as int?, - minusOne: json['-1'] as int?, - confused: json['confused'] as int?, - eyes: json['eyes'] as int?, - heart: json['heart'] as int?, - hooray: json['hooray'] as int?, - laugh: json['laugh'] as int?, - rocket: json['rocket'] as int?, - totalCount: json['total_count'] as int?, + plusOne: (json['+1'] as num?)?.toInt(), + minusOne: (json['-1'] as num?)?.toInt(), + confused: (json['confused'] as num?)?.toInt(), + eyes: (json['eyes'] as num?)?.toInt(), + heart: (json['heart'] as num?)?.toInt(), + hooray: (json['hooray'] as num?)?.toInt(), + laugh: (json['laugh'] as num?)?.toInt(), + rocket: (json['rocket'] as num?)?.toInt(), + totalCount: (json['total_count'] as num?)?.toInt(), url: json['url'] as String?, ); diff --git a/lib/src/common/model/repos.g.dart b/lib/src/common/model/repos.g.dart index 490b18b1..fe19ea97 100644 --- a/lib/src/common/model/repos.g.dart +++ b/lib/src/common/model/repos.g.dart @@ -10,9 +10,9 @@ GitHubComparison _$GitHubComparisonFromJson(Map json) => GitHubComparison( json['url'] as String?, json['status'] as String?, - json['ahead_by'] as int?, - json['behind_by'] as int?, - json['total_commits'] as int?, + (json['ahead_by'] as num?)?.toInt(), + (json['behind_by'] as num?)?.toInt(), + (json['total_commits'] as num?)?.toInt(), (json['files'] as List?) ?.map((e) => CommitFile.fromJson(e as Map)) .toList(), @@ -34,7 +34,7 @@ Map _$GitHubComparisonToJson(GitHubComparison instance) => Repository _$RepositoryFromJson(Map json) => Repository( name: json['name'] as String? ?? '', - id: json['id'] as int? ?? 0, + id: (json['id'] as num?)?.toInt() ?? 0, fullName: json['full_name'] as String? ?? '', owner: json['owner'] == null ? null @@ -51,17 +51,17 @@ Repository _$RepositoryFromJson(Map json) => Repository( : DateTime.parse(json['created_at'] as String), isPrivate: json['private'] as bool? ?? false, isFork: json['fork'] as bool? ?? false, - stargazersCount: json['stargazers_count'] as int? ?? 0, - watchersCount: json['watchers_count'] as int? ?? 0, + stargazersCount: (json['stargazers_count'] as num?)?.toInt() ?? 0, + watchersCount: (json['watchers_count'] as num?)?.toInt() ?? 0, language: json['language'] as String? ?? '', hasWiki: json['has_wiki'] as bool? ?? false, hasDownloads: json['has_downloads'] as bool? ?? false, - forksCount: json['forks_count'] as int? ?? 0, - openIssuesCount: json['open_issues_count'] as int? ?? 0, - subscribersCount: json['subscribers_count'] as int? ?? 0, - networkCount: json['network_count'] as int? ?? 0, + forksCount: (json['forks_count'] as num?)?.toInt() ?? 0, + openIssuesCount: (json['open_issues_count'] as num?)?.toInt() ?? 0, + subscribersCount: (json['subscribers_count'] as num?)?.toInt() ?? 0, + networkCount: (json['network_count'] as num?)?.toInt() ?? 0, hasIssues: json['has_issues'] as bool? ?? false, - size: json['size'] as int? ?? 0, + size: (json['size'] as num?)?.toInt() ?? 0, archived: json['archived'] as bool? ?? false, disabled: json['disabled'] as bool? ?? false, homepage: json['homepage'] as String? ?? '', @@ -100,7 +100,7 @@ Repository _$RepositoryFromJson(Map json) => Repository( deploymentsUrl: json['deployments_url'] as String?, downloadsUrl: json['downloads_url'] as String?, eventsUrl: json['events_url'] as String?, - forks: json['forks'] as int?, + forks: (json['forks'] as num?)?.toInt(), forksUrl: json['forks_url'] as String?, gitCommitsUrl: json['git_commits_url'] as String?, gitRefsUrl: json['git_refs_url'] as String?, @@ -123,7 +123,7 @@ Repository _$RepositoryFromJson(Map json) => Repository( mirrorUrl: json['mirror_url'] as String?, nodeId: json['node_id'] as String?, notificationsUrl: json['notifications_url'] as String?, - openIssues: json['open_issues'] as int?, + openIssues: (json['open_issues'] as num?)?.toInt(), organization: json['organization'] == null ? null : User.fromJson(json['organization'] as Map), @@ -150,7 +150,7 @@ Repository _$RepositoryFromJson(Map json) => Repository( treesUrl: json['trees_url'] as String?, url: json['url'] as String?, visibility: json['visibility'] as String?, - watchers: json['watchers'] as int?, + watchers: (json['watchers'] as num?)?.toInt(), webCommitSignoffRequired: json['web_commit_signoff_required'] as bool?, ); @@ -320,7 +320,7 @@ Map _$CommitDataToJson(CommitData instance) => CommitDataUser _$CommitDataUserFromJson(Map json) => CommitDataUser( json['login'] as String?, - json['id'] as int?, + (json['id'] as num?)?.toInt(), json['type'] as String?, ); @@ -347,7 +347,7 @@ Map _$CommitInfoToJson(CommitInfo instance) => UserInformation _$UserInformationFromJson(Map json) => UserInformation( json['login'] as String, - json['id'] as int, + (json['id'] as num).toInt(), json['avatar_url'] as String, json['html_url'] as String, ); @@ -380,7 +380,7 @@ CreateRepository _$CreateRepositoryFromJson(Map json) => private: json['private'] as bool?, hasIssues: json['has_issues'] as bool?, hasDownloads: json['has_downloads'] as bool?, - teamId: json['team_id'] as int?, + teamId: (json['team_id'] as num?)?.toInt(), autoInit: json['auto_init'] as bool?, gitignoreTemplate: json['gitignore_template'] as String?, licenseTemplate: json['license_template'] as String?, @@ -419,7 +419,7 @@ LicenseDetails _$LicenseDetailsFromJson(Map json) => name: json['name'] as String?, path: json['path'] as String?, sha: json['sha'] as String?, - size: json['size'] as int?, + size: (json['size'] as num?)?.toInt(), url: json['url'] == null ? null : Uri.parse(json['url'] as String), htmlUrl: json['html_url'] == null ? null diff --git a/lib/src/common/model/repos_commits.g.dart b/lib/src/common/model/repos_commits.g.dart index 5e74c999..a4b3a5fe 100644 --- a/lib/src/common/model/repos_commits.g.dart +++ b/lib/src/common/model/repos_commits.g.dart @@ -47,9 +47,9 @@ Map _$RepositoryCommitToJson(RepositoryCommit instance) => }; CommitStats _$CommitStatsFromJson(Map json) => CommitStats( - additions: json['additions'] as int?, - deletions: json['deletions'] as int?, - total: json['total'] as int?, + additions: (json['additions'] as num?)?.toInt(), + deletions: (json['deletions'] as num?)?.toInt(), + total: (json['total'] as num?)?.toInt(), ); Map _$CommitStatsToJson(CommitStats instance) => @@ -61,9 +61,9 @@ Map _$CommitStatsToJson(CommitStats instance) => CommitFile _$CommitFileFromJson(Map json) => CommitFile( name: json['filename'] as String?, - additions: json['additions'] as int?, - deletions: json['deletions'] as int?, - changes: json['changes'] as int?, + additions: (json['additions'] as num?)?.toInt(), + deletions: (json['deletions'] as num?)?.toInt(), + changes: (json['changes'] as num?)?.toInt(), status: json['status'] as String?, rawUrl: json['raw_url'] as String?, blobUrl: json['blob_url'] as String?, @@ -84,9 +84,9 @@ Map _$CommitFileToJson(CommitFile instance) => CommitComment _$CommitCommentFromJson(Map json) => CommitComment( - id: json['id'] as int?, - line: json['line'] as int?, - position: json['position'] as int?, + id: (json['id'] as num?)?.toInt(), + line: (json['line'] as num?)?.toInt(), + position: (json['position'] as num?)?.toInt(), path: json['path'] as String?, apiUrl: json['url'] as String?, commitId: json['commit_id'] as String?, diff --git a/lib/src/common/model/repos_contents.g.dart b/lib/src/common/model/repos_contents.g.dart index 96f92749..84dc677b 100644 --- a/lib/src/common/model/repos_contents.g.dart +++ b/lib/src/common/model/repos_contents.g.dart @@ -9,7 +9,7 @@ part of 'repos_contents.dart'; GitHubFile _$GitHubFileFromJson(Map json) => GitHubFile( type: json['type'] as String?, encoding: json['encoding'] as String?, - size: json['size'] as int?, + size: (json['size'] as num?)?.toInt(), name: json['name'] as String?, path: json['path'] as String?, content: json['content'] as String?, diff --git a/lib/src/common/model/repos_hooks.g.dart b/lib/src/common/model/repos_hooks.g.dart index c199f2ea..fa57fa4f 100644 --- a/lib/src/common/model/repos_hooks.g.dart +++ b/lib/src/common/model/repos_hooks.g.dart @@ -7,7 +7,7 @@ part of 'repos_hooks.dart'; // ************************************************************************** Hook _$HookFromJson(Map json) => Hook( - id: json['id'] as int?, + id: (json['id'] as num?)?.toInt(), name: json['name'] as String?, ) ..events = diff --git a/lib/src/common/model/repos_pages.g.dart b/lib/src/common/model/repos_pages.g.dart index a550ad75..ead9a68f 100644 --- a/lib/src/common/model/repos_pages.g.dart +++ b/lib/src/common/model/repos_pages.g.dart @@ -30,7 +30,7 @@ PageBuild _$PageBuildFromJson(Map json) => PageBuild( ? null : PageBuildPusher.fromJson(json['pusher'] as Map), commit: json['commit'] as String?, - duration: json['duration'] as int?, + duration: (json['duration'] as num?)?.toInt(), createdAt: json['created_at'] == null ? null : DateTime.parse(json['created_at'] as String), @@ -53,7 +53,7 @@ Map _$PageBuildToJson(PageBuild instance) => { PageBuildPusher _$PageBuildPusherFromJson(Map json) => PageBuildPusher( login: json['login'] as String?, - id: json['id'] as int?, + id: (json['id'] as num?)?.toInt(), apiUrl: json['url'] as String?, htmlUrl: json['html_url'] as String?, type: json['type'] as String?, diff --git a/lib/src/common/model/repos_releases.g.dart b/lib/src/common/model/repos_releases.g.dart index 2e0998e7..e0596897 100644 --- a/lib/src/common/model/repos_releases.g.dart +++ b/lib/src/common/model/repos_releases.g.dart @@ -7,7 +7,7 @@ part of 'repos_releases.dart'; // ************************************************************************** Release _$ReleaseFromJson(Map json) => Release( - id: json['id'] as int?, + id: (json['id'] as num?)?.toInt(), url: json['url'] as String?, htmlUrl: json['html_url'] as String?, tarballUrl: json['tarball_url'] as String?, @@ -61,13 +61,13 @@ Map _$ReleaseToJson(Release instance) => { }; ReleaseAsset _$ReleaseAssetFromJson(Map json) => ReleaseAsset( - id: json['id'] as int?, + id: (json['id'] as num?)?.toInt(), name: json['name'] as String?, label: json['label'] as String?, state: json['state'] as String?, contentType: json['content_type'] as String?, - size: json['size'] as int?, - downloadCount: json['download_count'] as int?, + size: (json['size'] as num?)?.toInt(), + downloadCount: (json['download_count'] as num?)?.toInt(), browserDownloadUrl: json['browser_download_url'] as String?, createdAt: json['created_at'] == null ? null diff --git a/lib/src/common/model/repos_stats.g.dart b/lib/src/common/model/repos_stats.g.dart index 12a609a5..83bd1650 100644 --- a/lib/src/common/model/repos_stats.g.dart +++ b/lib/src/common/model/repos_stats.g.dart @@ -12,7 +12,7 @@ ContributorStatistics _$ContributorStatisticsFromJson( json['author'] == null ? null : User.fromJson(json['author'] as Map), - json['total'] as int?, + (json['total'] as num?)?.toInt(), (json['weeks'] as List?) ?.map((e) => ContributorWeekStatistics.fromJson(e as Map)) @@ -30,10 +30,10 @@ Map _$ContributorStatisticsToJson( ContributorWeekStatistics _$ContributorWeekStatisticsFromJson( Map json) => ContributorWeekStatistics( - json['w'] as int?, - json['a'] as int?, - json['d'] as int?, - json['c'] as int?, + (json['w'] as num?)?.toInt(), + (json['a'] as num?)?.toInt(), + (json['d'] as num?)?.toInt(), + (json['c'] as num?)?.toInt(), ); Map _$ContributorWeekStatisticsToJson( @@ -48,8 +48,12 @@ Map _$ContributorWeekStatisticsToJson( ContributorParticipation _$ContributorParticipationFromJson( Map json) => ContributorParticipation( - all: (json['all'] as List?)?.map((e) => e as int).toList(), - owner: (json['owner'] as List?)?.map((e) => e as int).toList(), + all: (json['all'] as List?) + ?.map((e) => (e as num).toInt()) + .toList(), + owner: (json['owner'] as List?) + ?.map((e) => (e as num).toInt()) + .toList(), ); Map _$ContributorParticipationToJson( @@ -61,9 +65,11 @@ Map _$ContributorParticipationToJson( YearCommitCountWeek _$YearCommitCountWeekFromJson(Map json) => YearCommitCountWeek( - days: (json['days'] as List?)?.map((e) => e as int).toList(), - total: json['total'] as int?, - timestamp: json['timestamp'] as int?, + days: (json['days'] as List?) + ?.map((e) => (e as num).toInt()) + .toList(), + total: (json['total'] as num?)?.toInt(), + timestamp: (json['timestamp'] as num?)?.toInt(), ); Map _$YearCommitCountWeekToJson( @@ -76,9 +82,9 @@ Map _$YearCommitCountWeekToJson( WeeklyChangesCount _$WeeklyChangesCountFromJson(Map json) => WeeklyChangesCount( - timestamp: json['timestamp'] as int?, - additions: json['additions'] as int?, - deletions: json['deletions'] as int?, + timestamp: (json['timestamp'] as num?)?.toInt(), + additions: (json['additions'] as num?)?.toInt(), + deletions: (json['deletions'] as num?)?.toInt(), ); Map _$WeeklyChangesCountToJson(WeeklyChangesCount instance) => @@ -90,9 +96,9 @@ Map _$WeeklyChangesCountToJson(WeeklyChangesCount instance) => PunchcardEntry _$PunchcardEntryFromJson(Map json) => PunchcardEntry( - weekday: json['weekday'] as int?, - hour: json['hour'] as int?, - commits: json['commits'] as int?, + weekday: (json['weekday'] as num?)?.toInt(), + hour: (json['hour'] as num?)?.toInt(), + commits: (json['commits'] as num?)?.toInt(), ); Map _$PunchcardEntryToJson(PunchcardEntry instance) => diff --git a/lib/src/common/model/repos_statuses.g.dart b/lib/src/common/model/repos_statuses.g.dart index 6cb7c947..86b7b8e3 100644 --- a/lib/src/common/model/repos_statuses.g.dart +++ b/lib/src/common/model/repos_statuses.g.dart @@ -11,7 +11,7 @@ CombinedRepositoryStatus _$CombinedRepositoryStatusFromJson( CombinedRepositoryStatus( state: json['state'] as String?, sha: json['sha'] as String?, - totalCount: json['total_count'] as int?, + totalCount: (json['total_count'] as num?)?.toInt(), statuses: (json['statuses'] as List?) ?.map((e) => RepositoryStatus.fromJson(e as Map)) .toList(), diff --git a/lib/src/common/model/search.g.dart b/lib/src/common/model/search.g.dart index d24fa9cb..9d606865 100644 --- a/lib/src/common/model/search.g.dart +++ b/lib/src/common/model/search.g.dart @@ -8,7 +8,7 @@ part of 'search.dart'; CodeSearchResults _$CodeSearchResultsFromJson(Map json) => CodeSearchResults() - ..totalCount = json['total_count'] as int? + ..totalCount = (json['total_count'] as num?)?.toInt() ..incompleteResults = json['incomplete_results'] as bool? ..items = CodeSearchItem.fromJsonList(json['items'] as List); diff --git a/lib/src/common/model/timeline.g.dart b/lib/src/common/model/timeline.g.dart index 9d0bfc5a..be7d916d 100644 --- a/lib/src/common/model/timeline.g.dart +++ b/lib/src/common/model/timeline.g.dart @@ -8,7 +8,7 @@ part of 'timeline.dart'; TimelineEvent _$TimelineEventFromJson(Map json) => TimelineEvent( - id: json['id'] as int? ?? 0, + id: (json['id'] as num?)?.toInt() ?? 0, nodeId: json['node_id'] as String?, url: json['url'] as String?, actor: json['actor'] == null @@ -40,7 +40,7 @@ Map _$TimelineEventToJson(TimelineEvent instance) => }; LabelEvent _$LabelEventFromJson(Map json) => LabelEvent( - id: json['id'] as int? ?? 0, + id: (json['id'] as num?)?.toInt() ?? 0, nodeId: json['node_id'] as String?, url: json['url'] as String?, actor: json['actor'] == null @@ -77,7 +77,7 @@ Map _$LabelEventToJson(LabelEvent instance) => MilestoneEvent _$MilestoneEventFromJson(Map json) => MilestoneEvent( - id: json['id'] as int? ?? 0, + id: (json['id'] as num?)?.toInt() ?? 0, nodeId: json['node_id'] as String?, url: json['url'] as String?, actor: json['actor'] == null @@ -113,7 +113,7 @@ Map _$MilestoneEventToJson(MilestoneEvent instance) => }; RenameEvent _$RenameEventFromJson(Map json) => RenameEvent( - id: json['id'] as int? ?? 0, + id: (json['id'] as num?)?.toInt() ?? 0, nodeId: json['node_id'] as String?, url: json['url'] as String?, actor: json['actor'] == null @@ -150,7 +150,7 @@ Map _$RenameEventToJson(RenameEvent instance) => ReviewRequestEvent _$ReviewRequestEventFromJson(Map json) => ReviewRequestEvent( - id: json['id'] as int? ?? 0, + id: (json['id'] as num?)?.toInt() ?? 0, nodeId: json['node_id'] as String?, url: json['url'] as String?, actor: json['actor'] == null @@ -195,7 +195,7 @@ Map _$ReviewRequestEventToJson(ReviewRequestEvent instance) => ReviewDismissedEvent _$ReviewDismissedEventFromJson( Map json) => ReviewDismissedEvent( - id: json['id'] as int? ?? 0, + id: (json['id'] as num?)?.toInt() ?? 0, nodeId: json['node_id'] as String?, url: json['url'] as String?, actor: json['actor'] == null @@ -233,7 +233,7 @@ Map _$ReviewDismissedEventToJson( }; LockEvent _$LockEventFromJson(Map json) => LockEvent( - id: json['id'] as int? ?? 0, + id: (json['id'] as num?)?.toInt() ?? 0, nodeId: json['node_id'] as String?, url: json['url'] as String?, actor: json['actor'] == null @@ -266,7 +266,7 @@ Map _$LockEventToJson(LockEvent instance) => { }; ProjectEvent _$ProjectEventFromJson(Map json) => ProjectEvent( - id: json['id'] as int? ?? 0, + id: (json['id'] as num?)?.toInt() ?? 0, nodeId: json['node_id'] as String?, url: json['url'] as String?, actor: json['actor'] == null @@ -302,7 +302,7 @@ Map _$ProjectEventToJson(ProjectEvent instance) => }; CommentEvent _$CommentEventFromJson(Map json) => CommentEvent( - id: json['id'] as int? ?? 0, + id: (json['id'] as num?)?.toInt() ?? 0, nodeId: json['node_id'] as String?, url: json['url'] as String?, actor: json['actor'] == null @@ -359,7 +359,7 @@ Map _$CommentEventToJson(CommentEvent instance) => CrossReferenceEvent _$CrossReferenceEventFromJson(Map json) => CrossReferenceEvent( - id: json['id'] as int? ?? 0, + id: (json['id'] as num?)?.toInt() ?? 0, nodeId: json['node_id'] as String?, url: json['url'] as String?, actor: json['actor'] == null @@ -401,7 +401,7 @@ Map _$CrossReferenceEventToJson( TimelineCommitEvent _$TimelineCommitEventFromJson(Map json) => TimelineCommitEvent( - id: json['id'] as int? ?? 0, + id: (json['id'] as num?)?.toInt() ?? 0, nodeId: json['node_id'] as String?, url: json['url'] as String?, actor: json['actor'] == null @@ -460,7 +460,7 @@ Map _$TimelineCommitEventToJson( }; ReviewEvent _$ReviewEventFromJson(Map json) => ReviewEvent( - id: json['id'] as int? ?? 0, + id: (json['id'] as num?)?.toInt() ?? 0, nodeId: json['node_id'] as String?, url: json['url'] as String?, actor: json['actor'] == null @@ -520,7 +520,7 @@ Map _$ReviewEventToJson(ReviewEvent instance) => TimelineLineCommentedEvent _$TimelineLineCommentedEventFromJson( Map json) => TimelineLineCommentedEvent( - id: json['id'] as int? ?? 0, + id: (json['id'] as num?)?.toInt() ?? 0, nodeId: json['node_id'] as String?, url: json['url'] as String?, actor: json['actor'] == null @@ -560,7 +560,7 @@ Map _$TimelineLineCommentedEventToJson( TimelineCommitCommentedEvent _$TimelineCommitCommentedEventFromJson( Map json) => TimelineCommitCommentedEvent( - id: json['id'] as int? ?? 0, + id: (json['id'] as num?)?.toInt() ?? 0, nodeId: json['node_id'] as String?, url: json['url'] as String?, actor: json['actor'] == null @@ -598,7 +598,7 @@ Map _$TimelineCommitCommentedEventToJson( AssigneeEvent _$AssigneeEventFromJson(Map json) => AssigneeEvent( - id: json['id'] as int? ?? 0, + id: (json['id'] as num?)?.toInt() ?? 0, nodeId: json['node_id'] as String?, url: json['url'] as String?, actor: json['actor'] == null @@ -636,7 +636,7 @@ Map _$AssigneeEventToJson(AssigneeEvent instance) => StateChangeIssueEvent _$StateChangeIssueEventFromJson( Map json) => StateChangeIssueEvent( - id: json['id'] as int? ?? 0, + id: (json['id'] as num?)?.toInt() ?? 0, nodeId: json['node_id'] as String?, url: json['url'] as String?, actor: json['actor'] == null diff --git a/lib/src/common/model/timeline_support.g.dart b/lib/src/common/model/timeline_support.g.dart index c1e441f2..83adf60a 100644 --- a/lib/src/common/model/timeline_support.g.dart +++ b/lib/src/common/model/timeline_support.g.dart @@ -17,8 +17,8 @@ GitHubApp _$GitHubAppFromJson(Map json) => GitHubApp( (json['events'] as List?)?.map((e) => e as String).toList(), externalUrl: json['external_url'] as String?, htmlUrl: json['html_url'] as String?, - id: json['id'] as int?, - installationsCount: json['installations_count'] as int?, + id: (json['id'] as num?)?.toInt(), + installationsCount: (json['installations_count'] as num?)?.toInt(), name: json['name'] as String?, nodeId: json['node_id'] as String?, owner: json['owner'] == null @@ -69,7 +69,7 @@ DismissedReview _$DismissedReviewFromJson(Map json) => DismissedReview( dismissalCommitId: json['dismissal_commit_id'] as String?, dismissalMessage: json['dismissal_message'] as String?, - reviewId: json['review_id'] as int?, + reviewId: (json['review_id'] as num?)?.toInt(), state: json['state'] as String?, ); @@ -83,9 +83,9 @@ Map _$DismissedReviewToJson(DismissedReview instance) => ProjectCard _$ProjectCardFromJson(Map json) => ProjectCard( columnName: json['column_name'] as String?, - id: json['id'] as int?, + id: (json['id'] as num?)?.toInt(), previousColumnName: json['previous_column_name'] as String?, - projectId: json['project_id'] as int?, + projectId: (json['project_id'] as num?)?.toInt(), projectUrl: json['project_url'] as String?, url: json['url'] as String?, ); @@ -160,7 +160,7 @@ TemplateRepository _$TemplateRepositoryFromJson(Map json) => downloadsUrl: json['downloads_url'] as String?, eventsUrl: json['events_url'] as String?, fork: json['fork'] as bool?, - forksCount: json['forks_count'] as int?, + forksCount: (json['forks_count'] as num?)?.toInt(), forksUrl: json['forks_url'] as String?, fullName: json['full_name'] as String?, gitCommitsUrl: json['git_commits_url'] as String?, @@ -175,7 +175,7 @@ TemplateRepository _$TemplateRepositoryFromJson(Map json) => homepage: json['homepage'] as String?, hooksUrl: json['hooks_url'] as String?, htmlUrl: json['html_url'] as String?, - id: json['id'] as int?, + id: (json['id'] as num?)?.toInt(), isTemplate: json['is_template'] as bool?, issueCommentUrl: json['issue_comment_url'] as String?, issueEventsUrl: json['issue_events_url'] as String?, @@ -190,10 +190,10 @@ TemplateRepository _$TemplateRepositoryFromJson(Map json) => milestonesUrl: json['milestones_url'] as String?, mirrorUrl: json['mirror_url'] as String?, name: json['name'] as String?, - networkCount: json['network_count'] as int?, + networkCount: (json['network_count'] as num?)?.toInt(), nodeId: json['node_id'] as String?, notificationsUrl: json['notifications_url'] as String?, - openIssuesCount: json['open_issues_count'] as int?, + openIssuesCount: (json['open_issues_count'] as num?)?.toInt(), owner: json['owner'] == null ? null : Owner.fromJson(json['owner'] as Map), @@ -206,14 +206,14 @@ TemplateRepository _$TemplateRepositoryFromJson(Map json) => ? null : DateTime.parse(json['pushed_at'] as String), releasesUrl: json['releases_url'] as String?, - size: json['size'] as int?, + size: (json['size'] as num?)?.toInt(), squashMergeCommitMessage: json['squash_merge_commit_message'] as String?, squashMergeCommitTitle: json['squash_merge_commit_title'] as String?, sshUrl: json['ssh_url'] as String?, - stargazersCount: json['stargazers_count'] as int?, + stargazersCount: (json['stargazers_count'] as num?)?.toInt(), stargazersUrl: json['stargazers_url'] as String?, statusesUrl: json['statuses_url'] as String?, - subscribersCount: json['subscribers_count'] as int?, + subscribersCount: (json['subscribers_count'] as num?)?.toInt(), subscribersUrl: json['subscribers_url'] as String?, subscriptionUrl: json['subscription_url'] as String?, svnUrl: json['svn_url'] as String?, @@ -228,7 +228,7 @@ TemplateRepository _$TemplateRepositoryFromJson(Map json) => : DateTime.parse(json['updated_at'] as String), url: json['url'] as String?, visibility: json['visibility'] as String?, - watchersCount: json['watchers_count'] as int?, + watchersCount: (json['watchers_count'] as num?)?.toInt(), ); Map _$TemplateRepositoryToJson(TemplateRepository instance) => @@ -329,7 +329,7 @@ Owner _$OwnerFromJson(Map json) => Owner( gistsUrl: json['gists_url'] as String?, gravatarId: json['gravatar_id'] as String?, htmlUrl: json['html_url'] as String?, - id: json['id'] as int?, + id: (json['id'] as num?)?.toInt(), login: json['login'] as String?, nodeId: json['node_id'] as String?, organizationsUrl: json['organizations_url'] as String?, diff --git a/lib/src/common/model/users.g.dart b/lib/src/common/model/users.g.dart index 40e4a306..1e61153c 100644 --- a/lib/src/common/model/users.g.dart +++ b/lib/src/common/model/users.g.dart @@ -7,7 +7,7 @@ part of 'users.dart'; // ************************************************************************** User _$UserFromJson(Map json) => User( - id: json['id'] as int?, + id: (json['id'] as num?)?.toInt(), login: json['login'] as String?, avatarUrl: json['avatar_url'] as String?, htmlUrl: json['html_url'] as String?, @@ -19,10 +19,10 @@ User _$UserFromJson(Map json) => User( email: json['email'] as String?, hirable: json['hirable'] as bool?, bio: json['bio'] as String?, - publicReposCount: json['public_repos'] as int?, - publicGistsCount: json['public_gists'] as int?, - followersCount: json['followers'] as int?, - followingCount: json['following'] as int?, + publicReposCount: (json['public_repos'] as num?)?.toInt(), + publicGistsCount: (json['public_gists'] as num?)?.toInt(), + followersCount: (json['followers'] as num?)?.toInt(), + followingCount: (json['following'] as num?)?.toInt(), createdAt: json['created_at'] == null ? null : DateTime.parse(json['created_at'] as String), @@ -85,7 +85,7 @@ Map _$UserToJson(User instance) => { Collaborator _$CollaboratorFromJson(Map json) => Collaborator( json['login'] as String?, - json['id'] as int?, + (json['id'] as num?)?.toInt(), json['html_url'] as String?, json['type'] as String?, json['site_admin'] as bool?, @@ -105,13 +105,13 @@ Map _$CollaboratorToJson(Collaborator instance) => }; Contributor _$ContributorFromJson(Map json) => Contributor( - id: json['id'] as int?, + id: (json['id'] as num?)?.toInt(), login: json['login'] as String?, avatarUrl: json['avatar_url'] as String?, htmlUrl: json['html_url'] as String?, type: json['type'] as String?, siteAdmin: json['site_admin'] as bool?, - contributions: json['contributions'] as int?, + contributions: (json['contributions'] as num?)?.toInt(), ); Map _$ContributorToJson(Contributor instance) => @@ -127,7 +127,7 @@ Map _$ContributorToJson(Contributor instance) => CurrentUser _$CurrentUserFromJson(Map json) => CurrentUser() ..login = json['login'] as String? - ..id = json['id'] as int? + ..id = (json['id'] as num?)?.toInt() ..avatarUrl = json['avatar_url'] as String? ..htmlUrl = json['html_url'] as String? ..siteAdmin = json['site_admin'] as bool? @@ -138,10 +138,10 @@ CurrentUser _$CurrentUserFromJson(Map json) => CurrentUser() ..email = json['email'] as String? ..hirable = json['hirable'] as bool? ..bio = json['bio'] as String? - ..publicReposCount = json['public_repos'] as int? - ..publicGistsCount = json['public_gists'] as int? - ..followersCount = json['followers'] as int? - ..followingCount = json['following'] as int? + ..publicReposCount = (json['public_repos'] as num?)?.toInt() + ..publicGistsCount = (json['public_gists'] as num?)?.toInt() + ..followersCount = (json['followers'] as num?)?.toInt() + ..followingCount = (json['following'] as num?)?.toInt() ..createdAt = json['created_at'] == null ? null : DateTime.parse(json['created_at'] as String) @@ -165,9 +165,9 @@ CurrentUser _$CurrentUserFromJson(Map json) => CurrentUser() ..subscriptionsUrl = json['subscriptions_url'] as String? ..type = json['type'] as String? ..url = json['url'] as String? - ..privateReposCount = json['total_private_repos'] as int? - ..ownedPrivateReposCount = json['owned_private_repos'] as int? - ..diskUsage = json['disk_usage'] as int? + ..privateReposCount = (json['total_private_repos'] as num?)?.toInt() + ..ownedPrivateReposCount = (json['owned_private_repos'] as num?)?.toInt() + ..diskUsage = (json['disk_usage'] as num?)?.toInt() ..plan = json['plan'] == null ? null : UserPlan.fromJson(json['plan'] as Map); @@ -215,9 +215,9 @@ Map _$CurrentUserToJson(CurrentUser instance) => UserPlan _$UserPlanFromJson(Map json) => UserPlan() ..name = json['name'] as String? - ..space = json['space'] as int? - ..privateReposCount = json['private_repos'] as int? - ..collaboratorsCount = json['collaborators'] as int?; + ..space = (json['space'] as num?)?.toInt() + ..privateReposCount = (json['private_repos'] as num?)?.toInt() + ..collaboratorsCount = (json['collaborators'] as num?)?.toInt(); Map _$UserPlanToJson(UserPlan instance) => { 'name': instance.name, diff --git a/lib/src/server/hooks.g.dart b/lib/src/server/hooks.g.dart index e78b6cc9..81cbb790 100644 --- a/lib/src/server/hooks.g.dart +++ b/lib/src/server/hooks.g.dart @@ -132,7 +132,7 @@ Map _$IssueEventToJson(IssueEvent instance) => PullRequestEvent _$PullRequestEventFromJson(Map json) => PullRequestEvent( action: json['action'] as String?, - number: json['number'] as int?, + number: (json['number'] as num?)?.toInt(), pullRequest: json['pull_request'] == null ? null : PullRequest.fromJson(json['pull_request'] as Map), From 137871baa8cf1f6b83d5e343af9c0f350d17fbfc Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Tue, 15 Apr 2025 09:59:25 -0500 Subject: [PATCH 386/390] Bump to latest lints (#417) Bump to latest lints, require Dart 3.5 --- .github/workflows/dart.yml | 2 +- CHANGELOG.md | 2 +- example/common.dart | 2 +- example/emoji.dart | 1 + example/index.dart | 2 ++ example/languages.dart | 2 +- example/organization.dart | 1 + example/pr.dart | 1 + example/readme.dart | 1 + example/release_notes.dart | 1 + example/releases.dart | 1 + example/repos.dart | 1 + example/search.dart | 2 ++ example/stars.dart | 1 + example/user_info.dart | 1 + example/users.dart | 1 + example/zen.dart | 2 ++ lib/browser_helper.dart | 3 ++- lib/hooks.dart | 3 +-- lib/src/browser/xplat_browser.dart | 2 ++ lib/src/common/activity_service.dart | 2 +- lib/src/common/github.dart | 8 ++++---- lib/src/common/util/pagination.dart | 1 - pubspec.yaml | 4 ++-- test/unit/orgs_service_test.dart | 1 - 25 files changed, 32 insertions(+), 16 deletions(-) diff --git a/.github/workflows/dart.yml b/.github/workflows/dart.yml index 1dcc0100..63b8adab 100644 --- a/.github/workflows/dart.yml +++ b/.github/workflows/dart.yml @@ -13,7 +13,7 @@ jobs: matrix: os: [ubuntu-latest] # Test with at least the declared minimum Dart version - sdk: ['3.1', stable] + sdk: ['3.5', stable] steps: - uses: actions/checkout@v4 - uses: dart-lang/setup-dart@v1 diff --git a/CHANGELOG.md b/CHANGELOG.md index 7939058a..7e6bd14e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ ## 9.25.0-wip -* Require Dart 3.1 +* Require Dart 3.5 * Require `package:http` `^1.0.0`. ## 9.24.0 diff --git a/example/common.dart b/example/common.dart index 1564a6c3..e508d0ee 100644 --- a/example/common.dart +++ b/example/common.dart @@ -1,4 +1,5 @@ import 'dart:async'; +// ignore: deprecated_member_use import 'dart:html'; import 'package:github/github.dart'; @@ -13,7 +14,6 @@ export 'package:github/github.dart'; Future initViewSourceButton(String script) async { // query the DOM for the view source button, handle clicks document.querySelector('#view-source')?.onClick.listen((_) { - // ignore: unsafe_html final popup = window.open( 'https://github.com/SpinlockLabs/github.dart/blob/master/example/$script', 'View Source'); diff --git a/example/emoji.dart b/example/emoji.dart index 7604d461..663269dd 100644 --- a/example/emoji.dart +++ b/example/emoji.dart @@ -1,4 +1,5 @@ import 'dart:async'; +// ignore: deprecated_member_use import 'dart:html'; import 'common.dart'; diff --git a/example/index.dart b/example/index.dart index 42851c96..535acd07 100644 --- a/example/index.dart +++ b/example/index.dart @@ -1,4 +1,6 @@ +// ignore: deprecated_member_use import 'dart:html'; + import 'common.dart'; void main() { diff --git a/example/languages.dart b/example/languages.dart index 02da85e0..aa8b7ec1 100644 --- a/example/languages.dart +++ b/example/languages.dart @@ -1,3 +1,4 @@ +// ignore: deprecated_member_use import 'dart:html'; import 'common.dart'; @@ -34,7 +35,6 @@ void reloadTable({int accuracy = 4}) { isReloadingTable = true; final md = generateMarkdown(accuracy); github.misc.renderMarkdown(md).then((html) { - // ignore: unsafe_html tableDiv!.setInnerHtml(html, treeSanitizer: NodeTreeSanitizer.trusted); isReloadingTable = false; }); diff --git a/example/organization.dart b/example/organization.dart index ef7135f8..d11d0fdd 100644 --- a/example/organization.dart +++ b/example/organization.dart @@ -1,4 +1,5 @@ import 'dart:async'; +// ignore: deprecated_member_use import 'dart:html'; import 'common.dart'; diff --git a/example/pr.dart b/example/pr.dart index 15e18180..660d4c45 100644 --- a/example/pr.dart +++ b/example/pr.dart @@ -1,4 +1,5 @@ import 'dart:async'; +// ignore: deprecated_member_use import 'dart:html'; import 'common.dart'; diff --git a/example/readme.dart b/example/readme.dart index ad9ec300..1920cca4 100644 --- a/example/readme.dart +++ b/example/readme.dart @@ -1,3 +1,4 @@ +// ignore: deprecated_member_use import 'dart:html'; import 'common.dart'; diff --git a/example/release_notes.dart b/example/release_notes.dart index be929744..27835cdd 100644 --- a/example/release_notes.dart +++ b/example/release_notes.dart @@ -1,3 +1,4 @@ +// ignore: deprecated_member_use import 'dart:html'; import 'package:pub_semver/pub_semver.dart'; diff --git a/example/releases.dart b/example/releases.dart index ddd19570..c244c962 100644 --- a/example/releases.dart +++ b/example/releases.dart @@ -1,3 +1,4 @@ +// ignore: deprecated_member_use import 'dart:html'; import 'common.dart'; diff --git a/example/repos.dart b/example/repos.dart index e7b21da4..409417ab 100644 --- a/example/repos.dart +++ b/example/repos.dart @@ -1,4 +1,5 @@ import 'dart:async'; +// ignore: deprecated_member_use import 'dart:html'; import 'common.dart'; diff --git a/example/search.dart b/example/search.dart index 9ca8b0ac..aeee9cbb 100644 --- a/example/search.dart +++ b/example/search.dart @@ -1,4 +1,6 @@ +// ignore: deprecated_member_use import 'dart:html'; + import 'common.dart'; Future main() async { diff --git a/example/stars.dart b/example/stars.dart index 52a95e54..2bc50b4c 100644 --- a/example/stars.dart +++ b/example/stars.dart @@ -1,3 +1,4 @@ +// ignore: deprecated_member_use import 'dart:html'; import 'common.dart'; diff --git a/example/user_info.dart b/example/user_info.dart index 071c2820..656207b1 100644 --- a/example/user_info.dart +++ b/example/user_info.dart @@ -1,3 +1,4 @@ +// ignore: deprecated_member_use import 'dart:html'; import 'common.dart'; diff --git a/example/users.dart b/example/users.dart index ab75a061..003d3f5d 100644 --- a/example/users.dart +++ b/example/users.dart @@ -1,4 +1,5 @@ import 'dart:async'; +// ignore: deprecated_member_use import 'dart:html'; import 'common.dart'; diff --git a/example/zen.dart b/example/zen.dart index 2e4d8b57..34c55c87 100644 --- a/example/zen.dart +++ b/example/zen.dart @@ -1,4 +1,6 @@ +// ignore: deprecated_member_use import 'dart:html'; + import 'common.dart'; Future main() async { diff --git a/lib/browser_helper.dart b/lib/browser_helper.dart index 0d9af0f1..39ebd393 100644 --- a/lib/browser_helper.dart +++ b/lib/browser_helper.dart @@ -1,4 +1,6 @@ +// ignore: deprecated_member_use import 'dart:html'; + import 'package:github/src/common.dart'; /// Renders Markdown in HTML using the GitHub API @@ -24,7 +26,6 @@ void renderMarkdown(GitHub github, String selector, {int indent = 4}) { e.hidden = false; e.setAttribute('rendered', ''); e.classes.add('markdown-body'); - // ignore: unsafe_html e.setInnerHtml(html, treeSanitizer: NodeTreeSanitizer.trusted); }); } diff --git a/lib/hooks.dart b/lib/hooks.dart index 1a336ed2..19fc3fae 100644 --- a/lib/hooks.dart +++ b/lib/hooks.dart @@ -7,7 +7,6 @@ /// Add this import if you are in a non-web environment and writing something /// that uses github hooks. For more information, see github hooks documentation /// https://developer.github.com/v3/repos/hooks/ - -library hooks; +library; export 'src/server/xplat_server.dart'; diff --git a/lib/src/browser/xplat_browser.dart b/lib/src/browser/xplat_browser.dart index 71bed55a..c54a2530 100644 --- a/lib/src/browser/xplat_browser.dart +++ b/lib/src/browser/xplat_browser.dart @@ -1,4 +1,6 @@ +// ignore: deprecated_member_use import 'dart:html'; + import 'package:github/src/common.dart'; import 'package:github/src/common/xplat_common.dart' show findAuthenticationInMap; diff --git a/lib/src/common/activity_service.dart b/lib/src/common/activity_service.dart index f69e8c49..f97aefcf 100644 --- a/lib/src/common/activity_service.dart +++ b/lib/src/common/activity_service.dart @@ -329,7 +329,7 @@ class EventPoller { final List handledEvents = []; Timer? _timer; - StreamController? _controller; // ignore: close_sinks + StreamController? _controller; String? _lastFetched; diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index ef803ea0..e6ba64cb 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -190,7 +190,7 @@ class GitHub { /// /// The future will pass the object returned from this function to the then method. /// The default [convert] function returns the input object. - /// [body] is the data to send to the server. Pass in a List if you want to post binary body data. Everything else will have .toString() called on it and set as text content + /// [body] is the data to send to the server. Pass in a `List` if you want to post binary body data. Everything else will have .toString() called on it and set as text content /// [S] represents the input type. /// [T] represents the type return from this function after conversion Future postJSON( @@ -232,7 +232,7 @@ class GitHub { /// /// The future will pass the object returned from this function to the then method. /// The default [convert] function returns the input object. - /// [body] is the data to send to the server. Pass in a List if you want to post binary body data. Everything else will have .toString() called on it and set as text content + /// [body] is the data to send to the server. Pass in a `List` if you want to post binary body data. Everything else will have .toString() called on it and set as text content /// [S] represents the input type. /// [T] represents the type return from this function after conversion Future putJSON( @@ -274,7 +274,7 @@ class GitHub { /// /// The future will pass the object returned from this function to the then method. /// The default [convert] function returns the input object. - /// [body] is the data to send to the server. Pass in a List if you want to post binary body data. Everything else will have .toString() called on it and set as text content + /// [body] is the data to send to the server. Pass in a `List` if you want to post binary body data. Everything else will have .toString() called on it and set as text content /// [S] represents the input type. /// [T] represents the type return from this function after conversion Future patchJSON( @@ -343,7 +343,7 @@ class GitHub { /// [path] can either be a path like '/repos' or a full url. /// [headers] are HTTP Headers. If it doesn't exist, the 'Accept' and 'Authorization' headers are added. /// [params] are query string parameters. - /// [body] is the body content of requests that take content. Pass in a List if you want to post binary body data. Everything else will have .toString() called on it and set as text content + /// [body] is the body content of requests that take content. Pass in a `List` if you want to post binary body data. Everything else will have .toString() called on it and set as text content /// Future request( String method, diff --git a/lib/src/common/util/pagination.dart b/lib/src/common/util/pagination.dart index 95d47107..40cf621a 100644 --- a/lib/src/common/util/pagination.dart +++ b/lib/src/common/util/pagination.dart @@ -31,7 +31,6 @@ class PaginationHelper { var page = params['page'] ?? 1; params['page'] = page; - // ignore: literal_only_boolean_expressions while (true) { http.Response response; try { diff --git a/pubspec.yaml b/pubspec.yaml index 9b29ea72..b2f9b7f0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart environment: - sdk: ^3.1.0 + sdk: ^3.5.0 dependencies: http: ^1.0.0 @@ -19,7 +19,7 @@ dev_dependencies: collection: ^1.15.0 dependency_validator: ^3.0.0 json_serializable: ^6.6.1 - lints: ^4.0.0 + lints: ^5.0.0 mockito: ^5.3.2 nock: ^1.1.3 pub_semver: ^2.0.0 diff --git a/test/unit/orgs_service_test.dart b/test/unit/orgs_service_test.dart index 04fff9e1..9ba4ff3f 100644 --- a/test/unit/orgs_service_test.dart +++ b/test/unit/orgs_service_test.dart @@ -93,7 +93,6 @@ void main() { final github = GitHub(client: client); final organizationsService = OrganizationsService(github); - // ignore: omit_local_variable_types expect( () async => organizationsService.getTeamByName( 'flutter', 'flutter-programmers'), From d13786fb89e02266ae6c099bf3f0d79b4dc6eafe Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Thu, 17 Apr 2025 20:10:34 -0500 Subject: [PATCH 387/390] Fix pagination logic to use `next` link (#418) * Fix pagination logic to use `next` link Fixes https://github.com/SpinlockLabs/github.dart/issues/414 * Fix tests --- CHANGELOG.md | 3 ++- lib/src/common/util/pagination.dart | 6 ++---- pubspec.yaml | 2 +- test/common/repos_service_test.dart | 4 ++-- test/git_test.dart | 2 +- 5 files changed, 8 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e6bd14e..8c92ab04 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,8 @@ -## 9.25.0-wip +## 9.25.0 * Require Dart 3.5 * Require `package:http` `^1.0.0`. +* Fix pagination logic to use `next` link. ## 9.24.0 diff --git a/lib/src/common/util/pagination.dart b/lib/src/common/util/pagination.dart index 40cf621a..93f3a0d7 100644 --- a/lib/src/common/util/pagination.dart +++ b/lib/src/common/util/pagination.dart @@ -28,9 +28,6 @@ class PaginationHelper { params = Map.from(params); } - var page = params['page'] ?? 1; - params['page'] = page; - while (true) { http.Response response; try { @@ -70,7 +67,8 @@ class PaginationHelper { break; } - params['page'] = ++page; + path = next; + params = null; } } diff --git a/pubspec.yaml b/pubspec.yaml index b2f9b7f0..8168d555 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 9.25.0-wip +version: 9.25.0 description: A high-level GitHub API Client Library that uses Github's v3 API homepage: https://github.com/SpinlockLabs/github.dart diff --git a/test/common/repos_service_test.dart b/test/common/repos_service_test.dart index feebe05c..2f3f9120 100644 --- a/test/common/repos_service_test.dart +++ b/test/common/repos_service_test.dart @@ -16,7 +16,7 @@ void main() { test('listCommits', () async { final repositories = create((request) async { expect(request.url.path, '/repos/${slug.fullName}/commits'); - expect(request.url.query, 'page=1'); + expect(request.url.query, isEmpty); return Response(listCommits, StatusCodes.OK); }); @@ -29,7 +29,7 @@ void main() { expect(request.url.path, '/repos/${slug.fullName}/commits'); expect( request.url.query, - 'author=octocat&committer=octodog&sha=abc&path=%2Fpath&since=2022-02-22T00%3A00%3A00.000&until=2023-02-22T00%3A00%3A00.000&page=1', + 'author=octocat&committer=octodog&sha=abc&path=%2Fpath&since=2022-02-22T00%3A00%3A00.000&until=2023-02-22T00%3A00%3A00.000', ); return Response(listCommits, StatusCodes.OK); }); diff --git a/test/git_test.dart b/test/git_test.dart index 228b3a0b..e95ef5d6 100644 --- a/test/git_test.dart +++ b/test/git_test.dart @@ -172,7 +172,7 @@ void main() { test('code search', () async { nock(fakeApiUrl) .get( - '/search/code?q=search%20repo%3ASpinlockLabs%2Fgithub.dart%20in%3Afile&per_page=20&page=1') + '/search/code?q=search%20repo%3ASpinlockLabs%2Fgithub.dart%20in%3Afile&per_page=20') .reply(200, nocked.searchResults); final results = (await github.search From 4256ac1e8baeeca975b1d75abe60b0fbda73e001 Mon Sep 17 00:00:00 2001 From: "John \"codefu\" McDole" Date: Thu, 17 Apr 2025 18:11:11 -0700 Subject: [PATCH 388/390] Handle 'null' conclusion (#413) Creating a new concolusion with the GitHub API and then encoding that CheckRun to json adds: `"conclusion":"null"` to the json string; attempting to decode that throws an exception. Fixes #412 Co-authored-by: Rob Becker --- lib/src/common/model/checks.dart | 2 +- test/unit/checks_test.dart | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/src/common/model/checks.dart b/lib/src/common/model/checks.dart index 5068febc..b7666579 100644 --- a/lib/src/common/model/checks.dart +++ b/lib/src/common/model/checks.dart @@ -54,7 +54,7 @@ class CheckRunConclusion extends EnumWithValue { const CheckRunConclusion._(super.value); factory CheckRunConclusion._fromValue(String? value) { - if (value == null) { + if (value == null || value == 'null') { return empty; } for (final level in const [ diff --git a/test/unit/checks_test.dart b/test/unit/checks_test.dart index 8af59043..2eb7e6c4 100644 --- a/test/unit/checks_test.dart +++ b/test/unit/checks_test.dart @@ -100,6 +100,9 @@ const checkRunJson = '''{ const String expectedToString = '{"name":"mighty_readme","id":4,"external_id":"","status":"completed","head_sha":"","check_suite":{"id":5},"details_url":"https://example.com","started_at":"2018-05-04T01:14:52.000Z","conclusion":"neutral"}'; +const String newCheckRun = + '{"name":"New CheckRun","id":12345,"external_id":"","status":"queued","head_sha":"","check_suite":{"id":123456},"details_url":"https://example.com","started_at":"2024-12-05T01:05:24.000Z","conclusion":"null"}'; + void main() { group('Check run', () { test('CheckRun fromJson', () { @@ -110,6 +113,14 @@ void main() { expect(checkRun.conclusion, CheckRunConclusion.neutral); }); + test('CheckRun from freshly created and encoded', () { + final checkRun = CheckRun.fromJson(jsonDecode(newCheckRun)); + + expect(checkRun.id, 12345); + expect(checkRun.name, 'New CheckRun'); + expect(checkRun.conclusion, CheckRunConclusion.empty); + }); + test('CheckRun fromJson for skipped conclusion', () { /// The checkRun Json is the official Github values /// From 98f2e48df1736ec63ef48e086fefd4efbb522751 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 17 Apr 2025 19:16:11 -0600 Subject: [PATCH 389/390] Bump JamesIves/github-pages-deploy-action from 4.5.0 to 4.6.1 (#408) Bumps [JamesIves/github-pages-deploy-action](https://github.com/jamesives/github-pages-deploy-action) from 4.5.0 to 4.6.1. - [Release notes](https://github.com/jamesives/github-pages-deploy-action/releases) - [Commits](https://github.com/jamesives/github-pages-deploy-action/compare/v4.5.0...v4.6.1) --- updated-dependencies: - dependency-name: JamesIves/github-pages-deploy-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Rob Becker --- .github/workflows/publish_demos.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish_demos.yml b/.github/workflows/publish_demos.yml index 603b4a09..b6b6169e 100644 --- a/.github/workflows/publish_demos.yml +++ b/.github/workflows/publish_demos.yml @@ -24,7 +24,7 @@ jobs: rm build/example/packages - name: Publish 🚀 - uses: JamesIves/github-pages-deploy-action@v4.5.0 + uses: JamesIves/github-pages-deploy-action@v4.6.1 with: branch: gh-pages # The branch the action should deploy to. folder: build/example # The folder the action should deploy. From c3a02992b14d370ac8bd3ef2a09a588db2e2dbcb Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Thu, 17 Apr 2025 22:11:02 -0500 Subject: [PATCH 390/390] Drop mockito and rebuild (#419) --- lib/src/common/model/git.g.dart | 20 ++++++-------------- pubspec.yaml | 1 - 2 files changed, 6 insertions(+), 15 deletions(-) diff --git a/lib/src/common/model/git.g.dart b/lib/src/common/model/git.g.dart index e041aeb3..ccbb082b 100644 --- a/lib/src/common/model/git.g.dart +++ b/lib/src/common/model/git.g.dart @@ -95,20 +95,12 @@ GitCommitUser _$GitCommitUserFromJson(Map json) => json['date'] == null ? null : DateTime.parse(json['date'] as String), ); -Map _$GitCommitUserToJson(GitCommitUser instance) { - final val = {}; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('name', instance.name); - writeNotNull('email', instance.email); - writeNotNull('date', dateToGitHubIso8601(instance.date)); - return val; -} +Map _$GitCommitUserToJson(GitCommitUser instance) => + { + if (instance.name case final value?) 'name': value, + if (instance.email case final value?) 'email': value, + if (dateToGitHubIso8601(instance.date) case final value?) 'date': value, + }; GitTree _$GitTreeFromJson(Map json) => GitTree( json['sha'] as String?, diff --git a/pubspec.yaml b/pubspec.yaml index 8168d555..eed1fec4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -20,7 +20,6 @@ dev_dependencies: dependency_validator: ^3.0.0 json_serializable: ^6.6.1 lints: ^5.0.0 - mockito: ^5.3.2 nock: ^1.1.3 pub_semver: ^2.0.0 test: ^1.21.6 pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy