From 02b10aa904ed0ddc11c5fca8c32c741036d7016f Mon Sep 17 00:00:00 2001 From: tomyeh Date: Fri, 18 Mar 2016 12:20:44 +0800 Subject: [PATCH 001/496] Propogate error back to the caller --- lib/server.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/server.dart b/lib/server.dart index 1d04b783..67986266 100644 --- a/lib/server.dart +++ b/lib/server.dart @@ -117,8 +117,8 @@ class _IOClient extends http.Client { var resp = new http.Response(value, map, response.statusCode); completer.complete(resp); - }); - }); + }).catchError(completer.completeError); + }).catchError(completer.completeError); return completer.future; } From 91fc64c6004dbd6526347728cdbf16fe66ba2a90 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Mon, 29 Feb 2016 13:47:43 -0800 Subject: [PATCH 002/496] dartfmt --- example/common.dart | 11 +++++------ lib/common.dart | 9 ++------- lib/server.dart | 15 ++++----------- lib/src/common/explore_service.dart | 4 ++-- lib/src/common/github.dart | 6 ++++-- lib/src/common/orgs_service.dart | 6 +++--- lib/src/common/util/pagination.dart | 13 +++++++------ test/experiment/directcode_keys.dart | 2 +- test/git_test.dart | 5 +---- tool/hop_runner.dart | 6 ++++-- 10 files changed, 33 insertions(+), 44 deletions(-) diff --git a/example/common.dart b/example/common.dart index 2f66e4c8..67996ab4 100644 --- a/example/common.dart +++ b/example/common.dart @@ -24,8 +24,8 @@ void init(String script, {void onReady()}) { var ready = false; void sendCode() { - popup.postMessage( - {"command": "code", "code": code}, window.location.href); + popup + .postMessage({"command": "code", "code": code}, window.location.href); } window.addEventListener("message", (event) { @@ -52,10 +52,9 @@ Map queryString = GitHub _createGitHub() { initGitHub(); - return new GitHub( - auth: queryString["token"] != null - ? new Authentication.withToken(queryString["token"]) - : new Authentication.anonymous()); + return new GitHub(auth: queryString["token"] != null + ? new Authentication.withToken(queryString["token"]) + : new Authentication.anonymous()); } GitHub github = _createGitHub(); diff --git a/lib/common.dart b/lib/common.dart index bf7c3d3d..b829c9a1 100644 --- a/lib/common.dart +++ b/lib/common.dart @@ -6,13 +6,8 @@ library github.common; import "dart:async"; -import "dart:convert" show - JSON, - UTF8, - JsonEncoder, - JsonDecoder, - Utf8Encoder, - Utf8Decoder; +import "dart:convert" + show JSON, UTF8, JsonEncoder, JsonDecoder, Utf8Encoder, Utf8Decoder; import "package:crypto/crypto.dart" show CryptoUtils; import "package:html/parser.dart" as htmlParser; diff --git a/lib/server.dart b/lib/server.dart index 67986266..591f0bf4 100644 --- a/lib/server.dart +++ b/lib/server.dart @@ -50,12 +50,8 @@ const List COMMON_GITHUB_TOKEN_ENV_KEYS = const [ Authentication findAuthenticationFromEnvironment() { if (Platform.isMacOS) { try { - var result = Process.runSync("security", const [ - "find-internet-password", - "-g", - "-s", - "github.com" - ]); + var result = Process.runSync("security", + const ["find-internet-password", "-g", "-s", "github.com"]); if (result.exitCode != 0) { throw "Don't use keychain."; @@ -68,8 +64,7 @@ Authentication findAuthenticationFromEnvironment() { String password = result.stderr.toString().split("password:")[1].trim(); password = password.substring(1, password.length - 1); return new Authentication.basic(username.trim(), password.trim()); - } catch (e) { - } + } catch (e) {} } Map env = Platform.environment; @@ -82,9 +77,7 @@ Authentication findAuthenticationFromEnvironment() { if (env["GITHUB_USERNAME"] is String && env["GITHUB_PASSWORD"] is String) { return new Authentication.basic( - env["GITHUB_USERNAME"], - env["GITHUB_PASSWORD"] - ); + env["GITHUB_USERNAME"], env["GITHUB_PASSWORD"]); } return new Authentication.anonymous(); diff --git a/lib/src/common/explore_service.dart b/lib/src/common/explore_service.dart index 82b9386d..9f424b7a 100644 --- a/lib/src/common/explore_service.dart +++ b/lib/src/common/explore_service.dart @@ -12,8 +12,8 @@ class ExploreService extends Service { if (language != null) url += "?l=${language}"; - if (since != null) url += - language == null ? "?since=${since}" : "&since=${since}"; + if (since != null) + url += language == null ? "?since=${since}" : "&since=${since}"; var controller = new StreamController(); diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index d0687553..eeb2aed3 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -331,7 +331,8 @@ class GitHub { throw new InvalidJSON(this, message); } else if (message == "Body should be a JSON Hash") { throw new InvalidJSON(this, message); - } else throw new BadRequest(this); + } else + throw new BadRequest(this); break; case 422: var buff = new StringBuffer(); @@ -416,7 +417,8 @@ class GitHub { fail != null ? fail(response) : null; handleStatusCode(response); return null; - } else return response; + } else + return response; }); } diff --git a/lib/src/common/orgs_service.dart b/lib/src/common/orgs_service.dart index cf60d41a..9a6cec66 100644 --- a/lib/src/common/orgs_service.dart +++ b/lib/src/common/orgs_service.dart @@ -174,14 +174,14 @@ class OrganizationsService extends Service { var completer = new Completer(); _github.getJSON("/teams/${teamId}/memberships/${user}", statusCode: 200, - fail: (http.Response response) { + fail: (http.Response response) { if (response.statusCode == 404) { completer.complete(new TeamMembershipState(null)); } else { _github.handleStatusCode(response); } - }, convert: (json) => new TeamMembershipState(json['state'])) - .then(completer.complete); + }, convert: (json) => new TeamMembershipState(json['state'])).then( + completer.complete); return completer.future; } diff --git a/lib/src/common/util/pagination.dart b/lib/src/common/util/pagination.dart index c918462a..0b5ad422 100644 --- a/lib/src/common/util/pagination.dart +++ b/lib/src/common/util/pagination.dart @@ -92,11 +92,12 @@ class PaginationHelper { int statusCode: 200, String preview}) { return jsonObjects(method, path, - pages: pages, - headers: headers, - params: params, - body: body, - statusCode: statusCode, - preview: preview).map(converter); + pages: pages, + headers: headers, + params: params, + body: body, + statusCode: statusCode, + preview: preview) + .map(converter); } } diff --git a/test/experiment/directcode_keys.dart b/test/experiment/directcode_keys.dart index dc05e5b1..1969d66b 100755 --- a/test/experiment/directcode_keys.dart +++ b/test/experiment/directcode_keys.dart @@ -4,7 +4,7 @@ import "package:quiver/async.dart"; main() async { var github = createGitHubClient(); - + github.organizations.get("DirectMyFile").then((organization) { return github.organizations.listTeams(organization.name).toList(); }).then((teams) { diff --git a/test/git_test.dart b/test/git_test.dart index 8ff6c5af..9455ad3a 100644 --- a/test/git_test.dart +++ b/test/git_test.dart @@ -10,10 +10,7 @@ import 'package:test/test.dart'; import 'helper.dart'; -class MockGitHub extends MockWithNamedArgs implements GitHub { - // This removes the compiler warning. - noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); -} +class MockGitHub extends MockWithNamedArgs implements GitHub {} main() { MockGitHub github; diff --git a/tool/hop_runner.dart b/tool/hop_runner.dart index 506eff6f..380f6f6f 100755 --- a/tool/hop_runner.dart +++ b/tool/hop_runner.dart @@ -17,8 +17,10 @@ void main(List args) { addTask("analyze", createAnalyzerTask(getvar("analyzer.files").map(parse_config_value))); addTask("version", createVersionTask()); - addTask("publish", - createProcessTask("pub", args: ["publish", "-f"], description: "Publishes a New Version"), + addTask( + "publish", + createProcessTask("pub", + args: ["publish", "-f"], description: "Publishes a New Version"), dependencies: ["version"]); addTask("bench", createBenchTask()); addTask( From c06a8cdf5a7702b405bd6ee8e0729abf54d6266e Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Mon, 29 Feb 2016 14:04:42 -0800 Subject: [PATCH 003/496] Removed a number of top-level methods that should just be helpers --- CHANGELOG.md | 4 + lib/common.dart | 2 + lib/src/common/util/utils.dart | 119 +---------------------------- lib/src/util.dart | 111 +++++++++++++++++++++++++++ pubspec.yaml | 2 +- test/experiment/fancy_numbers.dart | 2 +- test/experiment/link_header.dart | 2 +- test/git_test.dart | 1 + 8 files changed, 122 insertions(+), 121 deletions(-) create mode 100644 lib/src/util.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index 432599d1..4bfc046c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## v3.0.0 + +- *BREAKING* Removed a number of top-level methods from the public API. + ## v2.3.2 - Automatically attempt to find GitHub user information in the process environment when running on the standalone VM. diff --git a/lib/common.dart b/lib/common.dart index b829c9a1..bb759947 100644 --- a/lib/common.dart +++ b/lib/common.dart @@ -19,6 +19,8 @@ import "package:xml/xml.dart" as xml; import "http.dart" as http; +import 'src/util.dart'; + part "src/common/github.dart"; // Util diff --git a/lib/src/common/util/utils.dart b/lib/src/common/util/utils.dart index 958b4a8d..9699953a 100644 --- a/lib/src/common/util/utils.dart +++ b/lib/src/common/util/utils.dart @@ -26,129 +26,12 @@ class OnlyWhen { const OnlyWhen(this.condition); } -/// Internal method to handle null for parsing dates. -DateTime parseDateTime(String input) { - if (input == null) { - return null; - } - - return DateTime.parse(input); -} - /// Converts the [date] to GitHub's ISO-8601 format: /// /// The format is "YYYY-MM-DDTHH:mm:ssZ" String dateToGitHubIso8601(DateTime date) { // Regex removes the milliseconds. - return date.toUtc().toIso8601String().replaceAll(_GITHUB_DATE_REMOVE, ''); -} - -final RegExp _GITHUB_DATE_REMOVE = new RegExp(r'\.\d*'); - -String buildQueryString(Map params) { - var queryString = new StringBuffer(); - - if (params.isNotEmpty && !params.values.every((value) => value == null)) { - queryString.write("?"); - } - - var i = 0; - for (var 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 new List.from(input); - } else if (input is Map) { - return new Map.from(input); - } else { - throw "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; - } -} - -//TODO(kevmoo): use regex here. -Map parseLinkHeader(String input) { - var out = {}; - var parts = input.split(", "); - for (var part in parts) { - if (part[0] != "<") { - throw new FormatException("Invalid Link Header"); - } - var kv = part.split("; "); - var url = kv[0].substring(1); - url = url.substring(0, url.length - 1); - var key = kv[1]; - key = key.replaceAll('"', "").substring(4); - out[key] = url; - } - return out; -} - -String fullNameFromRepoApiUrl(String url) { - var split = url.split("/"); - return split[4] + "/" + split[5]; -} - -class MapEntry { - final K key; - final V value; - - MapEntry(this.key, this.value); -} - -List> mapToList(Map input) { - var out = []; - for (var key in input.keys) { - out.add(new MapEntry(key, input[key])); - } - return out; -} - -int parseFancyNumber(String input) { - input = input.trim(); - if (input.contains(",")) input = input.replaceAll(",", ""); - - var 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)); - input = input.substring(0, input.length - m.length); - value = num.parse(input) * multipliers[m]; - } - - return value; -} - -//TODO(kevmoo) Hide this. Should not be visible. -Map createNonNullMap(Map input) { - var map = {}; - for (var key in input.keys) { - if (input[key] != null) { - map[key] = input[key]; - } - } - return map; + return date.toUtc().toIso8601String().replaceAll(GITHUB_DATE_REMOVE, ''); } RepositorySlug slugFromAPIUrl(String url) { diff --git a/lib/src/util.dart b/lib/src/util.dart new file mode 100644 index 00000000..59718f21 --- /dev/null +++ b/lib/src/util.dart @@ -0,0 +1,111 @@ +final RegExp GITHUB_DATE_REMOVE = new RegExp(r'\.\d*'); + +String buildQueryString(Map params) { + var queryString = new StringBuffer(); + + if (params.isNotEmpty && !params.values.every((value) => value == null)) { + queryString.write("?"); + } + + var i = 0; + for (var 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 new List.from(input); + } else if (input is Map) { + return new Map.from(input); + } else { + throw "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; + } +} + +//TODO(kevmoo): use regex here. +Map parseLinkHeader(String input) { + var out = {}; + var parts = input.split(", "); + for (var part in parts) { + if (part[0] != "<") { + throw new FormatException("Invalid Link Header"); + } + var kv = part.split("; "); + var url = kv[0].substring(1); + url = url.substring(0, url.length - 1); + var key = kv[1]; + key = key.replaceAll('"', "").substring(4); + out[key] = url; + } + return out; +} + +List> mapToList(Map input) { + var out = []; + for (var key in input.keys) { + out.add(new MapEntry(key, input[key])); + } + 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) { + return null; + } + + return DateTime.parse(input); +} + +Map createNonNullMap(Map input) { + var map = {}; + for (var key in input.keys) { + if (input[key] != null) { + map[key] = input[key]; + } + } + return map; +} + +// TODO: only used in test – delete? +int parseFancyNumber(String input) { + input = input.trim(); + if (input.contains(",")) input = input.replaceAll(",", ""); + + var 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)); + input = input.substring(0, input.length - m.length); + value = num.parse(input) * multipliers[m]; + } + + return value; +} diff --git a/pubspec.yaml b/pubspec.yaml index 6a9187fa..f0bd8462 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 2.3.1+1 +version: 3.0.0-dev author: Kenneth Endfinger description: GitHub API Client Library homepage: https://github.com/DirectMyFile/github.dart diff --git a/test/experiment/fancy_numbers.dart b/test/experiment/fancy_numbers.dart index cf1bd06c..f7d5bee8 100644 --- a/test/experiment/fancy_numbers.dart +++ b/test/experiment/fancy_numbers.dart @@ -1,4 +1,4 @@ -import "package:github/common.dart"; +import "package:github/src/util.dart"; void main() { test("1k", 1000); diff --git a/test/experiment/link_header.dart b/test/experiment/link_header.dart index d154e82b..3d750174 100644 --- a/test/experiment/link_header.dart +++ b/test/experiment/link_header.dart @@ -1,4 +1,4 @@ -import 'package:github/common.dart'; +import 'package:github/src/util.dart'; void main() { var it = parseLinkHeader( diff --git a/test/git_test.dart b/test/git_test.dart index 9455ad3a..f9d6f66b 100644 --- a/test/git_test.dart +++ b/test/git_test.dart @@ -4,6 +4,7 @@ import 'dart:async'; import 'dart:convert' show JSON; import 'package:github/common.dart'; +import 'package:github/src/util.dart'; import 'package:github/http.dart' as http; import 'package:mock/mock.dart'; import 'package:test/test.dart'; From 0fb4d1d8b9a8d1687fc7b1548b976b5f8d88773b Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Mon, 29 Feb 2016 15:31:25 -0800 Subject: [PATCH 004/496] Add named 'labels' argument to issue queries --- lib/src/common/issues_service.dart | 44 ++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/lib/src/common/issues_service.dart b/lib/src/common/issues_service.dart index aa60cb30..b36e257a 100644 --- a/lib/src/common/issues_service.dart +++ b/lib/src/common/issues_service.dart @@ -17,9 +17,10 @@ class IssuesService extends Service { String direction, String sort, DateTime since, - int perPage}) { - return _listIssues("/issues", - milestoneNumber, state, direction, sort, since, perPage); + int perPage, + List labels}) { + return _listIssues("/issues", milestoneNumber, state, direction, sort, + since, perPage, labels); } /// List all issues across owned and member repositories for the authenticated @@ -32,9 +33,10 @@ class IssuesService extends Service { String direction, String sort, DateTime since, - int perPage}) { - return _listIssues("/user/issues", - milestoneNumber, state, direction, sort, since, perPage); + int perPage, + List labels}) { + return _listIssues("/user/issues", milestoneNumber, state, direction, sort, + since, perPage, labels); } /// List all issues for a given organization for the authenticated user. @@ -46,9 +48,10 @@ class IssuesService extends Service { String direction, String sort, DateTime since, - int perPage}) { - return _listIssues("/orgs/${org}/issues", - milestoneNumber, state, direction, sort, since, perPage); + int perPage, + List labels}) { + return _listIssues("/orgs/${org}/issues", milestoneNumber, state, direction, + sort, since, perPage, labels); } /// Lists the issues for the specified repository. @@ -62,14 +65,21 @@ class IssuesService extends Service { String direction, String sort, DateTime since, - int perPage}) { - return _listIssues("/repos/${slug.fullName}/issues", - milestoneNumber, state, direction, sort, since, perPage); + 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) { + Stream _listIssues( + String pathSegment, + int milestoneNumber, + String state, + String direction, + String sort, + DateTime since, + int perPage, + List labels) { var params = {}; if (perPage != null) { @@ -103,6 +113,10 @@ class IssuesService extends Service { params['since'] = since.toUtc().toIso8601String(); } + if (labels != null && labels.isNotEmpty) { + params['labels'] = labels.join(','); + } + return new PaginationHelper(_github) .objects("GET", pathSegment, Issue.fromJSON, params: params); } From 57209df69e5fb87d842a6112d7d4eecac17c070d Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Sun, 24 Apr 2016 15:07:12 -0700 Subject: [PATCH 005/496] tiny cleanup using async/await --- lib/common.dart | 3 +-- lib/src/common/github.dart | 2 +- lib/src/common/issues_service.dart | 19 ++++++++++--------- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/common.dart b/lib/common.dart index bb759947..7d7ef0b1 100644 --- a/lib/common.dart +++ b/lib/common.dart @@ -6,8 +6,7 @@ library github.common; import "dart:async"; -import "dart:convert" - show JSON, UTF8, JsonEncoder, JsonDecoder, Utf8Encoder, Utf8Decoder; +import "dart:convert" show JSON, UTF8; import "package:crypto/crypto.dart" show CryptoUtils; import "package:html/parser.dart" as htmlParser; diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index eeb2aed3..70c0ea00 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -314,7 +314,7 @@ class GitHub { */ void handleStatusCode(http.Response response) { String message; - List errors; + List> errors; if (response.headers['content-type'].contains('application/json')) { var json = response.asJSON(); message = json['message']; diff --git a/lib/src/common/issues_service.dart b/lib/src/common/issues_service.dart index b36e257a..d36eb688 100644 --- a/lib/src/common/issues_service.dart +++ b/lib/src/common/issues_service.dart @@ -266,10 +266,11 @@ class IssuesService extends Service { /// Deletes a label. /// /// API docs: https://developer.github.com/v3/issues/labels/#delete-a-label - Future deleteLabel(RepositorySlug slug, String name) { - return _github - .request("DELETE", "/repos/${slug.fullName}/labels/${name}") - .then((response) => response.statusCode == StatusCodes.NO_CONTENT); + Future deleteLabel(RepositorySlug slug, String name) async { + var response = await _github.request( + "DELETE", "/repos/${slug.fullName}/labels/${name}"); + + return response.statusCode == StatusCodes.NO_CONTENT; } /// Lists all labels for an issue. @@ -310,11 +311,11 @@ 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) { - return _github - .request("DELETE", - "/repos/${slug.fullName}/issues/${issueNumber}/labels/${label}") - .then((response) => response.statusCode == StatusCodes.NO_CONTENT); + RepositorySlug slug, int issueNumber, String label) async { + var response = await _github.request("DELETE", + "/repos/${slug.fullName}/issues/${issueNumber}/labels/${label}"); + + return response.statusCode == StatusCodes.OK; } /// Removes all labels for an issue. From effe7f6ad1731007405919c72a942efc7239899e Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Tue, 28 Jun 2016 11:57:35 -0700 Subject: [PATCH 006/496] Removed dependency on pkg/crypto Use BASE64 which was introduced in Dart 1.13 --- lib/common.dart | 4 +--- lib/src/common/github.dart | 3 ++- lib/src/common/model/repos_contents.dart | 3 +-- lib/src/common/util/encoding_utils.dart | 13 ------------- pubspec.yaml | 3 +-- 5 files changed, 5 insertions(+), 21 deletions(-) delete mode 100644 lib/src/common/util/encoding_utils.dart diff --git a/lib/common.dart b/lib/common.dart index 7d7ef0b1..c3454187 100644 --- a/lib/common.dart +++ b/lib/common.dart @@ -6,8 +6,7 @@ library github.common; import "dart:async"; -import "dart:convert" show JSON, UTF8; -import "package:crypto/crypto.dart" show CryptoUtils; +import "dart:convert" show BASE64, JSON, UTF8; import "package:html/parser.dart" as htmlParser; import "package:html/dom.dart" as html; @@ -24,7 +23,6 @@ part "src/common/github.dart"; // Util part "src/common/util/auth.dart"; -part "src/common/util/encoding_utils.dart"; part "src/common/util/json.dart"; part "src/common/util/oauth2.dart"; part "src/common/util/errors.dart"; diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index 70c0ea00..326d03bc 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -380,7 +380,8 @@ class GitHub { if (auth.isToken) { headers.putIfAbsent("Authorization", () => "token ${auth.token}"); } else if (auth.isBasic) { - var userAndPass = utf8ToBase64('${auth.username}:${auth.password}'); + var userAndPass = + BASE64.encode(UTF8.encode('${auth.username}:${auth.password}')); headers.putIfAbsent("Authorization", () => "basic ${userAndPass}"); } diff --git a/lib/src/common/model/repos_contents.dart b/lib/src/common/model/repos_contents.dart index f57375ba..06e17a91 100644 --- a/lib/src/common/model/repos_contents.dart +++ b/lib/src/common/model/repos_contents.dart @@ -38,8 +38,7 @@ class GitHubFile { /// Text Content String get text { if (_text == null) { - _text = - new String.fromCharCodes(CryptoUtils.base64StringToBytes(content)); + _text = UTF8.decode(BASE64.decode(content)); } return _text; } diff --git a/lib/src/common/util/encoding_utils.dart b/lib/src/common/util/encoding_utils.dart deleted file mode 100644 index fd42a784..00000000 --- a/lib/src/common/util/encoding_utils.dart +++ /dev/null @@ -1,13 +0,0 @@ -part of github.common; - -/// Converts from a Base64 String to a UTF-8 String. -String base64ToUtf8(String base64) { - var bytes = CryptoUtils.base64StringToBytes(base64); - return UTF8.decode(bytes); -} - -/// Converts a UTF-8 String to a Base64 String. -String utf8ToBase64(String utf8) { - var bytes = UTF8.encode(utf8); - return CryptoUtils.bytesToBase64(bytes); -} diff --git a/pubspec.yaml b/pubspec.yaml index f0bd8462..6250c301 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,9 +4,8 @@ author: Kenneth Endfinger description: GitHub API Client Library homepage: https://github.com/DirectMyFile/github.dart environment: - sdk: '>=1.9.0 <2.0.0' + sdk: '>=1.13.0 <2.0.0' dependencies: - crypto: '^0.9.0' html: '^0.12.0' quiver: '>=0.20.0 <0.25.0' xml: '^2.0.0' From 20d9755ad6015c21a5ae1fc22c424a017864c6b3 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Fri, 12 Aug 2016 19:02:05 -0700 Subject: [PATCH 007/496] a bit of formatting --- example/common.dart | 7 ++++--- example/releases.dart | 1 + example/user_info.dart | 1 + lib/src/common/repos_service.dart | 4 +++- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/example/common.dart b/example/common.dart index 67996ab4..bf5d6c6d 100644 --- a/example/common.dart +++ b/example/common.dart @@ -52,9 +52,10 @@ Map queryString = GitHub _createGitHub() { initGitHub(); - return new GitHub(auth: queryString["token"] != null - ? new Authentication.withToken(queryString["token"]) - : new Authentication.anonymous()); + return new GitHub( + auth: queryString["token"] != null + ? new Authentication.withToken(queryString["token"]) + : new Authentication.anonymous()); } GitHub github = _createGitHub(); diff --git a/example/releases.dart b/example/releases.dart index a5c56027..539cdd61 100644 --- a/example/releases.dart +++ b/example/releases.dart @@ -32,6 +32,7 @@ void loadReleases() { rel.appendHtml("
${key}: ${value}", treeSanitizer: NodeTreeSanitizer.trusted); } + append("Tag", '${release.tagName}'); append("Download", 'TAR | ZIP'); diff --git a/example/user_info.dart b/example/user_info.dart index f631c59b..e3c70f28 100644 --- a/example/user_info.dart +++ b/example/user_info.dart @@ -41,6 +41,7 @@ void loadUser() { """); } } + append("Biography", user.bio); append("Company", user.company); append("Email", user.email); diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 393b2ed9..221507ef 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -39,7 +39,9 @@ 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,}; + var params = { + "type": type, + }; return new PaginationHelper(_github).objects( "GET", "/orgs/${org}/repos", Repository.fromJSON, From 2e5f6884e7321b04e599de4963b98f325c64d455 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Fri, 12 Aug 2016 19:10:46 -0700 Subject: [PATCH 008/496] use a bit of async --- lib/src/common/github.dart | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index 326d03bc..ff6cf688 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -370,7 +370,7 @@ class GitHub { String body, int statusCode, void fail(http.Response response), - String preview}) { + String preview}) async { if (headers == null) headers = {}; if (preview != null) { @@ -409,18 +409,17 @@ class GitHub { url.write(queryString); } - return client - .request(new http.Request(url.toString(), - method: method, headers: headers, body: body)) - .then((response) { - _updateRateLimit(response.headers); - if (statusCode != null && statusCode != response.statusCode) { - fail != null ? fail(response) : null; - handleStatusCode(response); - return null; - } else - return response; - }); + var request = new http.Request(url.toString(), + method: method, headers: headers, body: body); + + var response = await client.request(request); + _updateRateLimit(response.headers); + if (statusCode != null && statusCode != response.statusCode) { + fail != null ? fail(response) : null; + handleStatusCode(response); + return null; + } else + return response; } /** From 22efad6d6a6638b94a2348254e190090e7ea8f56 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Fri, 12 Aug 2016 19:26:16 -0700 Subject: [PATCH 009/496] Fix test and GitBlob content storage --- lib/src/common/model/git.dart | 2 +- test/git_integration_test.dart | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/src/common/model/git.dart b/lib/src/common/model/git.dart index 8fe4b524..76dfa47c 100644 --- a/lib/src/common/model/git.dart +++ b/lib/src/common/model/git.dart @@ -12,7 +12,7 @@ class GitBlob { if (input == null) return null; return new GitBlob() - ..content = input['content'] + ..content = (input['content'] as String)?.trim() // includes newline? ..encoding = input['encoding'] ..url = input['url'] ..sha = input['sha'] diff --git a/test/git_integration_test.dart b/test/git_integration_test.dart index ef3a504f..fca421d8 100644 --- a/test/git_integration_test.dart +++ b/test/git_integration_test.dart @@ -1,5 +1,7 @@ library github.test.integration.git_integration_test; +import 'dart:convert'; + import 'package:github/server.dart'; import 'package:test/test.dart'; @@ -43,7 +45,9 @@ main() { var fetchedBlob = await github.git.getBlob(slug, createdBlobSha); - expect(base64ToUtf8(fetchedBlob.content), equals('bbb')); + var base64Decoded = BASE64.decode(fetchedBlob.content); + + expect(UTF8.decode(base64Decoded), equals('bbb')); expect(fetchedBlob.encoding, equals('base64')); expect( fetchedBlob.url, From 8b0a9d3d5c194e5efb182ff2bffceb3d3bbe8632 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Sat, 13 Aug 2016 12:30:08 -0700 Subject: [PATCH 010/496] Remove home-grown http API (pkg/http is pretty nice) --- lib/browser.dart | 33 +++-------------------- lib/common.dart | 4 +-- lib/http.dart | 11 -------- lib/server.dart | 41 ++--------------------------- lib/src/common/blog_service.dart | 2 +- lib/src/common/explore_service.dart | 10 +++---- lib/src/common/gists_service.dart | 2 +- lib/src/common/github.dart | 23 +++++++++------- lib/src/common/misc_service.dart | 4 +-- lib/src/common/orgs_service.dart | 2 +- lib/src/common/repos_service.dart | 2 +- lib/src/common/util/oauth2.dart | 5 ++-- lib/src/common/util/pagination.dart | 2 +- lib/src/http/client.dart | 29 -------------------- lib/src/http/request.dart | 10 ------- lib/src/http/response.dart | 11 -------- pubspec.yaml | 1 + test/git_integration_test.dart | 2 +- test/git_test.dart | 8 +++--- test/helper.dart | 2 +- test/helper/http.dart | 8 +++--- 21 files changed, 46 insertions(+), 166 deletions(-) delete mode 100644 lib/http.dart delete mode 100644 lib/src/http/client.dart delete mode 100644 lib/src/http/request.dart delete mode 100644 lib/src/http/response.dart diff --git a/lib/browser.dart b/lib/browser.dart index 97447138..d1078bbf 100644 --- a/lib/browser.dart +++ b/lib/browser.dart @@ -6,42 +6,17 @@ */ library github.browser; -import "dart:async"; -import "dart:html"; +import 'dart:html' hide Client; + +import 'package:http/http.dart'; import "common.dart"; -import "http.dart" as http; export "common.dart"; part "src/browser/helper.dart"; -class _BrowserHttpClient extends http.Client { - @override - Future request(http.Request request) { - var req = new HttpRequest(); - var completer = new Completer(); - - req.open(request.method, request.url); - - if (request.headers != null) { - for (var header in request.headers.keys) { - req.setRequestHeader(header, request.headers[header]); - } - } - - req.onLoadEnd.listen((event) { - completer.complete( - new http.Response(req.responseText, req.responseHeaders, req.status)); - }); - - req.send(request.body); - - return completer.future; - } -} - void initGitHub() { - GitHub.defaultClient = () => new _BrowserHttpClient(); + GitHub.defaultClient = () => new Client(); } /** diff --git a/lib/common.dart b/lib/common.dart index c3454187..22ccfef6 100644 --- a/lib/common.dart +++ b/lib/common.dart @@ -11,12 +11,12 @@ import "dart:convert" show BASE64, JSON, UTF8; import "package:html/parser.dart" as htmlParser; import "package:html/dom.dart" as html; +import "package:http/http.dart" as http; + import "package:quiver/async.dart" show FutureGroup; import "package:xml/xml.dart" as xml; -import "http.dart" as http; - import 'src/util.dart'; part "src/common/github.dart"; diff --git a/lib/http.dart b/lib/http.dart deleted file mode 100644 index 07e971a3..00000000 --- a/lib/http.dart +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Cross-Platform HTTP Client Abstraction - */ -library github.http; - -import "dart:async"; -import "dart:convert"; - -part "src/http/client.dart"; -part "src/http/request.dart"; -part "src/http/response.dart"; diff --git a/lib/server.dart b/lib/server.dart index 591f0bf4..49351f55 100644 --- a/lib/server.dart +++ b/lib/server.dart @@ -10,12 +10,12 @@ import "dart:convert"; import "common.dart"; export "common.dart"; -import "http.dart" as http; +import "package:http/http.dart" as http; part "src/server/hooks.dart"; void initGitHub() { - GitHub.defaultClient = () => new _IOClient(); + GitHub.defaultClient = () => new http.IOClient(); } /** @@ -82,40 +82,3 @@ Authentication findAuthenticationFromEnvironment() { return new Authentication.anonymous(); } - -class _IOClient extends http.Client { - final HttpClient client; - - _IOClient() : client = new HttpClient(); - - @override - Future request(http.Request request) { - var completer = new Completer(); - client.openUrl(request.method, Uri.parse(request.url)).then((req) { - request.headers.forEach(req.headers.set); - // TODO (marcojakob): The DateTime.timeZoneName is currently not correctly - // implemented: https://code.google.com/p/dart/issues/detail?id=17085 - // Once this issue is resolved, we can reenable setting this header. - // req.headers.set("Time-Zone", timezoneName); - - if (request.body != null) { - req.write(request.body); - } - return req.close(); - }).then((response) { - response.transform(const Utf8Decoder()).join().then((value) { - var map = {}; - - response.headers.forEach((key, value) => map[key] = value.first); - - var resp = new http.Response(value, map, response.statusCode); - completer.complete(resp); - }).catchError(completer.completeError); - }).catchError(completer.completeError); - - return completer.future; - } - - @override - void close() => client.close(); -} diff --git a/lib/src/common/blog_service.dart b/lib/src/common/blog_service.dart index b76bd4d6..9173b962 100644 --- a/lib/src/common/blog_service.dart +++ b/lib/src/common/blog_service.dart @@ -7,7 +7,7 @@ class BlogService extends Service { /// Returns a stream of blog posts for the specified [url]. Stream listPosts([String url = "https://github.com/blog.atom"]) { var controller = new StreamController(); - _github.client.request(new http.Request(url)).then((response) { + _github.client.get(url).then((response) { var document = xml.parse(response.body); var entries = document.rootElement.findElements("entry"); diff --git a/lib/src/common/explore_service.dart b/lib/src/common/explore_service.dart index 9f424b7a..33de7ef0 100644 --- a/lib/src/common/explore_service.dart +++ b/lib/src/common/explore_service.dart @@ -17,7 +17,7 @@ class ExploreService extends Service { var controller = new StreamController(); - _github.client.request(new http.Request(url)).then((response) { + _github.client.get(url).then((response) { var doc = htmlParser.parse(response.body); var items = doc.querySelectorAll( "li.repo-leaderboard-list-item.leaderboard-list-item"); @@ -47,7 +47,7 @@ class ExploreService extends Service { Future getShowcase(ShowcaseInfo info) { var completer = new Completer(); - _github.client.request(new http.Request(info.url)).then((response) { + _github.client.get(info.url).then((response) { var doc = htmlParser.parse(response.body); var showcase = new Showcase(); @@ -125,7 +125,7 @@ class ExploreService extends Service { didFetchMore = true; GitHub .defaultClient() - .request(new http.Request(link.attributes['href'])) + .get(link.attributes['href']) .then(handleResponse); } } @@ -135,9 +135,7 @@ class ExploreService extends Service { } }; - _github.client - .request(new http.Request("https://github.com/showcases")) - .then(handleResponse); + _github.client.get("https://github.com/showcases").then(handleResponse); return controller.stream; } diff --git a/lib/src/common/gists_service.dart b/lib/src/common/gists_service.dart index ed4cb1ef..2fc51758 100644 --- a/lib/src/common/gists_service.dart +++ b/lib/src/common/gists_service.dart @@ -141,7 +141,7 @@ class GistsService extends Service { return _github .request("POST", "/gists/${id}/forks", statusCode: 201) .then((response) { - return Gist.fromJSON(response.asJSON()); + return Gist.fromJSON(JSON.decode(response.body)); }); } diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index ff6cf688..03106a29 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -286,7 +286,7 @@ class GitHub { Map params, JSONConverter convert, body, - String preview}) { + String preview}) async { if (headers == null) headers = {}; if (preview != null) { @@ -299,14 +299,13 @@ class GitHub { headers.putIfAbsent("Accept", () => "application/vnd.github.v3+json"); - return request("POST", path, + var response = await request("POST", path, headers: headers, params: params, body: body, statusCode: statusCode, - fail: fail).then((response) { - return convert(JSON.decode(response.body)); - }); + fail: fail); + return convert(JSON.decode(response.body)); } /** @@ -316,7 +315,7 @@ class GitHub { String message; List> errors; if (response.headers['content-type'].contains('application/json')) { - var json = response.asJSON(); + var json = JSON.decode(response.body); message = json['message']; errors = json['errors']; } @@ -409,10 +408,16 @@ class GitHub { url.write(queryString); } - var request = new http.Request(url.toString(), - method: method, headers: headers, body: body); + var request = new http.Request(method, Uri.parse(url.toString())); + request.headers.addAll(headers); + if (body != null) { + request.body = body; + } + + var streamedResponse = await client.send(request); + + var response = await http.Response.fromStream(streamedResponse); - var response = await client.request(request); _updateRateLimit(response.headers); if (statusCode != null && statusCode != response.statusCode) { fail != null ? fail(response) : null; diff --git a/lib/src/common/misc_service.dart b/lib/src/common/misc_service.dart index 3d81c1f7..3fffed70 100644 --- a/lib/src/common/misc_service.dart +++ b/lib/src/common/misc_service.dart @@ -76,8 +76,8 @@ class MiscService extends Service { var u = "http://feeds.feedburner.com/Octocats.xml"; _github.client - .request(new http.Request( - "${cors ? "http://whateverorigin.org/get?url=" : ""}${cors ? Uri.encodeComponent(u) : u}")) + .get( + "${cors ? "http://whateverorigin.org/get?url=" : ""}${cors ? Uri.encodeComponent(u) : u}") .then((response) { var document = htmlParser.parse(response.body); document.querySelectorAll("entry").forEach((entry) { diff --git a/lib/src/common/orgs_service.dart b/lib/src/common/orgs_service.dart index 9a6cec66..368c03e5 100644 --- a/lib/src/common/orgs_service.dart +++ b/lib/src/common/orgs_service.dart @@ -200,7 +200,7 @@ class OrganizationsService extends Service { _github.handleStatusCode(response); } }).then((response) { - return new TeamMembershipState(response.asJSON()["state"]); + return new TeamMembershipState(JSON.decode(response.body)["state"]); }).then(completer.complete); return completer.future; diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 221507ef..d8cf3d29 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -361,7 +361,7 @@ class RepositoriesService extends Service { .request("DELETE", "/repos/${slug.fullName}/contents/${path}", body: JSON.encode(map), statusCode: 200) .then((response) { - return ContentCreation.fromJSON(response.asJSON()); + return ContentCreation.fromJSON(JSON.decode(response.body)); }); } diff --git a/lib/src/common/util/oauth2.dart b/lib/src/common/util/oauth2.dart index 7a7ca391..d97873a8 100644 --- a/lib/src/common/util/oauth2.dart +++ b/lib/src/common/util/oauth2.dart @@ -80,10 +80,9 @@ class OAuth2Flow { }); return (github == null ? GitHub.defaultClient() : github.client) - .request(new http.Request("${baseUrl}/access_token", - body: body, method: "POST", headers: headers)) + .post("${baseUrl}/access_token", body: body, headers: headers) .then((response) { - var json = response.asJSON(); + var json = JSON.decode(response.body); if (json['error'] != null) { throw json; } diff --git a/lib/src/common/util/pagination.dart b/lib/src/common/util/pagination.dart index 0b5ad422..fd905f55 100644 --- a/lib/src/common/util/pagination.dart +++ b/lib/src/common/util/pagination.dart @@ -76,7 +76,7 @@ class PaginationHelper { params: params, body: body, statusCode: statusCode)) { - var json = response.asJSON() as List; + var json = JSON.decode(response.body) as List; for (var item in json) { yield item; diff --git a/lib/src/http/client.dart b/lib/src/http/client.dart deleted file mode 100644 index 743aaa44..00000000 --- a/lib/src/http/client.dart +++ /dev/null @@ -1,29 +0,0 @@ -part of github.http; - -abstract class Client { - Future request(Request request); - - Future get(String url, {Map headers}) { - return request(new Request(url, method: "GET", headers: headers)); - } - - Future post(String url, {body, Map headers}) { - return request( - new Request(url, method: "POST", headers: headers, body: body)); - } - - Future put(String url, {body, Map headers}) { - return request( - new Request(url, method: "PUT", headers: headers, body: body)); - } - - Future delete(String url, {Map headers}) { - return request(new Request(url, method: "DELETE", headers: headers)); - } - - Future head(String url, {Map headers}) { - return request(new Request(url, method: "HEAD", headers: headers)); - } - - void close() => null; -} diff --git a/lib/src/http/request.dart b/lib/src/http/request.dart deleted file mode 100644 index eefab0cb..00000000 --- a/lib/src/http/request.dart +++ /dev/null @@ -1,10 +0,0 @@ -part of github.http; - -class Request { - final String url; - final String method; - final String body; - final Map headers; - - Request(this.url, {this.method: "GET", this.body, this.headers: const {}}); -} diff --git a/lib/src/http/response.dart b/lib/src/http/response.dart deleted file mode 100644 index 2a173da1..00000000 --- a/lib/src/http/response.dart +++ /dev/null @@ -1,11 +0,0 @@ -part of github.http; - -class Response { - final String body; - final Map headers; - final int statusCode; - - Response(this.body, this.headers, this.statusCode); - - dynamic asJSON() => const JsonDecoder().convert(body); -} diff --git a/pubspec.yaml b/pubspec.yaml index 6250c301..a1c02ed5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -7,6 +7,7 @@ environment: sdk: '>=1.13.0 <2.0.0' dependencies: html: '^0.12.0' + http: '^0.11.3' quiver: '>=0.20.0 <0.25.0' xml: '^2.0.0' dev_dependencies: diff --git a/test/git_integration_test.dart b/test/git_integration_test.dart index fca421d8..50f22b3d 100644 --- a/test/git_integration_test.dart +++ b/test/git_integration_test.dart @@ -37,7 +37,7 @@ main() { }); test('create and get a new blob', () async { - CreateGitBlob newBlob = new CreateGitBlob('bbb', 'utf-8'); + var newBlob = new CreateGitBlob('bbb', 'utf-8'); // createBlob() var createdBlob = await github.git.createBlob(slug, newBlob); diff --git a/test/git_test.dart b/test/git_test.dart index f9d6f66b..080e91e9 100644 --- a/test/git_test.dart +++ b/test/git_test.dart @@ -5,7 +5,7 @@ import 'dart:convert' show JSON; import 'package:github/common.dart'; import 'package:github/src/util.dart'; -import 'package:github/http.dart' as http; +import "package:http/http.dart" as http; import 'package:mock/mock.dart'; import 'package:test/test.dart'; @@ -146,7 +146,7 @@ main() { group('editReference()', () { test('constructs correct path', () { // given - http.Response res = new http.Response('{}', null, null); + http.Response res = new http.Response('{}', 200); github .when(callsTo('request', anything, anything)) .alwaysReturn(new Future.value(res)); @@ -162,7 +162,7 @@ main() { test('creates valid JSON body', () { // given - http.Response res = new http.Response('{}', null, null); + http.Response res = new http.Response('{}', 200); github .when(callsTo('request', anything, anything)) .alwaysReturn(new Future.value(res)); @@ -184,7 +184,7 @@ main() { group('deleteReference()', () { test('constructs correct path', () { // given - http.Response res = new http.Response('{}', null, null); + http.Response res = new http.Response('{}', 200); github .when(callsTo('request', anything, anything)) .alwaysReturn(new Future.value(res)); diff --git a/test/helper.dart b/test/helper.dart index fa6fe475..7060835d 100644 --- a/test/helper.dart +++ b/test/helper.dart @@ -4,7 +4,7 @@ import 'dart:async'; import 'dart:convert'; import 'dart:io'; -import 'package:github/http.dart' as http; +import "package:http/http.dart" as http; import 'package:github/server.dart'; import 'package:mock/mock.dart'; import 'package:test/test.dart'; diff --git a/test/helper/http.dart b/test/helper/http.dart index 6244da3e..e2147811 100644 --- a/test/helper/http.dart +++ b/test/helper/http.dart @@ -4,13 +4,13 @@ final MockHTTPClient httpClient = new MockHTTPClient(); typedef http.Response ResponseCreator(http.Request request); -class MockHTTPClient extends http.Client { +class MockHTTPClient extends http.BaseClient { final Map responses = {}; @override - Future request(http.Request request) { + Future send(http.Request request) { var creator = responses.keys.firstWhere( - (it) => it.allMatches(request.url).isNotEmpty, + (it) => it.allMatches(request.url.toString()).isNotEmpty, orElse: () => null); if (creator == null) { throw new Exception("No Response Configured"); @@ -21,7 +21,7 @@ class MockHTTPClient extends http.Client { class MockResponse extends http.Response { MockResponse(String body, Map headers, int statusCode) - : super(body, headers, statusCode); + : super(body, statusCode, headers: headers); factory MockResponse.fromAsset(String name) { Map responseData = From 2c235a73e2ccde359bafd1c3249055fecda249b9 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Sat, 13 Aug 2016 12:33:27 -0700 Subject: [PATCH 011/496] cleanup parts, imports, exports --- lib/browser.dart | 1 + lib/common.dart | 42 +++++++++++++++++------------------------- lib/markdown.dart | 4 ++-- lib/server.dart | 7 ++++--- 4 files changed, 24 insertions(+), 30 deletions(-) diff --git a/lib/browser.dart b/lib/browser.dart index d1078bbf..45bb9260 100644 --- a/lib/browser.dart +++ b/lib/browser.dart @@ -11,6 +11,7 @@ import 'dart:html' hide Client; import 'package:http/http.dart'; import "common.dart"; + export "common.dart"; part "src/browser/helper.dart"; diff --git a/lib/common.dart b/lib/common.dart index 22ccfef6..074e6fa7 100644 --- a/lib/common.dart +++ b/lib/common.dart @@ -8,46 +8,23 @@ library github.common; import "dart:async"; import "dart:convert" show BASE64, JSON, UTF8; -import "package:html/parser.dart" as htmlParser; import "package:html/dom.dart" as html; - +import "package:html/parser.dart" as htmlParser; import "package:http/http.dart" as http; - import "package:quiver/async.dart" show FutureGroup; - import "package:xml/xml.dart" as xml; import 'src/util.dart'; -part "src/common/github.dart"; - -// Util -part "src/common/util/auth.dart"; -part "src/common/util/json.dart"; -part "src/common/util/oauth2.dart"; -part "src/common/util/errors.dart"; -part "src/common/util/pagination.dart"; -part "src/common/util/service.dart"; -part "src/common/util/utils.dart"; -part "src/common/util/crawler.dart"; - -// Services part "src/common/activity_service.dart"; part "src/common/authorizations_service.dart"; part "src/common/blog_service.dart"; part "src/common/explore_service.dart"; part "src/common/gists_service.dart"; part "src/common/git_service.dart"; +part "src/common/github.dart"; part "src/common/issues_service.dart"; part "src/common/misc_service.dart"; -part "src/common/orgs_service.dart"; -part "src/common/pulls_service.dart"; -part "src/common/repos_service.dart"; -part "src/common/search_service.dart"; -part "src/common/url_shortener_service.dart"; -part "src/common/users_service.dart"; - -// Models part "src/common/model/activity.dart"; part "src/common/model/authorizations.dart"; part "src/common/model/blog.dart"; @@ -72,3 +49,18 @@ part "src/common/model/repos_stats.dart"; part "src/common/model/repos_statuses.dart"; part "src/common/model/search.dart"; part "src/common/model/users.dart"; +part "src/common/orgs_service.dart"; +part "src/common/pulls_service.dart"; +part "src/common/repos_service.dart"; +part "src/common/search_service.dart"; +part "src/common/url_shortener_service.dart"; +part "src/common/users_service.dart"; +part "src/common/util/auth.dart"; +part "src/common/util/crawler.dart"; +part "src/common/util/errors.dart"; +part "src/common/util/json.dart"; +part "src/common/util/oauth2.dart"; +part "src/common/util/pagination.dart"; +part "src/common/util/service.dart"; +part "src/common/util/utils.dart"; + diff --git a/lib/markdown.dart b/lib/markdown.dart index 7b7d0ce8..6bc8e499 100644 --- a/lib/markdown.dart +++ b/lib/markdown.dart @@ -7,7 +7,7 @@ library github.markdown; import "package:quiver/strings.dart"; +part "src/markdown/code.dart"; +part "src/markdown/lists.dart"; part "src/markdown/tables.dart"; part "src/markdown/text.dart"; -part "src/markdown/lists.dart"; -part "src/markdown/code.dart"; diff --git a/lib/server.dart b/lib/server.dart index 49351f55..5a150384 100644 --- a/lib/server.dart +++ b/lib/server.dart @@ -4,13 +4,14 @@ library github.server; import "dart:async"; -import "dart:io"; import "dart:convert"; +import "dart:io"; + +import "package:http/http.dart" as http; import "common.dart"; -export "common.dart"; -import "package:http/http.dart" as http; +export "common.dart"; part "src/server/hooks.dart"; From ba0f3d5f74bb52ccf1b4afcd784252709d9ff750 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Sat, 13 Aug 2016 12:45:16 -0700 Subject: [PATCH 012/496] A bunch of cleanup and removal --- CHANGELOG.md | 2 + lib/browser.dart | 16 +--- lib/common.dart | 66 ------------- lib/dates.dart | 144 ---------------------------- lib/markdown.dart | 13 --- lib/server.dart | 16 +--- lib/src/browser/helper.dart | 4 +- lib/src/common.dart | 65 +++++++++++++ lib/src/common/explore_service.dart | 8 +- lib/src/common/github.dart | 7 +- lib/src/common/util/oauth2.dart | 2 +- lib/src/markdown/code.dart | 9 -- lib/src/markdown/lists.dart | 16 ---- lib/src/markdown/tables.dart | 33 ------- lib/src/markdown/text.dart | 26 ----- lib/src/server/hooks.dart | 6 +- test/experiment/api_urls.dart | 2 +- test/experiment/ati.dart | 19 ---- test/experiment/crawler.dart | 2 - test/experiment/dates.dart | 6 -- test/experiment/files.dart | 2 - test/git_test.dart | 2 +- test/helper/mock.dart | 1 - test/util_test.dart | 2 +- 24 files changed, 90 insertions(+), 379 deletions(-) delete mode 100644 lib/common.dart delete mode 100644 lib/dates.dart delete mode 100644 lib/markdown.dart create mode 100644 lib/src/common.dart delete mode 100644 lib/src/markdown/code.dart delete mode 100644 lib/src/markdown/lists.dart delete mode 100644 lib/src/markdown/tables.dart delete mode 100644 lib/src/markdown/text.dart delete mode 100755 test/experiment/ati.dart delete mode 100644 test/experiment/dates.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index 4bfc046c..6edc34c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ ## v3.0.0 - *BREAKING* Removed a number of top-level methods from the public API. +- *BREAKING* Removed `markdown.dart` library – use the `markdown` package instead. +- *BREAKING* Removed the `dates.dart` library. ## v2.3.2 diff --git a/lib/browser.dart b/lib/browser.dart index 45bb9260..fa26ad4f 100644 --- a/lib/browser.dart +++ b/lib/browser.dart @@ -6,25 +6,15 @@ */ library github.browser; -import 'dart:html' hide Client; +import "src/common.dart"; -import 'package:http/http.dart'; - -import "common.dart"; - -export "common.dart"; - -part "src/browser/helper.dart"; - -void initGitHub() { - GitHub.defaultClient = () => new Client(); -} +export "src/browser/helper.dart"; +export "src/common.dart"; /** * Creates a GitHub Client */ GitHub createGitHubClient( {Authentication auth, String endpoint: "https://api.github.com"}) { - initGitHub(); return new GitHub(auth: auth, endpoint: endpoint); } diff --git a/lib/common.dart b/lib/common.dart deleted file mode 100644 index 074e6fa7..00000000 --- a/lib/common.dart +++ /dev/null @@ -1,66 +0,0 @@ -/** - * The Core of GitHub for Dart. - * - * Contains the Models and other GitHub stuff. - */ -library github.common; - -import "dart:async"; -import "dart:convert" show BASE64, JSON, UTF8; - -import "package:html/dom.dart" as html; -import "package:html/parser.dart" as htmlParser; -import "package:http/http.dart" as http; -import "package:quiver/async.dart" show FutureGroup; -import "package:xml/xml.dart" as xml; - -import 'src/util.dart'; - -part "src/common/activity_service.dart"; -part "src/common/authorizations_service.dart"; -part "src/common/blog_service.dart"; -part "src/common/explore_service.dart"; -part "src/common/gists_service.dart"; -part "src/common/git_service.dart"; -part "src/common/github.dart"; -part "src/common/issues_service.dart"; -part "src/common/misc_service.dart"; -part "src/common/model/activity.dart"; -part "src/common/model/authorizations.dart"; -part "src/common/model/blog.dart"; -part "src/common/model/explore.dart"; -part "src/common/model/gists.dart"; -part "src/common/model/git.dart"; -part "src/common/model/issues.dart"; -part "src/common/model/keys.dart"; -part "src/common/model/misc.dart"; -part "src/common/model/notifications.dart"; -part "src/common/model/orgs.dart"; -part "src/common/model/pulls.dart"; -part "src/common/model/repos.dart"; -part "src/common/model/repos_commits.dart"; -part "src/common/model/repos_contents.dart"; -part "src/common/model/repos_forks.dart"; -part "src/common/model/repos_hooks.dart"; -part "src/common/model/repos_merging.dart"; -part "src/common/model/repos_pages.dart"; -part "src/common/model/repos_releases.dart"; -part "src/common/model/repos_stats.dart"; -part "src/common/model/repos_statuses.dart"; -part "src/common/model/search.dart"; -part "src/common/model/users.dart"; -part "src/common/orgs_service.dart"; -part "src/common/pulls_service.dart"; -part "src/common/repos_service.dart"; -part "src/common/search_service.dart"; -part "src/common/url_shortener_service.dart"; -part "src/common/users_service.dart"; -part "src/common/util/auth.dart"; -part "src/common/util/crawler.dart"; -part "src/common/util/errors.dart"; -part "src/common/util/json.dart"; -part "src/common/util/oauth2.dart"; -part "src/common/util/pagination.dart"; -part "src/common/util/service.dart"; -part "src/common/util/utils.dart"; - diff --git a/lib/dates.dart b/lib/dates.dart deleted file mode 100644 index 869923cc..00000000 --- a/lib/dates.dart +++ /dev/null @@ -1,144 +0,0 @@ -/** - * Date and Time Utilities - */ -library github.dates; - -/** - * Creates a Friendly Date and Time - */ -String friendlyDateTime(DateTime time) { - return "${friendlyDate(time)} at ${friendlyTime(time)}"; -} - -/** - * Creates a Friendly Date String - */ -String friendlyDate(DateTime time) { - return "${monthName(time.month)} ${time.day}${friendlyDaySuffix(time.day)}, ${time.year}"; -} - -/** - * Creates a Friendly Time String - */ -String friendlyTime(DateTime time) { - var suffix = time.hour >= 12 ? "PM" : "AM"; - var hour = ((time.hour + 11) % 12 + 1); - - return "${hour}:${time.minute}:${friendlySecond(time.second)} ${suffix} (in ${time.timeZoneName})"; -} - -/** - * Creates a friendly second string - */ -String friendlySecond(int second) { - if (second > 9) { - return second.toString(); - } else { - return "0${second}"; - } -} - -/** - * Creates a Friendly Day Suffix - */ -String friendlyDaySuffix(int day) { - switch (day) { - case 1: - case 21: - case 31: - return "st"; - case 2: - case 22: - return "nd"; - case 3: - case 23: - return "rd"; - default: - return "th"; - } -} - -/** - * Gets the Day Name - */ -String dayName(int number) { - switch (number) { - case DateTime.SUNDAY: - return "Sunday"; - case DateTime.MONDAY: - return "Monday"; - case DateTime.TUESDAY: - return "Tuesday"; - case DateTime.WEDNESDAY: - return "Wednesday"; - case DateTime.THURSDAY: - return "Thursday"; - case DateTime.FRIDAY: - return "Friday"; - case DateTime.SATURDAY: - return "Saturday"; - default: - throw "Should never happen."; - } -} - -/** - * Gets a Month Name - */ -String monthName(int number) { - switch (number) { - case 1: - return "January"; - case 2: - return "Feburary"; - case 3: - return "March"; - case 4: - return "April"; - case 5: - return "May"; - case 6: - return "June"; - case 7: - return "July"; - case 8: - return "August"; - case 9: - return "September"; - case 10: - return "October"; - case 11: - return "November"; - case 12: - return "December"; - } - return "(not a month?)"; -} - -DateTime now() => new DateTime.now(); - -DateTime offsetDay(DateTime original, int days) { - if (days.isNegative) { - return original.subtract(new Duration(days: days.abs())); - } else { - return original.add(new Duration(days: days)); - } -} - -DateTime yesterday() => offsetDay(now(), -1); -DateTime tomorrow() => offsetDay(now(), 1); - -DateTime offsetTimezone(DateTime other) { - var offset = now().timeZoneOffset; - return offsetDay(other, offset.inDays); -} - -String _timezoneName; - -String get timezoneName { - if (_timezoneName == null) { - _timezoneName = new DateTime.now().timeZoneName; - } - - return _timezoneName; -} diff --git a/lib/markdown.dart b/lib/markdown.dart deleted file mode 100644 index 6bc8e499..00000000 --- a/lib/markdown.dart +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Helper for Creating Markdown in a programmatic way. - * - * For rendering Markdown, see the GitHub class. - */ -library github.markdown; - -import "package:quiver/strings.dart"; - -part "src/markdown/code.dart"; -part "src/markdown/lists.dart"; -part "src/markdown/tables.dart"; -part "src/markdown/text.dart"; diff --git a/lib/server.dart b/lib/server.dart index 5a150384..5971843e 100644 --- a/lib/server.dart +++ b/lib/server.dart @@ -3,21 +3,12 @@ */ library github.server; -import "dart:async"; -import "dart:convert"; import "dart:io"; -import "package:http/http.dart" as http; +import "src/common.dart"; -import "common.dart"; - -export "common.dart"; - -part "src/server/hooks.dart"; - -void initGitHub() { - GitHub.defaultClient = () => new http.IOClient(); -} +export "src/common.dart"; +export "src/server/hooks.dart"; /** * Creates a GitHub Client. @@ -31,7 +22,6 @@ GitHub createGitHubClient( auth = findAuthenticationFromEnvironment(); } - initGitHub(); return new GitHub(auth: auth, endpoint: endpoint); } diff --git a/lib/src/browser/helper.dart b/lib/src/browser/helper.dart index eec1cd34..b9144ff6 100644 --- a/lib/src/browser/helper.dart +++ b/lib/src/browser/helper.dart @@ -1,4 +1,6 @@ -part of github.browser; +import 'dart:html' hide Client; + +import '../common.dart'; /** * Browser-Specific Helpers diff --git a/lib/src/common.dart b/lib/src/common.dart new file mode 100644 index 00000000..749dd800 --- /dev/null +++ b/lib/src/common.dart @@ -0,0 +1,65 @@ +/** + * The Core of GitHub for Dart. + * + * Contains the Models and other GitHub stuff. + */ +library github.common; + +import "dart:async"; +import "dart:convert" show BASE64, JSON, UTF8; + +import "package:html/dom.dart" as html; +import "package:html/parser.dart" as htmlParser; +import "package:http/http.dart" as http; +import "package:quiver/async.dart" show FutureGroup; +import "package:xml/xml.dart" as xml; + +import 'util.dart'; + +part "common/activity_service.dart"; +part "common/authorizations_service.dart"; +part "common/blog_service.dart"; +part "common/explore_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/blog.dart"; +part "common/model/explore.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_releases.dart"; +part "common/model/repos_stats.dart"; +part "common/model/repos_statuses.dart"; +part "common/model/search.dart"; +part "common/model/users.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/pagination.dart"; +part "common/util/service.dart"; +part "common/util/utils.dart"; diff --git a/lib/src/common/explore_service.dart b/lib/src/common/explore_service.dart index 33de7ef0..aee0b357 100644 --- a/lib/src/common/explore_service.dart +++ b/lib/src/common/explore_service.dart @@ -123,10 +123,10 @@ class ExploreService extends Service { for (var link in links) { if (link.text.contains("Next")) { didFetchMore = true; - GitHub - .defaultClient() - .get(link.attributes['href']) - .then(handleResponse); + + var client = new http.Client(); + + client.get(link.attributes['href']).then(handleResponse); } } diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index 03106a29..6260be40 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -15,11 +15,6 @@ class GitHub { static const _ratelimitResetHeader = 'x-ratelimit-reset'; static const _ratelimitRemainingHeader = 'x-ratelimit-remaining'; - /** - * Default Client Creator - */ - static ClientCreator defaultClient; - /** * Authentication Information */ @@ -89,7 +84,7 @@ class GitHub { this.endpoint: "https://api.github.com", http.Client client}) : this.auth = auth == null ? new Authentication.anonymous() : auth, - this.client = client == null ? defaultClient() : client; + this.client = client == null ? new http.Client() : client; /// Service for activity related methods of the GitHub API. ActivityService get activity { diff --git a/lib/src/common/util/oauth2.dart b/lib/src/common/util/oauth2.dart index d97873a8..12fa1504 100644 --- a/lib/src/common/util/oauth2.dart +++ b/lib/src/common/util/oauth2.dart @@ -79,7 +79,7 @@ class OAuth2Flow { "redirect_uri": redirectUri }); - return (github == null ? GitHub.defaultClient() : github.client) + return (github == null ? new http.Client() : github.client) .post("${baseUrl}/access_token", body: body, headers: headers) .then((response) { var json = JSON.decode(response.body); diff --git a/lib/src/markdown/code.dart b/lib/src/markdown/code.dart deleted file mode 100644 index 67b9ec01..00000000 --- a/lib/src/markdown/code.dart +++ /dev/null @@ -1,9 +0,0 @@ -part of github.markdown; - -String code(String code, {String language}) { - var buff = new StringBuffer(); - buff.writeln("```${language != null ? language: ""}"); - buff.writeln(code); - buff.writeln("```"); - return buff.toString(); -} diff --git a/lib/src/markdown/lists.dart b/lib/src/markdown/lists.dart deleted file mode 100644 index c5711348..00000000 --- a/lib/src/markdown/lists.dart +++ /dev/null @@ -1,16 +0,0 @@ -part of github.markdown; - -String list(List items, {bool ordered: false}) { - var buff = new StringBuffer(); - if (ordered) { - for (var i = 0; i < items.length; i++) { - var number = i + 1; - buff.writeln("${number}. ${items[i]}"); - } - } else { - for (var item in items) { - buff.writeln("- ${item}"); - } - } - return buff.toString(); -} diff --git a/lib/src/markdown/tables.dart b/lib/src/markdown/tables.dart deleted file mode 100644 index e9e7945f..00000000 --- a/lib/src/markdown/tables.dart +++ /dev/null @@ -1,33 +0,0 @@ -part of github.markdown; - -String table(List> data) { - var buff = new StringBuffer(); - var columns = new Set(); - data.forEach((row) => columns.addAll(row.keys)); - var p = []; - var fm = true; - for (var column in columns) { - if (fm) { - buff.write("|"); - p.add("|"); - fm = false; - } - buff.write(" ${column} |"); - p.add("${repeat("-", column.length + 2)}|"); - } - buff.writeln(); - buff.writeln(p.join()); - data.forEach((row) { - var values = row.values; - var fa = true; - for (var value in values) { - if (fa) { - buff.write("|"); - fa = false; - } - buff.write(" ${value} |"); - } - buff.writeln(); - }); - return buff.toString(); -} diff --git a/lib/src/markdown/text.dart b/lib/src/markdown/text.dart deleted file mode 100644 index 29da24b3..00000000 --- a/lib/src/markdown/text.dart +++ /dev/null @@ -1,26 +0,0 @@ -part of github.markdown; - -String heading(String text, {int level: 1}) { - if (level < 1 || level > 6) { - throw new RangeError.range(level, 1, 6); - } - return "${repeat("#", level)} ${text}"; -} - -String paragraph(String text) => "\n${text}\n"; - -String link(String name, String link) => "[${name}](${link})"; - -String bold(String text) => "**${text}**"; - -String italics(String text) => "*${text}*"; - -String strikethrough(String text) => "~~${text}~~"; - -String blockquote(String text) => "> ${text}"; - -String html(String code) => code; - -String line() => "\n"; - -String rule() => "---"; diff --git a/lib/src/server/hooks.dart b/lib/src/server/hooks.dart index 3e439e44..02f1e7d5 100644 --- a/lib/src/server/hooks.dart +++ b/lib/src/server/hooks.dart @@ -1,4 +1,8 @@ -part of github.server; +import "dart:async"; +import "dart:convert"; +import "dart:io"; + +import "../common.dart"; class HookMiddleware { final StreamController _eventController = diff --git a/test/experiment/api_urls.dart b/test/experiment/api_urls.dart index 6cb6fc36..94840e9e 100644 --- a/test/experiment/api_urls.dart +++ b/test/experiment/api_urls.dart @@ -1,4 +1,4 @@ -import "package:github/common.dart"; +import "package:github/src/common.dart"; void main() { print(slugFromAPIUrl("https://api.github.com/repos/DirectMyFile/irc.dart")); diff --git a/test/experiment/ati.dart b/test/experiment/ati.dart deleted file mode 100755 index cd05a8f3..00000000 --- a/test/experiment/ati.dart +++ /dev/null @@ -1,19 +0,0 @@ -import "package:github/server.dart"; -import "package:github/dates.dart"; - -void main() { - var slug = new RepositorySlug("DirectMyFile", "github.dart"); - var github = createGitHubClient(); - - github.repositories.getRepository(slug).then((repository) { - print("Name: ${repository.name}"); - print("Description: ${repository.description}"); - print("Owner: ${repository.owner.login}"); - print("Stars: ${repository.stargazersCount}"); - print("Watchers: ${repository.subscribersCount}"); - print("Language: ${repository.language}"); - print("Default Branch: ${repository.defaultBranch}"); - print("Created At: ${friendlyDateTime(repository.createdAt)}"); - print("Last Pushed At: ${friendlyDateTime(repository.pushedAt)}"); - }).then((_) => github.dispose()); -} diff --git a/test/experiment/crawler.dart b/test/experiment/crawler.dart index 622ec92e..a52454ab 100644 --- a/test/experiment/crawler.dart +++ b/test/experiment/crawler.dart @@ -1,8 +1,6 @@ import "package:github/server.dart"; void main() { - initGitHub(); - var github = new GitHub(auth: new Authentication.anonymous()); var crawler = new RepositoryCrawler( diff --git a/test/experiment/dates.dart b/test/experiment/dates.dart deleted file mode 100644 index 26877825..00000000 --- a/test/experiment/dates.dart +++ /dev/null @@ -1,6 +0,0 @@ -import "package:github/dates.dart"; - -void main() { - print("Solving Today"); - print(dayName(new DateTime.now().weekday)); -} diff --git a/test/experiment/files.dart b/test/experiment/files.dart index b152b082..31fc0ca4 100755 --- a/test/experiment/files.dart +++ b/test/experiment/files.dart @@ -1,8 +1,6 @@ import "package:github/server.dart"; void main() { - initGitHub(); - var github = new GitHub(); github.repositories diff --git a/test/git_test.dart b/test/git_test.dart index 080e91e9..afa8f7cf 100644 --- a/test/git_test.dart +++ b/test/git_test.dart @@ -3,7 +3,7 @@ library github.test.git_test; import 'dart:async'; import 'dart:convert' show JSON; -import 'package:github/common.dart'; +import 'package:github/src/common.dart'; import 'package:github/src/util.dart'; import "package:http/http.dart" as http; import 'package:mock/mock.dart'; diff --git a/test/helper/mock.dart b/test/helper/mock.dart index bde8a261..918c8b81 100644 --- a/test/helper/mock.dart +++ b/test/helper/mock.dart @@ -1,7 +1,6 @@ part of github.test.helper; GitHub createMockGitHub() { - initGitHub(); return new GitHub(client: httpClient); } diff --git a/test/util_test.dart b/test/util_test.dart index 19f65216..ccd3ff6e 100644 --- a/test/util_test.dart +++ b/test/util_test.dart @@ -2,7 +2,7 @@ library github.test.util_test; import "helper.dart"; -import "package:github/common.dart"; +import "package:github/src/common.dart"; import "package:test/test.dart"; main() { From 4965b420e7295686873382bfd20ecbd44cde0e6e Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Sun, 28 Aug 2016 12:36:44 -0700 Subject: [PATCH 013/496] =?UTF-8?q?Remove=20pkg/hop=20=E2=80=93=C2=A0updat?= =?UTF-8?q?e=20pkg/html=20dependency?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pubspec.yaml | 4 +--- tool/analyze.dart | 11 ---------- tool/hop_runner.dart | 35 ------------------------------- tool/version.dart | 50 -------------------------------------------- 4 files changed, 1 insertion(+), 99 deletions(-) delete mode 100644 tool/analyze.dart delete mode 100755 tool/hop_runner.dart delete mode 100644 tool/version.dart diff --git a/pubspec.yaml b/pubspec.yaml index a1c02ed5..d7a59797 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -6,13 +6,11 @@ homepage: https://github.com/DirectMyFile/github.dart environment: sdk: '>=1.13.0 <2.0.0' dependencies: - html: '^0.12.0' + html: '>=0.12.0 <0.14.0' http: '^0.11.3' quiver: '>=0.20.0 <0.25.0' xml: '^2.0.0' dev_dependencies: browser: '^0.10.0+2' - hop: '^0.32.0' mock: '^0.12.0' test: '^0.12.0' - yaml: '^2.0.0' diff --git a/tool/analyze.dart b/tool/analyze.dart deleted file mode 100644 index 027fb6f4..00000000 --- a/tool/analyze.dart +++ /dev/null @@ -1,11 +0,0 @@ -part of hop_runner; - -Task createAnalyzerTask(Iterable files, [Iterable extra_args]) { - var args = []; - args.addAll(files); - if (extra_args != null) { - args.addAll(extra_args); - } - return createProcessTask("dartanalyzer", - args: args, description: "Statically Analyze Code"); -} diff --git a/tool/hop_runner.dart b/tool/hop_runner.dart deleted file mode 100755 index 380f6f6f..00000000 --- a/tool/hop_runner.dart +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env dart -library hop_runner; - -import 'dart:async'; -import "dart:io"; - -import 'package:hop/hop.dart'; -import 'package:hop/hop_tasks.dart' hide createAnalyzerTask; -import 'package:yaml/yaml.dart'; - -part 'version.dart'; -part 'analyze.dart'; -part 'config.dart'; - -void main(List args) { - init(); - addTask("analyze", - createAnalyzerTask(getvar("analyzer.files").map(parse_config_value))); - addTask("version", createVersionTask()); - addTask( - "publish", - createProcessTask("pub", - args: ["publish", "-f"], description: "Publishes a New Version"), - dependencies: ["version"]); - addTask("bench", createBenchTask()); - addTask( - "test", - createProcessTask("dart", - args: ["--checked", getvar("test.file")], - description: "Runs Unit Tests")); - addChainedTask( - "check", getvar("check.tasks").map(parse_config_value).toList(), - description: "Runs the Dart Analyzer and Unit Tests"); - runHop(args); -} diff --git a/tool/version.dart b/tool/version.dart deleted file mode 100644 index 09c0a9ae..00000000 --- a/tool/version.dart +++ /dev/null @@ -1,50 +0,0 @@ -part of hop_runner; - -var VERSION_REGEX = new RegExp(r"^(\d+)\.(\d+)\.(\d+)$"); - -Task createVersionTask() { - return new Task((TaskContext ctx) { - var file = new File("pubspec.yaml"); - return new Future(() { - var content = file.readAsStringSync(); - var pubspec = loadYaml(content); - var old = pubspec["version"]; - var readme = new File("README.md"); - - var next = null; - - if (ctx.arguments.rest.length != 1) { - try { - next = incrementVersion(old); - } catch (e) { - ctx.fail("${e}"); - return; - } - } else { - next = ctx.arguments.rest[0]; - } - - content = content.replaceAll(old, next); - readme.writeAsStringSync(readme.readAsStringSync().replaceAll(old, next)); - file.writeAsStringSync(content); - ctx.info("Updated Version: v${old} => v${next}"); - }); - }, description: "Updates the Version"); -} - -String incrementVersion(String old) { - if (!VERSION_REGEX.hasMatch(old)) { - throw new Exception("the version in the pubspec is not a valid version"); - } - var match = VERSION_REGEX.firstMatch(old); - int major = int.parse(match[1]); - int minor = int.parse(match[2]); - int bugfix = int.parse(match[3]); - if (bugfix == 9) { - bugfix = 0; - minor++; - } else { - bugfix++; - } - return "${major}.${minor}.${bugfix}"; -} From c43983acc8f4d3411bf4c3f5563adb46dcf73a8c Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Sun, 28 Aug 2016 14:55:25 -0700 Subject: [PATCH 014/496] prepare to publish 3.0.0 --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index d7a59797..cb0bd534 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 3.0.0-dev +version: 3.0.0 author: Kenneth Endfinger description: GitHub API Client Library homepage: https://github.com/DirectMyFile/github.dart From ffc27b3927fa417f5e3a0c66912bb86d5329d921 Mon Sep 17 00:00:00 2001 From: Kenneth Endfinger Date: Sun, 28 Aug 2016 22:23:49 -0400 Subject: [PATCH 015/496] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5a0e24f1..ddb1eaed 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ First, add the following to your pubspec.yaml: ```yaml dependencies: - github: ">=2.3.1+1 <3.0.0" + github: "^3.0.0" ``` Then import the library and use it: From 149ffa86629b3dd5a5baced8c29daae516912cd5 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Fri, 30 Sep 2016 12:22:09 -0700 Subject: [PATCH 016/496] Throw an error if an issue is not found --- lib/src/common/issues_service.dart | 2 +- lib/src/common/model/issues.dart | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/src/common/issues_service.dart b/lib/src/common/issues_service.dart index d36eb688..d201af60 100644 --- a/lib/src/common/issues_service.dart +++ b/lib/src/common/issues_service.dart @@ -241,7 +241,7 @@ class IssuesService extends Service { /// API docs: https://developer.github.com/v3/issues/labels/#get-a-single-label Future getLabel(RepositorySlug slug, String name) { return _github.getJSON("/repos/${slug.fullName}/labels/${name}", - convert: IssueLabel.fromJSON); + convert: IssueLabel.fromJSON, statusCode: StatusCodes.OK); } /// Creates a new label on the specified repository. diff --git a/lib/src/common/model/issues.dart b/lib/src/common/model/issues.dart index a3f97d6b..af6c78e1 100644 --- a/lib/src/common/model/issues.dart +++ b/lib/src/common/model/issues.dart @@ -181,6 +181,9 @@ class IssueLabel { static IssueLabel fromJSON(input) { if (input == null) return null; + assert(input['name'] != null); + assert(input['color'] != null); + return new IssueLabel() ..name = input['name'] ..color = input['color']; From 195a3be0ab796a6600944f3dfd88b0ef71b1ab88 Mon Sep 17 00:00:00 2001 From: Joel Trottier-Hebert Date: Thu, 6 Oct 2016 11:22:20 -0400 Subject: [PATCH 017/496] Strong mode and some fixes --- .analysis_options | 49 +++++++++++++++++++ example/common.dart | 3 +- example/emoji.dart | 10 ++-- example/languages.dart | 9 ++-- example/repos.dart | 6 +-- lib/src/common/activity_service.dart | 73 ++++++++++++++++------------ lib/src/common/util/utils.dart | 2 +- lib/src/util.dart | 8 +-- pubspec.yaml | 1 + 9 files changed, 111 insertions(+), 50 deletions(-) create mode 100644 .analysis_options diff --git a/.analysis_options b/.analysis_options new file mode 100644 index 00000000..117985e8 --- /dev/null +++ b/.analysis_options @@ -0,0 +1,49 @@ +analyzer: + strong-mode: true + +linter: + rules: + - camel_case_types + - empty_constructor_bodies + - always_declare_return_types +# - avoid_as + - camel_case_types + - constant_identifier_names + - empty_constructor_bodies + - implementation_imports + - library_names + - library_prefixes + - non_constant_identifier_names + - one_member_abstracts + - package_api_docs + - package_prefixed_library_names + - prefer_is_not_empty + - slash_for_doc_comments + - super_goes_last + - type_annotate_public_apis + - type_init_formals +# - unnecessary_brace_in_string_interp + - unnecessary_getters_setters + - avoid_empty_else + - package_names + - unrelated_type_equality_checks + - throw_in_finally + - close_sinks + - comment_references + - control_flow_in_finally + - empty_statements + - hash_and_equals + - iterable_contains_unrelated_type + - list_remove_unrelated_type + - test_types_in_equals + - throw_in_finally + - valid_regexps + - annotate_overrides + - avoid_init_to_null + - avoid_return_types_on_setters + - await_only_futures + - empty_catches + - prefer_is_not_empty + - sort_constructors_first + - sort_unnamed_constructors_first + - unawaited_futures diff --git a/example/common.dart b/example/common.dart index bf5d6c6d..f41c695d 100644 --- a/example/common.dart +++ b/example/common.dart @@ -1,6 +1,7 @@ import "dart:html"; -import "package:github/browser.dart"; +import 'package:github/browser.dart'; +import "package:github/markdown.dart" as markdown; void init(String script, {void onReady()}) { var stopwatch = new Stopwatch(); diff --git a/example/emoji.dart b/example/emoji.dart index c29dfa61..9747a188 100644 --- a/example/emoji.dart +++ b/example/emoji.dart @@ -2,14 +2,14 @@ import "dart:html"; import "common.dart"; -DivElement $emoji; +DivElement emojiDiv; Map emojis; void main() { init("emoji.dart", onReady: () { - $emoji = querySelector("#emojis"); + emojiDiv = querySelector("#emojis"); loadEmojis(); - var searchBox = querySelector("#search-box"); + var searchBox = querySelector("#search-box") as InputElement; searchBox.onKeyUp.listen((event) { filter(searchBox.value); }); @@ -28,7 +28,7 @@ void loadEmojis() { h.append(new ImageElement(src: url, width: 64, height: 64) ..classes.add("emoji")); h.append(new ParagraphElement()..text = ":${name}:"); - $emoji.append(h); + emojiDiv.append(h); }); }); } @@ -40,7 +40,7 @@ void filter(String query) { return; } lastQuery = query; - var boxes = $emoji.children; + var boxes = emojiDiv.children; for (var box in boxes) { var boxName = box.querySelector("p"); var t = boxName.text; diff --git a/example/languages.dart b/example/languages.dart index dcd111a5..c52cff0d 100644 --- a/example/languages.dart +++ b/example/languages.dart @@ -1,18 +1,17 @@ import "dart:html"; -import "package:github/markdown.dart" as markdown; - +import 'markdown.dart' as markdown; import "package:github/browser.dart"; import "common.dart"; -DivElement $table; +DivElement tableDiv; LanguageBreakdown breakdown; void main() { initGitHub(); init("languages.dart", onReady: () { - $table = querySelector("#table"); + tableDiv = querySelector("#table"); loadRepository(); }); } @@ -51,7 +50,7 @@ void reloadTable({int accuracy: 4}) { isReloadingTable = true; github.misc.renderMarkdown(generateMarkdown(accuracy)).then((html) { - $table.setInnerHtml(html, treeSanitizer: NodeTreeSanitizer.trusted); + tableDiv.setInnerHtml(html, treeSanitizer: NodeTreeSanitizer.trusted); isReloadingTable = false; }); } diff --git a/example/repos.dart b/example/repos.dart index 519a89ea..57b2ca8d 100644 --- a/example/repos.dart +++ b/example/repos.dart @@ -5,7 +5,7 @@ import "package:github/dates.dart"; import "common.dart"; -DivElement $repos; +DivElement repositoriesDiv; List repos; Map> sorts = { @@ -21,7 +21,7 @@ void main() { var stopwatch = new Stopwatch(); stopwatch.start(); - $repos = querySelector("#repos"); + repositoriesDiv = querySelector("#repos"); document.onReadyStateChange.listen((event) { if (document.readyState == ReadyState.COMPLETE) { @@ -54,7 +54,7 @@ void updateRepos(List repos, document.querySelector("#repos").children.clear(); repos.sort(compare); for (var repo in repos) { - $repos.appendHtml( + repositoriesDiv.appendHtml( """
diff --git a/lib/src/common/activity_service.dart b/lib/src/common/activity_service.dart index 6447dd40..2c245ab3 100644 --- a/lib/src/common/activity_service.dart +++ b/lib/src/common/activity_service.dart @@ -12,7 +12,8 @@ class ActivityService extends Service { /// API docs: https://developer.github.com/v3/activity/events/#list-public-events Stream listPublicEvents({int pages: 2}) { return new PaginationHelper(_github) - .objects("GET", "/events", Event.fromJSON, pages: pages); + .objects("GET", "/events", Event.fromJSON, pages: pages) + as Stream; } /// Lists public events for a network of repositories. @@ -22,7 +23,7 @@ class ActivityService extends Service { {int pages: 2}) { return new PaginationHelper(_github).objects( "GET", "/networks/${slug.fullName}/events", Event.fromJSON, - pages: pages); + pages: pages) as Stream; } /// Returns an [EventPoller] for repository network events. @@ -43,7 +44,7 @@ class ActivityService extends Service { Stream listRepositoryIssueEvents(RepositorySlug slug, {int pages}) { return new PaginationHelper(_github).objects( "GET", "/repos/${slug.fullName}/issues/events", Event.fromJSON, - pages: pages); + pages: pages) as Stream; } /// Returns an [EventPoller] for public events. @@ -57,7 +58,7 @@ class ActivityService extends Service { Stream listRepositoryEvents(RepositorySlug slug, {int pages}) { return new PaginationHelper(_github).objects( "GET", "/repos/${slug.fullName}/events", Event.fromJSON, - pages: pages); + pages: pages) as Stream; } /// Returns an [EventPoller] for repository events. @@ -70,8 +71,9 @@ 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 new PaginationHelper(_github) - .objects("GET", "/orgs/${name}/events", Event.fromJSON, pages: pages); + return new PaginationHelper(_github).objects( + "GET", "/orgs/${name}/events", Event.fromJSON, pages: pages) + as Stream; } /// Returns an [EventPoller] for public events for an organization. @@ -97,8 +99,8 @@ 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 new PaginationHelper(_github).objects( - "GET", "/users/${username}/events", Event.fromJSON, - pages: pages); + "GET", "/users/${username}/events", Event.fromJSON, pages: pages) + as Stream; } /// Lists the public events performed by a user. @@ -107,7 +109,7 @@ class ActivityService extends Service { Stream listPublicEventsPerformedByUser(String username, {int pages}) { return new PaginationHelper(_github).objects( "GET", "/users/${username}/events/public", Event.fromJSON, - pages: pages); + pages: pages) as Stream; } /// Returns an [EventPoller] for the user's organization dashboard. @@ -124,8 +126,9 @@ class ActivityService extends Service { Stream listNotifications( {bool all: false, bool participating: false}) { return new PaginationHelper(_github).objects( - "GET", '/notifications', Notification.fromJSON, - params: {"all": all, "participating": participating}); + "GET", '/notifications', Notification.fromJSON, + params: {"all": all, "participating": participating}) + as Stream; } /// Lists all notifications for a given repository. @@ -133,9 +136,12 @@ 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", - '/repos/${repository.fullName}/notifications', Notification.fromJSON, - params: {"all": all, "participating": participating}); + return new PaginationHelper(_github).objects( + "GET", + '/repos/${repository.fullName}/notifications', + Notification.fromJSON, + params: {"all": all, "participating": participating}) + as Stream; } /// Marks all notifications up to [lastRead] as read. @@ -176,7 +182,8 @@ class ActivityService extends Service { /// API docs: https://developer.github.com/v3/activity/notifications/#view-a-single-thread Future getThread(String threadId) { return _github.getJSON("/notification/threads/${threadId}", - statusCode: StatusCodes.OK, convert: Notification.fromJSON); + statusCode: StatusCodes.OK, + convert: Notification.fromJSON) as Future; } // TODO: Implement markThreadRead: https://developer.github.com/v3/activity/notifications/#mark-a-thread-as-read @@ -189,7 +196,8 @@ class ActivityService extends Service { /// API docs: https://developer.github.com/v3/activity/starring/#list-stargazers Stream listStargazers(RepositorySlug slug) { return new PaginationHelper(_github) - .objects("GET", "/repos/${slug.fullName}/stargazers", User.fromJSON); + .objects("GET", "/repos/${slug.fullName}/stargazers", User.fromJSON) + as Stream; } /// Lists all the repos starred by a user. @@ -197,15 +205,16 @@ 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) - .objects("GET", "/users/${user}/starred", Repository.fromJSON); + .objects("GET", "/users/${user}/starred", Repository.fromJSON) + as Stream; } /// Lists all the repos by the current user. /// /// API docs: https://developer.github.com/v3/activity/starring/#list-repositories-being-starred Stream listStarred() { - return new PaginationHelper(_github) - .objects("GET", "/user/starred", Repository.fromJSON); + return new PaginationHelper(_github).objects( + "GET", "/user/starred", Repository.fromJSON) as Stream; } /// Checks if the currently authenticated user has starred the specified repository. @@ -224,7 +233,7 @@ 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) { + headers: {"Content-Length": "0"}).then((response) { return null; }); } @@ -234,7 +243,7 @@ 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) { + headers: {"Content-Length": "0"}).then((response) { return null; }); } @@ -243,7 +252,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 new PaginationHelper(_github) .objects("GET", "/repos/${slug.fullName}/subscribers", User.fromJSON); } @@ -251,7 +260,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 new PaginationHelper(_github) .objects("GET", '/users/${user}/subscriptions', Repository.fromJSON); } @@ -259,7 +268,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 new PaginationHelper(_github) .objects("GET", '/user/subscriptions', Repository.fromJSON); } @@ -269,7 +278,9 @@ class ActivityService extends Service { Future getRepositorySubscription( RepositorySlug slug) { return _github.getJSON("/repos/${slug.fullName}/subscription", - statusCode: StatusCodes.OK, convert: RepositorySubscription.fromJSON); + statusCode: StatusCodes.OK, + convert: RepositorySubscription.fromJSON) + as Future; } /// Sets the Repository Subscription Status @@ -282,7 +293,7 @@ class ActivityService extends Service { return _github.postJSON("/repos/${slug.fullName}/subscription", statusCode: StatusCodes.OK, convert: RepositorySubscription.fromJSON, - body: map); + body: map) as Future; } /// Deletes a Repository Subscription @@ -290,7 +301,7 @@ 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) { + headers: {"Content-Length": "0"}).then((response) { return null; }); } @@ -302,7 +313,7 @@ class EventPoller { final List handledEvents = []; Timer _timer; - StreamController _controller; + StreamController _controller; String _lastFetched; @@ -315,7 +326,7 @@ class EventPoller { if (after != null) after = after.toUtc(); - _controller = new StreamController(); + _controller = new StreamController(); void handleEvent(http.Response response) { if (interval == null) { @@ -350,7 +361,7 @@ class EventPoller { if (_timer == null) { _timer = new Timer.periodic(new Duration(seconds: interval), (timer) { - var headers = {}; + var headers = {}; if (_lastFetched != null) { headers['If-None-Match'] = _lastFetched; @@ -361,7 +372,7 @@ class EventPoller { } } - var headers = {}; + var headers = {}; if (_lastFetched != null) { headers['If-None-Match'] = _lastFetched; diff --git a/lib/src/common/util/utils.dart b/lib/src/common/util/utils.dart index 9699953a..fc2d2035 100644 --- a/lib/src/common/util/utils.dart +++ b/lib/src/common/util/utils.dart @@ -31,7 +31,7 @@ class OnlyWhen { /// The format is "YYYY-MM-DDTHH:mm:ssZ" String dateToGitHubIso8601(DateTime date) { // Regex removes the milliseconds. - return date.toUtc().toIso8601String().replaceAll(GITHUB_DATE_REMOVE, ''); + return date.toUtc().toIso8601String().replaceAll(githubDateRemoveRegExp, ''); } RepositorySlug slugFromAPIUrl(String url) { diff --git a/lib/src/util.dart b/lib/src/util.dart index 59718f21..d711659c 100644 --- a/lib/src/util.dart +++ b/lib/src/util.dart @@ -1,4 +1,4 @@ -final RegExp GITHUB_DATE_REMOVE = new RegExp(r'\.\d*'); +final RegExp githubDateRemoveRegExp = new RegExp(r'\.\d*'); String buildQueryString(Map params) { var queryString = new StringBuffer(); @@ -41,7 +41,7 @@ void putValue(String name, dynamic value, Map map) { //TODO(kevmoo): use regex here. Map parseLinkHeader(String input) { - var out = {}; + var out = {}; var parts = input.split(", "); for (var part in parts) { if (part[0] != "<") { @@ -58,7 +58,7 @@ Map parseLinkHeader(String input) { } List> mapToList(Map input) { - var out = []; + var out = > []; for (var key in input.keys) { out.add(new MapEntry(key, input[key])); } @@ -82,7 +82,7 @@ DateTime parseDateTime(String input) { } Map createNonNullMap(Map input) { - var map = {}; + var map = {}; for (var key in input.keys) { if (input[key] != null) { map[key] = input[key]; diff --git a/pubspec.yaml b/pubspec.yaml index cb0bd534..127df905 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -10,6 +10,7 @@ dependencies: http: '^0.11.3' quiver: '>=0.20.0 <0.25.0' xml: '^2.0.0' + markdown: '^0.11.1' dev_dependencies: browser: '^0.10.0+2' mock: '^0.12.0' From 847ae8e0ba6759b237f8829e561ee478a6d0ad33 Mon Sep 17 00:00:00 2001 From: Joel Trottier-Hebert Date: Thu, 6 Oct 2016 11:37:11 -0400 Subject: [PATCH 018/496] Strong mode and some fixes --- lib/src/common/repos_service.dart | 132 ++++++++++++++++++------------ 1 file changed, 79 insertions(+), 53 deletions(-) diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index d8cf3d29..eab49a4f 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -17,7 +17,8 @@ class RepositoriesService extends Service { var params = {"type": type, "sort": sort, "direction": direction}; return new PaginationHelper(_github) - .objects("GET", "/user/repos", Repository.fromJSON, params: params); + .objects("GET", "/user/repos", Repository.fromJSON, params: params) + as Stream; } /// Lists the repositories of the user specified by [user] in a streamed fashion. @@ -30,8 +31,8 @@ class RepositoriesService extends Service { var params = {"type": type, "sort": sort, "direction": direction}; return new PaginationHelper(_github).objects( - "GET", "/users/${user}/repos", Repository.fromJSON, - params: params); + "GET", "/users/${user}/repos", Repository.fromJSON, params: params) + as Stream; } /// List repositories for the specified [org]. @@ -44,8 +45,8 @@ class RepositoriesService extends Service { }; return new PaginationHelper(_github).objects( - "GET", "/orgs/${org}/repos", Repository.fromJSON, - params: params); + "GET", "/orgs/${org}/repos", Repository.fromJSON, params: params) + as Stream; } /// Lists all the public repositories on GitHub, in the order that they were @@ -56,7 +57,7 @@ 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 = {}; + var params = {}; if (since != null) { params['since'] = since.toIso8601String(); @@ -64,7 +65,8 @@ class RepositoriesService extends Service { var pages = limit != null ? (limit / 30).ceil() : null; - var controller = new StreamController.broadcast(); + // TODO: Close this, but where? + var controller = new StreamController.broadcast(); new PaginationHelper(_github) .fetchStreamed("GET", "/repositories", pages: pages, params: params) @@ -86,10 +88,12 @@ class RepositoriesService extends Service { {String org}) { if (org != null) { return _github.postJSON('/orgs/${org}/repos', - body: repository.toJSON(), convert: TeamRepository.fromJSON); + body: repository.toJSON(), + convert: TeamRepository.fromJSON) as Future; } else { return _github.postJSON('/user/repos', - body: repository.toJSON(), convert: Repository.fromJSON); + body: repository.toJSON(), + convert: Repository.fromJSON) as Future; } } @@ -103,12 +107,12 @@ class RepositoriesService extends Service { if (response.statusCode == 404) { throw new RepositoryNotFound(_github, slug.fullName); } - }); + }) as Future; } /// Fetches a list of repositories specified by [slugs]. Stream getRepositories(List slugs) { - var controller = new StreamController(); + var controller = new StreamController(); var group = new FutureGroup(); @@ -147,7 +151,7 @@ class RepositoriesService extends Service { "default_branch": "defaultBranch" }); return _github.postJSON("/repos/${repo.fullName}", - body: data, statusCode: 200); + body: data, statusCode: 200) as Future; } /// Deletes a repository. @@ -167,15 +171,15 @@ class RepositoriesService extends Service { Stream listContributors(RepositorySlug slug, {bool anon: false}) { return new PaginationHelper(_github).objects( 'GET', '/repos/${slug.fullName}/contributors', User.fromJSON, - params: {"anon": anon.toString()}); + params: {"anon": anon.toString()}) as Stream; } /// Lists the teams of the specified repository. /// /// API docs: https://developer.github.com/v3/repos/#list-teams Stream listTeams(RepositorySlug slug) { - return new PaginationHelper(_github) - .objects('GET', '/repos/${slug.fullName}/teams', Team.fromJSON); + return new PaginationHelper(_github).objects( + 'GET', '/repos/${slug.fullName}/teams', Team.fromJSON) as Stream; } /// Gets a language breakdown for the specified repository. @@ -184,14 +188,15 @@ class RepositoriesService extends Service { Future listLanguages(RepositorySlug slug) => _github.getJSON("/repos/${slug.fullName}/languages", statusCode: StatusCodes.OK, - convert: (input) => new LanguageBreakdown(input)); + convert: (Map input) => new LanguageBreakdown(input)) + as Future; /// 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', Tag.fromJSON); + return new PaginationHelper(_github).objects( + 'GET', '/repos/${slug.fullName}/tags', Tag.fromJSON) as Stream; } /// Lists the branches of the specified repository. @@ -199,7 +204,8 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/#list-branches Stream listBranches(RepositorySlug slug) { return new PaginationHelper(_github) - .objects('GET', '/repos/${slug.fullName}/branches', Branch.fromJSON); + .objects('GET', '/repos/${slug.fullName}/branches', Branch.fromJSON) + as Stream; } /// Fetches the specified branch. @@ -207,15 +213,16 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/#get-branch Future getBranch(RepositorySlug slug, String branch) { return _github.getJSON("/repos/${slug.fullName}/branches/${branch}", - convert: Branch.fromJSON); + convert: Branch.fromJSON) as Future; } /// 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 new PaginationHelper(_github) - .objects("GET", "/repos/${slug.fullName}/collaborators", User.fromJSON); + return new PaginationHelper(_github).objects( + "GET", "/repos/${slug.fullName}/collaborators", User.fromJSON) + as Stream; } Future isCollaborator(RepositorySlug slug, String user) { @@ -254,7 +261,8 @@ 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( - "GET", "/repos/${slug.fullName}/commits", RepositoryCommit.fromJSON); + "GET", "/repos/${slug.fullName}/commits", RepositoryCommit.fromJSON) + as Stream; } /// Fetches the specified commit. @@ -262,7 +270,7 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/commits/#get-a-single-commit Future getCommit(RepositorySlug slug, String sha) { return _github.getJSON("/repos/${slug.fullName}/commits/${sha}", - convert: RepositoryCommit.fromJSON); + convert: RepositoryCommit.fromJSON) as Future; } // TODO: Implement compareCommits: https://developer.github.com/v3/repos/commits/#compare-two-commits @@ -274,7 +282,7 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/contents/#get-the-readme Future getReadme(RepositorySlug slug, {String ref}) { - var headers = {}; + var headers = {}; String url = "/repos/${slug.fullName}/readme"; @@ -283,11 +291,12 @@ class RepositoriesService extends Service { } return _github.getJSON(url, headers: headers, statusCode: StatusCodes.OK, - fail: (http.Response response) { + fail: (http.Response response) { if (response.statusCode == 404) { throw new NotFound(_github, response.body); } - }, convert: (input) => GitHubFile.fromJSON(input, slug)); + }, convert: (input) => GitHubFile.fromJSON(input, slug)) + as Future; } /// Fetches content in a repository at the specified [path]. @@ -321,7 +330,7 @@ class RepositoriesService extends Service { contents.tree = copyOf(input.map((it) => GitHubFile.fromJSON(it))); } return contents; - }); + }) as Future; } /// Creates a new file in a repository. @@ -346,7 +355,9 @@ class RepositoriesService extends Service { {"message": message, "content": content, "sha": sha, "branch": branch}); return _github.postJSON("/repos/${slug.fullName}/contents/${path}", - body: map, statusCode: 200, convert: ContentCreation.fromJSON); + body: map, + statusCode: 200, + convert: ContentCreation.fromJSON) as Future; } /// Deletes the specified file. @@ -382,8 +393,9 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/forks/#list-forks Stream listForks(RepositorySlug slug) { - return new PaginationHelper(_github) - .objects("GET", "/repos/${slug.fullName}/forks", Repository.fromJSON); + return new PaginationHelper(_github).objects( + "GET", "/repos/${slug.fullName}/forks", Repository.fromJSON) + as Stream; } /// Creates a fork for the authenticated user. @@ -392,7 +404,8 @@ class RepositoriesService extends Service { Future createFork(RepositorySlug slug, [CreateFork fork]) { if (fork == null) fork = new CreateFork(); return _github.postJSON("/repos/${slug.fullName}/forks", - body: fork.toJSON(), convert: Repository.fromJSON); + body: fork.toJSON(), + convert: Repository.fromJSON) as Future; } /// Lists the hooks of the specified repository. @@ -402,7 +415,7 @@ class RepositoriesService extends Service { return new PaginationHelper(_github).objects( "GET", "/repos/${slug.fullName}/hooks", - (input) => Hook.fromJSON(slug.fullName, input)); + (input) => Hook.fromJSON(slug.fullName, input)) as Stream; } /// Fetches a single hook by [id]. @@ -410,7 +423,7 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/hooks/#get-single-hook Future getHook(RepositorySlug slug, int id) { return _github.getJSON("/repos/${slug.fullName}/hooks/${id}", - convert: (i) => Hook.fromJSON(slug.fullName, i)); + convert: (i) => Hook.fromJSON(slug.fullName, i)) as Future; } /// Creates a repository hook based on the specified [hook]. @@ -418,7 +431,8 @@ class RepositoriesService extends Service { /// 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: (i) => Hook.fromJSON(slug.fullName, i), body: hook.toJSON()); + convert: (i) => Hook.fromJSON(slug.fullName, i), + body: hook.toJSON()) as Future; } // TODO: Implement editHook: https://developer.github.com/v3/repos/hooks/#edit-a-hook @@ -456,7 +470,8 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/keys/#list Stream listDeployKeys(RepositorySlug slug) { return new PaginationHelper(_github) - .objects("GET", "/repos/${slug.fullName}/keys", PublicKey.fromJSON); + .objects("GET", "/repos/${slug.fullName}/keys", PublicKey.fromJSON) + as Stream; } // TODO: Implement getDeployKey: https://developer.github.com/v3/repos/keys/#get @@ -465,7 +480,8 @@ class RepositoriesService extends Service { /// /// 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()); + return _github.postJSON("/repos/${slug.fullName}/keys", body: key.toJSON()) + as Future; } // TODO: Implement editDeployKey: https://developer.github.com/v3/repos/keys/#edit @@ -478,7 +494,7 @@ class RepositoriesService extends Service { return _github.postJSON("/repos/${slug.fullName}/merges", body: merge.toJSON(), convert: RepositoryCommit.fromJSON, - statusCode: 201); + statusCode: 201) as Future; } /// Fetches the GitHub pages information for the specified repository. @@ -486,7 +502,8 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/pages/#get-information-about-a-pages-site Future getPagesInfo(RepositorySlug slug) { return _github.getJSON("/repos/${slug.fullName}/pages", - statusCode: 200, convert: RepositoryPages.fromJSON); + statusCode: 200, + convert: RepositoryPages.fromJSON) as Future; } // TODO: Implement listPagesBuilds: https://developer.github.com/v3/repos/pages/#list-pages-builds @@ -496,8 +513,9 @@ 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) - .objects("GET", "/repos/${slug.fullName}/releases", Release.fromJSON); + return new PaginationHelper(_github).objects( + "GET", "/repos/${slug.fullName}/releases", Release.fromJSON) + as Stream; } /// Fetches a single release. @@ -505,7 +523,7 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/releases/#get-a-single-release Future getRelease(RepositorySlug slug, int id) { return _github.getJSON("/repos/${slug.fullName}/releases/${id}", - convert: Release.fromJSON); + convert: Release.fromJSON) as Future; } /// Creates a Release based on the specified [release]. @@ -513,7 +531,7 @@ class RepositoriesService extends Service { /// 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: release.toJSON()); + convert: Release.fromJSON, body: release.toJSON()) as Future; } // TODO: Implement editRelease: https://developer.github.com/v3/repos/releases/#edit-a-release @@ -536,7 +554,9 @@ class RepositoriesService extends Service { if (json is Map) { new Future.delayed(new Duration(milliseconds: 200), () { _github.getJSON(path, - statusCode: 200, convert: handle, params: {"per_page": limit}); + statusCode: 200, + convert: handle, + params: {"per_page": limit.toString()}); }); return null; } else { @@ -544,7 +564,8 @@ class RepositoriesService extends Service { .complete(json.map((it) => ContributorStatistics.fromJSON(it))); } }; - _github.getJSON(path, convert: handle, params: {"per_page": limit}); + _github + .getJSON(path, convert: handle, params: {"per_page": limit.toString()}); return completer.future; } @@ -555,7 +576,7 @@ class RepositoriesService extends Service { return new PaginationHelper(_github).objects( "GET", "/repos/${slug.fullName}/stats/commit_activity", - YearCommitCountWeek.fromJSON); + YearCommitCountWeek.fromJSON) as Stream; } /// Fetches weekly addition and deletion counts. @@ -565,7 +586,7 @@ class RepositoriesService extends Service { return new PaginationHelper(_github).objects( "GET", "/repos/${slug.fullName}/stats/code_frequency", - WeeklyChangesCount.fromJSON); + WeeklyChangesCount.fromJSON) as Stream; } /// Fetches Participation Breakdowns. @@ -573,15 +594,18 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/statistics/#participation Future getParticipation(RepositorySlug slug) { return _github.getJSON("/repos/${slug.fullName}/stats/participation", - statusCode: 200, convert: ContributorParticipation.fromJSON); + statusCode: 200, convert: ContributorParticipation.fromJSON) + as Future; } /// Fetches Punchcard. /// /// API docs: https://developer.github.com/v3/repos/statistics/#punch-card Stream listPunchcard(RepositorySlug slug) { - return new PaginationHelper(_github).objects("GET", - "/repos/${slug.fullName}/stats/punchcard", PunchcardEntry.fromJSON); + return new PaginationHelper(_github).objects( + "GET", + "/repos/${slug.fullName}/stats/punchcard", + PunchcardEntry.fromJSON) as Stream; } /// Lists the statuses of a repository at the specified reference. @@ -592,7 +616,7 @@ class RepositoriesService extends Service { return new PaginationHelper(_github).objects( "GET", "/repos/${slug.fullName}/commits/${ref}/statuses", - RepositoryStatus.fromJSON); + RepositoryStatus.fromJSON) as Stream; } /// Creates a new status for a repository at the specified reference. @@ -602,7 +626,8 @@ 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: RepositoryStatus.fromJSON) as Future; } /// Gets a Combined Status for the specified repository and ref. @@ -611,6 +636,7 @@ class RepositoriesService extends Service { Future getCombinedStatus( RepositorySlug slug, String ref) { return _github.getJSON("/repos/${slug.fullName}/commits/${ref}/status", - convert: CombinedRepositoryStatus.fromJSON, statusCode: 200); + convert: CombinedRepositoryStatus.fromJSON, + statusCode: 200) as Future; } } From 599507d8823ec1bd76899249e4f4c1ffae66bee4 Mon Sep 17 00:00:00 2001 From: Joel Trottier-Hebert Date: Thu, 6 Oct 2016 11:46:16 -0400 Subject: [PATCH 019/496] Strong mode and some fixes --- example/readme.dart | 6 ++-- example/users.dart | 6 ++-- lib/src/common/model/activity.dart | 6 ++-- lib/src/common/model/authorizations.dart | 6 ++-- lib/src/common/model/git.dart | 44 +++++++++++++----------- 5 files changed, 35 insertions(+), 33 deletions(-) diff --git a/example/readme.dart b/example/readme.dart index 536b52e8..70847991 100644 --- a/example/readme.dart +++ b/example/readme.dart @@ -4,11 +4,11 @@ import "package:github/browser.dart"; import "common.dart"; -DivElement $readme; +DivElement readmeDiv; void main() { init("readme.dart", onReady: () { - $readme = querySelector("#readme"); + readmeDiv = querySelector("#readme"); loadReadme(); }); } @@ -18,5 +18,5 @@ void loadReadme() { .getReadme(new RepositorySlug("DirectMyFile", "github.dart")) .then((file) => github.misc.renderMarkdown(file.content)) .then((html) => - $readme.appendHtml(html, validator: NodeTreeSanitizer.trusted)); + readmeDiv.appendHtml(html, validator: NodeTreeSanitizer.trusted)); } diff --git a/example/users.dart b/example/users.dart index cd4904e7..50578244 100644 --- a/example/users.dart +++ b/example/users.dart @@ -5,11 +5,11 @@ import "package:github/dates.dart"; import "common.dart"; -DivElement $users; +DivElement usersDiv; void main() { init("users.dart", onReady: () { - $users = querySelector("#users"); + usersDiv = querySelector("#users"); loadUsers(); }); } @@ -50,7 +50,7 @@ void loadUsers() { m.append(h); - $users.querySelector("#${column}"); + usersDiv.querySelector("#${column}"); if (column == "left") { column = "right"; diff --git a/lib/src/common/model/activity.dart b/lib/src/common/model/activity.dart index ff6787d3..842fac6d 100644 --- a/lib/src/common/model/activity.dart +++ b/lib/src/common/model/activity.dart @@ -19,7 +19,7 @@ class Event { Map payload; - static Event fromJSON(input) { + static Event fromJSON(Map input) { if (input == null) return null; var event = new Event(); @@ -34,7 +34,7 @@ class Event { ..createdAt = parseDateTime(input['created_at']) ..id = input['id'] ..actor = User.fromJSON(input['actor']) - ..payload = input['payload']; + ..payload = input['payload'] as Map; return event; } @@ -51,7 +51,7 @@ class RepositorySubscription { RepositorySubscription(); - static RepositorySubscription fromJSON(input) { + static RepositorySubscription fromJSON(Map input) { if (input == null) return null; return new RepositorySubscription() diff --git a/lib/src/common/model/authorizations.dart b/lib/src/common/model/authorizations.dart index 5ee97e0c..e38c1d5c 100644 --- a/lib/src/common/model/authorizations.dart +++ b/lib/src/common/model/authorizations.dart @@ -15,12 +15,12 @@ class Authorization { Map json; - static Authorization fromJSON(input) { + static Authorization fromJSON(Map input) { if (input == null) return null; return new Authorization() ..id = input['id'] - ..scopes = input['scopes'] + ..scopes = input['scopes'] as List ..token = input['token'] ..app = AuthorizationApplication.fromJSON(input['app']) ..note = input['note'] @@ -63,7 +63,7 @@ class CreateAuthorization { CreateAuthorization(this.note); String toJSON() { - var map = {}; + var map = {}; putValue("note", note, map); putValue("note_url", noteUrl, map); putValue("client_id", clientID, map); diff --git a/lib/src/common/model/git.dart b/lib/src/common/model/git.dart index 76dfa47c..ffd26ad1 100644 --- a/lib/src/common/model/git.dart +++ b/lib/src/common/model/git.dart @@ -8,7 +8,7 @@ class GitBlob { String sha; int size; - static GitBlob fromJSON(input) { + static GitBlob fromJSON(Map input) { if (input == null) return null; return new GitBlob() @@ -50,7 +50,7 @@ class GitCommit { @ApiName('comment_count') int commentCount; - static GitCommit fromJSON(input) { + static GitCommit fromJSON(Map input) { if (input == null) return null; var commit = new GitCommit() @@ -60,19 +60,21 @@ class GitCommit { ..commentCount = input['comment_count']; if (input['author'] != null) { - commit.author = GitCommitUser.fromJSON(input['author']); + commit.author = + GitCommitUser.fromJSON(input['author'] as Map); } if (input['committer'] != null) { - commit.committer = GitCommitUser.fromJSON(input['committer']); + commit.committer = + GitCommitUser.fromJSON(input['committer'] as Map); } if (input['tree'] != null) { - commit.tree = GitTree.fromJSON(input['tree']); + commit.tree = GitTree.fromJSON(input['tree'] as Map); } if (input['parents'] != null) { - commit.parents = input['parents'] + commit.parents = (input['parents'] as List>) .map((Map parent) => GitCommit.fromJSON(parent)) .toList(); } @@ -102,7 +104,7 @@ class CreateGitCommit { CreateGitCommit(this.message, this.tree); String toJSON() { - var map = {}; + var map = {}; putValue('message', message, map); putValue('tree', tree, map); putValue('parents', parents, map); @@ -128,7 +130,7 @@ class GitCommitUser { GitCommitUser(this.name, this.email, this.date); - static GitCommitUser fromJSON(input) { + static GitCommitUser fromJSON(Map input) { if (input == null) return null; return new GitCommitUser( @@ -136,7 +138,7 @@ class GitCommitUser { } Map toMap() { - var map = {}; + var map = {}; putValue('name', name, map); putValue('email', email, map); @@ -158,7 +160,7 @@ class GitTree { @ApiName("tree") List entries; - static GitTree fromJSON(input) { + static GitTree fromJSON(Map input) { if (input == null) return null; var tree = new GitTree() @@ -168,7 +170,7 @@ class GitTree { // There are no tree entries if it's a tree referenced from a GitCommit. if (input['tree'] != null) { - tree.entries = input['tree'] + tree.entries = (input['tree'] as List>) .map((Map it) => GitTreeEntry.fromJSON(it)) .toList(growable: false); } @@ -187,7 +189,7 @@ class GitTreeEntry { String sha; String url; - static GitTreeEntry fromJSON(input) { + static GitTreeEntry fromJSON(Map input) { if (input == null) return null; return new GitTreeEntry() @@ -216,7 +218,7 @@ class CreateGitTree { CreateGitTree(this.entries); String toJSON() { - var map = {}; + var map = {}; putValue('base_tree', baseTree, map); @@ -242,7 +244,7 @@ class CreateGitTreeEntry { CreateGitTreeEntry(this.path, this.mode, this.type, {this.sha, this.content}); Map toMap() { - var map = {}; + var map = {}; putValue('path', path, map); putValue('mode', mode, map); @@ -260,13 +262,13 @@ class GitReference { String url; GitObject object; - static GitReference fromJSON(input) { + static GitReference fromJSON(Map input) { if (input == null) return null; return new GitReference() ..ref = input['ref'] ..url = input['url'] - ..object = GitObject.fromJSON(input['object']); + ..object = GitObject.fromJSON(input['object'] as Map); } } @@ -279,7 +281,7 @@ class GitTag { GitCommitUser tagger; GitObject object; - static GitTag fromJSON(input) { + static GitTag fromJSON(Map input) { if (input == null) return null; return new GitTag() @@ -287,8 +289,8 @@ class GitTag { ..sha = input['sha'] ..url = input['url'] ..message = input['message'] - ..tagger = GitCommitUser.fromJSON(input['tagger']) - ..object = GitObject.fromJSON(input['object']); + ..tagger = GitCommitUser.fromJSON(input['tagger'] as Map) + ..object = GitObject.fromJSON(input['object'] as Map); } } @@ -303,7 +305,7 @@ class CreateGitTag { CreateGitTag(this.tag, this.message, this.object, this.type, this.tagger); String toJSON() { - var map = {}; + var map = {}; putValue('tag', tag, map); putValue('message', message, map); @@ -321,7 +323,7 @@ class GitObject { String sha; String url; - static GitObject fromJSON(input) { + static GitObject fromJSON(Map input) { if (input == null) return null; return new GitObject() From ffd3bd603fdf779a206d8965f5af9e23f7ed6b85 Mon Sep 17 00:00:00 2001 From: Joel Trottier-Hebert Date: Thu, 6 Oct 2016 11:54:53 -0400 Subject: [PATCH 020/496] Strong mode and some fixes --- lib/src/common/model/issues.dart | 23 +++++++++++++---------- test/helper/mock.dart | 4 +++- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/lib/src/common/model/issues.dart b/lib/src/common/model/issues.dart index af6c78e1..9db6ca20 100644 --- a/lib/src/common/model/issues.dart +++ b/lib/src/common/model/issues.dart @@ -58,10 +58,10 @@ class Issue { @ApiName("closed_by") User closedBy; - static Issue fromJSON(input) { + static Issue fromJSON(Map input) { if (input == null) return null; - var labels = input['labels']; + var labels = input['labels'] as List>; if (labels == null) labels = []; return new Issue() @@ -74,9 +74,11 @@ class Issue { ..user = User.fromJSON(input['user']) ..labels = labels.map(IssueLabel.fromJSON).toList(growable: false) ..assignee = User.fromJSON(input['assignee']) - ..milestone = Milestone.fromJSON(input['milestone']) + ..milestone = + Milestone.fromJSON(input['milestone'] as Map) ..commentsCount = input['comments'] - ..pullRequest = IssuePullRequest.fromJSON(input['pull_request']) + ..pullRequest = IssuePullRequest + .fromJSON(input['pull_request'] as Map) ..createdAt = parseDateTime(input['created_at']) ..updatedAt = parseDateTime(input['updated_at']) ..closedAt = parseDateTime(input['closed_at']) @@ -100,7 +102,7 @@ class IssueRequest { IssueRequest(); String toJSON() { - var map = {}; + var map = {}; putValue("title", title, map); putValue("body", body, map); putValue("labels", labels, map); @@ -125,7 +127,7 @@ class IssuePullRequest { @ApiName("patch_url") String patchUrl; - static IssuePullRequest fromJSON(input) { + static IssuePullRequest fromJSON(Map input) { if (input == null) return null; return new IssuePullRequest() @@ -155,7 +157,7 @@ class IssueComment { @ApiName("issue_url") String issueUrl; - static IssueComment fromJSON(input) { + static IssueComment fromJSON(Map input) { if (input == null) return null; return new IssueComment() @@ -178,7 +180,7 @@ class IssueLabel { /// Label Color String color; - static IssueLabel fromJSON(input) { + static IssueLabel fromJSON(Map input) { if (input == null) return null; assert(input['name'] != null); @@ -189,6 +191,7 @@ class IssueLabel { ..color = input['color']; } + @override String toString() => 'IssueLabel: $name'; } @@ -232,7 +235,7 @@ class Milestone { @ApiName("due_on") DateTime dueOn; - static Milestone fromJSON(input) { + static Milestone fromJSON(Map input) { if (input == null) return null; return new Milestone() @@ -261,7 +264,7 @@ class CreateMilestone { CreateMilestone(this.title); String toJSON() { - var map = {}; + var map = {}; putValue("title", title, map); putValue("state", state, map); putValue(description, description, map); diff --git a/test/helper/mock.dart b/test/helper/mock.dart index 918c8b81..ac670a56 100644 --- a/test/helper/mock.dart +++ b/test/helper/mock.dart @@ -18,7 +18,8 @@ class MockWithNamedArgs extends Mock { log = new LogEntryListNamedArgs(() => _lastNamedArgs); } - noSuchMethod(Invocation invocation) { + @override + dynamic noSuchMethod(Invocation invocation) { _lastNamedArgs = invocation.namedArguments; return super.noSuchMethod(invocation); } @@ -41,6 +42,7 @@ class LogEntryListNamedArgs extends LogEntryList { LogEntryListNamedArgs(this.getLastNamedArgs); + @override add(LogEntry entry) { logs.add(new LogEntryNamedArgs(entry, getLastNamedArgs())); } From eddd5430bb86e925a896be833bd5ce44e78941dd Mon Sep 17 00:00:00 2001 From: Joel Trottier-Hebert Date: Thu, 6 Oct 2016 12:22:25 -0400 Subject: [PATCH 021/496] Strong mode and some fixes --- lib/src/common/activity_service.dart | 2 +- lib/src/common/authorizations_service.dart | 8 +++--- lib/src/common/blog_service.dart | 2 +- lib/src/common/explore_service.dart | 7 +++--- lib/src/common/model/activity.dart | 4 +-- lib/src/common/model/keys.dart | 4 +-- lib/src/common/model/notifications.dart | 10 +++++--- lib/src/common/model/orgs.dart | 23 +++++++++-------- lib/src/common/model/pulls.dart | 23 +++++++++-------- lib/src/common/model/repos.dart | 29 ++++++++++++++-------- lib/src/common/model/repos_commits.dart | 20 ++++++++------- lib/src/common/model/repos_contents.dart | 4 +-- 12 files changed, 77 insertions(+), 59 deletions(-) diff --git a/lib/src/common/activity_service.dart b/lib/src/common/activity_service.dart index 2c245ab3..d8c002dd 100644 --- a/lib/src/common/activity_service.dart +++ b/lib/src/common/activity_service.dart @@ -339,7 +339,7 @@ class EventPoller { _lastFetched = response.headers['ETag']; - var json = JSON.decode(response.body); + var json = JSON.decode(response.body) as List>; if (!(onlyNew && _timer == null)) { for (var item in json) { diff --git a/lib/src/common/authorizations_service.dart b/lib/src/common/authorizations_service.dart index acf90d18..a46a6720 100644 --- a/lib/src/common/authorizations_service.dart +++ b/lib/src/common/authorizations_service.dart @@ -15,15 +15,17 @@ class AuthorizationsService extends Service { /// API docs: https://developer.github.com/v3/oauth_authorizations/#list-your-authorizations Stream listAuthorizations() { return new PaginationHelper(_github) - .objects("GET", "/authorizations", Authorization.fromJSON); + .objects("GET", "/authorizations", Authorization.fromJSON) + as Stream; } - /// Fetches an authorization specified by [name]. + /// Fetches an authorization specified by [id]. /// /// API docs: https://developer.github.com/v3/oauth_authorizations/#get-a-single-authorization Future getAuthorization(int id) { return _github.getJSON("/authorizations/${id}", - statusCode: 200, convert: Authorization.fromJSON); + statusCode: 200, + convert: Authorization.fromJSON) as Future; } // TODO: Implement remaining API methods of authorizations: diff --git a/lib/src/common/blog_service.dart b/lib/src/common/blog_service.dart index 9173b962..a8477c46 100644 --- a/lib/src/common/blog_service.dart +++ b/lib/src/common/blog_service.dart @@ -6,7 +6,7 @@ class BlogService extends Service { /// Returns a stream of blog posts for the specified [url]. Stream listPosts([String url = "https://github.com/blog.atom"]) { - var controller = new StreamController(); + var controller = new StreamController(); _github.client.get(url).then((response) { var document = xml.parse(response.body); diff --git a/lib/src/common/explore_service.dart b/lib/src/common/explore_service.dart index aee0b357..61e903b8 100644 --- a/lib/src/common/explore_service.dart +++ b/lib/src/common/explore_service.dart @@ -15,7 +15,7 @@ class ExploreService extends Service { if (since != null) url += language == null ? "?since=${since}" : "&since=${since}"; - var controller = new StreamController(); + var controller = new StreamController(); _github.client.get(url).then((response) { var doc = htmlParser.parse(response.body); @@ -45,7 +45,7 @@ class ExploreService extends Service { } Future getShowcase(ShowcaseInfo info) { - var completer = new Completer(); + var completer = new Completer(); _github.client.get(info.url).then((response) { var doc = htmlParser.parse(response.body); @@ -60,6 +60,7 @@ class ExploreService extends Service { var description = page.querySelector(".collection-description"); + // TODO: This is most likely wrong showcase.description = description; showcase.lastUpdated = lastUpdated; showcase.title = title; @@ -89,7 +90,7 @@ class ExploreService extends Service { } Stream listShowcases() { - var controller = new StreamController(); + var controller = new StreamController(); Function handleResponse; diff --git a/lib/src/common/model/activity.dart b/lib/src/common/model/activity.dart index 842fac6d..37d0f04d 100644 --- a/lib/src/common/model/activity.dart +++ b/lib/src/common/model/activity.dart @@ -29,8 +29,8 @@ class Event { event.type = input['type']; event - ..repo = Repository.fromJSON(input['repo']) - ..org = Organization.fromJSON(input['org']) + ..repo = Repository.fromJSON(input['repo'] as Map) + ..org = Organization.fromJSON(input['org'] as Map) ..createdAt = parseDateTime(input['created_at']) ..id = input['id'] ..actor = User.fromJSON(input['actor']) diff --git a/lib/src/common/model/keys.dart b/lib/src/common/model/keys.dart index e96c41d6..1be5c935 100644 --- a/lib/src/common/model/keys.dart +++ b/lib/src/common/model/keys.dart @@ -9,7 +9,7 @@ class PublicKey { String key; String title; - static PublicKey fromJSON(input) { + static PublicKey fromJSON(Map input) { if (input == null) return null; return new PublicKey() @@ -27,7 +27,7 @@ class CreatePublicKey { CreatePublicKey(this.title, this.key); String toJSON() { - var map = {}; + var map = {}; putValue("title", title, map); putValue("key", key, map); return JSON.encode(map); diff --git a/lib/src/common/model/notifications.dart b/lib/src/common/model/notifications.dart index ab2d5627..5343bdf2 100644 --- a/lib/src/common/model/notifications.dart +++ b/lib/src/common/model/notifications.dart @@ -14,13 +14,15 @@ class Notification { @ApiName("last_read_at") DateTime lastReadAt; - static Notification fromJSON(input) { + static Notification fromJSON(Map input) { if (input == null) return null; return new Notification() ..id = input['id'] - ..repository = Repository.fromJSON(input['repository']) - ..subject = NotificationSubject.fromJSON(input['subject']) + ..repository = + Repository.fromJSON(input['repository'] as Map) + ..subject = + NotificationSubject.fromJSON(input['subject'] as Map) ..reason = input['reason'] ..unread = input['unread'] ..updatedAt = parseDateTime(input['updated_at']) @@ -33,7 +35,7 @@ class NotificationSubject { String title; String type; - static NotificationSubject fromJSON(input) { + static NotificationSubject fromJSON(Map input) { if (input == null) return null; return new NotificationSubject() diff --git a/lib/src/common/model/orgs.dart b/lib/src/common/model/orgs.dart index 043c902c..b5e9d22d 100644 --- a/lib/src/common/model/orgs.dart +++ b/lib/src/common/model/orgs.dart @@ -55,7 +55,7 @@ class Organization { @ApiName("updated_at") DateTime updatedAt; - static Organization fromJSON(input) { + static Organization fromJSON(Map input) { if (input == null) return null; return new Organization() @@ -82,11 +82,12 @@ class OrganizationMembership { String state; Organization organization; - static OrganizationMembership fromJSON(input) { + static OrganizationMembership fromJSON(Map input) { if (input == null) return null; return new OrganizationMembership() - ..organization = Organization.fromJSON(input['organization']) + ..organization = + Organization.fromJSON(input['organization'] as Map) ..state = input['state']; } } @@ -113,7 +114,7 @@ class Team { /// Organization Organization organization; - static Team fromJSON(input) { + static Team fromJSON(Map input) { if (input == null) return null; return new Team() @@ -121,7 +122,8 @@ class Team { ..id = input['id'] ..membersCount = input['members_count'] ..reposCount = input['repos_count'] - ..organization = Organization.fromJSON(input['organization']); + ..organization = + Organization.fromJSON(input['organization'] as Map); } } @@ -159,7 +161,7 @@ class TeamMember { @ApiName("html_url") String htmlUrl; - static TeamMember fromJSON(input) { + static TeamMember fromJSON(Map input) { if (input == null) return null; var member = new TeamMember(); @@ -178,7 +180,7 @@ class TeamRepository extends Repository { /// Repository Permissions. TeamRepositoryPermissions permissions; - static TeamRepository fromJSON(input) { + static TeamRepository fromJSON(Map input) { if (input == null) return null; return new TeamRepository() @@ -204,9 +206,10 @@ class TeamRepository extends Repository { ..forksCount = input['forks_count'] ..createdAt = parseDateTime(input['created_at']) ..pushedAt = parseDateTime(input['pushed_at']) - ..owner = UserInformation.fromJSON(input['owner']) + ..owner = UserInformation.fromJSON(input['owner'] as Map) ..isPrivate = input['private'] - ..permissions = TeamRepositoryPermissions.fromJSON(input['permissions']); + ..permissions = TeamRepositoryPermissions + .fromJSON(input['permissions'] as Map); } } @@ -221,7 +224,7 @@ class TeamRepositoryPermissions { /// Pull Access bool pull; - static TeamRepositoryPermissions fromJSON(input) { + static TeamRepositoryPermissions fromJSON(Map input) { if (input == null) return null; return new TeamRepositoryPermissions() diff --git a/lib/src/common/model/pulls.dart b/lib/src/common/model/pulls.dart index e6b834f0..ac1b1406 100644 --- a/lib/src/common/model/pulls.dart +++ b/lib/src/common/model/pulls.dart @@ -56,12 +56,13 @@ class PullRequestInformation { PullRequestInformation([this.isCompletePullRequest = false]); - static PullRequestInformation fromJSON(input, [PullRequestInformation into]) { + static PullRequestInformation fromJSON(Map input, + [PullRequestInformation into]) { if (input == null) return null; var pr = into != null ? into : new PullRequestInformation(); - pr.head = PullRequestHead.fromJSON(input['head']); - pr.base = PullRequestHead.fromJSON(input['base']); + pr.head = PullRequestHead.fromJSON(input['head'] as Map); + pr.base = PullRequestHead.fromJSON(input['base'] as Map); pr.htmlUrl = input['html_url']; pr.diffUrl = input['diff_url']; pr.patchUrl = input['patch_url']; @@ -113,7 +114,7 @@ class PullRequest extends PullRequestInformation { PullRequest() : super(true); - static PullRequest fromJSON(input) { + static PullRequest fromJSON(Map input) { if (input == null) return null; PullRequest pr = PullRequestInformation.fromJSON(input, new PullRequest()); @@ -139,7 +140,7 @@ class PullRequestMerge { PullRequestMerge(); - static PullRequestMerge fromJSON(input) { + static PullRequestMerge fromJSON(Map input) { if (input == null) return null; return new PullRequestMerge() @@ -166,7 +167,7 @@ class PullRequestHead { /// Repository Repository repo; - static PullRequestHead fromJSON(input) { + static PullRequestHead fromJSON(Map input) { if (input == null) return null; var head = new PullRequestHead(); @@ -174,7 +175,7 @@ class PullRequestHead { head.ref = input['ref']; head.sha = input['sha']; head.user = User.fromJSON(input['user']); - head.repo = Repository.fromJSON(input['repo']); + head.repo = Repository.fromJSON(input['repo'] as Map); return head; } } @@ -196,7 +197,7 @@ class CreatePullRequest { CreatePullRequest(this.title, this.head, this.base, {this.body}); String toJSON() { - var map = {}; + var map = {}; putValue("title", title, map); putValue("head", head, map); putValue("base", base, map); @@ -240,7 +241,7 @@ class PullRequestComment { @ApiName("_links") Links links; - static PullRequestComment fromJSON(input) { + static PullRequestComment fromJSON(Map input) { if (input == null) return null; return new PullRequestComment() @@ -275,7 +276,7 @@ class CreatePullRequestComment { CreatePullRequestComment(this.body, this.commitId, this.path, this.position); String toJSON() { - var map = {}; + var map = {}; putValue("body", body, map); putValue("commit_id", commitId, map); putValue("path", path, map); @@ -298,7 +299,7 @@ class PullRequestFile { String rawUrl; String patch; - static PullRequestFile fromJSON(input) { + static PullRequestFile fromJSON(Map input) { var file = new PullRequestFile(); file.sha = input['sha']; file.filename = input['filename']; diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart index d2d16524..e4643301 100644 --- a/lib/src/common/model/repos.dart +++ b/lib/src/common/model/repos.dart @@ -90,7 +90,8 @@ class Repository { @ApiName("pushed_at") DateTime pushedAt; - static Repository fromJSON(input, [Repository instance]) { + static Repository fromJSON(Map input, + [Repository instance]) { if (input == null) return null; if (instance == null) instance = new Repository(); @@ -119,12 +120,14 @@ class Repository { ..createdAt = parseDateTime(input['created_at']) ..pushedAt = parseDateTime(input['pushed_at']) ..isPrivate = input['private'] - ..owner = UserInformation.fromJSON(input['owner']); + ..owner = + UserInformation.fromJSON(input['owner'] as Map); } /// Gets the Repository Slug (Full Name). RepositorySlug slug() => new RepositorySlug(owner.login, name); + @override String toString() => 'Repository: ${owner.login}/$name'; } @@ -150,7 +153,7 @@ class CloneUrls { /// https://github.com/user/repo String svn; - static CloneUrls fromJSON(input) { + static CloneUrls fromJSON(Map input) { if (input == null) return null; return new CloneUrls() @@ -167,18 +170,19 @@ class Tag { String zipUrl; String tarUrl; - static Tag fromJSON(input) { + static Tag fromJSON(Map input) { if (input == null) { return null; } return new Tag() ..name = input['name'] - ..commit = CommitInfo.fromJson(input['commit']) + ..commit = CommitInfo.fromJson(input['commit'] as Map) ..tarUrl = input['tarball_url'] ..zipUrl = input['zipball_url']; } + @override String toString() => 'Tag: $name'; } @@ -186,14 +190,15 @@ class CommitInfo { String sha; GitTree tree; - static CommitInfo fromJson(input) { + static CommitInfo fromJson(Map input) { if (input == null) { return null; } return new CommitInfo() ..sha = input['sha'] - ..tree = GitTree.fromJSON(input['commit']['tree']); + ..tree = + GitTree.fromJSON(input['commit']['tree'] as Map); } } @@ -213,7 +218,7 @@ class UserInformation { @ApiName("html_url") String htmlUrl; - static UserInformation fromJSON(input) { + static UserInformation fromJSON(Map input) { if (input == null) return null; return new UserInformation() @@ -247,9 +252,11 @@ class RepositorySlug { /// Example: owner/name String get fullName => "${owner}/${name}"; + @override bool operator ==(Object obj) => obj is RepositorySlug && obj.fullName == fullName; + @override int get hashCode => fullName.hashCode; @override @@ -326,12 +333,12 @@ class Branch { /// Commit Information CommitInfo commit; - static Branch fromJSON(input) { + static Branch fromJSON(Map input) { if (input == null) return null; var branch = new Branch() ..name = input['name'] - ..commit = CommitInfo.fromJson(input['commit']); + ..commit = CommitInfo.fromJson(input['commit'] as Map); return branch; } @@ -362,7 +369,7 @@ class LanguageBreakdown { /// Creates a list of lists with a tuple of the language name and the bytes. List> toList() { - var out = []; + var out = >[]; for (var key in info.keys) { out.add([key, info[key]]); } diff --git a/lib/src/common/model/repos_commits.dart b/lib/src/common/model/repos_commits.dart index 9ac0e557..198943c8 100644 --- a/lib/src/common/model/repos_commits.dart +++ b/lib/src/common/model/repos_commits.dart @@ -38,7 +38,7 @@ class RepositoryCommit { /// The files changed in this commit. List files; - static RepositoryCommit fromJSON(input) { + static RepositoryCommit fromJSON(Map input) { if (input == null) return null; var commit = new RepositoryCommit() @@ -46,19 +46,21 @@ class RepositoryCommit { ..sha = input['sha'] ..htmlUrl = input['html_url'] ..commentsUrl = input['comments_url'] - ..commit = GitCommit.fromJSON(input['commit']) + ..commit = GitCommit.fromJSON(input['commit'] as Map) ..author = User.fromJSON(input['author']) ..committer = User.fromJSON(input['committer']) - ..stats = CommitStats.fromJSON(input['stats']); + ..stats = CommitStats.fromJSON(input['stats'] as Map); if (input['parents'] != null) { - commit.parents = - input['parents'].map((parent) => GitCommit.fromJSON(parent)).toList(); + commit.parents = (input['parents'] as List>) + .map((parent) => GitCommit.fromJSON(parent)) + .toList(); } if (input['files'] != null) { - commit.files = - input['files'].map((file) => CommitFile.fromJSON(file)).toList(); + commit.files = (input['files'] as List>) + .map((file) => CommitFile.fromJSON(file)) + .toList(); } return commit; @@ -76,7 +78,7 @@ class CommitStats { /// Total changes. int total; - static CommitStats fromJSON(input) { + static CommitStats fromJSON(Map input) { if (input == null) return null; return new CommitStats() @@ -106,7 +108,7 @@ class CommitFile { Map json; - static CommitFile fromJSON(input) { + static CommitFile fromJSON(Map input) { if (input == null) return null; return new CommitFile() diff --git a/lib/src/common/model/repos_contents.dart b/lib/src/common/model/repos_contents.dart index 06e17a91..aea13371 100644 --- a/lib/src/common/model/repos_contents.dart +++ b/lib/src/common/model/repos_contents.dart @@ -48,7 +48,7 @@ class GitHubFile { /// Source Repository RepositorySlug sourceRepository; - static GitHubFile fromJSON(input, [RepositorySlug slug]) { + static GitHubFile fromJSON(Map input, [RepositorySlug slug]) { if (input == null) return null; return new GitHubFile() @@ -112,7 +112,7 @@ class CreateFile { CreateFile(this.path, this.content, this.message); String toJSON() { - var map = {}; + var map = {}; putValue("path", path, map); putValue("message", message, map); putValue("content", content, map); From b1b6ae11b061e3af7e1c8f0051d67d6d00ebefa2 Mon Sep 17 00:00:00 2001 From: Joel Trottier-Hebert Date: Thu, 6 Oct 2016 12:25:24 -0400 Subject: [PATCH 022/496] Strong mode and some fixes --- lib/src/common/gists_service.dart | 2 +- lib/src/common/model/gists.dart | 2 +- lib/src/common/model/repos_contents.dart | 14 ++++++++------ lib/src/common/model/repos_forks.dart | 2 +- lib/src/common/model/repos_hooks.dart | 6 +++--- lib/src/common/model/repos_merging.dart | 2 +- lib/src/common/model/repos_releases.dart | 2 +- lib/src/common/model/repos_statuses.dart | 2 +- lib/src/common/pulls_service.dart | 2 +- 9 files changed, 18 insertions(+), 16 deletions(-) diff --git a/lib/src/common/gists_service.dart b/lib/src/common/gists_service.dart index 2fc51758..dd29997d 100644 --- a/lib/src/common/gists_service.dart +++ b/lib/src/common/gists_service.dart @@ -87,7 +87,7 @@ class GistsService extends Service { /// API docs: https://developer.github.com/v3/gists/#edit-a-gist Future editGist(String id, {String description, Map files}) { - var map = {}; + var map = {}; if (description != null) { map["description"] = description; diff --git a/lib/src/common/model/gists.dart b/lib/src/common/model/gists.dart index 39437d93..7cfab8a3 100644 --- a/lib/src/common/model/gists.dart +++ b/lib/src/common/model/gists.dart @@ -170,7 +170,7 @@ class CreateGistComment { CreateGistComment(this.body); String toJSON() { - var map = {}; + var map = {}; map['body'] = body; return JSON.encode(map); } diff --git a/lib/src/common/model/repos_contents.dart b/lib/src/common/model/repos_contents.dart index aea13371..78f7508e 100644 --- a/lib/src/common/model/repos_contents.dart +++ b/lib/src/common/model/repos_contents.dart @@ -48,7 +48,8 @@ class GitHubFile { /// Source Repository RepositorySlug sourceRepository; - static GitHubFile fromJSON(Map input, [RepositorySlug slug]) { + static GitHubFile fromJSON(Map input, + [RepositorySlug slug]) { if (input == null) return null; return new GitHubFile() @@ -112,7 +113,7 @@ class CreateFile { CreateFile(this.path, this.content, this.message); String toJSON() { - var map = {}; + var map = {}; putValue("path", path, map); putValue("message", message, map); putValue("content", content, map); @@ -130,7 +131,7 @@ class CommitUser { CommitUser(this.name, this.email); Map toMap() { - var map = {}; + var map = {}; putValue('name', name, map); putValue('email', email, map); @@ -146,10 +147,11 @@ class ContentCreation { ContentCreation(this.commit, this.content); - static ContentCreation fromJSON(input) { + static ContentCreation fromJSON(Map input) { if (input == null) return null; - return new ContentCreation(RepositoryCommit.fromJSON(input['commit']), - GitHubFile.fromJSON(input['content'])); + return new ContentCreation( + RepositoryCommit.fromJSON(input['commit'] as Map), + GitHubFile.fromJSON(input['content'] as Map)); } } diff --git a/lib/src/common/model/repos_forks.dart b/lib/src/common/model/repos_forks.dart index 4ed60b6b..3dbbe6c5 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 = {}; + var map = {}; putValue("organization", organization, map); return JSON.encode(map); } diff --git a/lib/src/common/model/repos_hooks.dart b/lib/src/common/model/repos_hooks.dart index eb9e01a8..f5d6517b 100644 --- a/lib/src/common/model/repos_hooks.dart +++ b/lib/src/common/model/repos_hooks.dart @@ -31,18 +31,18 @@ class Hook { Map config; - static Hook fromJSON(repoName, input) { + static Hook fromJSON(String repoName, Map input) { if (input == null) return null; return new Hook() - ..events = input['events'] + ..events = input['events'] as List ..active = input['active'] ..name = input['name'] ..id = input['id'] ..repoName = repoName ..updatedAt = parseDateTime(input['updated_at']) ..createdAt = parseDateTime(input['created_at']) - ..config = input['config']; + ..config = input['config'] as Map; } } diff --git a/lib/src/common/model/repos_merging.dart b/lib/src/common/model/repos_merging.dart index 2afeaddb..4f720b27 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 = {}; + var map = {}; putValue("base", base, map); putValue("head", head, map); putValue("commit_message", commitMessage, map); diff --git a/lib/src/common/model/repos_releases.dart b/lib/src/common/model/repos_releases.dart index bb5b26ac..a720052b 100644 --- a/lib/src/common/model/repos_releases.dart +++ b/lib/src/common/model/repos_releases.dart @@ -154,7 +154,7 @@ class CreateRelease { CreateRelease(this.tagName); String toJSON() { - var map = {}; + var map = {}; putValue("tag_name", tagName, map); putValue("name", name, map); putValue("body", body, map); diff --git a/lib/src/common/model/repos_statuses.dart b/lib/src/common/model/repos_statuses.dart index dcbee94e..06b12dad 100644 --- a/lib/src/common/model/repos_statuses.dart +++ b/lib/src/common/model/repos_statuses.dart @@ -58,7 +58,7 @@ class CreateStatus { CreateStatus(this.state); String toJSON() { - var map = {}; + var map = {}; putValue("state", state, map); putValue("target_url", targetUrl, map); putValue("description", description, map); diff --git a/lib/src/common/pulls_service.dart b/lib/src/common/pulls_service.dart index 96fa744d..4d1f1d48 100644 --- a/lib/src/common/pulls_service.dart +++ b/lib/src/common/pulls_service.dart @@ -35,7 +35,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}) { - var map = {}; + var map = {}; putValue("title", title, map); putValue("body", body, map); putValue("state", state, map); From d78ef1734968973b68f0bb18fefb42b5c8e6d8b8 Mon Sep 17 00:00:00 2001 From: Joel Trottier-Hebert Date: Thu, 6 Oct 2016 12:28:36 -0400 Subject: [PATCH 023/496] Strong mode and some fixes --- lib/src/common/model/repos_stats.dart | 22 +++++++++++----------- lib/src/common/model/repos_statuses.dart | 12 +++++++----- lib/src/common/model/search.dart | 5 +++-- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/lib/src/common/model/repos_stats.dart b/lib/src/common/model/repos_stats.dart index 2bcf580e..133c0461 100644 --- a/lib/src/common/model/repos_stats.dart +++ b/lib/src/common/model/repos_stats.dart @@ -11,14 +11,14 @@ class ContributorStatistics { /// Weekly Statistics List weeks; - static ContributorStatistics fromJSON(input) { + static ContributorStatistics fromJSON(Map input) { if (input == null) return null; return new ContributorStatistics() ..author = User.fromJSON(input['author']) ..total = input['total'] - ..weeks = - input['weeks'].map((it) => ContributorWeekStatistics.fromJSON(it)); + ..weeks = (input['weeks'] as List>) + .map((it) => ContributorWeekStatistics.fromJSON(it)); } } @@ -37,7 +37,7 @@ class ContributorWeekStatistics { /// Number of Commits int commits; - static ContributorWeekStatistics fromJSON(input) { + static ContributorWeekStatistics fromJSON(Map input) { if (input == null) return null; return new ContributorWeekStatistics() @@ -56,12 +56,12 @@ class ContributorParticipation { /// Commit Counts for the Owner List owner; - static ContributorParticipation fromJSON(input) { + static ContributorParticipation fromJSON(Map input) { if (input == null) return null; return new ContributorParticipation() - ..all = input['all'] - ..owner = input['owner']; + ..all = input['all'] as List + ..owner = input['owner'] as List; } } @@ -76,11 +76,11 @@ class YearCommitCountWeek { /// Timestamp for Beginning of Week int timestamp; - static YearCommitCountWeek fromJSON(input) { + static YearCommitCountWeek fromJSON(Map input) { if (input == null) return null; var c = new YearCommitCountWeek(); - c.days = input["days"]; + c.days = input["days"] as List; c.total = input["total"]; c.timestamp = input["week"]; return c; @@ -98,7 +98,7 @@ class WeeklyChangesCount { /// Number of Deletions int deletions; - static WeeklyChangesCount fromJSON(input) { + static WeeklyChangesCount fromJSON(Map input) { if (input == null) return null; var c = new WeeklyChangesCount(); c.timestamp = input[0]; @@ -119,7 +119,7 @@ class PunchcardEntry { /// Number of Commits int commits; - static PunchcardEntry fromJSON(input) { + static PunchcardEntry fromJSON(Map input) { if (input == null) return null; var c = new PunchcardEntry(); c.weekday = input[0]; diff --git a/lib/src/common/model/repos_statuses.dart b/lib/src/common/model/repos_statuses.dart index 06b12dad..dc430b33 100644 --- a/lib/src/common/model/repos_statuses.dart +++ b/lib/src/common/model/repos_statuses.dart @@ -10,16 +10,18 @@ class CombinedRepositoryStatus { CombinedRepositoryStatus(); - static CombinedRepositoryStatus fromJSON(input) { + static CombinedRepositoryStatus fromJSON(Map input) { if (input == null) return null; return new CombinedRepositoryStatus() ..state = input["state"] ..sha = input["sha"] ..totalCount = input["total_count"] - ..statuses = - input["statuses"].map((it) => RepositoryStatus.fromJSON(it)).toList() - ..repository = Repository.fromJSON(input["repository"]); + ..statuses = (input["statuses"] as List>) + .map((it) => RepositoryStatus.fromJSON(it)) + .toList() + ..repository = + Repository.fromJSON(input["repository"] as Map); } } @@ -32,7 +34,7 @@ class RepositoryStatus { String description; String context; - static RepositoryStatus fromJSON(input) { + static RepositoryStatus fromJSON(Map input) { if (input == null) return null; return new RepositoryStatus() diff --git a/lib/src/common/model/search.dart b/lib/src/common/model/search.dart index 711b3ff0..899e1e14 100644 --- a/lib/src/common/model/search.dart +++ b/lib/src/common/model/search.dart @@ -9,7 +9,8 @@ class SearchResults { List items; - static SearchResults fromJSON(input, JSONConverter resultConverter) { + static SearchResults fromJSON( + Map input, JSONConverter resultConverter) { var results = new SearchResults(); results ..totalCount = input['total_count'] @@ -32,7 +33,7 @@ abstract class SearchResult { } class RepositorySearchResult extends Repository with SearchResult { - static RepositorySearchResult fromJSON(input) { + static RepositorySearchResult fromJSON(Map input) { var result = new RepositorySearchResult(); Repository.fromJSON(input, result); result.score = input['score']; From 1ab836c2e59430cfec213fae8f8c6a4abe7f4bf6 Mon Sep 17 00:00:00 2001 From: Joel Trottier-Hebert Date: Thu, 6 Oct 2016 12:42:58 -0400 Subject: [PATCH 024/496] Strong mode and some fixes --- lib/src/common/gists_service.dart | 30 ++++++++++++++++++------------ lib/src/common/util/oauth2.dart | 6 +++--- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/lib/src/common/gists_service.dart b/lib/src/common/gists_service.dart index dd29997d..8d62bf40 100644 --- a/lib/src/common/gists_service.dart +++ b/lib/src/common/gists_service.dart @@ -11,8 +11,8 @@ class GistsService extends Service { /// /// API docs: https://developer.github.com/v3/gists/#list-gists Stream listUserGists(String username) { - return new PaginationHelper(_github) - .objects("GET", "/users/${username}/gists", Gist.fromJSON); + return new PaginationHelper(_github).objects( + "GET", "/users/${username}/gists", Gist.fromJSON) as Stream; } /// Fetches the gists for the currently authenticated user. @@ -20,8 +20,8 @@ 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 new PaginationHelper(_github).objects("GET", "/gists", Gist.fromJSON) + as Stream; } /// Fetches the currently authenticated user's public gists. @@ -29,7 +29,7 @@ class GistsService extends Service { /// API docs: https://developer.github.com/v3/gists/#list-gists Stream listCurrentUserPublicGists() { return new PaginationHelper(_github) - .objects("GET", "/gists/public", Gist.fromJSON); + .objects("GET", "/gists/public", Gist.fromJSON) as Stream; } /// Fetches the currently authenticated user's starred gists. @@ -37,7 +37,7 @@ class GistsService extends Service { /// API docs: https://developer.github.com/v3/gists/#list-gists Stream listCurrentUserStarredGists() { return new PaginationHelper(_github) - .objects("GET", "/gists/starred", Gist.fromJSON); + .objects("GET", "/gists/starred", Gist.fromJSON) as Stream; } /// Fetches a Gist by the specified [id]. @@ -45,7 +45,7 @@ class GistsService extends Service { /// API docs: https://developer.github.com/v3/gists/#get-a-single-gist Future getGist(String id) { return _github.getJSON("/gists/${id}", - statusCode: StatusCodes.OK, convert: Gist.fromJSON); + statusCode: StatusCodes.OK, convert: Gist.fromJSON) as Future; } /// Creates a Gist @@ -53,7 +53,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}) { - var map = {"files": {}}; + var map = {"files": {}}; if (description != null) { map["description"] = description; @@ -70,7 +70,9 @@ class GistsService extends Service { map["files"] = f; return _github.postJSON("/gists", - statusCode: 201, body: JSON.encode(map), convert: Gist.fromJSON); + statusCode: 201, + body: JSON.encode(map), + convert: Gist.fromJSON) as Future; } /// Deletes the specified Gist. @@ -102,7 +104,9 @@ class GistsService extends Service { } return _github.postJSON("/gists/${id}", - statusCode: 200, body: JSON.encode(map), convert: Gist.fromJSON); + statusCode: 200, + body: JSON.encode(map), + convert: Gist.fromJSON) as Future; } // TODO: Implement listGistCommits: https://developer.github.com/v3/gists/#list-gist-commits @@ -152,7 +156,8 @@ 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) - .objects("GET", "/gists/${gistId}/comments", GistComment.fromJSON); + .objects("GET", "/gists/${gistId}/comments", GistComment.fromJSON) + as Stream; } // TODO: Implement getComment: https://developer.github.com/v3/gists/comments/#get-a-single-comment @@ -162,7 +167,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: request.toJSON(), convert: GistComment.fromJSON); + body: request.toJSON(), + convert: GistComment.fromJSON) as Future; } // TODO: Implement editComment: https://developer.github.com/v3/gists/comments/#edit-a-comment diff --git a/lib/src/common/util/oauth2.dart b/lib/src/common/util/oauth2.dart index 12fa1504..3ed2b6db 100644 --- a/lib/src/common/util/oauth2.dart +++ b/lib/src/common/util/oauth2.dart @@ -82,12 +82,12 @@ class OAuth2Flow { return (github == null ? new http.Client() : github.client) .post("${baseUrl}/access_token", body: body, headers: headers) .then((response) { - var json = JSON.decode(response.body); + var json = JSON.decode(response.body) as Map; if (json['error'] != null) { throw json; } - return new ExchangeResponse( - json['access_token'], json['token_type'], json['scope'].split(",")); + return new ExchangeResponse(json['access_token'], json['token_type'], + (json['scope'] as String).split(",")); }); } } From a76ffe1712cacb1c941626747d126252ff475572 Mon Sep 17 00:00:00 2001 From: Joel Trottier-Hebert Date: Thu, 6 Oct 2016 12:52:07 -0400 Subject: [PATCH 025/496] Fix Strong mode, docs and other fixes --- lib/src/common/git_service.dart | 32 ++++--- lib/src/common/github.dart | 159 ++++++++++++++------------------ 2 files changed, 86 insertions(+), 105 deletions(-) diff --git a/lib/src/common/git_service.dart b/lib/src/common/git_service.dart index e1d428f8..e97a4c5a 100644 --- a/lib/src/common/git_service.dart +++ b/lib/src/common/git_service.dart @@ -12,7 +12,8 @@ class GitService extends Service { /// API docs: https://developer.github.com/v3/git/blobs/#get-a-blob Future getBlob(RepositorySlug slug, String sha) { return _github.getJSON('/repos/${slug.fullName}/git/blobs/${sha}', - convert: GitBlob.fromJSON, statusCode: StatusCodes.OK); + convert: GitBlob.fromJSON, + statusCode: StatusCodes.OK) as Future; } /// Creates a blob with specified [blob] content. @@ -22,7 +23,7 @@ class GitService extends Service { return _github.postJSON('/repos/${slug.fullName}/git/blobs', convert: GitBlob.fromJSON, statusCode: StatusCodes.CREATED, - body: blob.toJSON()); + body: blob.toJSON()) as Future; } /// Fetches a commit from [slug] for a given [sha]. @@ -30,7 +31,8 @@ class GitService extends Service { /// API docs: https://developer.github.com/v3/git/commits/#get-a-commit Future getCommit(RepositorySlug slug, String sha) { return _github.getJSON('/repos/${slug.fullName}/git/commits/${sha}', - convert: GitCommit.fromJSON, statusCode: StatusCodes.OK); + convert: GitCommit.fromJSON, + statusCode: StatusCodes.OK) as Future; } /// Creates a new commit in a repository. @@ -40,7 +42,7 @@ class GitService extends Service { return _github.postJSON('/repos/${slug.fullName}/git/commits', convert: GitCommit.fromJSON, statusCode: StatusCodes.CREATED, - body: commit.toJSON()); + body: commit.toJSON()) as Future; } /// Fetches a reference from a repository for the given [ref]. @@ -50,7 +52,8 @@ class GitService extends Service { /// API docs: https://developer.github.com/v3/git/refs/#get-a-reference Future getReference(RepositorySlug slug, String ref) { return _github.getJSON('/repos/${slug.fullName}/git/refs/${ref}', - convert: GitReference.fromJSON, statusCode: StatusCodes.OK); + convert: GitReference.fromJSON, + statusCode: StatusCodes.OK) as Future; } /// Lists the references in a repository. @@ -67,7 +70,7 @@ class GitService extends Service { } return new PaginationHelper(_github) - .objects('GET', path, GitReference.fromJSON); + .objects('GET', path, GitReference.fromJSON) as Stream; } /// Creates a new reference in a repository. @@ -81,7 +84,7 @@ class GitService extends Service { return _github.postJSON('/repos/${slug.fullName}/git/refs', convert: GitReference.fromJSON, statusCode: StatusCodes.CREATED, - body: JSON.encode({'ref': ref, 'sha': sha})); + body: JSON.encode({'ref': ref, 'sha': sha})) as Future; } /// Updates a reference in a repository. @@ -98,7 +101,9 @@ class GitService extends Service { .request('PATCH', '/repos/${slug.fullName}/git/refs/${ref}', body: body, headers: headers) .then((response) { - return GitReference.fromJSON(JSON.decode(response.body)); + return GitReference + .fromJSON(JSON.decode(response.body) as Map) + as Future; }); } @@ -116,7 +121,7 @@ class GitService extends Service { /// API docs: https://developer.github.com/v3/git/tags/#get-a-tag Future getTag(RepositorySlug slug, String sha) { return _github.getJSON('/repos/${slug.fullName}/git/tags/${sha}', - convert: GitTag.fromJSON, statusCode: StatusCodes.OK); + convert: GitTag.fromJSON, statusCode: StatusCodes.OK) as Future; } /// Creates a new tag in a repository. @@ -126,10 +131,10 @@ class GitService extends Service { return _github.postJSON('/repos/${slug.fullName}/git/tags', convert: GitTag.fromJSON, statusCode: StatusCodes.CREATED, - body: tag.toJSON()); + body: tag.toJSON()) as Future; } - /// Fetches a tree from a repository for the given [ref]. + /// Fetches a tree from a repository for the given ref [sha]. /// /// If [recursive] is set to true, the tree is fetched recursively. /// @@ -143,7 +148,8 @@ class GitService extends Service { } return _github.getJSON(path, - convert: GitTree.fromJSON, statusCode: StatusCodes.OK); + convert: GitTree.fromJSON, + statusCode: StatusCodes.OK) as Future; } /// Creates a new tree in a repository. @@ -153,6 +159,6 @@ class GitService extends Service { return _github.postJSON('/repos/${slug.fullName}/git/trees', convert: GitTree.fromJSON, statusCode: StatusCodes.CREATED, - body: tree.toJSON()); + body: tree.toJSON()) as Future; } } diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index 6260be40..37b00747 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -2,32 +2,25 @@ part of github.common; typedef http.Client ClientCreator(); -/** - * The Main GitHub Client - * - * ## Example - * - * var github = new GitHub(auth: new Authentication.withToken("SomeToken")); - * // Use the Client - */ +/// The Main GitHub Client +/// +/// ## Example +/// +/// var github = new GitHub(auth: new Authentication.withToken("SomeToken")); +/// // Use the Client +/// class GitHub { static const _ratelimitLimitHeader = 'x-ratelimit-limit'; static const _ratelimitResetHeader = 'x-ratelimit-reset'; static const _ratelimitRemainingHeader = 'x-ratelimit-remaining'; - /** - * Authentication Information - */ + /// Authentication Information Authentication auth; - /** - * API Endpoint - */ + /// API Endpoint final String endpoint; - /** - * HTTP Client - */ + /// HTTP Client final http.Client client; ActivityService _activity; @@ -45,6 +38,17 @@ class GitHub { UrlShortenerService _urlShortener; UsersService _users; + /// Creates a new [GitHub] instance. + /// + /// [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 ? new Authentication.anonymous() : auth, + this.client = client == null ? new http.Client() : client; + /// The maximum number of requests that the consumer is permitted to make per /// hour. /// @@ -72,20 +76,6 @@ class GitHub { int _rateLimitReset, _rateLimitLimit, _rateLimitRemaining; - /** - * Creates a new [GitHub] instance. - * - * [fetcher] is the HTTP Transporter to use - * [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 ? new Authentication.anonymous() : auth, - this.client = client == null ? new http.Client() : client; - /// Service for activity related methods of the GitHub API. ActivityService get activity { if (_activity == null) { @@ -201,26 +191,19 @@ class GitHub { return _users; } - /** - * Handles Get 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. - */ + /// Handles Get 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. Future getJSON(String path, {int statusCode, void fail(http.Response response), @@ -252,35 +235,31 @@ class GitHub { return convert(json); } - /** - * 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. - * 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. - */ + /// Handles Post Requests that respond with JSO + /// + /// [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 postJSON(String path, {int statusCode, void fail(http.Response response), Map headers, Map params, JSONConverter convert, - body, + String body, String preview}) async { if (headers == null) headers = {}; @@ -303,16 +282,16 @@ class GitHub { return convert(JSON.decode(response.body)); } - /** - * Internal method to handle status codes - */ + /// + /// Internal method to handle status codes + /// void handleStatusCode(http.Response response) { String message; List> errors; if (response.headers['content-type'].contains('application/json')) { var json = JSON.decode(response.body); message = json['message']; - errors = json['errors']; + errors = json['errors'] as List>; } switch (response.statusCode) { case 404: @@ -349,15 +328,14 @@ class GitHub { throw new UnknownError(this, message); } - /** - * Handles Authenticated Requests in an easy to understand way. - * - * [method] is the HTTP method. - * [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. - */ + /// Handles Authenticated Requests in an easy to understand way. + /// + /// [method] is the HTTP method. + /// [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. + /// Future request(String method, String path, {Map headers, Map params, @@ -422,11 +400,8 @@ class GitHub { return response; } - /** - * Disposes of this GitHub Instance. - * - * No other methods on this instance should be called after this method is called. - */ + /// 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. From 51b798979288027bd96d96ec6b4f157105dcb510 Mon Sep 17 00:00:00 2001 From: Joel Trottier-Hebert Date: Thu, 6 Oct 2016 13:02:49 -0400 Subject: [PATCH 026/496] Fix Strong mode, other fixes --- lib/src/common/issues_service.dart | 60 ++++++++++++++++++------------ lib/src/common/misc_service.dart | 14 ++++--- lib/src/common/orgs_service.dart | 53 ++++++++++++++++---------- 3 files changed, 79 insertions(+), 48 deletions(-) diff --git a/lib/src/common/issues_service.dart b/lib/src/common/issues_service.dart index d201af60..f6483528 100644 --- a/lib/src/common/issues_service.dart +++ b/lib/src/common/issues_service.dart @@ -89,7 +89,7 @@ class IssuesService extends Service { if (milestoneNumber != null) { // should be a milestone number (e.g. '34') not a milestone title // (e.g. '1.15') - params['milestone'] = milestoneNumber; + params['milestone'] = milestoneNumber.toString(); } if (state != null) { @@ -118,7 +118,8 @@ class IssuesService extends Service { } return new PaginationHelper(_github) - .objects("GET", pathSegment, Issue.fromJSON, params: params); + .objects("GET", pathSegment, Issue.fromJSON, params: params) + as Stream; } /// Edit an issue. @@ -129,7 +130,8 @@ class IssuesService extends Service { .request("PATCH", '/repos/${slug.fullName}/issues/${issueNumber}', body: issue.toJSON()) .then((response) { - return Issue.fromJSON(JSON.decode(response.body)); + return Issue.fromJSON(JSON.decode(response.body) as Map) + as Future; }); } @@ -138,7 +140,7 @@ class IssuesService extends Service { /// API docs: https://developer.github.com/v3/issues/#get-a-single-issue Future get(RepositorySlug slug, int issueNumber) { return _github.getJSON("/repos/${slug.fullName}/issues/${issueNumber}", - convert: Issue.fromJSON); + convert: Issue.fromJSON) as Future; } /// Create an issue. @@ -154,7 +156,8 @@ class IssuesService extends Service { throw new GitHubError(_github, response.body); } - return Issue.fromJSON(JSON.decode(response.body)); + return Issue.fromJSON(JSON.decode(response.body) as Map) + as Future; } /// Lists all available assignees (owners and collaborators) to which issues @@ -163,7 +166,8 @@ class IssuesService extends Service { /// API docs: https://developer.github.com/v3/issues/assignees/#list-assignees Stream listAssignees(RepositorySlug slug) { return new PaginationHelper(_github) - .objects("GET", "/repos/${slug.fullName}/assignees", User.fromJSON); + .objects("GET", "/repos/${slug.fullName}/assignees", User.fromJSON) + as Stream; } /// Checks if a user is an assignee for the specified repository. @@ -183,15 +187,17 @@ class IssuesService extends Service { return new PaginationHelper(_github).objects( 'GET', '/repos/${slug.fullName}/issues/${issueNumber}/comments', - IssueComment.fromJSON); + IssueComment.fromJSON) as Stream; } /// 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 new PaginationHelper(_github).objects('GET', - '/repos/${slug.fullName}/issues/comments', IssueComment.fromJSON); + return new PaginationHelper(_github).objects( + 'GET', + '/repos/${slug.fullName}/issues/comments', + IssueComment.fromJSON) as Stream; } /// Fetches the specified issue comment. @@ -199,7 +205,7 @@ class IssuesService extends Service { /// API docs: https://developer.github.com/v3/issues/comments/#get-a-single-comment Future getComment(RepositorySlug slug, int id) { return _github.getJSON("/repos/${slug.fullName}/issues/comments/${id}", - convert: IssueComment.fromJSON); + convert: IssueComment.fromJSON) as Future; } /// Creates a new comment on the specified issue @@ -212,7 +218,7 @@ class IssuesService extends Service { '/repos/${slug.fullName}/issues/${issueNumber}/comments', body: it, convert: IssueComment.fromJSON, - statusCode: StatusCodes.CREATED); + statusCode: StatusCodes.CREATED) as Future; } // TODO: Implement editComment: https://developer.github.com/v3/issues/comments/#edit-a-comment @@ -232,8 +238,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 new PaginationHelper(_github) - .objects("GET", "/repos/${slug.fullName}/labels", IssueLabel.fromJSON); + return new PaginationHelper(_github).objects( + "GET", "/repos/${slug.fullName}/labels", IssueLabel.fromJSON) + as Stream; } /// Fetches a single label. @@ -241,7 +248,8 @@ class IssuesService extends Service { /// API docs: https://developer.github.com/v3/issues/labels/#get-a-single-label Future getLabel(RepositorySlug slug, String name) { return _github.getJSON("/repos/${slug.fullName}/labels/${name}", - convert: IssueLabel.fromJSON, statusCode: StatusCodes.OK); + convert: IssueLabel.fromJSON, + statusCode: StatusCodes.OK) as Future; } /// Creates a new label on the specified repository. @@ -251,7 +259,7 @@ class IssuesService extends Service { RepositorySlug slug, String name, String color) { return _github.postJSON("/repos/${slug.fullName}/labels", body: JSON.encode({"name": name, "color": color}), - convert: IssueLabel.fromJSON); + convert: IssueLabel.fromJSON) as Future; } /// Edits a label. @@ -260,7 +268,7 @@ class IssuesService extends Service { Future editLabel(RepositorySlug slug, String name, String color) { return _github.postJSON("/repos/${slug.fullName}/labels/${name}", body: JSON.encode({"name": name, "color": color}), - convert: IssueLabel.fromJSON); + convert: IssueLabel.fromJSON) as Future; } /// Deletes a label. @@ -280,7 +288,7 @@ class IssuesService extends Service { return new PaginationHelper(_github).objects( "GET", "/repos/${slug.fullName}/issues/${issueNumber}/labels", - IssueLabel.fromJSON); + IssueLabel.fromJSON) as Stream; } /// Adds labels to an issue. @@ -289,9 +297,11 @@ class IssuesService extends Service { Future> addLabelsToIssue( RepositorySlug slug, int issueNumber, List labels) { return _github.postJSON( - "/repos/${slug.fullName}/issues/${issueNumber}/labels", - body: JSON.encode(labels), - convert: (input) => input.map((it) => IssueLabel.fromJSON(it))); + "/repos/${slug.fullName}/issues/${issueNumber}/labels", + body: JSON.encode(labels), + convert: (input) => + input.map((Map it) => IssueLabel.fromJSON(it))) + as Future>; } /// Replaces all labels for an issue. @@ -303,7 +313,9 @@ class IssuesService extends Service { .request("PUT", "/repos/${slug.fullName}/issues/${issueNumber}/labels", body: JSON.encode(labels)) .then((response) { - return JSON.decode(response.body).map((it) => IssueLabel.fromJSON(it)); + return JSON + .decode(response.body) + .map((Map it) => IssueLabel.fromJSON(it)); }); } @@ -335,7 +347,8 @@ 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( - "GET", "/repos/${slug.fullName}/milestones", Milestone.fromJSON); + "GET", "/repos/${slug.fullName}/milestones", Milestone.fromJSON) + as Stream; } // TODO: Implement getMilestone: https://developer.github.com/v3/issues/milestones/#get-a-single-milestone @@ -346,7 +359,8 @@ class IssuesService extends Service { Future createMilestone( RepositorySlug slug, CreateMilestone request) { return _github.postJSON("/repos/${slug.fullName}/milestones", - body: JSON.encode(request.toJSON()), convert: Milestone.fromJSON); + body: JSON.encode(request.toJSON()), + convert: Milestone.fromJSON) as Future; } // 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 3fffed70..10eb2b08 100644 --- a/lib/src/common/misc_service.dart +++ b/lib/src/common/misc_service.dart @@ -12,14 +12,15 @@ class MiscService extends Service { /// /// API docs: https://developer.github.com/v3/emojis/ Future> listEmojis() { - return _github.getJSON("/emojis", statusCode: StatusCodes.OK); + return _github.getJSON("/emojis", statusCode: StatusCodes.OK) + as Future>; } /// Lists available .gitignore template names. /// /// API docs: https://developer.github.com/v3/gitignore/#listing-available-templates Future> listGitignoreTemplates() { - return _github.getJSON("/gitignore/templates"); + return _github.getJSON("/gitignore/templates") as Future>; } /// Gets a .gitignore template by [name]. @@ -28,7 +29,7 @@ class MiscService extends Service { /// API docs: https://developer.github.com/v3/gitignore/#get-a-single-template Future getGitignoreTemplate(String name) { return _github.getJSON("/gitignore/templates/${name}", - convert: GitignoreTemplate.fromJSON); + convert: GitignoreTemplate.fromJSON) as Future; } /// Renders Markdown from the [input]. @@ -64,14 +65,15 @@ class MiscService extends Service { /// Gets the GitHub API Status. Future getApiStatus() { return _github.getJSON("https://status.github.com/api/status.json", - statusCode: StatusCodes.OK, convert: APIStatus.fromJSON); + statusCode: StatusCodes.OK, + convert: APIStatus.fromJSON) as Future; } /// Returns a stream of Octocats from Octodex. /// /// See: https://octodex.github.com/ Stream listOctodex({bool cors: false}) { - var controller = new StreamController(); + var controller = new StreamController(); var u = "http://feeds.feedburner.com/Octocats.xml"; @@ -102,7 +104,7 @@ class MiscService extends Service { /// Returns an ASCII Octocat with the specified [text]. Future getOctocat([String text]) { - var params = {}; + var params = {}; if (text != null) { params["s"] = text; diff --git a/lib/src/common/orgs_service.dart b/lib/src/common/orgs_service.dart index 368c03e5..6fd185aa 100644 --- a/lib/src/common/orgs_service.dart +++ b/lib/src/common/orgs_service.dart @@ -17,8 +17,8 @@ class OrganizationsService extends Service { if (userName == null) { requestPath = "/user/orgs"; } - return new PaginationHelper(_github) - .objects("GET", requestPath, Organization.fromJSON); + return new PaginationHelper(_github).objects( + "GET", requestPath, Organization.fromJSON) as Stream; } /// Fetches the organization specified by [name]. @@ -31,12 +31,12 @@ class OrganizationsService extends Service { if (response.statusCode == 404) { throw new OrganizationNotFound(_github, name); } - }); + }) as Future; } /// Fetches the organizations specified by [names]. Stream getMulti(List names) { - var controller = new StreamController(); + var controller = new StreamController(); var group = new FutureGroup(); @@ -73,15 +73,18 @@ class OrganizationsService extends Service { }); return _github.postJSON("/orgs/${org}", - statusCode: 200, convert: Organization.fromJSON, body: map); + statusCode: 200, + convert: Organization.fromJSON, + // TODO: This is probably wrong. Map needs to be json encoded? + body: map) as Future; } /// Lists all of the teams for the specified organization. /// /// API docs: https://developer.github.com/v3/orgs/teams/#list-teams Stream listTeams(String orgName) { - return new PaginationHelper(_github) - .objects("GET", "/orgs/${orgName}/teams", Team.fromJSON); + return new PaginationHelper(_github).objects( + "GET", "/orgs/${orgName}/teams", Team.fromJSON) as Stream; } /// Gets the team specified by the [teamId]. @@ -89,7 +92,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: Organization.fromJSON, statusCode: 200); + convert: Organization.fromJSON, statusCode: 200) as Future; } /// Creates a Team. @@ -105,7 +108,10 @@ class OrganizationsService extends Service { }); return _github.postJSON("/orgs/${org}/teams", - statusCode: 201, convert: Team.fromJSON, body: map); + statusCode: 201, + convert: Team.fromJSON, + // TODO: This is probably wrong, map needs to be json encoded? + body: map) as Future; } /// Edits a Team. @@ -117,7 +123,10 @@ class OrganizationsService extends Service { {"name": name, "description": description, "permission": permission}); return _github.postJSON("/teams/${teamId}", - statusCode: 200, convert: Team.fromJSON, body: map); + statusCode: 200, + convert: Team.fromJSON, + // TODO: This is probably wrong, map needs to be json encoded? + body: map) as Future; } /// Deletes the team specified by the [teamId] @@ -134,7 +143,8 @@ class OrganizationsService extends Service { /// API docs: https://developer.github.com/v3/orgs/teams/#list-team-members Stream listTeamMembers(int teamId) { return new PaginationHelper(_github) - .objects("GET", "/teams/${teamId}/members", TeamMember.fromJSON); + .objects("GET", "/teams/${teamId}/members", TeamMember.fromJSON) + as Stream; } Future getTeamMemberStatus(int teamId, String user) { @@ -171,7 +181,7 @@ 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 = new Completer(); _github.getJSON("/teams/${teamId}/memberships/${user}", statusCode: 200, fail: (http.Response response) { @@ -190,7 +200,7 @@ 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 = new Completer(); _github.request("POST", "/teams/${teamId}/memberships/${user}", statusCode: 200, fail: (http.Response response) { @@ -201,6 +211,7 @@ class OrganizationsService extends Service { } }).then((response) { return new TeamMembershipState(JSON.decode(response.body)["state"]); + // TODO: Not sure what should go here. }).then(completer.complete); return completer.future; @@ -219,7 +230,8 @@ class OrganizationsService extends Service { /// API docs: https://developer.github.com/v3/orgs/teams/#list-team-repos Stream listTeamRepositories(int teamId) { return new PaginationHelper(_github) - .objects("GET", "/teams/${teamId}/repos", Repository.fromJSON); + .objects("GET", "/teams/${teamId}/repos", Repository.fromJSON) + as Stream; } /// Checks if a team manages the specified repository. @@ -260,15 +272,16 @@ class OrganizationsService extends Service { /// API docs: https://developer.github.com/v3/orgs/teams/#list-user-teams Stream listUserTeams() { return new PaginationHelper(_github) - .objects("GET", "/user/teams", Team.fromJSON); + .objects("GET", "/user/teams", Team.fromJSON) as Stream; } /// Lists the hooks for the specified organization. /// /// API docs: https://developer.github.com/v3/orgs/hooks/#list-hooks Stream listHooks(String org) { - return new PaginationHelper(_github).objects( - "GET", "/orgs/${org}/hooks", (input) => Hook.fromJSON(org, input)); + return new PaginationHelper(_github).objects("GET", "/orgs/${org}/hooks", + (Map input) => Hook.fromJSON(org, input)) + as Stream; } /// Fetches a single hook by [id]. @@ -276,7 +289,8 @@ class OrganizationsService extends Service { /// API docs: https://developer.github.com/v3/orgs/hooks/#get-single-hook Future getHook(String org, int id) { return _github.getJSON("/orgs/${org}/hooks/${id}", - convert: (i) => Hook.fromJSON(org, i)); + convert: (Map i) => Hook.fromJSON(org, i)) + as Future; } /// Creates an organization hook based on the specified [hook]. @@ -284,7 +298,8 @@ class OrganizationsService extends Service { /// API docs: https://developer.github.com/v3/orgs/hooks/#create-a-hook Future createHook(String org, CreateHook hook) { return _github.postJSON("/orgs/${org}/hooks", - convert: (i) => Hook.fromJSON(org, i), body: hook.toJSON()); + convert: (Map i) => Hook.fromJSON(org, i), + body: hook.toJSON()) as Future; } // TODO: Implement editHook: https://developer.github.com/v3/orgs/hooks/#edit-a-hook From 4a692bb218ba63b5266c2fc9fc564ddd94c08871 Mon Sep 17 00:00:00 2001 From: Joel Trottier-Hebert Date: Thu, 6 Oct 2016 13:04:36 -0400 Subject: [PATCH 027/496] Fix Strong mode, other fixes --- lib/src/common/pulls_service.dart | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/lib/src/common/pulls_service.dart b/lib/src/common/pulls_service.dart index 4d1f1d48..5e633a64 100644 --- a/lib/src/common/pulls_service.dart +++ b/lib/src/common/pulls_service.dart @@ -10,7 +10,7 @@ class PullRequestsService extends Service { Stream list(RepositorySlug slug, {int pages}) { return new PaginationHelper(_github).objects( "GET", "/repos/${slug.fullName}/pulls", PullRequest.fromJSON, - pages: pages); + pages: pages) as Stream; } /// Fetches a single pull request. @@ -18,7 +18,8 @@ class PullRequestsService extends Service { /// API docs: https://developer.github.com/v3/pulls/#get-a-single-pull-request Future get(RepositorySlug slug, int number) { return _github.getJSON("/repos/${slug.fullName}/pulls/${number}", - convert: PullRequest.fromJSON, statusCode: StatusCodes.OK); + convert: PullRequest.fromJSON, + statusCode: StatusCodes.OK) as Future; } /// Creates a Pull Request based on the given [request]. @@ -27,7 +28,8 @@ class PullRequestsService extends Service { Future create( RepositorySlug slug, CreateRelease request) { return _github.postJSON("/repos/${slug.fullName}/pulls", - convert: PullRequestInformation.fromJSON, body: request.toJSON()); + convert: PullRequestInformation.fromJSON, + body: request.toJSON()) as Future; } /// Edit a pull request. @@ -44,7 +46,8 @@ class PullRequestsService extends Service { .request("POST", '/repos/${slug.fullName}/pulls/${number}', body: JSON.encode(map)) .then((response) { - return PullRequest.fromJSON(JSON.decode(response.body)); + return PullRequest + .fromJSON(JSON.decode(response.body) as Map); }); } @@ -55,14 +58,14 @@ class PullRequestsService extends Service { return new PaginationHelper(_github).objects( "GET", '/repos/${slug.fullName}/pulls/${number}/commits', - RepositoryCommit.fromJSON); + RepositoryCommit.fromJSON) as Stream; } Stream listFiles(RepositorySlug slug, int number) { return new PaginationHelper(_github).objects( "GET", '/repos/${slug.fullName}/pulls/${number}/files', - PullRequestFile.fromJSON); + PullRequestFile.fromJSON) as Stream; } Future isMerged(RepositorySlug slug, int number) { @@ -88,7 +91,8 @@ class PullRequestsService extends Service { .request("PUT", "/repos/${slug.fullName}/pulls/${number}/merge", body: JSON.encode(json)) .then((response) { - return PullRequestMerge.fromJSON(JSON.decode(response.body)); + return PullRequestMerge + .fromJSON(JSON.decode(response.body) as Map); }); } @@ -100,15 +104,17 @@ class PullRequestsService extends Service { return new PaginationHelper(_github).objects( "GET", "/repos/${slug.fullName}/pulls/${number}/comments", - PullRequestComment.fromJSON); + PullRequestComment.fromJSON) as Stream; } /// 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 new PaginationHelper(_github).objects("GET", - "/repos/${slug.fullName}/pulls/comments", PullRequestComment.fromJSON); + return new PaginationHelper(_github).objects( + "GET", + "/repos/${slug.fullName}/pulls/comments", + PullRequestComment.fromJSON) as Stream; } /// Creates a new pull request comment. @@ -119,7 +125,7 @@ class PullRequestsService extends Service { return _github.postJSON('/repos/${slug.fullName}/pulls/${number}/comments', body: comment.toJSON(), convert: PullRequestComment.fromJSON, - statusCode: 201); + statusCode: 201) as Future; } // TODO: Implement editComment: https://developer.github.com/v3/pulls/comments/#edit-a-comment From d7045d1c8e6e0028b945dd61d5c8d46f26273876 Mon Sep 17 00:00:00 2001 From: Joel Trottier-Hebert Date: Thu, 6 Oct 2016 13:12:38 -0400 Subject: [PATCH 028/496] Fix Strong mode, other fixes --- lib/src/common/repos_service.dart | 40 ++++++++++++++--------- lib/src/common/search_service.dart | 10 +++--- lib/src/common/url_shortener_service.dart | 2 +- lib/src/common/users_service.dart | 27 ++++++++------- 4 files changed, 48 insertions(+), 31 deletions(-) diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index eab49a4f..cd29bf99 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -151,7 +151,9 @@ class RepositoriesService extends Service { "default_branch": "defaultBranch" }); return _github.postJSON("/repos/${repo.fullName}", - body: data, statusCode: 200) as Future; + // TODO: data probably needs to be json encoded? + body: data, + statusCode: 200) as Future; } /// Deletes a repository. @@ -291,12 +293,13 @@ class RepositoriesService extends Service { } return _github.getJSON(url, headers: headers, statusCode: StatusCodes.OK, - fail: (http.Response response) { + fail: (http.Response response) { if (response.statusCode == 404) { throw new NotFound(_github, response.body); } - }, convert: (input) => GitHubFile.fromJSON(input, slug)) - as Future; + }, + convert: (Map input) => + GitHubFile.fromJSON(input, slug)) as Future; } /// Fetches content in a repository at the specified [path]. @@ -325,9 +328,11 @@ class RepositoriesService extends Service { return _github.getJSON(url, convert: (input) { var contents = new RepositoryContents(); if (input is Map) { - contents.file = GitHubFile.fromJSON(input); + contents.file = GitHubFile.fromJSON(input as Map); } else { - contents.tree = copyOf(input.map((it) => GitHubFile.fromJSON(it))); + contents.tree = (input as List>) + .map((Map it) => GitHubFile.fromJSON(it)) + .toList(); } return contents; }) as Future; @@ -341,7 +346,8 @@ class RepositoriesService extends Service { .request("PUT", "/repos/${slug.fullName}/contents/${file.path}", body: file.toJSON()) .then((response) { - return ContentCreation.fromJSON(JSON.decode(response.body)); + return ContentCreation + .fromJSON(JSON.decode(response.body) as Map); }); } @@ -355,6 +361,7 @@ class RepositoriesService extends Service { {"message": message, "content": content, "sha": sha, "branch": branch}); return _github.postJSON("/repos/${slug.fullName}/contents/${path}", + // TODO: map probably needs to be json encoded body: map, statusCode: 200, convert: ContentCreation.fromJSON) as Future; @@ -372,7 +379,8 @@ class RepositoriesService extends Service { .request("DELETE", "/repos/${slug.fullName}/contents/${path}", body: JSON.encode(map), statusCode: 200) .then((response) { - return ContentCreation.fromJSON(JSON.decode(response.body)); + return ContentCreation + .fromJSON(JSON.decode(response.body) as Map); }); } @@ -413,9 +421,10 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/hooks/#list-hooks Stream listHooks(RepositorySlug slug) { return new PaginationHelper(_github).objects( - "GET", - "/repos/${slug.fullName}/hooks", - (input) => Hook.fromJSON(slug.fullName, input)) as Stream; + "GET", + "/repos/${slug.fullName}/hooks", + (Map input) => Hook.fromJSON(slug.fullName, input)) + as Stream; } /// Fetches a single hook by [id]. @@ -423,7 +432,8 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/hooks/#get-single-hook Future getHook(RepositorySlug slug, int id) { return _github.getJSON("/repos/${slug.fullName}/hooks/${id}", - convert: (i) => Hook.fromJSON(slug.fullName, i)) as Future; + convert: (Map i) => + Hook.fromJSON(slug.fullName, i)) as Future; } /// Creates a repository hook based on the specified [hook]. @@ -431,7 +441,7 @@ class RepositoriesService extends Service { /// 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: (i) => Hook.fromJSON(slug.fullName, i), + convert: (Map i) => Hook.fromJSON(slug.fullName, i), body: hook.toJSON()) as Future; } @@ -560,8 +570,8 @@ class RepositoriesService extends Service { }); return null; } else { - completer - .complete(json.map((it) => ContributorStatistics.fromJSON(it))); + completer.complete(json.map( + (Map it) => ContributorStatistics.fromJSON(it))); } }; _github diff --git a/lib/src/common/search_service.dart b/lib/src/common/search_service.dart index f496010d..db0cc592 100644 --- a/lib/src/common/search_service.dart +++ b/lib/src/common/search_service.dart @@ -17,7 +17,7 @@ class SearchService extends Service { params["sort"] = sort; } - var controller = new StreamController(); + var controller = new StreamController(); var isFirst = true; @@ -41,7 +41,9 @@ class SearchService extends Service { List items = input['items']; - items.map((item) => Repository.fromJSON(item)).forEach(controller.add); + items + .map((Map item) => Repository.fromJSON(item)) + .forEach(controller.add); }).onDone(controller.close); return controller.stream; @@ -62,9 +64,9 @@ class SearchService extends Service { params["sort"] = sort; } - params["per_page"] = perPage; + params["per_page"] = perPage.toString(); - var controller = new StreamController(); + var controller = new StreamController(); var isFirst = true; diff --git a/lib/src/common/url_shortener_service.dart b/lib/src/common/url_shortener_service.dart index ea61ba54..7af62807 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 = {}; + var params = {}; params['url'] = url; diff --git a/lib/src/common/users_service.dart b/lib/src/common/users_service.dart index c9d0b6a3..ee1fb649 100644 --- a/lib/src/common/users_service.dart +++ b/lib/src/common/users_service.dart @@ -11,7 +11,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) as Future; /// Updates the Current User. /// @@ -35,12 +35,15 @@ class UsersService extends Service { }); return _github.postJSON("/user", - body: map, statusCode: 200, convert: CurrentUser.fromJSON); + // TODO: map probably needs to be JSON encoded. + body: map, + statusCode: 200, + convert: CurrentUser.fromJSON) as Future; } /// Fetches a list of users specified by [names]. Stream getUsers(List names, {int pages}) { - var controller = new StreamController(); + var controller = new StreamController(); var group = new FutureGroup(); @@ -68,7 +71,7 @@ class UsersService extends Service { if (response.statusCode == StatusCodes.FORBIDDEN) { throw new AccessForbidden(_github); } - }, convert: CurrentUser.fromJSON); + }, convert: CurrentUser.fromJSON) as Future; } /// Checks if a user exists. @@ -83,13 +86,13 @@ 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, - pages: pages, params: {"since": since}); + pages: pages, params: {"since": since}) as Stream; /// 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) - .objects("GET", "/user/emails", UserEmail.fromJSON); + .objects("GET", "/user/emails", UserEmail.fromJSON) as Stream; /// Add Emails /// @@ -97,7 +100,7 @@ class UsersService extends Service { Stream addEmails(List emails) => new PaginationHelper(_github).objects( "POST", "/user/emails", UserEmail.fromJSON, - statusCode: 201, body: JSON.encode(emails)); + statusCode: 201, body: JSON.encode(emails)) as Stream; /// Delete Emails /// @@ -112,7 +115,7 @@ class UsersService extends Service { /// API docs: https://developer.github.com/v3/users/followers/#list-followers-of-a-user Stream listUserFollowers(String user) => new PaginationHelper(_github) .objects("GET", "/users/${user}/followers", User.fromJSON, - statusCode: 200); + statusCode: 200) as Stream; /// Check if the current user is following the specified user. Future isFollowingUser(String user) => @@ -148,7 +151,8 @@ class UsersService extends Service { /// /// API docs: https://developer.github.com/v3/users/followers/#list-followers-of-a-user Stream listCurrentUserFollowers() => new PaginationHelper(_github) - .objects("GET", "/user/followers", User.fromJSON, statusCode: 200); + .objects("GET", "/user/followers", User.fromJSON, statusCode: 200) + as Stream; /// Lists the verified public keys for a [userLogin]. If no [userLogin] is specified, /// the public keys for the authenticated user are fetched. @@ -158,7 +162,7 @@ class UsersService extends Service { Stream listPublicKeys([String userLogin]) { var path = userLogin == null ? "/user/keys" : "/users/${userLogin}/keys"; return new PaginationHelper(_github) - .objects("GET", path, PublicKey.fromJSON); + .objects("GET", path, PublicKey.fromJSON) as Stream; } // TODO: Implement getPublicKey: https://developer.github.com/v3/users/keys/#get-a-single-public-key @@ -167,7 +171,8 @@ 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; } // TODO: Implement updatePublicKey: https://developer.github.com/v3/users/keys/#update-a-public-key From 624fcd2a98183f559fa0560a90861de1b6c1586a Mon Sep 17 00:00:00 2001 From: Joel Trottier-Hebert Date: Thu, 6 Oct 2016 13:19:02 -0400 Subject: [PATCH 029/496] Fix Strong mode, other fixes --- lib/src/common/repos_service.dart | 3 ++- lib/src/server/hooks.dart | 27 +++++++++++++++++---------- test/helper/http.dart | 16 ++++++++++------ 3 files changed, 29 insertions(+), 17 deletions(-) diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index cd29bf99..e93be18c 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -72,7 +72,8 @@ class RepositoriesService extends Service { .fetchStreamed("GET", "/repositories", pages: pages, params: params) .listen((http.Response response) { var list = JSON.decode(response.body); - var repos = new List.from(list.map((it) => Repository.fromJSON(it))); + var repos = new List.from( + list.map((Map it) => Repository.fromJSON(it))); for (var repo in repos) controller.add(repo); }); diff --git a/lib/src/server/hooks.dart b/lib/src/server/hooks.dart index 02f1e7d5..e287ce10 100644 --- a/lib/src/server/hooks.dart +++ b/lib/src/server/hooks.dart @@ -5,6 +5,7 @@ import "dart:io"; import "../common.dart"; class HookMiddleware { + // TODO: Close this, but where? final StreamController _eventController = new StreamController(); Stream get onEvent => _eventController.stream; @@ -26,7 +27,8 @@ class HookMiddleware { request.transform(const Utf8Decoder()).join().then((content) { _eventController.add(new HookEvent.fromJSON( - request.headers.value("X-GitHub-Event"), JSON.decode(content))); + request.headers.value("X-GitHub-Event"), + JSON.decode(content) as Map)); request.response ..write(JSON.encode({"handled": _eventController.hasListener})) ..close(); @@ -93,7 +95,8 @@ class RepositoryEvent extends HookEvent { static RepositoryEvent fromJSON(Map json) { return new RepositoryEvent() ..action = json["action"] - ..repository = Repository.fromJSON(json["repository"]) + ..repository = + Repository.fromJSON(json["repository"] as Map) ..sender = User.fromJSON(json["sender"]); } } @@ -106,8 +109,9 @@ class IssueCommentEvent extends HookEvent { static IssueCommentEvent fromJSON(Map json) { return new IssueCommentEvent() ..action = json["action"] - ..issue = Issue.fromJSON(json["issue"]) - ..comment = IssueComment.fromJSON(json["comment"]); + ..issue = Issue.fromJSON(json["issue"] as Map) + ..comment = + IssueComment.fromJSON(json["comment"] as Map); } } @@ -117,7 +121,7 @@ class ForkEvent extends HookEvent { static ForkEvent fromJSON(Map json) { return new ForkEvent() - ..forkee = Repository.fromJSON(json["forkee"]) + ..forkee = Repository.fromJSON(json["forkee"] as Map) ..sender = User.fromJSON(json["sender"]); } } @@ -134,9 +138,10 @@ class IssueEvent extends HookEvent { return new IssueEvent() ..action = json["action"] ..assignee = User.fromJSON(json["assignee"]) - ..label = IssueLabel.fromJSON(json["label"]) - ..issue = Issue.fromJSON(json["issue"]) - ..repository = Repository.fromJSON(json["repository"]) + ..label = IssueLabel.fromJSON(json["label"] as Map) + ..issue = Issue.fromJSON(json["issue"] as Map) + ..repository = + Repository.fromJSON(json["repository"] as Map) ..sender = User.fromJSON(json["sender"]); } } @@ -152,8 +157,10 @@ class PullRequestEvent extends HookEvent { return new PullRequestEvent() ..action = json["action"] ..number = json["number"] - ..repository = Repository.fromJSON(json["repository"]) - ..pullRequest = PullRequest.fromJSON(json["pull_request"]) + ..repository = + Repository.fromJSON(json["repository"] as Map) + ..pullRequest = + PullRequest.fromJSON(json["pull_request"] as Map) ..sender = User.fromJSON(json["sender"]); } } diff --git a/test/helper/http.dart b/test/helper/http.dart index e2147811..d5f32203 100644 --- a/test/helper/http.dart +++ b/test/helper/http.dart @@ -2,19 +2,21 @@ part of github.test.helper; final MockHTTPClient httpClient = new MockHTTPClient(); -typedef http.Response ResponseCreator(http.Request request); +typedef http.Response ResponseCreator(http.BaseRequest request); class MockHTTPClient extends http.BaseClient { - final Map responses = {}; + final Map responses = {}; @override - Future send(http.Request request) { - var creator = responses.keys.firstWhere( + Future send(http.BaseRequest request) { + var matchingUrlCreatorKey = responses.keys.firstWhere( (it) => it.allMatches(request.url.toString()).isNotEmpty, orElse: () => null); + var creator = responses[matchingUrlCreatorKey]; if (creator == null) { throw new Exception("No Response Configured"); } + return new Future.value(creator(request)); } } @@ -25,8 +27,10 @@ class MockResponse extends http.Response { factory MockResponse.fromAsset(String name) { Map responseData = - JSON.decode(asset("responses/${name}.json").readAsStringSync()); - Map headers = responseData['headers']; + JSON.decode(asset("responses/${name}.json").readAsStringSync()) + as Map; + Map headers = + responseData['headers'] as Map; dynamic body = responseData['body']; int statusCode = responseData['statusCode']; String actualBody; From 467e50cf62e0a59ea2d124b6a312f785ba65ea62 Mon Sep 17 00:00:00 2001 From: Joel Trottier-Hebert Date: Thu, 6 Oct 2016 13:21:26 -0400 Subject: [PATCH 030/496] Some refactoring --- example/releases.dart | 10 +++++----- example/status.dart | 25 ++++++++++--------------- lib/src/common/model/gists.dart | 2 +- 3 files changed, 16 insertions(+), 21 deletions(-) diff --git a/example/releases.dart b/example/releases.dart index 539cdd61..984f4570 100644 --- a/example/releases.dart +++ b/example/releases.dart @@ -4,11 +4,11 @@ import "package:github/browser.dart"; import "common.dart"; -DivElement $releases; +DivElement releasesDiv; void main() { init("releases.dart", onReady: () { - $releases = querySelector("#releases"); + releasesDiv = querySelector("#releases"); loadReleases(); }); } @@ -19,15 +19,15 @@ void loadReleases() { .toList() .then((releases) { for (var release in releases) { - $releases.appendHtml( + releasesDiv.appendHtml( """

${release.name}

""", treeSanitizer: NodeTreeSanitizer.trusted); - var rel = $releases.querySelector("#release-${release.id}"); - void append(String key, value) { + var rel = releasesDiv.querySelector("#release-${release.id}"); + void append(String key, String value) { if (value == null) return; rel.appendHtml("
${key}: ${value}", treeSanitizer: NodeTreeSanitizer.trusted); diff --git a/example/status.dart b/example/status.dart index 819601cd..10ee6b88 100644 --- a/example/status.dart +++ b/example/status.dart @@ -1,21 +1,16 @@ +import 'dart:async'; import "dart:html"; import "dart:convert"; -main() async { - await sync(); -} - -sync() async { - { - var request = await HttpRequest.request( - "https://status.github.com/api/status.json", - requestHeaders: {"Origin": window.location.origin}); +Future main() async { + var request = await HttpRequest.request( + "https://status.github.com/api/status.json", + requestHeaders: {"Origin": window.location.origin}); - var text = request.responseText; - var json = JSON.decode(text); + var text = request.responseText; + var json = JSON.decode(text); - querySelector("#status") - ..appendText(json["status"]) - ..classes.add("status-${json["status"]}"); - } + querySelector("#status") + ..appendText(json["status"]) + ..classes.add("status-${json["status"]}"); } diff --git a/lib/src/common/model/gists.dart b/lib/src/common/model/gists.dart index 7cfab8a3..7d512a1f 100644 --- a/lib/src/common/model/gists.dart +++ b/lib/src/common/model/gists.dart @@ -151,7 +151,7 @@ class GistComment { String body; - static GistComment fromJSON(input) { + static GistComment fromJSON(Map input) { if (input == null) return null; return new GistComment() From 1e3adf8b73121cc09f529159000c953df7c7df5c Mon Sep 17 00:00:00 2001 From: Joel Trottier-Hebert Date: Thu, 6 Oct 2016 13:54:25 -0400 Subject: [PATCH 031/496] Strong mode --- example/user_info.dart | 2 +- lib/browser.dart | 14 ++++------- lib/server.dart | 17 ++++++-------- lib/src/browser/helper.dart | 24 +++++++------------ lib/src/common.dart | 9 +++---- lib/src/common/explore_service.dart | 6 ++--- lib/src/common/gists_service.dart | 2 +- lib/src/common/misc_service.dart | 4 ++-- lib/src/common/model/activity.dart | 2 +- lib/src/common/model/authorizations.dart | 6 ++--- lib/src/common/model/gists.dart | 20 ++++++++-------- lib/src/common/model/issues.dart | 10 ++++---- lib/src/common/model/misc.dart | 4 ++-- lib/src/common/model/pulls.dart | 10 ++++---- lib/src/common/model/repos_commits.dart | 4 ++-- lib/src/common/model/repos_contents.dart | 4 ++-- lib/src/common/model/repos_pages.dart | 2 +- lib/src/common/model/repos_releases.dart | 8 +++---- lib/src/common/model/repos_stats.dart | 2 +- lib/src/common/model/users.dart | 30 ++++++++---------------- lib/src/common/search_service.dart | 4 +++- lib/src/common/util/auth.dart | 18 +++++++------- lib/src/common/util/crawler.dart | 4 +--- lib/src/common/util/json.dart | 6 ++--- lib/src/common/util/utils.dart | 2 -- lib/src/server/hooks.dart | 10 ++++---- test/experiment/directcode_keys.dart | 3 ++- test/experiment/limit_pager.dart | 5 ++-- test/experiment/org_hooks.dart | 3 ++- test/experiment/orglist.dart | 3 ++- test/git_integration_test.dart | 2 +- test/git_test.dart | 2 +- test/util_test.dart | 2 +- tool/build.dart | 4 ++-- 34 files changed, 110 insertions(+), 138 deletions(-) diff --git a/example/user_info.dart b/example/user_info.dart index e3c70f28..7601a981 100644 --- a/example/user_info.dart +++ b/example/user_info.dart @@ -33,7 +33,7 @@ void loadUser() { Name: ${user.name} """); - void append(String name, value) { + void append(String name, dynamic value) { if (value != null) { info.appendHtml("""
diff --git a/lib/browser.dart b/lib/browser.dart index fa26ad4f..656f720f 100644 --- a/lib/browser.dart +++ b/lib/browser.dart @@ -1,9 +1,7 @@ -/** - * GitHub for the Browser - * - * This contains a few utilities that are browser specific. - * See [GitHubBrowserHelper] for more information. - */ +/// GitHub for the Browser +/// +/// This contains a few utilities that are browser specific. + library github.browser; import "src/common.dart"; @@ -11,9 +9,7 @@ import "src/common.dart"; export "src/browser/helper.dart"; export "src/common.dart"; -/** - * Creates a GitHub Client - */ +/// Creates a GitHub Client GitHub createGitHubClient( {Authentication auth, String endpoint: "https://api.github.com"}) { return new GitHub(auth: auth, endpoint: endpoint); diff --git a/lib/server.dart b/lib/server.dart index 5971843e..735e72bf 100644 --- a/lib/server.dart +++ b/lib/server.dart @@ -1,6 +1,4 @@ -/** - * GitHub for the Server - */ +/// GitHub for the Server library github.server; import "dart:io"; @@ -10,12 +8,9 @@ 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]. - */ +/// 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) { @@ -55,7 +50,9 @@ Authentication findAuthenticationFromEnvironment() { String password = result.stderr.toString().split("password:")[1].trim(); password = password.substring(1, password.length - 1); return new Authentication.basic(username.trim(), password.trim()); - } catch (e) {} + } catch (e) { + print(e); + } } Map env = Platform.environment; diff --git a/lib/src/browser/helper.dart b/lib/src/browser/helper.dart index b9144ff6..970e2438 100644 --- a/lib/src/browser/helper.dart +++ b/lib/src/browser/helper.dart @@ -2,19 +2,15 @@ import 'dart:html' hide Client; import '../common.dart'; -/** - * Browser-Specific Helpers - */ +/// 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. - */ + /// 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}) { ElementList elements = document.querySelectorAll(selector); @@ -36,9 +32,7 @@ class GitHubBrowserHelper { } } - /** - * Creates an Image Element from a User that has the user's avatar. - */ + /// 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); diff --git a/lib/src/common.dart b/lib/src/common.dart index 749dd800..4ea2e459 100644 --- a/lib/src/common.dart +++ b/lib/src/common.dart @@ -1,15 +1,12 @@ -/** - * The Core of GitHub for Dart. - * - * Contains the Models and other GitHub stuff. - */ +/// The Core of GitHub for Dart. +/// Contains the Models and other GitHub stuff. library github.common; import "dart:async"; import "dart:convert" show BASE64, JSON, UTF8; import "package:html/dom.dart" as html; -import "package:html/parser.dart" as htmlParser; +import "package:html/parser.dart" as html_parser; import "package:http/http.dart" as http; import "package:quiver/async.dart" show FutureGroup; import "package:xml/xml.dart" as xml; diff --git a/lib/src/common/explore_service.dart b/lib/src/common/explore_service.dart index 61e903b8..fc015b5d 100644 --- a/lib/src/common/explore_service.dart +++ b/lib/src/common/explore_service.dart @@ -18,7 +18,7 @@ class ExploreService extends Service { var controller = new StreamController(); _github.client.get(url).then((response) { - var doc = htmlParser.parse(response.body); + var doc = html_parser.parse(response.body); var items = doc.querySelectorAll( "li.repo-leaderboard-list-item.leaderboard-list-item"); @@ -48,7 +48,7 @@ class ExploreService extends Service { var completer = new Completer(); _github.client.get(info.url).then((response) { - var doc = htmlParser.parse(response.body); + var doc = html_parser.parse(response.body); var showcase = new Showcase(); var title = doc.querySelector(".collection-header").text; @@ -95,7 +95,7 @@ class ExploreService extends Service { Function handleResponse; handleResponse = (response) { - var doc = htmlParser.parse(response.body); + var doc = html_parser.parse(response.body); var cards = doc.querySelectorAll(".collection-card"); diff --git a/lib/src/common/gists_service.dart b/lib/src/common/gists_service.dart index 8d62bf40..98fce6e9 100644 --- a/lib/src/common/gists_service.dart +++ b/lib/src/common/gists_service.dart @@ -145,7 +145,7 @@ class GistsService extends Service { return _github .request("POST", "/gists/${id}/forks", statusCode: 201) .then((response) { - return Gist.fromJSON(JSON.decode(response.body)); + return Gist.fromJSON(JSON.decode(response.body) as Map); }); } diff --git a/lib/src/common/misc_service.dart b/lib/src/common/misc_service.dart index 10eb2b08..ab211784 100644 --- a/lib/src/common/misc_service.dart +++ b/lib/src/common/misc_service.dart @@ -81,13 +81,13 @@ class MiscService extends Service { .get( "${cors ? "http://whateverorigin.org/get?url=" : ""}${cors ? Uri.encodeComponent(u) : u}") .then((response) { - var document = htmlParser.parse(response.body); + var document = html_parser.parse(response.body); document.querySelectorAll("entry").forEach((entry) { var name = entry.querySelector("title").text; var c = "" + entry.querySelector("content").innerHtml + ""; - var content = htmlParser.parse(c); + var content = html_parser.parse(c); var image = content.querySelector("a img").attributes['src']; var url = entry.querySelector("link").attributes['href']; diff --git a/lib/src/common/model/activity.dart b/lib/src/common/model/activity.dart index 37d0f04d..e28667ea 100644 --- a/lib/src/common/model/activity.dart +++ b/lib/src/common/model/activity.dart @@ -33,7 +33,7 @@ class Event { ..org = Organization.fromJSON(input['org'] as Map) ..createdAt = parseDateTime(input['created_at']) ..id = input['id'] - ..actor = User.fromJSON(input['actor']) + ..actor = User.fromJSON(input['actor'] as Map) ..payload = input['payload'] as Map; return event; diff --git a/lib/src/common/model/authorizations.dart b/lib/src/common/model/authorizations.dart index e38c1d5c..a81ee78d 100644 --- a/lib/src/common/model/authorizations.dart +++ b/lib/src/common/model/authorizations.dart @@ -22,13 +22,13 @@ class Authorization { ..id = input['id'] ..scopes = input['scopes'] as List ..token = input['token'] - ..app = AuthorizationApplication.fromJSON(input['app']) + ..app = AuthorizationApplication.fromJSON(input['app'] as Map) ..note = input['note'] ..noteUrl = input['note_url'] ..createdAt = parseDateTime(input['created_at']) ..updatedAt = parseDateTime(input['updated_at']) ..json = input - ..user = User.fromJSON(input['user']); + ..user = User.fromJSON(input['user'] as Map); } } @@ -42,7 +42,7 @@ class AuthorizationApplication { AuthorizationApplication(); - static AuthorizationApplication fromJSON(input) { + static AuthorizationApplication fromJSON(Map input) { if (input == null) return null; return new AuthorizationApplication() diff --git a/lib/src/common/model/gists.dart b/lib/src/common/model/gists.dart index 7d512a1f..674e53b5 100644 --- a/lib/src/common/model/gists.dart +++ b/lib/src/common/model/gists.dart @@ -27,21 +27,21 @@ class Gist { @ApiName("updated_at") DateTime updatedAt; - static Gist fromJSON(input) { + static Gist fromJSON(Map input) { if (input == null) return null; var gist = new Gist() ..id = input['id'] ..description = input['description'] ..public = input['public'] - ..owner = User.fromJSON(input['owner']) - ..user = User.fromJSON(input['user']); + ..owner = User.fromJSON(input['owner'] as Map) + ..user = User.fromJSON(input['user'] as Map); if (input['files'] != null) { gist.files = []; for (var key in input['files'].keys) { - var map = copyOf(input['files'][key]); + var map = copyOf(input['files'][key]) as Map; map['name'] = key; gist.files.add(GistFile.fromJSON(map)); } @@ -71,7 +71,7 @@ class GistFile { bool truncated; String content; - static GistFile fromJSON(input) { + static GistFile fromJSON(Map input) { if (input == null) return null; return new GistFile() @@ -96,11 +96,11 @@ class GistFork { @ApiName("updated_at") DateTime updatedAt; - static GistFork fromJSON(input) { + static GistFork fromJSON(Map input) { if (input == null) return null; return new GistFork() - ..user = User.fromJSON(input['user']) + ..user = User.fromJSON(input['user'] as Map) ..id = input['id'] ..createdAt = parseDateTime(input['created_at']) ..updatedAt = parseDateTime(input['updated_at']); @@ -125,12 +125,12 @@ class GistHistoryEntry { @ApiName("committed_at") DateTime committedAt; - static GistHistoryEntry fromJSON(input) { + static GistHistoryEntry fromJSON(Map input) { if (input == null) return null; return new GistHistoryEntry() ..version = input['version'] - ..user = User.fromJSON(input['user']) + ..user = User.fromJSON(input['user'] as Map) ..deletions = input['change_status']['deletions'] ..additions = input['change_status']['additions'] ..totalChanges = input['change_status']['total'] @@ -156,7 +156,7 @@ class GistComment { return new GistComment() ..id = input['id'] - ..user = User.fromJSON(input['user']) + ..user = User.fromJSON(input['user'] as Map) ..createdAt = parseDateTime(input['created_at']) ..updatedAt = parseDateTime(input['updated_at']) ..body = input['body']; diff --git a/lib/src/common/model/issues.dart b/lib/src/common/model/issues.dart index 9db6ca20..0279e4c8 100644 --- a/lib/src/common/model/issues.dart +++ b/lib/src/common/model/issues.dart @@ -71,9 +71,9 @@ class Issue { ..number = input['number'] ..state = input['state'] ..title = input['title'] - ..user = User.fromJSON(input['user']) + ..user = User.fromJSON(input['user'] as Map) ..labels = labels.map(IssueLabel.fromJSON).toList(growable: false) - ..assignee = User.fromJSON(input['assignee']) + ..assignee = User.fromJSON(input['assignee'] as Map) ..milestone = Milestone.fromJSON(input['milestone'] as Map) ..commentsCount = input['comments'] @@ -82,7 +82,7 @@ class Issue { ..createdAt = parseDateTime(input['created_at']) ..updatedAt = parseDateTime(input['updated_at']) ..closedAt = parseDateTime(input['closed_at']) - ..closedBy = User.fromJSON(input['closed_by']) + ..closedBy = User.fromJSON(input['closed_by'] as Map) ..body = input['body']; } @@ -163,7 +163,7 @@ class IssueComment { return new IssueComment() ..id = input['id'] ..body = input['body'] - ..user = User.fromJSON(input['user']) + ..user = User.fromJSON(input['user'] as Map) ..createdAt = parseDateTime(input['created_at']) ..updatedAt = parseDateTime(input['updated_at']) ..url = input['url'] @@ -244,7 +244,7 @@ class Milestone { ..state = input['state'] ..title = input['title'] ..description = input['description'] - ..creator = User.fromJSON(input['creator']) + ..creator = User.fromJSON(input['creator'] as Map) ..openIssuesCount = input['open_issues'] ..closedIssuesCount = input['closed_issues'] ..createdAt = parseDateTime(input['created_at']) diff --git a/lib/src/common/model/misc.dart b/lib/src/common/model/misc.dart index 265b7c2b..3c995dc2 100644 --- a/lib/src/common/model/misc.dart +++ b/lib/src/common/model/misc.dart @@ -8,7 +8,7 @@ class GitignoreTemplate { /// Template Source String source; - static GitignoreTemplate fromJSON(input) { + static GitignoreTemplate fromJSON(Map input) { if (input == null) return null; return new GitignoreTemplate() @@ -52,7 +52,7 @@ class APIStatus { @ApiName("body") String message; - static APIStatus fromJSON(input) { + static APIStatus fromJSON(Map input) { if (input == null) return null; return new APIStatus() diff --git a/lib/src/common/model/pulls.dart b/lib/src/common/model/pulls.dart index ac1b1406..b8541510 100644 --- a/lib/src/common/model/pulls.dart +++ b/lib/src/common/model/pulls.dart @@ -74,7 +74,7 @@ class PullRequestInformation { pr.updatedAt = parseDateTime(input['updated_at']); pr.closedAt = parseDateTime(input['closed_at']); pr.mergedAt = parseDateTime(input['merged_at']); - pr.user = User.fromJSON(input['user']); + pr.user = User.fromJSON(input['user'] as Map); return pr; } } @@ -121,7 +121,7 @@ class PullRequest extends PullRequestInformation { pr.mergeable = input['mergeable']; pr.merged = input['merged']; pr.id = input['id']; - pr.mergedBy = User.fromJSON(input['merged_by']); + pr.mergedBy = User.fromJSON(input['merged_by'] as Map); pr.mergeCommitSha = input['merge_commit_sha']; pr.commentsCount = input['comments']; pr.commitsCount = input['commits']; @@ -174,7 +174,7 @@ class PullRequestHead { head.label = input['label']; head.ref = input['ref']; head.sha = input['sha']; - head.user = User.fromJSON(input['user']); + head.user = User.fromJSON(input['user'] as Map); head.repo = Repository.fromJSON(input['repo'] as Map); return head; } @@ -252,13 +252,13 @@ class PullRequestComment { ..originalPosition = input['original_position'] ..commitID = input['commit_id'] ..originalCommitID = input['original_commit_id'] - ..user = User.fromJSON(input['user']) + ..user = User.fromJSON(input['user'] as Map) ..body = input['body'] ..createdAt = parseDateTime(input['created_at']) ..updatedAt = parseDateTime(input['updated_at']) ..url = input['html_url'] ..pullRequestUrl = input['pull_request_url'] - ..links = Links.fromJSON(input['_links']); + ..links = Links.fromJSON(input['_links'] as Map); } } diff --git a/lib/src/common/model/repos_commits.dart b/lib/src/common/model/repos_commits.dart index 198943c8..10dcc0e0 100644 --- a/lib/src/common/model/repos_commits.dart +++ b/lib/src/common/model/repos_commits.dart @@ -47,8 +47,8 @@ class RepositoryCommit { ..htmlUrl = input['html_url'] ..commentsUrl = input['comments_url'] ..commit = GitCommit.fromJSON(input['commit'] as Map) - ..author = User.fromJSON(input['author']) - ..committer = User.fromJSON(input['committer']) + ..author = User.fromJSON(input['author'] as Map) + ..committer = User.fromJSON(input['committer'] as Map) ..stats = CommitStats.fromJSON(input['stats'] as Map); if (input['parents'] != null) { diff --git a/lib/src/common/model/repos_contents.dart b/lib/src/common/model/repos_contents.dart index 78f7508e..35075781 100644 --- a/lib/src/common/model/repos_contents.dart +++ b/lib/src/common/model/repos_contents.dart @@ -62,7 +62,7 @@ class GitHubFile { ..sha = input['sha'] ..gitUrl = input['git_url'] ..htmlUrl = input['html_url'] - ..links = Links.fromJSON(input['_links']) + ..links = Links.fromJSON(input['_links'] as Map) ..sourceRepository = slug; } } @@ -81,7 +81,7 @@ class Links { @ApiName("html") String html; - static Links fromJSON(input) { + static Links fromJSON(Map input) { if (input == null) return null; var links = new Links(); diff --git a/lib/src/common/model/repos_pages.dart b/lib/src/common/model/repos_pages.dart index c24ae82c..e1a78d30 100644 --- a/lib/src/common/model/repos_pages.dart +++ b/lib/src/common/model/repos_pages.dart @@ -12,7 +12,7 @@ class RepositoryPages { @ApiName("custom_404") bool hasCustom404; - static RepositoryPages fromJSON(input) { + static RepositoryPages fromJSON(Map input) { if (input == null) return null; var pages = new RepositoryPages(); diff --git a/lib/src/common/model/repos_releases.dart b/lib/src/common/model/repos_releases.dart index a720052b..12bfa81b 100644 --- a/lib/src/common/model/repos_releases.dart +++ b/lib/src/common/model/repos_releases.dart @@ -54,7 +54,7 @@ class Release { /// Release Assets List assets; - static Release fromJSON(input) { + static Release fromJSON(Map input) { if (input == null) return null; return new Release() @@ -69,8 +69,8 @@ class Release { ..draft = input['draft'] ..prerelease = input['prelease'] ..author = input['author'] - ..assets = - new List.from(input['assets'].map((it) => ReleaseAsset.fromJSON(it))) + ..assets = new List.from(input['assets'] + .map((Map it) => ReleaseAsset.fromJSON(it))) ..name = input['name'] ..createdAt = parseDateTime(input['created_at']) ..publishedAt = parseDateTime(input['published_at']); @@ -114,7 +114,7 @@ class ReleaseAsset { @ApiName("updated_at") DateTime updatedAt; - static ReleaseAsset fromJSON(input) { + static ReleaseAsset fromJSON(Map input) { if (input == null) return null; return new ReleaseAsset() diff --git a/lib/src/common/model/repos_stats.dart b/lib/src/common/model/repos_stats.dart index 133c0461..b80c1e71 100644 --- a/lib/src/common/model/repos_stats.dart +++ b/lib/src/common/model/repos_stats.dart @@ -15,7 +15,7 @@ class ContributorStatistics { if (input == null) return null; return new ContributorStatistics() - ..author = User.fromJSON(input['author']) + ..author = User.fromJSON(input['author'] as Map) ..total = input['total'] ..weeks = (input['weeks'] as List>) .map((it) => ContributorWeekStatistics.fromJSON(it)); diff --git a/lib/src/common/model/users.dart b/lib/src/common/model/users.dart index 6f97564c..7be7dece 100644 --- a/lib/src/common/model/users.dart +++ b/lib/src/common/model/users.dart @@ -67,7 +67,7 @@ class User { @ApiName("updated_at") DateTime updatedAt; - static User fromJSON(input) { + static User fromJSON(Map input) { if (input == null) return null; if (input['avatar_url'] == null) { @@ -115,7 +115,7 @@ class CurrentUser extends User { /// The User's GitHub Plan UserPlan plan; - static CurrentUser fromJSON(input) { + static CurrentUser fromJSON(Map input) { if (input == null) return null; return new CurrentUser() @@ -139,38 +139,28 @@ class CurrentUser extends User { ..updatedAt = parseDateTime(input['updated_at']) ..privateReposCount = input['total_private_repos'] ..ownedPrivateReposCount = input['owned_private_repos'] - ..plan = UserPlan.fromJSON(input['plan']) + ..plan = UserPlan.fromJSON(input['plan'] as Map) ..json = input; } } -/** - * A Users GitHub Plan - */ +/// A Users GitHub Plan class UserPlan { - /** - * Plan Name - */ + // Plan Name String name; - /** - * Plan Space - */ + // Plan Space int space; - /** - * Number of Private Repositories - */ + // Number of Private Repositories @ApiName("private_repos") int privateReposCount; - /** - * Number of Collaborators - */ + // Number of Collaborators @ApiName("collaborators") int collaboratorsCount; - static UserPlan fromJSON(input) { + static UserPlan fromJSON(Map input) { if (input == null) return null; return new UserPlan() ..name = input['name'] @@ -186,7 +176,7 @@ class UserEmail { bool verified; bool primary; - static UserEmail fromJSON(input) { + static UserEmail fromJSON(Map input) { if (input == null) return null; return new UserEmail() diff --git a/lib/src/common/search_service.dart b/lib/src/common/search_service.dart index db0cc592..3d7ebefe 100644 --- a/lib/src/common/search_service.dart +++ b/lib/src/common/search_service.dart @@ -89,7 +89,9 @@ class SearchService extends Service { List items = input['items']; - items.map((item) => User.fromJSON(item)).forEach(controller.add); + items + .map((Map item) => User.fromJSON(item)) + .forEach(controller.add); }).onDone(controller.close); return controller.stream; diff --git a/lib/src/common/util/auth.dart b/lib/src/common/util/auth.dart index a133014b..3282fbfb 100644 --- a/lib/src/common/util/auth.dart +++ b/lib/src/common/util/auth.dart @@ -11,15 +11,6 @@ class Authentication { /// GitHub Password final String password; - /// Anonymous Authentication Flag - bool get isAnonymous => !isBasic && !isToken; - - /// Basic Authentication Flag - bool get isBasic => username != null; - - /// Token Authentication Flag - bool get isToken => token != null; - /// Creates an [Authentication] instance that uses the specified OAuth2 [token]. Authentication.withToken(this.token) : username = null, @@ -33,4 +24,13 @@ class Authentication { /// Creates an [Authentication] instance that uses a username and password. Authentication.basic(this.username, this.password) : token = null; + + /// Anonymous Authentication Flag + bool get isAnonymous => !isBasic && !isToken; + + /// Basic Authentication Flag + bool get isBasic => username != null; + + /// Token Authentication Flag + bool get isToken => token != null; } diff --git a/lib/src/common/util/crawler.dart b/lib/src/common/util/crawler.dart index 7295f0ed..0ce469c3 100644 --- a/lib/src/common/util/crawler.dart +++ b/lib/src/common/util/crawler.dart @@ -1,8 +1,6 @@ part of github.common; -/** - * Crawls a Repository to Fetch All Files - */ +// Crawls a Repository to Fetch All Files class RepositoryCrawler { final GitHub github; final RepositorySlug slug; diff --git a/lib/src/common/util/json.dart b/lib/src/common/util/json.dart index 05cc97c6..8abe399c 100644 --- a/lib/src/common/util/json.dart +++ b/lib/src/common/util/json.dart @@ -1,6 +1,4 @@ part of github.common; -/** - * Creates a Model Object from the JSON [input] - */ -typedef T JSONConverter(input); +/// Creates a Model Object from the JSON [input] +typedef T JSONConverter(dynamic input); diff --git a/lib/src/common/util/utils.dart b/lib/src/common/util/utils.dart index fc2d2035..01eb08e8 100644 --- a/lib/src/common/util/utils.dart +++ b/lib/src/common/util/utils.dart @@ -10,9 +10,7 @@ class NotReadyYet { /// Specifies the original API Field Name class ApiName { - /** /// Original API Field Name - */ final String name; const ApiName(this.name); diff --git a/lib/src/server/hooks.dart b/lib/src/server/hooks.dart index e287ce10..96972575 100644 --- a/lib/src/server/hooks.dart +++ b/lib/src/server/hooks.dart @@ -97,7 +97,7 @@ class RepositoryEvent extends HookEvent { ..action = json["action"] ..repository = Repository.fromJSON(json["repository"] as Map) - ..sender = User.fromJSON(json["sender"]); + ..sender = User.fromJSON(json["sender"] as Map); } } @@ -122,7 +122,7 @@ class ForkEvent extends HookEvent { static ForkEvent fromJSON(Map json) { return new ForkEvent() ..forkee = Repository.fromJSON(json["forkee"] as Map) - ..sender = User.fromJSON(json["sender"]); + ..sender = User.fromJSON(json["sender"] as Map); } } @@ -137,12 +137,12 @@ class IssueEvent extends HookEvent { static IssueEvent fromJSON(Map json) { return new IssueEvent() ..action = json["action"] - ..assignee = User.fromJSON(json["assignee"]) + ..assignee = User.fromJSON(json["assignee"] as Map) ..label = IssueLabel.fromJSON(json["label"] as Map) ..issue = Issue.fromJSON(json["issue"] as Map) ..repository = Repository.fromJSON(json["repository"] as Map) - ..sender = User.fromJSON(json["sender"]); + ..sender = User.fromJSON(json["sender"] as Map); } } @@ -161,6 +161,6 @@ class PullRequestEvent extends HookEvent { Repository.fromJSON(json["repository"] as Map) ..pullRequest = PullRequest.fromJSON(json["pull_request"] as Map) - ..sender = User.fromJSON(json["sender"]); + ..sender = User.fromJSON(json["sender"] as Map); } } diff --git a/test/experiment/directcode_keys.dart b/test/experiment/directcode_keys.dart index 1969d66b..43d721f4 100755 --- a/test/experiment/directcode_keys.dart +++ b/test/experiment/directcode_keys.dart @@ -1,8 +1,9 @@ +import 'dart:async'; import "package:github/server.dart"; import "package:quiver/async.dart"; -main() async { +Future main() async { var github = createGitHubClient(); github.organizations.get("DirectMyFile").then((organization) { diff --git a/test/experiment/limit_pager.dart b/test/experiment/limit_pager.dart index e4f8ccef..c0f983d7 100755 --- a/test/experiment/limit_pager.dart +++ b/test/experiment/limit_pager.dart @@ -8,9 +8,7 @@ void main() { const int MAX_PER_PAGE = 100; const int ACCURACY_RANGE = 5; -/** - * Solves the most efficient way to fetch the number of objects [limit] with the least requests. - */ +/// 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})"); @@ -38,6 +36,7 @@ class PaginationInformation { PaginationInformation(this.limit, this.pages, this.itemsPerPage); + @override String toString() => "limit: ${limit}, pages: ${pages}, per page: ${itemsPerPage}"; } diff --git a/test/experiment/org_hooks.dart b/test/experiment/org_hooks.dart index 32a845ae..5c85638b 100644 --- a/test/experiment/org_hooks.dart +++ b/test/experiment/org_hooks.dart @@ -1,6 +1,7 @@ import "../helper.dart"; +import 'dart:async'; -main() async { +Future main() async { var org = "IOT-DSA"; var hooks = await github.organizations.listHooks(org).toList(); diff --git a/test/experiment/orglist.dart b/test/experiment/orglist.dart index d7372e39..bb8f4565 100644 --- a/test/experiment/orglist.dart +++ b/test/experiment/orglist.dart @@ -1,6 +1,7 @@ +import 'dart:async'; import "package:github/server.dart"; -main() async { +Future main() async { var github = createGitHubClient(); var repos = await github.repositories.listUserRepositories("dart-lang").toList(); diff --git a/test/git_integration_test.dart b/test/git_integration_test.dart index 50f22b3d..864ef1bb 100644 --- a/test/git_integration_test.dart +++ b/test/git_integration_test.dart @@ -6,7 +6,7 @@ import 'package:github/server.dart'; import 'package:test/test.dart'; -main() { +void main() { String firstCommitSha; String firstCommitTreeSha; diff --git a/test/git_test.dart b/test/git_test.dart index afa8f7cf..58722113 100644 --- a/test/git_test.dart +++ b/test/git_test.dart @@ -13,7 +13,7 @@ import 'helper.dart'; class MockGitHub extends MockWithNamedArgs implements GitHub {} -main() { +void main() { MockGitHub github; GitService git; RepositorySlug repo; diff --git a/test/util_test.dart b/test/util_test.dart index ccd3ff6e..0671262d 100644 --- a/test/util_test.dart +++ b/test/util_test.dart @@ -5,7 +5,7 @@ import "helper.dart"; import "package:github/src/common.dart"; import "package:test/test.dart"; -main() { +void main() { group("slugFromAPIUrl()", () { test("https://api.github.com/repos/DirectMyFile/irc.dart slug is correct", () { diff --git a/tool/build.dart b/tool/build.dart index 67247259..e389c0b5 100755 --- a/tool/build.dart +++ b/tool/build.dart @@ -2,12 +2,12 @@ import "dart:async"; import "dart:io"; -var packages_dir = new Directory("packages/"); +Directory packagesDirectory = new Directory("packages/"); void main(List args) { var future = new Future.value(null); - if (!packages_dir.existsSync()) { + if (!packagesDirectory.existsSync()) { future = execute("pub get"); } From f159c3809ac9634cb2f246599893b90fa32fcd74 Mon Sep 17 00:00:00 2001 From: Joel Trottier-Hebert Date: Thu, 6 Oct 2016 13:55:47 -0400 Subject: [PATCH 032/496] undo useless change --- example/common.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/common.dart b/example/common.dart index f41c695d..b7e75180 100644 --- a/example/common.dart +++ b/example/common.dart @@ -1,6 +1,6 @@ import "dart:html"; -import 'package:github/browser.dart'; +import "package:github/browser.dart"; import "package:github/markdown.dart" as markdown; void init(String script, {void onReady()}) { From 28068c84e28204ca73fc3e751a546ef67d83aff8 Mon Sep 17 00:00:00 2001 From: Joel Trottier-Hebert Date: Thu, 6 Oct 2016 14:16:03 -0400 Subject: [PATCH 033/496] Undo unnecessary cast --- lib/src/common/git_service.dart | 3 +-- lib/src/common/issues_service.dart | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/src/common/git_service.dart b/lib/src/common/git_service.dart index e97a4c5a..da42cd2c 100644 --- a/lib/src/common/git_service.dart +++ b/lib/src/common/git_service.dart @@ -102,8 +102,7 @@ class GitService extends Service { body: body, headers: headers) .then((response) { return GitReference - .fromJSON(JSON.decode(response.body) as Map) - as Future; + .fromJSON(JSON.decode(response.body) as Map); }); } diff --git a/lib/src/common/issues_service.dart b/lib/src/common/issues_service.dart index f6483528..182d0e71 100644 --- a/lib/src/common/issues_service.dart +++ b/lib/src/common/issues_service.dart @@ -156,8 +156,7 @@ class IssuesService extends Service { throw new GitHubError(_github, response.body); } - return Issue.fromJSON(JSON.decode(response.body) as Map) - as Future; + return Issue.fromJSON(JSON.decode(response.body) as Map); } /// Lists all available assignees (owners and collaborators) to which issues From 1ab504b63cfb4d5834d9a6ca565fcd4e5d6cf69b Mon Sep 17 00:00:00 2001 From: Joel Trottier-Hebert Date: Thu, 6 Oct 2016 17:02:07 -0400 Subject: [PATCH 034/496] Fix tests to use tokens in environment variables --- test/git_integration_test.dart | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/test/git_integration_test.dart b/test/git_integration_test.dart index 864ef1bb..2fed2541 100644 --- a/test/git_integration_test.dart +++ b/test/git_integration_test.dart @@ -2,6 +2,7 @@ library github.test.integration.git_integration_test; import 'dart:convert'; +import 'dart:io'; import 'package:github/server.dart'; import 'package:test/test.dart'; @@ -17,9 +18,9 @@ void main() { RepositorySlug slug; setUpAll(() { - var authToken = ''; - var repoOwner = ''; - var repoName = ''; + 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']; github = createGitHubClient(auth: new Authentication.withToken(authToken)); slug = new RepositorySlug(repoOwner, repoName); From 6f333d8e4c2f34d7bddbd02b6109fe601681cdda Mon Sep 17 00:00:00 2001 From: Joel Trottier-Hebert Date: Thu, 6 Oct 2016 20:46:07 -0400 Subject: [PATCH 035/496] Refactored half of git_test with mockito instead of mock --- pubspec.yaml | 1 + test/git_test.dart | 124 +++++++++++++++++++++------------------------ 2 files changed, 58 insertions(+), 67 deletions(-) diff --git a/pubspec.yaml b/pubspec.yaml index 127df905..dd94fada 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,3 +15,4 @@ dev_dependencies: browser: '^0.10.0+2' mock: '^0.12.0' test: '^0.12.0' + mockito: '^1.0.1' diff --git a/test/git_test.dart b/test/git_test.dart index 58722113..b4a3bd2f 100644 --- a/test/git_test.dart +++ b/test/git_test.dart @@ -6,17 +6,20 @@ import 'dart:convert' show JSON; import 'package:github/src/common.dart'; import 'package:github/src/util.dart'; import "package:http/http.dart" as http; -import 'package:mock/mock.dart'; +import 'package:mockito/mockito.dart'; import 'package:test/test.dart'; import 'helper.dart'; -class MockGitHub extends MockWithNamedArgs implements GitHub {} +//class MockGitHub extends MockWithNamedArgs implements GitHub {} + +class MockGitHub extends Mock implements GitHub {} void main() { MockGitHub github; GitService git; RepositorySlug repo; + var someSha = 'someSHA'; setUp(() { github = new MockGitHub(); @@ -24,15 +27,12 @@ void main() { repo = new RepositorySlug('o', 'n'); }); - // - // BLOB - // group('getBlob()', () { test('constructs correct path', () { git.getBlob(repo, 'sh'); - github - .getLogs(callsTo('getJSON', '/repos/o/n/git/blobs/sh')) - .verify(happenedOnce); + + verify(github.getJSON('/repos/o/n/git/blobs/sh', + convert: GitBlob.fromJSON, statusCode: StatusCodes.OK)); }); }); @@ -41,33 +41,28 @@ void main() { CreateGitBlob blob = new CreateGitBlob('bbb', 'utf-8'); git.createBlob(repo, blob); - github - .getLogs(callsTo('postJSON', '/repos/o/n/git/blobs')) - .verify(happenedOnce); + verify(github.postJSON('/repos/o/n/git/blobs', + convert: GitBlob.fromJSON, + statusCode: StatusCodes.CREATED, + body: blob.toJSON())); }); test('creates valid JSON body', () { CreateGitBlob blob = new CreateGitBlob('bbb', 'utf-8'); - git.createBlob(repo, blob); - - LogEntryNamedArgs entry = github.getLogs().first; - Map body = JSON.decode(entry.namedArgs[#body]); + git.createBlob(repo, blob); + var body = captureSentBody(github); expect(body['content'], equals('bbb')); expect(body['encoding'], equals('utf-8')); }); }); - // - // COMMIT - // group('getCommit()', () { test('constructs correct path', () { git.getCommit(repo, 'sh'); - github - .getLogs(callsTo('getJSON', '/repos/o/n/git/commits/sh')) - .verify(happenedOnce); + verify(github.getJSON('/repos/o/n/git/commits/sh', + convert: GitCommit.fromJSON, statusCode: StatusCodes.OK)); }); }); @@ -76,9 +71,10 @@ void main() { CreateGitCommit commit = new CreateGitCommit('aMessage', 'aTreeSha'); git.createCommit(repo, commit); - github - .getLogs(callsTo('postJSON', '/repos/o/n/git/commits')) - .verify(happenedOnce); + verify(github.postJSON('/repos/o/n/git/commits', + convert: GitCommit.fromJSON, + statusCode: StatusCodes.CREATED, + body: commit.toJSON())); }); test('creates valid JSON body', () { @@ -94,9 +90,7 @@ void main() { git.createCommit(repo, commit); // then - LogEntryNamedArgs entry = github.getLogs().first; - Map body = JSON.decode(entry.namedArgs[#body]); - + var body = captureSentBody(github); expect(body['message'], equals('aMessage')); expect(body['tree'], equals('aTreeSha')); expect(body['parents'], equals(['parentSha1', 'parentSha2'])); @@ -109,55 +103,50 @@ void main() { }); }); - // - // REFERENCE - // group('getReference()', () { test('constructs correct path', () { git.getReference(repo, 'heads/b'); - github - .getLogs(callsTo('getJSON', '/repos/o/n/git/refs/heads/b')) - .verify(happenedOnce); + verify(github.getJSON('/repos/o/n/git/refs/heads/b', + convert: GitReference.fromJSON, statusCode: StatusCodes.OK)); }); }); group('createReference()', () { + var someRef = 'refs/heads/b'; test('constructs correct path', () { - git.createReference(repo, 'refs/heads/b', 'someSHA'); + git.createReference(repo, someRef, someSha); - github - .getLogs(callsTo('postJSON', '/repos/o/n/git/refs')) - .verify(happenedOnce); + verify(github.postJSON('/repos/o/n/git/refs', + convert: GitReference.fromJSON, + statusCode: StatusCodes.CREATED, + body: JSON.encode({'ref': someRef, 'sha': someSha}))); }); test('creates valid JSON body', () { - git.createReference(repo, 'refs/heads/b', 'someSHA'); + git.createReference(repo, someRef, someSha); - // then - LogEntryNamedArgs entry = github.getLogs().first; - Map body = JSON.decode(entry.namedArgs[#body]); - - expect(body['ref'], equals('refs/heads/b')); - expect(body['sha'], equals('someSHA')); + var body = captureSentBody(github); + expect(body['ref'], equals(someRef)); + expect(body['sha'], equals(someSha)); }); }); group('editReference()', () { test('constructs correct path', () { // given - http.Response res = new http.Response('{}', 200); - github - .when(callsTo('request', anything, anything)) - .alwaysReturn(new Future.value(res)); + http.Response expectedResponse = new http.Response('{}', 200); + + when(github.request(any, any, + body: any, headers: typed(any, named: 'headers'))) + .thenReturn(new Future.value(expectedResponse)); // when - git.editReference(repo, 'heads/b', 'someSHA'); + git.editReference(repo, 'heads/b', someSha); // then - github - .getLogs(callsTo('request', 'PATCH', '/repos/o/n/git/refs/heads/b')) - .verify(happenedOnce); + verify(github.request('PATCH', '/repos/o/n/git/refs/heads/b', + headers: typed(any, named: 'headers'), body: any)); }); test('creates valid JSON body', () { @@ -168,14 +157,14 @@ void main() { .alwaysReturn(new Future.value(res)); // when - git.editReference(repo, 'heads/b', 'someSHA', force: true); + git.editReference(repo, 'heads/b', someSha, force: true); // then LogEntryNamedArgs entry = github.getLogs().first; Map body = JSON.decode(entry.namedArgs[#body]); Map headers = entry.namedArgs[#headers]; - expect(body['sha'], equals('someSHA')); + expect(body['sha'], equals(someSha)); expect(body['force'], equals(true)); expect(headers['content-length'], equals('30')); }); @@ -199,12 +188,9 @@ void main() { }); }); - // - // TAG - // group('getTag()', () { test('constructs correct path', () { - git.getTag(repo, 'someSHA'); + git.getTag(repo, someSha); github .getLogs(callsTo('getJSON', '/repos/o/n/git/tags/someSHA')) @@ -216,7 +202,7 @@ void main() { test('constructs correct path', () { git.createTag( repo, - new CreateGitTag('v0.0.1', 'a message', 'someSHA', 'commit', + new CreateGitTag('v0.0.1', 'a message', someSha, 'commit', new GitCommitUser('aName', 'aEmail', new DateTime.now()))); github @@ -227,7 +213,7 @@ void main() { test('creates valid JSON body', () { git.createTag( repo, - new CreateGitTag('v0.0.1', 'a message', 'someSHA', 'commit', + new CreateGitTag('v0.0.1', 'a message', someSha, 'commit', new GitCommitUser('aName', 'aEmail', new DateTime.now()))); LogEntryNamedArgs entry = github.getLogs().first; @@ -235,18 +221,12 @@ void main() { expect(body['tag'], equals('v0.0.1')); expect(body['message'], equals('a message')); - expect(body['object'], equals('someSHA')); + expect(body['object'], equals(someSha)); expect(body['type'], equals('commit')); expect(body['tagger']['name'], equals('aName')); }); }); - // - // TREE - // - // - // TREE - // group('getTree()', () { test('constructs correct path', () { git.getTree(repo, 'sh'); @@ -322,3 +302,13 @@ void main() { }); }); } + +captureSentBody(MockGitHub github) { + var bodyString = verify( + github.postJSON(any, convert: any, statusCode: any, body: captureAny)) + .captured + .single; + + var body = JSON.decode(bodyString); + return body; +} From b4bb2a8c5d7cee29939f06d454d36703338bb5c2 Mon Sep 17 00:00:00 2001 From: Joel Trottier-Hebert Date: Thu, 6 Oct 2016 21:03:59 -0400 Subject: [PATCH 036/496] More tests refactored --- test/git_test.dart | 69 ++++++++++++++++++++++++---------------------- 1 file changed, 36 insertions(+), 33 deletions(-) diff --git a/test/git_test.dart b/test/git_test.dart index b4a3bd2f..30058234 100644 --- a/test/git_test.dart +++ b/test/git_test.dart @@ -11,8 +11,6 @@ import 'package:test/test.dart'; import 'helper.dart'; -//class MockGitHub extends MockWithNamedArgs implements GitHub {} - class MockGitHub extends Mock implements GitHub {} void main() { @@ -151,18 +149,21 @@ void main() { test('creates valid JSON body', () { // given - http.Response res = new http.Response('{}', 200); - github - .when(callsTo('request', anything, anything)) - .alwaysReturn(new Future.value(res)); + http.Response expectedResponse = new http.Response('{}', 200); + when(github.request(any, any, + body: any, headers: typed(any, named: 'headers'))) + .thenReturn(new Future.value(expectedResponse)); // when git.editReference(repo, 'heads/b', someSha, force: true); // then - LogEntryNamedArgs entry = github.getLogs().first; - Map body = JSON.decode(entry.namedArgs[#body]); - Map headers = entry.namedArgs[#headers]; + var captured = verify(github.request(any, any, + body: captureAny, headers: typed(captureAny, named: 'headers'))) + .captured; + + var body = JSON.decode(captured[0]); + var headers = captured[1]; expect(body['sha'], equals(someSha)); expect(body['force'], equals(true)); @@ -173,18 +174,15 @@ void main() { group('deleteReference()', () { test('constructs correct path', () { // given - http.Response res = new http.Response('{}', 200); - github - .when(callsTo('request', anything, anything)) - .alwaysReturn(new Future.value(res)); + http.Response expectedResponse = new http.Response('{}', 200); + when(github.request(any, any)) + .thenReturn(new Future.value(expectedResponse)); // when git.deleteReference(repo, 'heads/b'); // then - github - .getLogs(callsTo('request', 'DELETE', '/repos/o/n/git/refs/heads/b')) - .verify(happenedOnce); + verify(github.request('DELETE', '/repos/o/n/git/refs/heads/b')); }); }); @@ -192,33 +190,28 @@ void main() { test('constructs correct path', () { git.getTag(repo, someSha); - github - .getLogs(callsTo('getJSON', '/repos/o/n/git/tags/someSHA')) - .verify(happenedOnce); + verify(github.getJSON('/repos/o/n/git/tags/someSHA', + convert: GitTag.fromJSON, statusCode: StatusCodes.OK)); }); }); group('createTag()', () { + var createGitTag = new CreateGitTag('v0.0.1', 'a message', someSha, + 'commit', new GitCommitUser('aName', 'aEmail', new DateTime.now())); + test('constructs correct path', () { - git.createTag( - repo, - new CreateGitTag('v0.0.1', 'a message', someSha, 'commit', - new GitCommitUser('aName', 'aEmail', new DateTime.now()))); + git.createTag(repo, createGitTag); - github - .getLogs(callsTo('postJSON', '/repos/o/n/git/tags')) - .verify(happenedOnce); + verify(github.postJSON('/repos/o/n/git/tags', + convert: GitTag.fromJSON, + statusCode: StatusCodes.CREATED, + body: createGitTag.toJSON())); }); test('creates valid JSON body', () { - git.createTag( - repo, - new CreateGitTag('v0.0.1', 'a message', someSha, 'commit', - new GitCommitUser('aName', 'aEmail', new DateTime.now()))); - - LogEntryNamedArgs entry = github.getLogs().first; - Map body = JSON.decode(entry.namedArgs[#body]); + git.createTag(repo, createGitTag); + var body = captureSentBody(github); expect(body['tag'], equals('v0.0.1')); expect(body['message'], equals('a message')); expect(body['object'], equals(someSha)); @@ -312,3 +305,13 @@ captureSentBody(MockGitHub github) { var body = JSON.decode(bodyString); return body; } + +captureSentHeaders(MockGitHub github) { + var headersString = verify(github.postJSON(any, + convert: any, statusCode: any, body: any, headers: typed(captureAny))) + .captured + .single; + + var headers = JSON.decode(headersString); + return headers; +} From 865eadf276ab06ebd676b2af70612238e01ccc30 Mon Sep 17 00:00:00 2001 From: Joel Trottier-Hebert Date: Thu, 6 Oct 2016 21:10:09 -0400 Subject: [PATCH 037/496] More tests refactored + Removed dependency on Mock --- pubspec.yaml | 1 - test/git_test.dart | 44 +++++++++++++------------------------- test/helper.dart | 2 -- test/helper/mock.dart | 49 ------------------------------------------- 4 files changed, 14 insertions(+), 82 deletions(-) delete mode 100644 test/helper/mock.dart diff --git a/pubspec.yaml b/pubspec.yaml index dd94fada..2267e255 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -13,6 +13,5 @@ dependencies: markdown: '^0.11.1' dev_dependencies: browser: '^0.10.0+2' - mock: '^0.12.0' test: '^0.12.0' mockito: '^1.0.1' diff --git a/test/git_test.dart b/test/git_test.dart index 30058234..ce179561 100644 --- a/test/git_test.dart +++ b/test/git_test.dart @@ -9,8 +9,6 @@ import "package:http/http.dart" as http; import 'package:mockito/mockito.dart'; import 'package:test/test.dart'; -import 'helper.dart'; - class MockGitHub extends Mock implements GitHub {} void main() { @@ -224,9 +222,8 @@ void main() { test('constructs correct path', () { git.getTree(repo, 'sh'); - github - .getLogs(callsTo('getJSON', '/repos/o/n/git/trees/sh')) - .verify(happenedOnce); + verify(github.getJSON('/repos/o/n/git/trees/sh', + convert: GitTree.fromJSON, statusCode: StatusCodes.OK)); }); }); @@ -234,19 +231,20 @@ void main() { test('constructs correct path', () { git.getTree(repo, 'sh', recursive: true); - github - .getLogs(callsTo('getJSON', '/repos/o/n/git/trees/sh?recursive=1')) - .verify(happenedOnce); + verify(github.getJSON('/repos/o/n/git/trees/sh?recursive=1', + convert: GitTree.fromJSON, statusCode: StatusCodes.OK)); }); }); group('createTree()', () { test('constructs correct path', () { - git.createTree(repo, new CreateGitTree([])); + var createGitTree = new CreateGitTree([]); + git.createTree(repo, createGitTree); - github - .getLogs(callsTo('postJSON', '/repos/o/n/git/trees')) - .verify(happenedOnce); + verify(github.postJSON('/repos/o/n/git/trees', + convert: GitTree.fromJSON, + statusCode: StatusCodes.CREATED, + body: createGitTree.toJSON())); }); test('with sha creates valid JSON body', () { @@ -260,9 +258,7 @@ void main() { git.createTree(repo, tree); // then - LogEntryNamedArgs entry = github.getLogs().first; - Map body = JSON.decode(entry.namedArgs[#body]); - + var body = captureSentBody(github); expect(body['tree'], isNotNull); expect(body['tree'][0]['path'], equals('file.rb')); expect(body['tree'][0]['mode'], equals('100644')); @@ -283,9 +279,7 @@ void main() { git.createTree(repo, tree); // then - LogEntryNamedArgs entry = github.getLogs().first; - Map body = JSON.decode(entry.namedArgs[#body]); - + var body = captureSentBody(github); expect(body['tree'], isNotNull); expect(body['tree'][0]['path'], equals('file.rb')); expect(body['tree'][0]['mode'], equals('100644')); @@ -296,22 +290,12 @@ void main() { }); } -captureSentBody(MockGitHub github) { +Map captureSentBody(MockGitHub github) { var bodyString = verify( github.postJSON(any, convert: any, statusCode: any, body: captureAny)) .captured .single; - var body = JSON.decode(bodyString); + var body = JSON.decode(bodyString) as Map; return body; } - -captureSentHeaders(MockGitHub github) { - var headersString = verify(github.postJSON(any, - convert: any, statusCode: any, body: any, headers: typed(captureAny))) - .captured - .single; - - var headers = JSON.decode(headersString); - return headers; -} diff --git a/test/helper.dart b/test/helper.dart index 7060835d..da83b0a0 100644 --- a/test/helper.dart +++ b/test/helper.dart @@ -6,13 +6,11 @@ import 'dart:io'; import "package:http/http.dart" as http; import 'package:github/server.dart'; -import 'package:mock/mock.dart'; import 'package:test/test.dart'; part 'helper/assets.dart'; part 'helper/expect.dart'; part 'helper/http.dart'; -part 'helper/mock.dart'; GitHub github = _makeGitHubClient(); diff --git a/test/helper/mock.dart b/test/helper/mock.dart deleted file mode 100644 index ac670a56..00000000 --- a/test/helper/mock.dart +++ /dev/null @@ -1,49 +0,0 @@ -part of github.test.helper; - -GitHub createMockGitHub() { - return new GitHub(client: httpClient); -} - -/// A [Mock] class that keeps track of named arguments for method calls. -/// (The normal [Mock] unfortunately only tracks positional parameters.) -/// -/// TODO: Remove this when [Issue 21133](https://code.google.com/p/dart/issues/detail?id=21133) -/// is resolved. -class MockWithNamedArgs extends Mock { - /// The named arguments of the last method invocation. - Map _lastNamedArgs; - - MockWithNamedArgs() { - // Replace the default log with our own enhanced log. - log = new LogEntryListNamedArgs(() => _lastNamedArgs); - } - - @override - dynamic noSuchMethod(Invocation invocation) { - _lastNamedArgs = invocation.namedArguments; - return super.noSuchMethod(invocation); - } -} - -/// A [LogEntry] that keeps track of named arguments for method calls. -class LogEntryNamedArgs extends LogEntry { - /// The named arguments. - final Map namedArgs; - - LogEntryNamedArgs(LogEntry logEntry, this.namedArgs) - : super(logEntry.mockName, logEntry.methodName, logEntry.args, - logEntry.action); -} - -/// A [LogEntryList] that keeps track of named arguments for method calls. -/// All [add]ed [LogEntry]s of this List will be of type [LogEntryNamedArgs]. -class LogEntryListNamedArgs extends LogEntryList { - final Function getLastNamedArgs; - - LogEntryListNamedArgs(this.getLastNamedArgs); - - @override - add(LogEntry entry) { - logs.add(new LogEntryNamedArgs(entry, getLastNamedArgs())); - } -} From c328984734b36f43e99d6be61678ea5da0780246 Mon Sep 17 00:00:00 2001 From: ekweible Date: Mon, 7 Nov 2016 11:36:16 -0700 Subject: [PATCH 038/496] Use BrowserClient from http package when creating a browser GitHub client --- lib/browser.dart | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/browser.dart b/lib/browser.dart index 656f720f..5a3d0c24 100644 --- a/lib/browser.dart +++ b/lib/browser.dart @@ -4,6 +4,8 @@ library github.browser; +import 'package:http/browser_client.dart'; + import "src/common.dart"; export "src/browser/helper.dart"; @@ -12,5 +14,6 @@ export "src/common.dart"; /// Creates a GitHub Client GitHub createGitHubClient( {Authentication auth, String endpoint: "https://api.github.com"}) { - return new GitHub(auth: auth, endpoint: endpoint); + return new GitHub( + auth: auth, client: new BrowserClient(), endpoint: endpoint); } From d8437731e23ae9073ac70715357ea191cabcd10e Mon Sep 17 00:00:00 2001 From: ekweible Date: Mon, 7 Nov 2016 11:36:20 -0700 Subject: [PATCH 039/496] Fix typo in AccessForbidden message. --- lib/src/common/util/errors.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/common/util/errors.dart b/lib/src/common/util/errors.dart index 53f4f3a9..29983caf 100644 --- a/lib/src/common/util/errors.dart +++ b/lib/src/common/util/errors.dart @@ -47,7 +47,7 @@ class TeamNotFound extends NotFound { /// Access was forbidden to a resource class AccessForbidden extends GitHubError { - AccessForbidden(GitHub github) : super(github, "Access Forbbidden"); + AccessForbidden(GitHub github) : super(github, "Access Forbidden"); } /// Client hit the rate limit. From 2b59d941589b54e2535f2837200e72f8e823e3c6 Mon Sep 17 00:00:00 2001 From: Faisal Abid Date: Tue, 18 Apr 2017 21:27:30 -0400 Subject: [PATCH 040/496] Update github.dart --- lib/src/common/github.dart | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index 37b00747..05b8cb78 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -222,6 +222,14 @@ class GitHub { } headers.putIfAbsent("Accept", () => "application/vnd.github.v3+json"); + if (auth.isToken) { + headers.putIfAbsent("Authorization", () => "token ${auth.token}"); + } else if (auth.isBasic) { + var userAndPass = + BASE64.encode(UTF8.encode('${auth.username}:${auth.password}')); + headers.putIfAbsent("Authorization", () => "basic ${userAndPass}"); + } + var response = await request("GET", path, headers: headers, params: params, statusCode: statusCode, fail: fail); From c145a122c78deda592f435feac702a0cd78c580b Mon Sep 17 00:00:00 2001 From: Faisal Abid Date: Tue, 18 Apr 2017 21:52:14 -0400 Subject: [PATCH 041/496] forcing auth --- lib/src/common/github.dart | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index 05b8cb78..97f464db 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -222,6 +222,7 @@ class GitHub { } headers.putIfAbsent("Accept", () => "application/vnd.github.v3+json"); + if (auth.isToken) { headers.putIfAbsent("Authorization", () => "token ${auth.token}"); } else if (auth.isBasic) { @@ -281,6 +282,14 @@ class GitHub { headers.putIfAbsent("Accept", () => "application/vnd.github.v3+json"); + if (auth.isToken) { + headers.putIfAbsent("Authorization", () => "token ${auth.token}"); + } else if (auth.isBasic) { + var userAndPass = + BASE64.encode(UTF8.encode('${auth.username}:${auth.password}')); + headers.putIfAbsent("Authorization", () => "basic ${userAndPass}"); + } + var response = await request("POST", path, headers: headers, params: params, From 19e2240efc7a12240c6b36de8a882803dbf96e40 Mon Sep 17 00:00:00 2001 From: Joel Trottier-Hebert Date: Fri, 26 May 2017 11:02:48 -0400 Subject: [PATCH 042/496] v3.0.1 --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 2267e255..1b831b7a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 3.0.0 +version: 3.0.1 author: Kenneth Endfinger description: GitHub API Client Library homepage: https://github.com/DirectMyFile/github.dart From 875724e5ab8b0043cce668e12fdb5f84bad36a5f Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Fri, 7 Jul 2017 16:42:35 -0700 Subject: [PATCH 043/496] Remove unused file --- tool/config.dart | 52 ------------------------------------------------ 1 file changed, 52 deletions(-) delete mode 100644 tool/config.dart diff --git a/tool/config.dart b/tool/config.dart deleted file mode 100644 index e5e3e90f..00000000 --- a/tool/config.dart +++ /dev/null @@ -1,52 +0,0 @@ -part of hop_runner; - -Map config; - -Directory get tool_dir => new File.fromUri(Platform.script).parent.absolute; -Directory get root_dir => tool_dir.parent; - -Map load_config() { - var it = loadYaml(new File("${tool_dir.path}/build.yaml").readAsStringSync()); - if (it.containsKey("variables")) { - variables.addAll(it["variables"]); - } - return it; -} - -Map variables = { - "tool_dir": tool_dir.path, - "root_dir": root_dir.path -}; - -String parse_config_value(String input) { - var out = input; - for (var variable in variables.keys) { - out = out.replaceAll("{${variable}}", variables[variable]); - } - return out; -} - -dynamic getvar(String path, [dynamic defaultValue = false]) { - var current = config; - - if (current.containsKey(path)) { - return current[path]; - } - - var parts = path.split(r"\."); - for (var part in parts) { - if (current == null) { - return null; - } - current = current[part]; - } - if (current is String) { - current = parse_config_value(current); - } - return current; -} - -void init() { - Directory.current = root_dir; - config = load_config(); -} From 4adc751771f312c42f54dc771416ca646e75ef7b Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Fri, 7 Jul 2017 16:47:37 -0700 Subject: [PATCH 044/496] handle `null` commit --- lib/src/common/model/repos.dart | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart index e4643301..eab9681a 100644 --- a/lib/src/common/model/repos.dart +++ b/lib/src/common/model/repos.dart @@ -195,10 +195,14 @@ class CommitInfo { return null; } - return new CommitInfo() - ..sha = input['sha'] - ..tree = - GitTree.fromJSON(input['commit']['tree'] as Map); + var info = new CommitInfo()..sha = input['sha']; + + var commit = input['commit'] as Map; + if (commit != null) { + info.tree = GitTree.fromJSON(commit['tree']); + } + + return info; } } From 66e3528c36adf4c166bb7fe170933d9e529c3ee4 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Fri, 7 Jul 2017 16:52:25 -0700 Subject: [PATCH 045/496] Cleanup RepositoriesServiec.listPublicRepositories --- lib/src/common/repos_service.dart | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index e93be18c..a3aba61f 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -65,19 +65,13 @@ class RepositoriesService extends Service { var pages = limit != null ? (limit / 30).ceil() : null; - // TODO: Close this, but where? - var controller = new StreamController.broadcast(); - - new PaginationHelper(_github) + return new PaginationHelper(_github) .fetchStreamed("GET", "/repositories", pages: pages, params: params) - .listen((http.Response response) { - var list = JSON.decode(response.body); - var repos = new List.from( - list.map((Map it) => Repository.fromJSON(it))); - for (var repo in repos) controller.add(repo); - }); + .expand((http.Response response) { + var list = JSON.decode(response.body) as List>; - return controller.stream.take(limit); + return list.map((Map it) => Repository.fromJSON(it)); + }); } /// Creates a repository with [repository]. If an [org] is specified, the new From 1d9bac2de8e7ff0fe45f876590220d59b98e70e5 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Fri, 7 Jul 2017 16:52:50 -0700 Subject: [PATCH 046/496] dartfmt --- lib/src/common/repos_service.dart | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index a3aba61f..caf10cd1 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -184,9 +184,9 @@ class RepositoriesService extends Service { /// 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) => new LanguageBreakdown(input)) - as Future; + statusCode: StatusCodes.OK, + convert: (Map input) => new LanguageBreakdown(input)) + as Future; /// Lists the tags of the specified repository. /// @@ -287,12 +287,14 @@ class RepositoriesService extends Service { url += '?ref=$ref'; } - return _github.getJSON(url, headers: headers, statusCode: StatusCodes.OK, + return _github.getJSON(url, + headers: headers, + statusCode: StatusCodes.OK, fail: (http.Response response) { - if (response.statusCode == 404) { - throw new NotFound(_github, response.body); - } - }, + if (response.statusCode == 404) { + throw new NotFound(_github, response.body); + } + }, convert: (Map input) => GitHubFile.fromJSON(input, slug)) as Future; } From 40ce5bd2a50d91057cd65d6aaea72104766c8cac Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Mon, 10 Jul 2017 11:47:34 -0700 Subject: [PATCH 047/496] Handle empty content in RepoServer.getContents --- lib/src/common/repos_service.dart | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index caf10cd1..e29c77e5 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -325,6 +325,13 @@ class RepositoriesService extends Service { return _github.getJSON(url, convert: (input) { var contents = new 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'], + apiUrl: input['documentation_url']); + } contents.file = GitHubFile.fromJSON(input as Map); } else { contents.tree = (input as List>) From 9f79e6e1808f26be85bf394529efd57eab58af5f Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Mon, 10 Jul 2017 12:10:46 -0700 Subject: [PATCH 048/496] Store GitHubFile.content without newlines (if they exist) This is much better for future decoding --- lib/src/common.dart | 2 +- lib/src/common/model/repos_contents.dart | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/src/common.dart b/lib/src/common.dart index 4ea2e459..0fe1b8ca 100644 --- a/lib/src/common.dart +++ b/lib/src/common.dart @@ -3,7 +3,7 @@ library github.common; import "dart:async"; -import "dart:convert" show BASE64, JSON, UTF8; +import "dart:convert" show BASE64, JSON, UTF8, LineSplitter; import "package:html/dom.dart" as html; import "package:html/parser.dart" as html_parser; diff --git a/lib/src/common/model/repos_contents.dart b/lib/src/common/model/repos_contents.dart index 35075781..87e25f41 100644 --- a/lib/src/common/model/repos_contents.dart +++ b/lib/src/common/model/repos_contents.dart @@ -58,7 +58,9 @@ class GitHubFile { ..size = input['size'] ..name = input['name'] ..path = input['path'] - ..content = input['content'] + ..content = input['content'] == null + ? null + : LineSplitter.split(input['content']).join() ..sha = input['sha'] ..gitUrl = input['git_url'] ..htmlUrl = input['html_url'] From 2c32f4ca3c44613491cbe3dbd43524635e85cc32 Mon Sep 17 00:00:00 2001 From: Joel Trottier-Hebert Date: Mon, 10 Jul 2017 15:44:30 -0400 Subject: [PATCH 049/496] v3.0.2 --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 1b831b7a..81d67c11 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 3.0.1 +version: 3.0.2 author: Kenneth Endfinger description: GitHub API Client Library homepage: https://github.com/DirectMyFile/github.dart From 84be50ff7873aaebb0fc08f791fcd941daf8f4b5 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Fri, 14 Jul 2017 15:50:45 -0700 Subject: [PATCH 050/496] Big refactor Added CommitDataUser Fixed CommitInfo to use CommitDataUser --- .analysis_options | 4 +- CHANGELOG.md | 4 ++ benchmark/config.dart | 4 +- benchmark/main.dart | 2 +- benchmark/repository.dart | 4 +- lib/src/common.dart | 2 + lib/src/common.g.dart | 82 +++++++++++++++++++++++ lib/src/common/git_service.dart | 4 +- lib/src/common/model/git.dart | 67 ++++++++----------- lib/src/common/model/repos.dart | 97 ++++++++++++++++++---------- pubspec.yaml | 6 +- test/experiment/directcode_keys.dart | 2 +- test/git_test.dart | 6 +- tool/build.dart | 37 +++-------- tool/build.yaml | 17 ----- tool/phases.dart | 9 +++ tool/watch.dart | 11 ++++ 17 files changed, 225 insertions(+), 133 deletions(-) create mode 100644 lib/src/common.g.dart mode change 100755 => 100644 tool/build.dart delete mode 100644 tool/build.yaml create mode 100644 tool/phases.dart create mode 100644 tool/watch.dart diff --git a/.analysis_options b/.analysis_options index 117985e8..d7841468 100644 --- a/.analysis_options +++ b/.analysis_options @@ -8,7 +8,7 @@ linter: - always_declare_return_types # - avoid_as - camel_case_types - - constant_identifier_names +# - constant_identifier_names - empty_constructor_bodies - implementation_imports - library_names @@ -38,7 +38,7 @@ linter: - test_types_in_equals - throw_in_finally - valid_regexps - - annotate_overrides +# - annotate_overrides - avoid_init_to_null - avoid_return_types_on_setters - await_only_futures diff --git a/CHANGELOG.md b/CHANGELOG.md index 6edc34c6..f1706915 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## v4.0.0 + +* Make fields in many objects read-only. + ## v3.0.0 - *BREAKING* Removed a number of top-level methods from the public API. diff --git a/benchmark/config.dart b/benchmark/config.dart index 94ac49d8..0bfcaf29 100644 --- a/benchmark/config.dart +++ b/benchmark/config.dart @@ -1,6 +1,6 @@ part of github.benchmark; -final RepositorySlug REPOSITORY_SLUG = +final RepositorySlug repositorySlug = new RepositorySlug("DirectMyFile", "github.dart"); -final String TOKEN = "5fdec2b77527eae85f188b7b2bfeeda170f26883"; +final String token = "5fdec2b77527eae85f188b7b2bfeeda170f26883"; diff --git a/benchmark/main.dart b/benchmark/main.dart index e24e35e2..96fbcde1 100644 --- a/benchmark/main.dart +++ b/benchmark/main.dart @@ -15,7 +15,7 @@ GitHub github; void main() { int times = 10; - github = createGitHubClient(auth: new Authentication.withToken(TOKEN)); + github = createGitHubClient(auth: new Authentication.withToken(token)); runBenchmarks(times, { "Fetch Repository": fetchRepository, "Fetch Commits": fetchCommits diff --git a/benchmark/repository.dart b/benchmark/repository.dart index ccad5cd3..82ba5d8d 100644 --- a/benchmark/repository.dart +++ b/benchmark/repository.dart @@ -2,7 +2,7 @@ part of github.benchmark; Future fetchRepository() { var watch = new Stopwatch()..start(); - return github.repositories.getRepository(REPOSITORY_SLUG).then((repo) { + return github.repositories.getRepository(repositorySlug).then((repo) { watch.stop(); return watch; }); @@ -12,7 +12,7 @@ Future fetchCommits() { var watch = new Stopwatch()..start(); return github.repositories - .listCommits(REPOSITORY_SLUG) + .listCommits(repositorySlug) .toList() .then((commits) { watch.stop(); diff --git a/lib/src/common.dart b/lib/src/common.dart index 0fe1b8ca..7e9c01ab 100644 --- a/lib/src/common.dart +++ b/lib/src/common.dart @@ -9,10 +9,12 @@ import "package:html/dom.dart" as html; import "package:html/parser.dart" as html_parser; import "package:http/http.dart" as http; import "package:quiver/async.dart" show FutureGroup; +import "package:source_gen/generators/json_serializable.dart"; import "package:xml/xml.dart" as xml; import 'util.dart'; +part "common.g.dart"; part "common/activity_service.dart"; part "common/authorizations_service.dart"; part "common/blog_service.dart"; diff --git a/lib/src/common.g.dart b/lib/src/common.g.dart new file mode 100644 index 00000000..0f0daed3 --- /dev/null +++ b/lib/src/common.g.dart @@ -0,0 +1,82 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of github.common; + +// ************************************************************************** +// Generator: JsonSerializableGenerator +// Target: class GitTree +// ************************************************************************** + +GitTree _$GitTreeFromJson(Map json) => new GitTree( + json['sha'] as String, + json['url'] as String, + json['truncated'] as bool, + (json['tree'] as List) + ?.map((v0) => v0 == null ? null : new GitTreeEntry.fromJson(v0)) + ?.toList()); + +// ************************************************************************** +// Generator: JsonSerializableGenerator +// Target: class GitTreeEntry +// ************************************************************************** + +GitTreeEntry _$GitTreeEntryFromJson(Map json) => new 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); + +// ************************************************************************** +// Generator: JsonSerializableGenerator +// Target: class CommitData +// ************************************************************************** + +CommitData _$CommitDataFromJson(Map json) => new CommitData( + json['sha'], + json['commit'] == null ? null : new GitCommit.fromJson(json['commit']), + json['url'] as String, + json['html_url'] as String, + json['comments_url'] as String, + json['author'] == null ? null : new CommitDataUser.fromJson(json['author']), + json['committer'] == null + ? null + : new CommitDataUser.fromJson(json['committer']), + json['parents']); + +// ************************************************************************** +// Generator: JsonSerializableGenerator +// Target: class CommitDataUser +// ************************************************************************** + +CommitDataUser _$CommitDataUserFromJson(Map json) => new CommitDataUser( + json['login'] as String, json['id'] as int, json['type'] as String); + +// ************************************************************************** +// Generator: JsonSerializableGenerator +// Target: class CommitInfo +// ************************************************************************** + +CommitInfo _$CommitInfoFromJson(Map json) => new CommitInfo( + json['sha'] as String, + json['tree'] == null ? null : new GitTree.fromJson(json['tree'])); + +// ************************************************************************** +// Generator: JsonSerializableGenerator +// Target: class UserInformation +// ************************************************************************** + +UserInformation _$UserInformationFromJson(Map json) => new UserInformation( + json['login'] as String, + json['id'] as int, + json['avatar_url'] as String, + json['html_url'] as String); + +// ************************************************************************** +// Generator: JsonSerializableGenerator +// Target: class Branch +// ************************************************************************** + +Branch _$BranchFromJson(Map json) => new Branch(json['name'] as String, + json['commit'] == null ? null : new CommitData.fromJson(json['commit'])); diff --git a/lib/src/common/git_service.dart b/lib/src/common/git_service.dart index da42cd2c..5339acf3 100644 --- a/lib/src/common/git_service.dart +++ b/lib/src/common/git_service.dart @@ -147,7 +147,7 @@ class GitService extends Service { } return _github.getJSON(path, - convert: GitTree.fromJSON, + convert: (j) => new GitTree.fromJson(j), statusCode: StatusCodes.OK) as Future; } @@ -156,7 +156,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: GitTree.fromJSON, + convert: (j) => new GitTree.fromJson(j), statusCode: StatusCodes.CREATED, body: tree.toJSON()) as Future; } diff --git a/lib/src/common/model/git.dart b/lib/src/common/model/git.dart index ffd26ad1..ad1c2cc9 100644 --- a/lib/src/common/model/git.dart +++ b/lib/src/common/model/git.dart @@ -50,9 +50,9 @@ class GitCommit { @ApiName('comment_count') int commentCount; - static GitCommit fromJSON(Map input) { - if (input == null) return null; + GitCommit(); + factory GitCommit.fromJson(input) { var commit = new GitCommit() ..sha = input['sha'] ..url = input['url'] @@ -70,7 +70,7 @@ class GitCommit { } if (input['tree'] != null) { - commit.tree = GitTree.fromJSON(input['tree'] as Map); + commit.tree = new GitTree.fromJson(input['tree'] as Map); } if (input['parents'] != null) { @@ -81,6 +81,12 @@ class GitCommit { return commit; } + + static GitCommit fromJSON(Map input) { + if (input == null) return null; + + return new GitCommit.fromJson(input); + } } /// Model class for a new commit to be created. @@ -149,57 +155,40 @@ class GitCommitUser { } /// Model class for a GitHub tree. +@JsonSerializable(createToJson: false) class GitTree { - String sha; - String url; + final String sha; + final String url; /// If truncated is true, the number of items in the tree array exceeded /// GitHub's maximum limit. - bool truncated; - - @ApiName("tree") - List entries; + final bool truncated; - static GitTree fromJSON(Map input) { - if (input == null) return null; + @JsonKey("tree") + final List entries; - var tree = new GitTree() - ..sha = input['sha'] - ..url = input['url'] - ..truncated = input['truncated']; + GitTree(this.sha, this.url, this.truncated, this.entries); - // There are no tree entries if it's a tree referenced from a GitCommit. - if (input['tree'] != null) { - tree.entries = (input['tree'] as List>) - .map((Map it) => GitTreeEntry.fromJSON(it)) - .toList(growable: false); - } - return tree; - } + factory GitTree.fromJson(Map json) => + json == null ? null : _$GitTreeFromJson(json); } /// 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(createToJson: false) class GitTreeEntry { - String path; - String mode; - String type; - int size; - String sha; - String url; + final String path; + final String mode; + final String type; + final int size; + final String sha; + final String url; - static GitTreeEntry fromJSON(Map input) { - if (input == null) return null; + GitTreeEntry(this.path, this.mode, this.type, this.size, this.sha, this.url); - return new GitTreeEntry() - ..path = input['path'] - ..mode = input['mode'] - ..type = input['type'] - ..size = input['size'] - ..sha = input['sha'] - ..url = input['url']; - } + factory GitTreeEntry.fromJson(Map json) => + _$GitTreeEntryFromJson(json); } /// Model class for a new tree to be created. diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart index eab9681a..26c3eb59 100644 --- a/lib/src/common/model/repos.dart +++ b/lib/src/common/model/repos.dart @@ -177,7 +177,8 @@ class Tag { return new Tag() ..name = input['name'] - ..commit = CommitInfo.fromJson(input['commit'] as Map) + ..commit = + new CommitInfo.fromJson(input['commit'] as Map) ..tarUrl = input['tarball_url'] ..zipUrl = input['zipball_url']; } @@ -186,50 +187,79 @@ class Tag { String toString() => 'Tag: $name'; } -class CommitInfo { - String sha; - GitTree tree; +@JsonSerializable(createToJson: false) +class CommitData { + final Object sha; + final GitCommit commit; - static CommitInfo fromJson(Map input) { - if (input == null) { - return null; - } + @JsonKey("url") + final String url; - var info = new CommitInfo()..sha = input['sha']; + @JsonKey("html_url") + final String htmlUrl; - var commit = input['commit'] as Map; - if (commit != null) { - info.tree = GitTree.fromJSON(commit['tree']); - } + @JsonKey("comments_url") + final String commentsUrl; - return info; - } + final CommitDataUser author, committer; + final Object parents; + + CommitData(this.sha, this.commit, this.url, this.htmlUrl, this.commentsUrl, + this.author, this.committer, this.parents); + + factory CommitData.fromJson(Map json) => + _$CommitDataFromJson(json); +} + +@JsonSerializable(createToJson: false) +class CommitDataUser { + final String login, type; + + final int id; + + CommitDataUser(this.login, this.id, this.type); + + factory CommitDataUser.fromJson(Map json) => + _$CommitDataUserFromJson(json); +} + +@JsonSerializable(createToJson: false) +class CommitInfo { + final String sha; + final GitTree tree; + + CommitInfo(this.sha, this.tree); + + factory CommitInfo.fromJson(Map json) => + _$CommitInfoFromJson(json); } /// User Information +@JsonSerializable(createToJson: false) class UserInformation { /// Owner Username - String login; + final String login; /// Owner ID - int id; + final int id; /// Avatar Url - @ApiName("avatar_url") - String avatarUrl; + @JsonKey("avatar_url") + final String avatarUrl; /// Url to the user's GitHub Profile - @ApiName("html_url") - String htmlUrl; + @JsonKey("html_url") + final String htmlUrl; + + UserInformation(this.login, this.id, this.avatarUrl, this.htmlUrl); + + factory UserInformation.fromJson(Map json) => + _$UserInformationFromJson(json); static UserInformation fromJSON(Map input) { if (input == null) return null; - return new UserInformation() - ..login = input['login'] - ..id = input['id'] - ..avatarUrl = input['avatar_url'] - ..htmlUrl = input['html_url']; + return new UserInformation.fromJson(input); } } @@ -330,21 +360,22 @@ class CreateRepository { } /// Model class for a branch. +@JsonSerializable(createToJson: false) class Branch { /// The name of the branch. - String name; + final String name; /// Commit Information - CommitInfo commit; + final CommitData commit; + + Branch(this.name, this.commit); + + factory Branch.fromJson(Map json) => _$BranchFromJson(json); static Branch fromJSON(Map input) { if (input == null) return null; - var branch = new Branch() - ..name = input['name'] - ..commit = CommitInfo.fromJson(input['commit'] as Map); - - return branch; + return new Branch.fromJson(input); } } diff --git a/pubspec.yaml b/pubspec.yaml index 81d67c11..3cb3e625 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 3.0.2 +version: 4.0.0-dev author: Kenneth Endfinger description: GitHub API Client Library homepage: https://github.com/DirectMyFile/github.dart @@ -8,10 +8,12 @@ environment: dependencies: html: '>=0.12.0 <0.14.0' http: '^0.11.3' + markdown: '^0.11.1' quiver: '>=0.20.0 <0.25.0' + source_gen: '^0.6.1' xml: '^2.0.0' - markdown: '^0.11.1' dev_dependencies: browser: '^0.10.0+2' + build_runner: ^0.3.0 test: '^0.12.0' mockito: '^1.0.1' diff --git a/test/experiment/directcode_keys.dart b/test/experiment/directcode_keys.dart index 43d721f4..a3444f0c 100755 --- a/test/experiment/directcode_keys.dart +++ b/test/experiment/directcode_keys.dart @@ -6,7 +6,7 @@ import "package:quiver/async.dart"; Future main() async { var github = createGitHubClient(); - github.organizations.get("DirectMyFile").then((organization) { + await github.organizations.get("DirectMyFile").then((organization) { return github.organizations.listTeams(organization.name).toList(); }).then((teams) { var group = new FutureGroup(); diff --git a/test/git_test.dart b/test/git_test.dart index ce179561..439d434e 100644 --- a/test/git_test.dart +++ b/test/git_test.dart @@ -223,7 +223,7 @@ void main() { git.getTree(repo, 'sh'); verify(github.getJSON('/repos/o/n/git/trees/sh', - convert: GitTree.fromJSON, statusCode: StatusCodes.OK)); + convert: (j) => new GitTree.fromJson(j), statusCode: StatusCodes.OK)); }); }); @@ -232,7 +232,7 @@ void main() { git.getTree(repo, 'sh', recursive: true); verify(github.getJSON('/repos/o/n/git/trees/sh?recursive=1', - convert: GitTree.fromJSON, statusCode: StatusCodes.OK)); + convert: (j) => new GitTree.fromJson(j), statusCode: StatusCodes.OK)); }); }); @@ -242,7 +242,7 @@ void main() { git.createTree(repo, createGitTree); verify(github.postJSON('/repos/o/n/git/trees', - convert: GitTree.fromJSON, + convert: (j) => new GitTree.fromJson(j), statusCode: StatusCodes.CREATED, body: createGitTree.toJSON())); }); diff --git a/tool/build.dart b/tool/build.dart old mode 100755 new mode 100644 index e389c0b5..6a3347a9 --- a/tool/build.dart +++ b/tool/build.dart @@ -1,34 +1,13 @@ -#!/usr/bin/env dart -import "dart:async"; -import "dart:io"; +// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. -Directory packagesDirectory = new Directory("packages/"); +import 'dart:async'; -void main(List args) { - var future = new Future.value(null); +import 'package:build_runner/build_runner.dart'; - if (!packagesDirectory.existsSync()) { - future = execute("pub get"); - } +import 'phases.dart'; - future.then((_) { - var argz = (args.length > 0 ? " " : "") + args.join(" "); - return execute("dart --checked tool/hop_runner.dart --color${argz}"); - }); -} - -dynamic execute(String cmdline) { - var split = cmdline.split(" "); - var command = split[0]; - split.remove(command); - var args = split; - return Process.start(command, args).then((Process process) { - stdout.addStream(process.stdout); - stderr.addStream(process.stderr); - return process.exitCode; - }).then((int exitCode) { - if (exitCode != 0) { - exit(exitCode); - } - }); +Future main() async { + await build(phases, deleteFilesByDefault: true); } diff --git a/tool/build.yaml b/tool/build.yaml deleted file mode 100644 index 9081b2a6..00000000 --- a/tool/build.yaml +++ /dev/null @@ -1,17 +0,0 @@ -analyzer.files: - - lib/common.dart - - lib/server.dart - - lib/browser.dart - - example/repos.dart - - example/organization.dart - - example/users.dart - - example/user_info.dart - - example/languages.dart - - example/oauth2.dart - - example/releases.dart - - example/common.dart -check.tasks: - - analyze - - test -docs.output: out/docs -test.file: test/all_tests.dart diff --git a/tool/phases.dart b/tool/phases.dart new file mode 100644 index 00000000..dd30b69c --- /dev/null +++ b/tool/phases.dart @@ -0,0 +1,9 @@ +import 'package:build_runner/build_runner.dart'; +import 'package:source_gen/source_gen.dart'; +import 'package:source_gen/generators/json_serializable_generator.dart'; + +final PhaseGroup phases = new PhaseGroup.singleAction( + new GeneratorBuilder(const [ + const JsonSerializableGenerator(), + ]), + new InputSet('github', const ['lib/src/common.dart'])); diff --git a/tool/watch.dart b/tool/watch.dart new file mode 100644 index 00000000..be2730bd --- /dev/null +++ b/tool/watch.dart @@ -0,0 +1,11 @@ +// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'package:build_runner/build_runner.dart'; + +import 'phases.dart'; + +void main() { + watch(phases, deleteFilesByDefault: true); +} From 764b6407c153aca65e1447359662d5522adee47c Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Fri, 14 Jul 2017 19:19:50 -0700 Subject: [PATCH 051/496] more fixes --- lib/src/common.g.dart | 17 +++++++++++++++-- lib/src/common/model/repos.dart | 30 +++++++++++++----------------- lib/src/common/repos_service.dart | 2 +- test/git_integration_test.dart | 2 +- 4 files changed, 30 insertions(+), 21 deletions(-) diff --git a/lib/src/common.g.dart b/lib/src/common.g.dart index 0f0daed3..9f8ba535 100644 --- a/lib/src/common.g.dart +++ b/lib/src/common.g.dart @@ -28,13 +28,24 @@ GitTreeEntry _$GitTreeEntryFromJson(Map json) => new GitTreeEntry( json['sha'] as String, json['url'] as String); +// ************************************************************************** +// Generator: JsonSerializableGenerator +// Target: class Tag +// ************************************************************************** + +Tag _$TagFromJson(Map json) => new Tag( + json['name'] as String, + json['commit'] == null ? null : new CommitInfo.fromJson(json['commit']), + json['zipball_url'] as String, + json['tarball_url'] as String); + // ************************************************************************** // Generator: JsonSerializableGenerator // Target: class CommitData // ************************************************************************** CommitData _$CommitDataFromJson(Map json) => new CommitData( - json['sha'], + json['sha'] as String, json['commit'] == null ? null : new GitCommit.fromJson(json['commit']), json['url'] as String, json['html_url'] as String, @@ -43,7 +54,9 @@ CommitData _$CommitDataFromJson(Map json) => new CommitData( json['committer'] == null ? null : new CommitDataUser.fromJson(json['committer']), - json['parents']); + (json['parents'] as List) + ?.map((v0) => v0 as Map) + ?.toList()); // ************************************************************************** // Generator: JsonSerializableGenerator diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart index 26c3eb59..798cd336 100644 --- a/lib/src/common/model/repos.dart +++ b/lib/src/common/model/repos.dart @@ -164,24 +164,20 @@ class CloneUrls { } } +@JsonSerializable(createToJson: false) class Tag { - String name; - CommitInfo commit; - String zipUrl; - String tarUrl; + final String name; + final CommitInfo commit; - static Tag fromJSON(Map input) { - if (input == null) { - return null; - } + @JsonKey('zipball_url') + final String zipUrl; + @JsonKey('tarball_url') + final String tarUrl; - return new Tag() - ..name = input['name'] - ..commit = - new CommitInfo.fromJson(input['commit'] as Map) - ..tarUrl = input['tarball_url'] - ..zipUrl = input['zipball_url']; - } + Tag(this.name, this.commit, this.zipUrl, this.tarUrl); + + factory Tag.fromJson(Map input) => + input == null ? null : _$TagFromJson(input); @override String toString() => 'Tag: $name'; @@ -189,7 +185,7 @@ class Tag { @JsonSerializable(createToJson: false) class CommitData { - final Object sha; + final String sha; final GitCommit commit; @JsonKey("url") @@ -202,7 +198,7 @@ class CommitData { final String commentsUrl; final CommitDataUser author, committer; - final Object parents; + final List> parents; CommitData(this.sha, this.commit, this.url, this.htmlUrl, this.commentsUrl, this.author, this.committer, this.parents); diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index e29c77e5..42dad6be 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -193,7 +193,7 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/#list-tags Stream listTags(RepositorySlug slug) { return new PaginationHelper(_github).objects( - 'GET', '/repos/${slug.fullName}/tags', Tag.fromJSON) as Stream; + 'GET', '/repos/${slug.fullName}/tags', (j) => new Tag.fromJson(j)) as Stream; } /// Lists the branches of the specified repository. diff --git a/test/git_integration_test.dart b/test/git_integration_test.dart index 2fed2541..7c9913b3 100644 --- a/test/git_integration_test.dart +++ b/test/git_integration_test.dart @@ -34,7 +34,7 @@ void main() { test('get last commit of master', () async { var branch = await github.repositories.getBranch(slug, 'master'); firstCommitSha = branch.commit.sha; - firstCommitTreeSha = branch.commit.tree.sha; + firstCommitTreeSha = branch.commit.commit.sha; }); test('create and get a new blob', () async { From bb8ce63e3406d831a33b9a1585b33bdcc999e26a Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Tue, 18 Jul 2017 15:09:09 -0700 Subject: [PATCH 052/496] initial support for comparing commits --- CHANGELOG.md | 3 ++- lib/src/common.g.dart | 12 ++++++++++ lib/src/common/model/repos.dart | 37 +++++++++++++++++++++++++++++++ lib/src/common/repos_service.dart | 9 +++++++- 4 files changed, 59 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f1706915..b1c93584 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ ## v4.0.0 -* Make fields in many objects read-only. +- Make fields in many objects read-only. +- Initial support for comparing commits. ## v3.0.0 diff --git a/lib/src/common.g.dart b/lib/src/common.g.dart index 9f8ba535..21c67827 100644 --- a/lib/src/common.g.dart +++ b/lib/src/common.g.dart @@ -28,6 +28,18 @@ GitTreeEntry _$GitTreeEntryFromJson(Map json) => new GitTreeEntry( json['sha'] as String, json['url'] as String); +// ************************************************************************** +// Generator: JsonSerializableGenerator +// Target: class GitHubComparison +// ************************************************************************** + +GitHubComparison _$GitHubComparisonFromJson(Map json) => new GitHubComparison( + json['url'] as String, + json['status'] as String, + json['ahead_by'] as int, + json['behind_by'] as int, + json['total_commits'] as int); + // ************************************************************************** // Generator: JsonSerializableGenerator // Target: class Tag diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart index 798cd336..45b3cc1a 100644 --- a/lib/src/common/model/repos.dart +++ b/lib/src/common/model/repos.dart @@ -1,5 +1,42 @@ part of github.common; +@JsonSerializable(createToJson: false) +class GitHubComparison { + final String url; + + final String status; + + @JsonKey('ahead_by') + final int aheadBy; + + @JsonKey('behind_by') + final int behindBy; + + @JsonKey('total_commits') + final int totalCommits; + + GitHubComparison( + this.url, this.status, this.aheadBy, this.behindBy, this.totalCommits); + + factory GitHubComparison.fromJson(Map json) => + _$GitHubComparisonFromJson(json); + + String toString() { + switch (status) { + case 'identical': + return "GitHubComparison: identical"; + case 'behind': + return "GitHubComparison: behind ($behindBy)"; + case 'diverged': + return "GitHubComparison: diverged"; + case 'ahead': + return "GitHubComparison: ahead ($aheadBy)"; + default: + return "Huh??? - $status"; + } + } +} + /// Model class for a repository. class Repository { /// Repository Name diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 42dad6be..449e32c8 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -270,7 +270,14 @@ class RepositoriesService extends Service { convert: RepositoryCommit.fromJSON) as Future; } - // TODO: Implement compareCommits: https://developer.github.com/v3/repos/commits/#compare-two-commits + /// [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) => new GitHubComparison.fromJson(j)); /// Fetches the readme file for a repository. /// From b4b1185ea61321ce3d3f5ca980f64302cd49e4dc Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Tue, 18 Jul 2017 15:32:58 -0700 Subject: [PATCH 053/496] Use SDK v1.21 generic methods --- lib/src/common/activity_service.dart | 17 ++--- lib/src/common/authorizations_service.dart | 8 +-- lib/src/common/gists_service.dart | 6 +- lib/src/common/git_service.dart | 45 +++++------- lib/src/common/github.dart | 4 +- lib/src/common/issues_service.dart | 22 +++--- lib/src/common/misc_service.dart | 15 ++-- lib/src/common/orgs_service.dart | 24 +++---- lib/src/common/pulls_service.dart | 8 +-- lib/src/common/repos_service.dart | 82 +++++++++------------- lib/src/common/users_service.dart | 17 +++-- pubspec.yaml | 2 +- 12 files changed, 103 insertions(+), 147 deletions(-) diff --git a/lib/src/common/activity_service.dart b/lib/src/common/activity_service.dart index d8c002dd..077acc58 100644 --- a/lib/src/common/activity_service.dart +++ b/lib/src/common/activity_service.dart @@ -180,11 +180,9 @@ class ActivityService extends Service { /// Fetches the specified notification thread. /// /// API docs: https://developer.github.com/v3/activity/notifications/#view-a-single-thread - Future getThread(String threadId) { - return _github.getJSON("/notification/threads/${threadId}", - statusCode: StatusCodes.OK, - convert: Notification.fromJSON) as Future; - } + Future getThread(String threadId) => + _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 // TODO: Implement getThreadSubscription: https://developer.github.com/v3/activity/notifications/#get-a-thread-subscription @@ -276,12 +274,9 @@ class ActivityService extends Service { /// /// API docs: https://developer.github.com/v3/activity/watching/#get-a-repository-subscription Future getRepositorySubscription( - RepositorySlug slug) { - return _github.getJSON("/repos/${slug.fullName}/subscription", - statusCode: StatusCodes.OK, - convert: RepositorySubscription.fromJSON) - as Future; - } + RepositorySlug slug) => + _github.getJSON("/repos/${slug.fullName}/subscription", + statusCode: StatusCodes.OK, convert: RepositorySubscription.fromJSON); /// Sets the Repository Subscription Status /// diff --git a/lib/src/common/authorizations_service.dart b/lib/src/common/authorizations_service.dart index a46a6720..cf6e4eea 100644 --- a/lib/src/common/authorizations_service.dart +++ b/lib/src/common/authorizations_service.dart @@ -22,11 +22,9 @@ class AuthorizationsService extends Service { /// Fetches an authorization specified by [id]. /// /// API docs: https://developer.github.com/v3/oauth_authorizations/#get-a-single-authorization - Future getAuthorization(int id) { - return _github.getJSON("/authorizations/${id}", - statusCode: 200, - convert: Authorization.fromJSON) as Future; - } + Future getAuthorization(int id) => + _github.getJSON("/authorizations/${id}", + 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/gists_service.dart b/lib/src/common/gists_service.dart index 98fce6e9..213e2484 100644 --- a/lib/src/common/gists_service.dart +++ b/lib/src/common/gists_service.dart @@ -43,10 +43,8 @@ class GistsService extends Service { /// Fetches a Gist by the specified [id]. /// /// API docs: https://developer.github.com/v3/gists/#get-a-single-gist - Future getGist(String id) { - return _github.getJSON("/gists/${id}", - statusCode: StatusCodes.OK, convert: Gist.fromJSON) as Future; - } + Future getGist(String id) => _github.getJSON("/gists/${id}", + statusCode: StatusCodes.OK, convert: Gist.fromJSON); /// Creates a Gist /// diff --git a/lib/src/common/git_service.dart b/lib/src/common/git_service.dart index 5339acf3..0638527c 100644 --- a/lib/src/common/git_service.dart +++ b/lib/src/common/git_service.dart @@ -10,11 +10,9 @@ 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) { - return _github.getJSON('/repos/${slug.fullName}/git/blobs/${sha}', - convert: GitBlob.fromJSON, - statusCode: StatusCodes.OK) as Future; - } + Future getBlob(RepositorySlug slug, String sha) => + _github.getJSON('/repos/${slug.fullName}/git/blobs/${sha}', + convert: GitBlob.fromJSON, statusCode: StatusCodes.OK); /// Creates a blob with specified [blob] content. /// @@ -29,11 +27,9 @@ 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) { - return _github.getJSON('/repos/${slug.fullName}/git/commits/${sha}', - convert: GitCommit.fromJSON, - statusCode: StatusCodes.OK) as Future; - } + Future getCommit(RepositorySlug slug, String sha) => + _github.getJSON('/repos/${slug.fullName}/git/commits/${sha}', + convert: GitCommit.fromJSON, statusCode: StatusCodes.OK); /// Creates a new commit in a repository. /// @@ -50,11 +46,9 @@ class GitService extends Service { /// Note: The [ref] in the URL must be formatted as "heads/branch", not just "branch". /// /// API docs: https://developer.github.com/v3/git/refs/#get-a-reference - Future getReference(RepositorySlug slug, String ref) { - return _github.getJSON('/repos/${slug.fullName}/git/refs/${ref}', - convert: GitReference.fromJSON, - statusCode: StatusCodes.OK) as Future; - } + Future getReference(RepositorySlug slug, String ref) => + _github.getJSON('/repos/${slug.fullName}/git/refs/${ref}', + convert: GitReference.fromJSON, statusCode: StatusCodes.OK); /// Lists the references in a repository. /// @@ -118,20 +112,18 @@ 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) { - return _github.getJSON('/repos/${slug.fullName}/git/tags/${sha}', - convert: GitTag.fromJSON, statusCode: StatusCodes.OK) as Future; - } + Future getTag(RepositorySlug slug, String 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) { - return _github.postJSON('/repos/${slug.fullName}/git/tags', - convert: GitTag.fromJSON, - statusCode: StatusCodes.CREATED, - body: tag.toJSON()) as Future; - } + Future createTag(RepositorySlug slug, CreateGitTag tag) => + _github.postJSON('/repos/${slug.fullName}/git/tags', + convert: GitTag.fromJSON, + statusCode: StatusCodes.CREATED, + body: tag.toJSON()); /// Fetches a tree from a repository for the given ref [sha]. /// @@ -147,8 +139,7 @@ class GitService extends Service { } return _github.getJSON(path, - convert: (j) => new GitTree.fromJson(j), - statusCode: StatusCodes.OK) as Future; + convert: (j) => new 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 97f464db..15a8e13d 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -204,12 +204,12 @@ 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, + Future getJSON(String path, {int statusCode, void fail(http.Response response), Map headers, Map params, - JSONConverter convert, + JSONConverter convert, String preview}) async { if (headers == null) headers = {}; diff --git a/lib/src/common/issues_service.dart b/lib/src/common/issues_service.dart index 182d0e71..26133eb0 100644 --- a/lib/src/common/issues_service.dart +++ b/lib/src/common/issues_service.dart @@ -138,10 +138,9 @@ class IssuesService extends Service { /// Get an issue. /// /// API docs: https://developer.github.com/v3/issues/#get-a-single-issue - Future get(RepositorySlug slug, int issueNumber) { - return _github.getJSON("/repos/${slug.fullName}/issues/${issueNumber}", - convert: Issue.fromJSON) as Future; - } + Future get(RepositorySlug slug, int issueNumber) => + _github.getJSON("/repos/${slug.fullName}/issues/${issueNumber}", + convert: Issue.fromJSON); /// Create an issue. /// @@ -202,10 +201,9 @@ class IssuesService extends Service { /// Fetches the specified issue comment. /// /// API docs: https://developer.github.com/v3/issues/comments/#get-a-single-comment - Future getComment(RepositorySlug slug, int id) { - return _github.getJSON("/repos/${slug.fullName}/issues/comments/${id}", - convert: IssueComment.fromJSON) as Future; - } + Future getComment(RepositorySlug slug, int id) => + _github.getJSON("/repos/${slug.fullName}/issues/comments/${id}", + convert: IssueComment.fromJSON); /// Creates a new comment on the specified issue /// @@ -245,11 +243,9 @@ class IssuesService extends Service { /// Fetches a single label. /// /// API docs: https://developer.github.com/v3/issues/labels/#get-a-single-label - Future getLabel(RepositorySlug slug, String name) { - return _github.getJSON("/repos/${slug.fullName}/labels/${name}", - convert: IssueLabel.fromJSON, - statusCode: StatusCodes.OK) as Future; - } + Future getLabel(RepositorySlug slug, String name) => + _github.getJSON("/repos/${slug.fullName}/labels/${name}", + convert: IssueLabel.fromJSON, statusCode: StatusCodes.OK); /// Creates a new label on the specified repository. /// diff --git a/lib/src/common/misc_service.dart b/lib/src/common/misc_service.dart index ab211784..fff51156 100644 --- a/lib/src/common/misc_service.dart +++ b/lib/src/common/misc_service.dart @@ -27,10 +27,9 @@ class MiscService extends Service { /// All template names can be fetched using [listGitignoreTemplates]. /// /// API docs: https://developer.github.com/v3/gitignore/#get-a-single-template - Future getGitignoreTemplate(String name) { - return _github.getJSON("/gitignore/templates/${name}", - convert: GitignoreTemplate.fromJSON) as Future; - } + Future getGitignoreTemplate(String name) => + _github.getJSON("/gitignore/templates/${name}", + convert: GitignoreTemplate.fromJSON); /// Renders Markdown from the [input]. /// @@ -63,11 +62,9 @@ class MiscService extends Service { } /// Gets the GitHub API Status. - Future getApiStatus() { - return _github.getJSON("https://status.github.com/api/status.json", - statusCode: StatusCodes.OK, - convert: APIStatus.fromJSON) as Future; - } + Future getApiStatus() => + _github.getJSON("https://status.github.com/api/status.json", + statusCode: StatusCodes.OK, convert: APIStatus.fromJSON); /// Returns a stream of Octocats from Octodex. /// diff --git a/lib/src/common/orgs_service.dart b/lib/src/common/orgs_service.dart index 6fd185aa..df4836e0 100644 --- a/lib/src/common/orgs_service.dart +++ b/lib/src/common/orgs_service.dart @@ -24,15 +24,13 @@ class OrganizationsService extends Service { /// Fetches the organization specified by [name]. /// /// API docs: https://developer.github.com/v3/orgs/#get-an-organization - Future get(String name) { - return _github.getJSON("/orgs/${name}", - convert: Organization.fromJSON, - statusCode: StatusCodes.OK, fail: (http.Response response) { - if (response.statusCode == 404) { - throw new OrganizationNotFound(_github, name); - } - }) as Future; - } + Future get(String name) => _github.getJSON("/orgs/${name}", + convert: Organization.fromJSON, + statusCode: StatusCodes.OK, fail: (http.Response response) { + if (response.statusCode == 404) { + throw new OrganizationNotFound(_github, name); + } + }); /// Fetches the organizations specified by [names]. Stream getMulti(List names) { @@ -287,11 +285,9 @@ 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) { - return _github.getJSON("/orgs/${org}/hooks/${id}", - convert: (Map i) => Hook.fromJSON(org, i)) - as Future; - } + Future getHook(String org, int id) => + _github.getJSON("/orgs/${org}/hooks/${id}", + convert: (Map i) => Hook.fromJSON(org, i)); /// 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 5e633a64..a4f40b44 100644 --- a/lib/src/common/pulls_service.dart +++ b/lib/src/common/pulls_service.dart @@ -16,11 +16,9 @@ class PullRequestsService extends Service { /// Fetches a single pull request. /// /// API docs: https://developer.github.com/v3/pulls/#get-a-single-pull-request - Future get(RepositorySlug slug, int number) { - return _github.getJSON("/repos/${slug.fullName}/pulls/${number}", - convert: PullRequest.fromJSON, - statusCode: StatusCodes.OK) as Future; - } + Future get(RepositorySlug slug, int number) => + _github.getJSON("/repos/${slug.fullName}/pulls/${number}", + convert: PullRequest.fromJSON, 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 449e32c8..5df78f71 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -95,15 +95,14 @@ class RepositoriesService extends Service { /// Fetches the repository specified by the [slug]. /// /// API docs: https://developer.github.com/v3/repos/#get - Future getRepository(RepositorySlug slug) { - return _github.getJSON("/repos/${slug.owner}/${slug.name}", - convert: Repository.fromJSON, - statusCode: StatusCodes.OK, fail: (http.Response response) { - if (response.statusCode == 404) { - throw new RepositoryNotFound(_github, slug.fullName); - } - }) as Future; - } + 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 new RepositoryNotFound(_github, slug.fullName); + } + }); /// Fetches a list of repositories specified by [slugs]. Stream getRepositories(List slugs) { @@ -184,16 +183,16 @@ class RepositoriesService extends Service { /// 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) => new LanguageBreakdown(input)) - as Future; + statusCode: StatusCodes.OK, + convert: (Map input) => new LanguageBreakdown(input)); /// 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)) as Stream; + 'GET', '/repos/${slug.fullName}/tags', (j) => new Tag.fromJson(j)) + as Stream; } /// Lists the branches of the specified repository. @@ -208,10 +207,9 @@ class RepositoriesService extends Service { /// Fetches the specified branch. /// /// API docs: https://developer.github.com/v3/repos/#get-branch - Future getBranch(RepositorySlug slug, String branch) { - return _github.getJSON("/repos/${slug.fullName}/branches/${branch}", - convert: Branch.fromJSON) as Future; - } + Future getBranch(RepositorySlug slug, String branch) => + _github.getJSON("/repos/${slug.fullName}/branches/${branch}", + convert: Branch.fromJSON); /// Lists the users that have access to the repository identified by [slug]. /// @@ -265,10 +263,9 @@ 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) { - return _github.getJSON("/repos/${slug.fullName}/commits/${sha}", - convert: RepositoryCommit.fromJSON) as Future; - } + Future getCommit(RepositorySlug slug, String sha) => + _github.getJSON("/repos/${slug.fullName}/commits/${sha}", + convert: RepositoryCommit.fromJSON); /// [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. @@ -303,7 +300,7 @@ class RepositoriesService extends Service { } }, convert: (Map input) => - GitHubFile.fromJSON(input, slug)) as Future; + GitHubFile.fromJSON(input, slug)); } /// Fetches content in a repository at the specified [path]. @@ -346,7 +343,7 @@ class RepositoriesService extends Service { .toList(); } return contents; - }) as Future; + }); } /// Creates a new file in a repository. @@ -441,11 +438,9 @@ 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) { - return _github.getJSON("/repos/${slug.fullName}/hooks/${id}", - convert: (Map i) => - Hook.fromJSON(slug.fullName, i)) as Future; - } + Future getHook(RepositorySlug slug, int id) => + _github.getJSON("/repos/${slug.fullName}/hooks/${id}", + convert: (Map i) => Hook.fromJSON(slug.fullName, i)); /// Creates a repository hook based on the specified [hook]. /// @@ -521,11 +516,9 @@ 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) { - return _github.getJSON("/repos/${slug.fullName}/pages", - statusCode: 200, - convert: RepositoryPages.fromJSON) as Future; - } + Future getPagesInfo(RepositorySlug slug) => + _github.getJSON("/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 @@ -542,10 +535,9 @@ 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) { - return _github.getJSON("/repos/${slug.fullName}/releases/${id}", - convert: Release.fromJSON) as Future; - } + Future getRelease(RepositorySlug slug, int id) => + _github.getJSON("/repos/${slug.fullName}/releases/${id}", + convert: Release.fromJSON); /// Creates a Release based on the specified [release]. /// @@ -613,11 +605,9 @@ class RepositoriesService extends Service { /// Fetches Participation Breakdowns. /// /// API docs: https://developer.github.com/v3/repos/statistics/#participation - Future getParticipation(RepositorySlug slug) { - return _github.getJSON("/repos/${slug.fullName}/stats/participation", - statusCode: 200, convert: ContributorParticipation.fromJSON) - as Future; - } + Future getParticipation(RepositorySlug slug) => + _github.getJSON("/repos/${slug.fullName}/stats/participation", + statusCode: 200, convert: ContributorParticipation.fromJSON); /// Fetches Punchcard. /// @@ -655,9 +645,7 @@ 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) { - return _github.getJSON("/repos/${slug.fullName}/commits/${ref}/status", - convert: CombinedRepositoryStatus.fromJSON, - statusCode: 200) as Future; - } + RepositorySlug slug, String ref) => + _github.getJSON("/repos/${slug.fullName}/commits/${ref}/status", + convert: CombinedRepositoryStatus.fromJSON, statusCode: 200); } diff --git a/lib/src/common/users_service.dart b/lib/src/common/users_service.dart index ee1fb649..34646066 100644 --- a/lib/src/common/users_service.dart +++ b/lib/src/common/users_service.dart @@ -11,7 +11,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) as Future; + _github.getJSON("/users/${name}", convert: User.fromJSON); /// Updates the Current User. /// @@ -65,14 +65,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() { - return _github.getJSON("/user", statusCode: StatusCodes.OK, - fail: (http.Response response) { - if (response.statusCode == StatusCodes.FORBIDDEN) { - throw new AccessForbidden(_github); - } - }, convert: CurrentUser.fromJSON) as Future; - } + Future getCurrentUser() => + _github.getJSON("/user", statusCode: StatusCodes.OK, + fail: (http.Response response) { + if (response.statusCode == StatusCodes.FORBIDDEN) { + throw new AccessForbidden(_github); + } + }, convert: CurrentUser.fromJSON); /// Checks if a user exists. Future isUser(String name) => _github diff --git a/pubspec.yaml b/pubspec.yaml index 3cb3e625..f68ff36d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ author: Kenneth Endfinger description: GitHub API Client Library homepage: https://github.com/DirectMyFile/github.dart environment: - sdk: '>=1.13.0 <2.0.0' + sdk: '>=1.21.0 <2.0.0' dependencies: html: '>=0.12.0 <0.14.0' http: '^0.11.3' From 232e03ecaf6853715143fcd63467be1d77d1413c Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Tue, 18 Jul 2017 15:33:07 -0700 Subject: [PATCH 054/496] dartfmt --- example/users.dart | 5 +++-- lib/src/common/github.dart | 3 +-- lib/src/common/model/authorizations.dart | 5 +++-- lib/src/common/model/keys.dart | 2 +- lib/src/common/model/repos_forks.dart | 2 +- lib/src/common/model/repos_merging.dart | 2 +- lib/src/common/orgs_service.dart | 21 ++++++++++++--------- lib/src/util.dart | 6 +++--- test/helper/http.dart | 2 +- 9 files changed, 26 insertions(+), 22 deletions(-) diff --git a/example/users.dart b/example/users.dart index 50578244..a587315e 100644 --- a/example/users.dart +++ b/example/users.dart @@ -29,8 +29,9 @@ void loadUsers() { h.append(new BRElement()); } - h.append(GitHubBrowserHelper.createAvatarImage(user, - width: 64, height: 64)..classes.add("avatar")); + h.append( + GitHubBrowserHelper.createAvatarImage(user, width: 64, height: 64) + ..classes.add("avatar")); var buff = new StringBuffer(); buff diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index 15a8e13d..8918c28c 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -231,7 +231,6 @@ class GitHub { headers.putIfAbsent("Authorization", () => "basic ${userAndPass}"); } - var response = await request("GET", path, headers: headers, params: params, statusCode: statusCode, fail: fail); @@ -286,7 +285,7 @@ class GitHub { headers.putIfAbsent("Authorization", () => "token ${auth.token}"); } else if (auth.isBasic) { var userAndPass = - BASE64.encode(UTF8.encode('${auth.username}:${auth.password}')); + BASE64.encode(UTF8.encode('${auth.username}:${auth.password}')); headers.putIfAbsent("Authorization", () => "basic ${userAndPass}"); } diff --git a/lib/src/common/model/authorizations.dart b/lib/src/common/model/authorizations.dart index a81ee78d..cc7dad88 100644 --- a/lib/src/common/model/authorizations.dart +++ b/lib/src/common/model/authorizations.dart @@ -22,7 +22,8 @@ class Authorization { ..id = input['id'] ..scopes = input['scopes'] as List ..token = input['token'] - ..app = AuthorizationApplication.fromJSON(input['app'] as Map) + ..app = AuthorizationApplication + .fromJSON(input['app'] as Map) ..note = input['note'] ..noteUrl = input['note_url'] ..createdAt = parseDateTime(input['created_at']) @@ -63,7 +64,7 @@ class CreateAuthorization { CreateAuthorization(this.note); String toJSON() { - var map = {}; + var map = {}; putValue("note", note, map); putValue("note_url", noteUrl, map); putValue("client_id", clientID, map); diff --git a/lib/src/common/model/keys.dart b/lib/src/common/model/keys.dart index 1be5c935..88c98566 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 = {}; + var map = {}; putValue("title", title, map); putValue("key", key, map); return JSON.encode(map); diff --git a/lib/src/common/model/repos_forks.dart b/lib/src/common/model/repos_forks.dart index 3dbbe6c5..189455e9 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 = {}; + var map = {}; putValue("organization", organization, map); return JSON.encode(map); } diff --git a/lib/src/common/model/repos_merging.dart b/lib/src/common/model/repos_merging.dart index 4f720b27..4daa3923 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 = {}; + var map = {}; putValue("base", base, map); putValue("head", head, map); putValue("commit_message", commitMessage, map); diff --git a/lib/src/common/orgs_service.dart b/lib/src/common/orgs_service.dart index df4836e0..a2adf86a 100644 --- a/lib/src/common/orgs_service.dart +++ b/lib/src/common/orgs_service.dart @@ -181,15 +181,18 @@ class OrganizationsService extends Service { Future getTeamMembership(int teamId, String user) { var completer = new Completer(); - _github.getJSON("/teams/${teamId}/memberships/${user}", statusCode: 200, - fail: (http.Response response) { - if (response.statusCode == 404) { - completer.complete(new TeamMembershipState(null)); - } else { - _github.handleStatusCode(response); - } - }, convert: (json) => new TeamMembershipState(json['state'])).then( - completer.complete); + _github + .getJSON("/teams/${teamId}/memberships/${user}", + statusCode: 200, + fail: (http.Response response) { + if (response.statusCode == 404) { + completer.complete(new TeamMembershipState(null)); + } else { + _github.handleStatusCode(response); + } + }, + convert: (json) => new TeamMembershipState(json['state'])) + .then(completer.complete); return completer.future; } diff --git a/lib/src/util.dart b/lib/src/util.dart index d711659c..90179da3 100644 --- a/lib/src/util.dart +++ b/lib/src/util.dart @@ -41,7 +41,7 @@ void putValue(String name, dynamic value, Map map) { //TODO(kevmoo): use regex here. Map parseLinkHeader(String input) { - var out = {}; + var out = {}; var parts = input.split(", "); for (var part in parts) { if (part[0] != "<") { @@ -58,7 +58,7 @@ Map parseLinkHeader(String input) { } List> mapToList(Map input) { - var out = > []; + var out = >[]; for (var key in input.keys) { out.add(new MapEntry(key, input[key])); } @@ -82,7 +82,7 @@ DateTime parseDateTime(String input) { } Map createNonNullMap(Map input) { - var map = {}; + var map = {}; for (var key in input.keys) { if (input[key] != null) { map[key] = input[key]; diff --git a/test/helper/http.dart b/test/helper/http.dart index d5f32203..a8391ef6 100644 --- a/test/helper/http.dart +++ b/test/helper/http.dart @@ -28,7 +28,7 @@ class MockResponse extends http.Response { factory MockResponse.fromAsset(String name) { Map responseData = JSON.decode(asset("responses/${name}.json").readAsStringSync()) - as Map; + as Map; Map headers = responseData['headers'] as Map; dynamic body = responseData['body']; From 47a32cc0248d01e245ac0c8a6bc18c67eddfe320 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Tue, 18 Jul 2017 18:08:27 -0700 Subject: [PATCH 055/496] Rename analysis_options --- .analysis_options => analysis_options.yaml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .analysis_options => analysis_options.yaml (100%) diff --git a/.analysis_options b/analysis_options.yaml similarity index 100% rename from .analysis_options rename to analysis_options.yaml From e43b998c9fe7ce892bc73aca2d5d7b98d9b2c016 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Tue, 18 Jul 2017 18:39:53 -0700 Subject: [PATCH 056/496] Cleanup analysis_options, add lint for unnecessary string squiggles --- analysis_options.yaml | 53 +++++++++++----------- benchmark/harness.dart | 2 +- lib/src/common/activity_service.dart | 22 ++++----- lib/src/common/authorizations_service.dart | 2 +- lib/src/common/explore_service.dart | 6 +-- lib/src/common/gists_service.dart | 20 ++++---- lib/src/common/git_service.dart | 14 +++--- lib/src/common/github.dart | 14 +++--- lib/src/common/issues_service.dart | 39 ++++++++-------- lib/src/common/misc_service.dart | 2 +- lib/src/common/model/explore.dart | 2 +- lib/src/common/model/repos.dart | 6 +-- lib/src/common/orgs_service.dart | 52 ++++++++++----------- lib/src/common/pulls_service.dart | 16 +++---- lib/src/common/repos_service.dart | 43 +++++++++--------- lib/src/common/users_service.dart | 16 +++---- lib/src/common/util/errors.dart | 10 ++-- lib/src/common/util/oauth2.dart | 2 +- lib/src/util.dart | 2 +- test/experiment/error_handling.dart | 6 +-- test/experiment/fancy_numbers.dart | 4 +- test/experiment/limit_pager.dart | 5 +- test/experiment/org_hooks.dart | 2 +- test/git_integration_test.dart | 2 +- test/helper/assets.dart | 2 +- test/helper/expect.dart | 2 +- test/helper/http.dart | 2 +- test/util_test.dart | 4 +- 28 files changed, 174 insertions(+), 178 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index d7841468..ba4f9bee 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -3,47 +3,48 @@ analyzer: linter: rules: - - camel_case_types - - empty_constructor_bodies - always_declare_return_types -# - avoid_as +# - annotate_overrides +# - avoid_as + - avoid_empty_else + - avoid_init_to_null + - avoid_return_types_on_setters + - await_only_futures - camel_case_types -# - constant_identifier_names + - camel_case_types + - close_sinks + - comment_references +# - constant_identifier_names + - control_flow_in_finally + - directives_ordering + - empty_catches - empty_constructor_bodies + - empty_constructor_bodies + - empty_statements + - hash_and_equals - implementation_imports + - iterable_contains_unrelated_type - library_names - library_prefixes + - list_remove_unrelated_type - non_constant_identifier_names - one_member_abstracts - package_api_docs + - package_names - package_prefixed_library_names - prefer_is_not_empty + - prefer_is_not_empty - slash_for_doc_comments + - sort_constructors_first + - sort_unnamed_constructors_first - super_goes_last + - test_types_in_equals + - throw_in_finally + - throw_in_finally - type_annotate_public_apis - type_init_formals -# - unnecessary_brace_in_string_interp + - unawaited_futures + - unnecessary_brace_in_string_interps - unnecessary_getters_setters - - avoid_empty_else - - package_names - unrelated_type_equality_checks - - throw_in_finally - - close_sinks - - comment_references - - control_flow_in_finally - - empty_statements - - hash_and_equals - - iterable_contains_unrelated_type - - list_remove_unrelated_type - - test_types_in_equals - - throw_in_finally - valid_regexps -# - annotate_overrides - - avoid_init_to_null - - avoid_return_types_on_setters - - await_only_futures - - empty_catches - - prefer_is_not_empty - - sort_constructors_first - - sort_unnamed_constructors_first - - unawaited_futures diff --git a/benchmark/harness.dart b/benchmark/harness.dart index def29fb8..13643911 100644 --- a/benchmark/harness.dart +++ b/benchmark/harness.dart @@ -9,7 +9,7 @@ class BenchmarkHelper { int total = result.map((it) => it.elapsedMilliseconds).reduce((a, b) => a + b); num avg = total / result.length; - print(" - ${name}:"); + print(" - $name:"); print(" - Average: ${avg}ms"); print(" - Times:"); diff --git a/lib/src/common/activity_service.dart b/lib/src/common/activity_service.dart index 077acc58..7b28fa2b 100644 --- a/lib/src/common/activity_service.dart +++ b/lib/src/common/activity_service.dart @@ -71,8 +71,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 new PaginationHelper(_github).objects( - "GET", "/orgs/${name}/events", Event.fromJSON, pages: pages) + return new PaginationHelper(_github) + .objects("GET", "/orgs/$name/events", Event.fromJSON, pages: pages) as Stream; } @@ -80,26 +80,26 @@ 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"); + new 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"); + new 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"); + new 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( - "GET", "/users/${username}/events", Event.fromJSON, pages: pages) + "GET", "/users/$username/events", Event.fromJSON, pages: pages) as Stream; } @@ -108,7 +108,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( - "GET", "/users/${username}/events/public", Event.fromJSON, + "GET", "/users/$username/events/public", Event.fromJSON, pages: pages) as Stream; } @@ -116,7 +116,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}"); + new EventPoller(_github, "/users/$user/events/orgs/$organization"); // TODO: Implement listFeeds: https://developer.github.com/v3/activity/feeds/#list-feeds @@ -181,7 +181,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}", + _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 @@ -203,7 +203,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) - .objects("GET", "/users/${user}/starred", Repository.fromJSON) + .objects("GET", "/users/$user/starred", Repository.fromJSON) as Stream; } @@ -259,7 +259,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) - .objects("GET", '/users/${user}/subscriptions', Repository.fromJSON); + .objects("GET", '/users/$user/subscriptions', Repository.fromJSON); } /// Lists the repositories the current user is watching. diff --git a/lib/src/common/authorizations_service.dart b/lib/src/common/authorizations_service.dart index cf6e4eea..21287f6f 100644 --- a/lib/src/common/authorizations_service.dart +++ b/lib/src/common/authorizations_service.dart @@ -23,7 +23,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/explore_service.dart b/lib/src/common/explore_service.dart index fc015b5d..fd6e8a82 100644 --- a/lib/src/common/explore_service.dart +++ b/lib/src/common/explore_service.dart @@ -10,10 +10,10 @@ class ExploreService extends Service { {String language, String since: "daily"}) { var url = "https://github.com/trending"; - if (language != null) url += "?l=${language}"; + if (language != null) url += "?l=$language"; if (since != null) - url += language == null ? "?since=${since}" : "&since=${since}"; + url += language == null ? "?since=$since" : "&since=$since"; var controller = new StreamController(); @@ -71,7 +71,7 @@ class ExploreService extends Service { for (var repo in repos) { var repoTitle = repo.querySelector(".collection-repo-title"); var path = repoTitle.querySelector("a").attributes['href']; - var url = "https://githb.com${path}"; + var url = "https://githb.com$path"; var name = path.substring(1); var item = new ShowcaseItem(); diff --git a/lib/src/common/gists_service.dart b/lib/src/common/gists_service.dart index 213e2484..85a7a3bc 100644 --- a/lib/src/common/gists_service.dart +++ b/lib/src/common/gists_service.dart @@ -12,7 +12,7 @@ class GistsService extends Service { /// API docs: https://developer.github.com/v3/gists/#list-gists Stream listUserGists(String username) { return new PaginationHelper(_github).objects( - "GET", "/users/${username}/gists", Gist.fromJSON) as Stream; + "GET", "/users/$username/gists", Gist.fromJSON) as Stream; } /// Fetches the gists for the currently authenticated user. @@ -43,7 +43,7 @@ class GistsService extends Service { /// 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 @@ -77,7 +77,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; }); } @@ -101,7 +101,7 @@ class GistsService extends Service { map["files"] = f; } - return _github.postJSON("/gists/${id}", + return _github.postJSON("/gists/$id", statusCode: 200, body: JSON.encode(map), convert: Gist.fromJSON) as Future; @@ -113,7 +113,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; }); } @@ -122,7 +122,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; }); } @@ -131,7 +131,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; }); } @@ -141,7 +141,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 - .request("POST", "/gists/${id}/forks", statusCode: 201) + .request("POST", "/gists/$id/forks", statusCode: 201) .then((response) { return Gist.fromJSON(JSON.decode(response.body) as Map); }); @@ -154,7 +154,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) - .objects("GET", "/gists/${gistId}/comments", GistComment.fromJSON) + .objects("GET", "/gists/$gistId/comments", GistComment.fromJSON) as Stream; } @@ -164,7 +164,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) as Future; } diff --git a/lib/src/common/git_service.dart b/lib/src/common/git_service.dart index 0638527c..b5ce2edf 100644 --- a/lib/src/common/git_service.dart +++ b/lib/src/common/git_service.dart @@ -11,7 +11,7 @@ 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. @@ -28,7 +28,7 @@ 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. @@ -47,7 +47,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. @@ -92,7 +92,7 @@ class GitService extends Service { var headers = {'content-length': body.length.toString()}; return _github - .request('PATCH', '/repos/${slug.fullName}/git/refs/${ref}', + .request('PATCH', '/repos/${slug.fullName}/git/refs/$ref', body: body, headers: headers) .then((response) { return GitReference @@ -105,7 +105,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 - .request("DELETE", "/repos/${slug.fullName}/git/refs/${ref}") + .request("DELETE", "/repos/${slug.fullName}/git/refs/$ref") .then((response) => response.statusCode == StatusCodes.NO_CONTENT); } @@ -113,7 +113,7 @@ 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. @@ -133,7 +133,7 @@ class GitService extends Service { /// and https://developer.github.com/v3/git/trees/#get-a-tree-recursively Future getTree(RepositorySlug slug, String sha, {bool recursive: false}) { - var path = '/repos/${slug.fullName}/git/trees/${sha}'; + var path = '/repos/${slug.fullName}/git/trees/$sha'; if (recursive) { path += '?recursive=1'; } diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index 8918c28c..6e90646d 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -228,7 +228,7 @@ class GitHub { } else if (auth.isBasic) { var userAndPass = BASE64.encode(UTF8.encode('${auth.username}:${auth.password}')); - headers.putIfAbsent("Authorization", () => "basic ${userAndPass}"); + headers.putIfAbsent("Authorization", () => "basic $userAndPass"); } var response = await request("GET", path, @@ -286,7 +286,7 @@ class GitHub { } else if (auth.isBasic) { var userAndPass = BASE64.encode(UTF8.encode('${auth.username}:${auth.password}')); - headers.putIfAbsent("Authorization", () => "basic ${userAndPass}"); + headers.putIfAbsent("Authorization", () => "basic $userAndPass"); } var response = await request("POST", path, @@ -326,7 +326,7 @@ class GitHub { case 422: var buff = new StringBuffer(); buff.writeln(); - buff.writeln(" Message: ${message}"); + buff.writeln(" Message: $message"); if (errors != null) { buff.writeln(" Errors:"); for (Map error in errors) { @@ -334,9 +334,9 @@ class GitHub { var field = error['field']; var code = error['code']; buff - ..writeln(" Resource: ${resource}") - ..writeln(" Field ${field}") - ..write(" Code: ${code}"); + ..writeln(" Resource: $resource") + ..writeln(" Field $field") + ..write(" Code: $code"); } } throw new ValidationFailed(this, buff.toString()); @@ -370,7 +370,7 @@ class GitHub { } else if (auth.isBasic) { var userAndPass = BASE64.encode(UTF8.encode('${auth.username}:${auth.password}')); - headers.putIfAbsent("Authorization", () => "basic ${userAndPass}"); + headers.putIfAbsent("Authorization", () => "basic $userAndPass"); } if (method == "PUT" && body == null) { diff --git a/lib/src/common/issues_service.dart b/lib/src/common/issues_service.dart index 26133eb0..f28ed227 100644 --- a/lib/src/common/issues_service.dart +++ b/lib/src/common/issues_service.dart @@ -50,7 +50,7 @@ class IssuesService extends Service { DateTime since, int perPage, List labels}) { - return _listIssues("/orgs/${org}/issues", milestoneNumber, state, direction, + return _listIssues("/orgs/$org/issues", milestoneNumber, state, direction, sort, since, perPage, labels); } @@ -127,7 +127,7 @@ class IssuesService extends Service { /// API docs: https://developer.github.com/v3/issues/#edit-an-issue Future edit(RepositorySlug slug, int issueNumber, IssueRequest issue) { return _github - .request("PATCH", '/repos/${slug.fullName}/issues/${issueNumber}', + .request("PATCH", '/repos/${slug.fullName}/issues/$issueNumber', body: issue.toJSON()) .then((response) { return Issue.fromJSON(JSON.decode(response.body) as Map) @@ -139,7 +139,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}", + _github.getJSON("/repos/${slug.fullName}/issues/$issueNumber", convert: Issue.fromJSON); /// Create an issue. @@ -173,7 +173,7 @@ class IssuesService extends Service { /// API docs: https://developer.github.com/v3/issues/assignees/#check-assignee Future isAssignee(RepositorySlug slug, String repoName) { return _github - .request("GET", "/repos/${slug.fullName}/assignees/${repoName}") + .request("GET", "/repos/${slug.fullName}/assignees/$repoName") .then((response) => response.statusCode == StatusCodes.NO_CONTENT); } @@ -184,7 +184,7 @@ class IssuesService extends Service { RepositorySlug slug, int issueNumber) { return new PaginationHelper(_github).objects( 'GET', - '/repos/${slug.fullName}/issues/${issueNumber}/comments', + '/repos/${slug.fullName}/issues/$issueNumber/comments', IssueComment.fromJSON) as Stream; } @@ -202,7 +202,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 @@ -212,7 +212,7 @@ class IssuesService extends Service { RepositorySlug slug, int issueNumber, String body) { var it = JSON.encode({"body": body}); return _github.postJSON( - '/repos/${slug.fullName}/issues/${issueNumber}/comments', + '/repos/${slug.fullName}/issues/$issueNumber/comments', body: it, convert: IssueComment.fromJSON, statusCode: StatusCodes.CREATED) as Future; @@ -225,7 +225,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 - .request('DELETE', '/repos/${slug.fullName}/issues/comments/${id}') + .request('DELETE', '/repos/${slug.fullName}/issues/comments/$id') .then((response) => response.statusCode == StatusCodes.NO_CONTENT); } @@ -244,7 +244,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. @@ -261,7 +261,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: JSON.encode({"name": name, "color": color}), convert: IssueLabel.fromJSON) as Future; } @@ -270,8 +270,8 @@ 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 = await _github.request( - "DELETE", "/repos/${slug.fullName}/labels/${name}"); + var response = + await _github.request("DELETE", "/repos/${slug.fullName}/labels/$name"); return response.statusCode == StatusCodes.NO_CONTENT; } @@ -282,7 +282,7 @@ class IssuesService extends Service { Stream listLabelsByIssue(RepositorySlug slug, int issueNumber) { return new PaginationHelper(_github).objects( "GET", - "/repos/${slug.fullName}/issues/${issueNumber}/labels", + "/repos/${slug.fullName}/issues/$issueNumber/labels", IssueLabel.fromJSON) as Stream; } @@ -292,7 +292,7 @@ class IssuesService extends Service { Future> addLabelsToIssue( RepositorySlug slug, int issueNumber, List labels) { return _github.postJSON( - "/repos/${slug.fullName}/issues/${issueNumber}/labels", + "/repos/${slug.fullName}/issues/$issueNumber/labels", body: JSON.encode(labels), convert: (input) => input.map((Map it) => IssueLabel.fromJSON(it))) @@ -305,7 +305,7 @@ class IssuesService extends Service { Future> replaceLabelsForIssue( RepositorySlug slug, int issueNumber, List labels) { return _github - .request("PUT", "/repos/${slug.fullName}/issues/${issueNumber}/labels", + .request("PUT", "/repos/${slug.fullName}/issues/$issueNumber/labels", body: JSON.encode(labels)) .then((response) { return JSON @@ -319,8 +319,8 @@ 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("DELETE", - "/repos/${slug.fullName}/issues/${issueNumber}/labels/${label}"); + var response = await _github.request( + "DELETE", "/repos/${slug.fullName}/issues/$issueNumber/labels/$label"); return response.statusCode == StatusCodes.OK; } @@ -330,8 +330,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 - .request( - "DELETE", "/repos/${slug.fullName}/issues/${issueNumber}/labels") + .request("DELETE", "/repos/${slug.fullName}/issues/$issueNumber/labels") .then((response) => response.statusCode == StatusCodes.NO_CONTENT); } @@ -365,7 +364,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 - .request("DELETE", '/repos/${slug.fullName}/milestones/${number}') + .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 fff51156..7aba42fb 100644 --- a/lib/src/common/misc_service.dart +++ b/lib/src/common/misc_service.dart @@ -28,7 +28,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]. diff --git a/lib/src/common/model/explore.dart b/lib/src/common/model/explore.dart index 8fe585a8..fdb3ff70 100644 --- a/lib/src/common/model/explore.dart +++ b/lib/src/common/model/explore.dart @@ -5,7 +5,7 @@ class TrendingRepository { html.Element titleObject; String get title => titleObject.text; - String get url => "https://github.com/${title}"; + String get url => "https://github.com/$title"; String description; } diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart index 45b3cc1a..7381bbe0 100644 --- a/lib/src/common/model/repos.dart +++ b/lib/src/common/model/repos.dart @@ -317,7 +317,7 @@ class RepositorySlug { /// The Full Name of the Repository /// /// Example: owner/name - String get fullName => "${owner}/${name}"; + String get fullName => "$owner/$name"; @override bool operator ==(Object obj) => @@ -327,7 +327,7 @@ class RepositorySlug { int get hashCode => fullName.hashCode; @override - String toString() => "${owner}/${name}"; + String toString() => "$owner/$name"; } /// Model class for a new repository to be created. @@ -448,7 +448,7 @@ class LanguageBreakdown { String toString() { var buffer = new StringBuffer(); _data.forEach((key, value) { - buffer.writeln("${key}: ${value}"); + buffer.writeln("$key: $value"); }); return buffer.toString(); } diff --git a/lib/src/common/orgs_service.dart b/lib/src/common/orgs_service.dart index a2adf86a..88afca3f 100644 --- a/lib/src/common/orgs_service.dart +++ b/lib/src/common/orgs_service.dart @@ -24,7 +24,7 @@ class OrganizationsService extends Service { /// 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) { @@ -70,7 +70,7 @@ class OrganizationsService extends Service { "description": description }); - return _github.postJSON("/orgs/${org}", + return _github.postJSON("/orgs/$org", statusCode: 200, convert: Organization.fromJSON, // TODO: This is probably wrong. Map needs to be json encoded? @@ -81,15 +81,15 @@ class OrganizationsService extends Service { /// /// API docs: https://developer.github.com/v3/orgs/teams/#list-teams Stream listTeams(String orgName) { - return new PaginationHelper(_github).objects( - "GET", "/orgs/${orgName}/teams", Team.fromJSON) as Stream; + return new PaginationHelper(_github) + .objects("GET", "/orgs/$orgName/teams", Team.fromJSON) as Stream; } /// Gets the team specified by the [teamId]. /// /// 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; } @@ -105,7 +105,7 @@ class OrganizationsService extends Service { "permission": permission }); - return _github.postJSON("/orgs/${org}/teams", + return _github.postJSON("/orgs/$org/teams", statusCode: 201, convert: Team.fromJSON, // TODO: This is probably wrong, map needs to be json encoded? @@ -120,7 +120,7 @@ class OrganizationsService extends Service { var map = createNonNullMap( {"name": name, "description": description, "permission": permission}); - return _github.postJSON("/teams/${teamId}", + return _github.postJSON("/teams/$teamId", statusCode: 200, convert: Team.fromJSON, // TODO: This is probably wrong, map needs to be json encoded? @@ -131,7 +131,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; }); } @@ -141,12 +141,12 @@ class OrganizationsService extends Service { /// API docs: https://developer.github.com/v3/orgs/teams/#list-team-members Stream listTeamMembers(int teamId) { return new PaginationHelper(_github) - .objects("GET", "/teams/${teamId}/members", TeamMember.fromJSON) + .objects("GET", "/teams/$teamId/members", TeamMember.fromJSON) as Stream; } 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"]; }); } @@ -157,7 +157,7 @@ class OrganizationsService extends Service { @deprecated Future addTeamMember(int teamId, String user) { return _github - .request("PUT", "/teams/${teamId}/members/${user}") + .request("PUT", "/teams/$teamId/members/$user") .then((response) { return response.statusCode == 204; }); @@ -169,7 +169,7 @@ class OrganizationsService extends Service { @deprecated Future removeMember(int teamId, String user) { return _github - .request("DELETE", "/teams/${teamId}/members/${user}") + .request("DELETE", "/teams/$teamId/members/$user") .then((response) { return response.statusCode == 204; }); @@ -182,7 +182,7 @@ class OrganizationsService extends Service { var completer = new Completer(); _github - .getJSON("/teams/${teamId}/memberships/${user}", + .getJSON("/teams/$teamId/memberships/$user", statusCode: 200, fail: (http.Response response) { if (response.statusCode == 404) { @@ -203,8 +203,8 @@ class OrganizationsService extends Service { Future addTeamMembership(int teamId, String user) { var completer = new Completer(); - _github.request("POST", "/teams/${teamId}/memberships/${user}", - statusCode: 200, fail: (http.Response response) { + _github.request("POST", "/teams/$teamId/memberships/$user", statusCode: 200, + fail: (http.Response response) { if (response.statusCode == 404) { completer.complete(new TeamMembershipState(null)); } else { @@ -222,7 +222,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); } @@ -231,7 +231,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) - .objects("GET", "/teams/${teamId}/repos", Repository.fromJSON) + .objects("GET", "/teams/$teamId/repos", Repository.fromJSON) as Stream; } @@ -240,7 +240,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 - .request("GET", "/teams/${teamId}/repos/${slug.fullName}") + .request("GET", "/teams/$teamId/repos/${slug.fullName}") .then((response) { return response.statusCode == 204; }); @@ -251,7 +251,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 - .request("PUT", "/teams/${teamId}/repos/${slug.fullName}") + .request("PUT", "/teams/$teamId/repos/${slug.fullName}") .then((response) { return response.statusCode == 204; }); @@ -262,7 +262,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 - .request("DELETE", "/teams/${teamId}/repos/${slug.fullName}") + .request("DELETE", "/teams/$teamId/repos/${slug.fullName}") .then((response) { return response.statusCode == 204; }); @@ -280,7 +280,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 new PaginationHelper(_github).objects("GET", "/orgs/$org/hooks", (Map input) => Hook.fromJSON(org, input)) as Stream; } @@ -289,14 +289,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()) as Future; } @@ -308,15 +308,13 @@ class OrganizationsService extends Service { /// API docs: https://developer.github.com/v3/orgs/hooks/#ping-a-hook Future pingHook(String org, int id) { return _github - .request("POST", "/orgs/${org}/hooks/${id}/pings") + .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 a4f40b44..1edd5c87 100644 --- a/lib/src/common/pulls_service.dart +++ b/lib/src/common/pulls_service.dart @@ -17,7 +17,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]. @@ -41,7 +41,7 @@ class PullRequestsService extends Service { putValue("state", state, map); return _github - .request("POST", '/repos/${slug.fullName}/pulls/${number}', + .request("POST", '/repos/${slug.fullName}/pulls/$number', body: JSON.encode(map)) .then((response) { return PullRequest @@ -55,20 +55,20 @@ class PullRequestsService extends Service { Stream listCommits(RepositorySlug slug, int number) { return new PaginationHelper(_github).objects( "GET", - '/repos/${slug.fullName}/pulls/${number}/commits', + '/repos/${slug.fullName}/pulls/$number/commits', RepositoryCommit.fromJSON) as Stream; } Stream listFiles(RepositorySlug slug, int number) { return new PaginationHelper(_github).objects( "GET", - '/repos/${slug.fullName}/pulls/${number}/files', + '/repos/${slug.fullName}/pulls/$number/files', PullRequestFile.fromJSON) as Stream; } Future isMerged(RepositorySlug slug, int number) { return _github - .request("GET", "/repos/${slug.fullName}/pulls/${number}/merge") + .request("GET", "/repos/${slug.fullName}/pulls/$number/merge") .then((response) { return response.statusCode == 204; }); @@ -86,7 +86,7 @@ class PullRequestsService extends Service { } return _github - .request("PUT", "/repos/${slug.fullName}/pulls/${number}/merge", + .request("PUT", "/repos/${slug.fullName}/pulls/$number/merge", body: JSON.encode(json)) .then((response) { return PullRequestMerge @@ -101,7 +101,7 @@ class PullRequestsService extends Service { RepositorySlug slug, int number) { return new PaginationHelper(_github).objects( "GET", - "/repos/${slug.fullName}/pulls/${number}/comments", + "/repos/${slug.fullName}/pulls/$number/comments", PullRequestComment.fromJSON) as Stream; } @@ -120,7 +120,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 5df78f71..4d555beb 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -31,7 +31,7 @@ class RepositoriesService extends Service { var params = {"type": type, "sort": sort, "direction": direction}; return new PaginationHelper(_github).objects( - "GET", "/users/${user}/repos", Repository.fromJSON, params: params) + "GET", "/users/$user/repos", Repository.fromJSON, params: params) as Stream; } @@ -45,7 +45,7 @@ class RepositoriesService extends Service { }; return new PaginationHelper(_github).objects( - "GET", "/orgs/${org}/repos", Repository.fromJSON, params: params) + "GET", "/orgs/$org/repos", Repository.fromJSON, params: params) as Stream; } @@ -82,7 +82,7 @@ class RepositoriesService extends Service { Future createRepository(CreateRepository repository, {String org}) { if (org != null) { - return _github.postJSON('/orgs/${org}/repos', + return _github.postJSON('/orgs/$org/repos', body: repository.toJSON(), convert: TeamRepository.fromJSON) as Future; } else { @@ -208,7 +208,7 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/#get-branch Future getBranch(RepositorySlug slug, String branch) => - _github.getJSON("/repos/${slug.fullName}/branches/${branch}", + _github.getJSON("/repos/${slug.fullName}/branches/$branch", convert: Branch.fromJSON); /// Lists the users that have access to the repository identified by [slug]. @@ -222,7 +222,7 @@ class RepositoriesService extends Service { Future isCollaborator(RepositorySlug slug, String user) { return _github - .request("GET", "/repos/${slug.fullName}/collaborators/${user}") + .request("GET", "/repos/${slug.fullName}/collaborators/$user") .then((response) { return response.statusCode == 204; }); @@ -230,7 +230,7 @@ class RepositoriesService extends Service { Future addCollaborator(RepositorySlug slug, String user) { return _github - .request("PUT", "/repos/${slug.fullName}/collaborators/${user}") + .request("PUT", "/repos/${slug.fullName}/collaborators/$user") .then((response) { return response.statusCode == 204; }); @@ -238,7 +238,7 @@ class RepositoriesService extends Service { Future removeCollaborator(RepositorySlug slug, String user) { return _github - .request("DELETE", "/repos/${slug.fullName}/collaborators/${user}") + .request("DELETE", "/repos/${slug.fullName}/collaborators/$user") .then((response) { return response.statusCode == 204; }); @@ -264,7 +264,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}", + _github.getJSON("/repos/${slug.fullName}/commits/$sha", convert: RepositoryCommit.fromJSON); /// [refBase] and [refHead] can be the same value for a branch, commit, or ref @@ -273,7 +273,7 @@ class RepositoriesService extends Service { /// 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}", + _github.getJSON("/repos/${slug.fullName}/compare/$refBase...$refHead", convert: (j) => new GitHubComparison.fromJson(j)); /// Fetches the readme file for a repository. @@ -320,7 +320,7 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/contents/#get-contents Future getContents(RepositorySlug slug, String path, {String ref}) { - String url = "/repos/${slug.fullName}/contents/${path}"; + String url = "/repos/${slug.fullName}/contents/$path"; if (ref != null) { url += '?ref=$ref'; @@ -368,7 +368,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.postJSON("/repos/${slug.fullName}/contents/$path", // TODO: map probably needs to be json encoded body: map, statusCode: 200, @@ -384,7 +384,7 @@ class RepositoriesService extends Service { createNonNullMap({"message": message, "sha": sha, "branch": branch}); return _github - .request("DELETE", "/repos/${slug.fullName}/contents/${path}", + .request("DELETE", "/repos/${slug.fullName}/contents/$path", body: JSON.encode(map), statusCode: 200) .then((response) { return ContentCreation @@ -398,8 +398,7 @@ 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"]; }); @@ -439,7 +438,7 @@ class RepositoriesService extends Service { /// /// 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}", + _github.getJSON("/repos/${slug.fullName}/hooks/$id", convert: (Map i) => Hook.fromJSON(slug.fullName, i)); /// Creates a repository hook based on the specified [hook]. @@ -458,7 +457,7 @@ class RepositoriesService extends Service { /// 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") + .request("POST", "/repos/${slug.fullName}/hooks/$id/tests") .then((response) => response.statusCode == 204); } @@ -467,13 +466,13 @@ class RepositoriesService extends Service { /// 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") + .request("POST", "/repos/${slug.fullName}/hooks/$id/pings") .then((response) => response.statusCode == 204); } Future deleteHook(RepositorySlug slug, int id) { return _github - .request("DELETE", "/repos/${slug.fullName}/hooks/${id}") + .request("DELETE", "/repos/${slug.fullName}/hooks/$id") .then((response) { return response.statusCode == 204; }); @@ -536,7 +535,7 @@ class RepositoriesService extends Service { /// /// 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}", + _github.getJSON("/repos/${slug.fullName}/releases/$id", convert: Release.fromJSON); /// Creates a Release based on the specified [release]. @@ -626,7 +625,7 @@ class RepositoriesService extends Service { Stream listStatuses(RepositorySlug slug, String ref) { return new PaginationHelper(_github).objects( "GET", - "/repos/${slug.fullName}/commits/${ref}/statuses", + "/repos/${slug.fullName}/commits/$ref/statuses", RepositoryStatus.fromJSON) as Stream; } @@ -636,7 +635,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) { - return _github.postJSON("/repos/${slug.fullName}/statuses/${ref}", + return _github.postJSON("/repos/${slug.fullName}/statuses/$ref", body: request.toJSON(), convert: RepositoryStatus.fromJSON) as Future; } @@ -646,6 +645,6 @@ 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) => - _github.getJSON("/repos/${slug.fullName}/commits/${ref}/status", + _github.getJSON("/repos/${slug.fullName}/commits/$ref/status", convert: CombinedRepositoryStatus.fromJSON, statusCode: 200); } diff --git a/lib/src/common/users_service.dart b/lib/src/common/users_service.dart index 34646066..a204bf7e 100644 --- a/lib/src/common/users_service.dart +++ b/lib/src/common/users_service.dart @@ -11,7 +11,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. /// @@ -75,7 +75,7 @@ class UsersService extends Service { /// Checks if a user exists. Future isUser(String name) => _github - .request("GET", "/users/${name}") + .request("GET", "/users/$name") .then((resp) => resp.statusCode == StatusCodes.OK); // TODO: Implement editUser: https://developer.github.com/v3/users/#update-the-authenticated-user @@ -113,25 +113,25 @@ class UsersService extends Service { /// /// API docs: https://developer.github.com/v3/users/followers/#list-followers-of-a-user Stream listUserFollowers(String user) => new PaginationHelper(_github) - .objects("GET", "/users/${user}/followers", User.fromJSON, + .objects("GET", "/users/$user/followers", User.fromJSON, statusCode: 200) as Stream; /// 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 - .request("POST", "/user/following/${user}", statusCode: 204) + .request("POST", "/user/following/$user", statusCode: 204) .then((response) { return response.statusCode == 204; }); @@ -140,7 +140,7 @@ class UsersService extends Service { /// Unfollows a user. Future unfollowUser(String user) { return _github - .request("DELETE", "/user/following/${user}", statusCode: 204) + .request("DELETE", "/user/following/$user", statusCode: 204) .then((response) { return response.statusCode == 204; }); @@ -159,7 +159,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"; + var path = userLogin == null ? "/user/keys" : "/users/$userLogin/keys"; return new PaginationHelper(_github) .objects("GET", path, PublicKey.fromJSON) as Stream; } diff --git a/lib/src/common/util/errors.dart b/lib/src/common/util/errors.dart index 29983caf..fcad2baf 100644 --- a/lib/src/common/util/errors.dart +++ b/lib/src/common/util/errors.dart @@ -10,7 +10,7 @@ class GitHubError implements Exception { GitHubError(this.github, this.message, {this.apiUrl, this.source}); @override - String toString() => "GitHub Error: ${message}"; + String toString() => "GitHub Error: $message"; } /// GitHub Entity was not found @@ -25,24 +25,24 @@ class BadRequest extends GitHubError { /// GitHub Repository was not found class RepositoryNotFound extends NotFound { RepositoryNotFound(GitHub github, String repo) - : super(github, "Repository Not Found: ${repo}"); + : super(github, "Repository Not Found: $repo"); } /// GitHub User was not found class UserNotFound extends NotFound { UserNotFound(GitHub github, String user) - : super(github, "User Not Found: ${user}"); + : super(github, "User Not Found: $user"); } /// GitHub Organization was not found class OrganizationNotFound extends NotFound { OrganizationNotFound(GitHub github, String organization) - : super(github, "Organization Not Found: ${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}"); + TeamNotFound(GitHub github, int id) : super(github, "Team Not Found: $id"); } /// Access was forbidden to a resource diff --git a/lib/src/common/util/oauth2.dart b/lib/src/common/util/oauth2.dart index 3ed2b6db..fe4f1b8c 100644 --- a/lib/src/common/util/oauth2.dart +++ b/lib/src/common/util/oauth2.dart @@ -80,7 +80,7 @@ class OAuth2Flow { }); return (github == null ? new http.Client() : github.client) - .post("${baseUrl}/access_token", body: body, headers: headers) + .post("$baseUrl/access_token", body: body, headers: headers) .then((response) { var json = JSON.decode(response.body) as Map; if (json['error'] != null) { diff --git a/lib/src/util.dart b/lib/src/util.dart index 90179da3..5fc09f13 100644 --- a/lib/src/util.dart +++ b/lib/src/util.dart @@ -13,7 +13,7 @@ String buildQueryString(Map params) { if (params[key] == null) { continue; } - queryString.write("${key}=${Uri.encodeComponent(params[key].toString())}"); + queryString.write("$key=${Uri.encodeComponent(params[key].toString())}"); if (i != params.keys.length) { queryString.write("&"); } diff --git a/test/experiment/error_handling.dart b/test/experiment/error_handling.dart index cc58cb3c..943cc0ef 100644 --- a/test/experiment/error_handling.dart +++ b/test/experiment/error_handling.dart @@ -1,10 +1,10 @@ +import 'dart:convert'; +import 'dart:io'; + import 'package:github/server.dart'; import '../helper.dart'; -import 'dart:io'; -import 'dart:convert'; - void main() { var github = createGitHubClient(); var response = new MockResponse( diff --git a/test/experiment/fancy_numbers.dart b/test/experiment/fancy_numbers.dart index f7d5bee8..5bfd8db8 100644 --- a/test/experiment/fancy_numbers.dart +++ b/test/experiment/fancy_numbers.dart @@ -13,8 +13,8 @@ void main() { void test(String input, int expect) { var out = parseFancyNumber(input); if (out != expect) { - print("ERROR: ${input} was parsed as ${out} but we expected ${expect}"); + print("ERROR: $input was parsed as $out but we expected $expect"); } else { - print("${input} => ${expect}"); + print("$input => $expect"); } } diff --git a/test/experiment/limit_pager.dart b/test/experiment/limit_pager.dart index c0f983d7..b6cfb375 100755 --- a/test/experiment/limit_pager.dart +++ b/test/experiment/limit_pager.dart @@ -11,7 +11,7 @@ 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 new RangeError("limit cannot be less than zero (was $limit)"); } if (limit < MAX_PER_PAGE) { @@ -37,6 +37,5 @@ class PaginationInformation { PaginationInformation(this.limit, this.pages, this.itemsPerPage); @override - String toString() => - "limit: ${limit}, pages: ${pages}, per page: ${itemsPerPage}"; + String toString() => "limit: $limit, pages: $pages, per page: $itemsPerPage"; } diff --git a/test/experiment/org_hooks.dart b/test/experiment/org_hooks.dart index 5c85638b..79959430 100644 --- a/test/experiment/org_hooks.dart +++ b/test/experiment/org_hooks.dart @@ -1,5 +1,5 @@ -import "../helper.dart"; import 'dart:async'; +import "../helper.dart"; Future main() async { var org = "IOT-DSA"; diff --git a/test/git_integration_test.dart b/test/git_integration_test.dart index 7c9913b3..9caba301 100644 --- a/test/git_integration_test.dart +++ b/test/git_integration_test.dart @@ -53,7 +53,7 @@ void main() { expect( fetchedBlob.url, equals( - 'https://api.github.com/repos/${slug.fullName}/git/blobs/${createdBlobSha}')); + 'https://api.github.com/repos/${slug.fullName}/git/blobs/$createdBlobSha')); expect(fetchedBlob.sha, equals(createdBlobSha)); expect(fetchedBlob.size, equals(3)); }); diff --git a/test/helper/assets.dart b/test/helper/assets.dart index bc28aee2..d2e4b9b8 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) => new File("test/assets/$id"); diff --git a/test/helper/expect.dart b/test/helper/expect.dart index 4fc21f07..ff1ac3f1 100644 --- a/test/helper/expect.dart +++ b/test/helper/expect.dart @@ -1,5 +1,5 @@ part of github.test.helper; void expectSlug(RepositorySlug slug, String user, String repo) { - expect(slug.fullName, equals("${user}/${repo}")); + expect(slug.fullName, equals("$user/$repo")); } diff --git a/test/helper/http.dart b/test/helper/http.dart index a8391ef6..d8668ede 100644 --- a/test/helper/http.dart +++ b/test/helper/http.dart @@ -27,7 +27,7 @@ class MockResponse extends http.Response { factory MockResponse.fromAsset(String name) { Map responseData = - JSON.decode(asset("responses/${name}.json").readAsStringSync()) + JSON.decode(asset("responses/$name.json").readAsStringSync()) as Map; Map headers = responseData['headers'] as Map; diff --git a/test/util_test.dart b/test/util_test.dart index 0671262d..a41eb39e 100644 --- a/test/util_test.dart +++ b/test/util_test.dart @@ -1,10 +1,10 @@ library github.test.util_test; -import "helper.dart"; - import "package:github/src/common.dart"; import "package:test/test.dart"; +import "helper.dart"; + void main() { group("slugFromAPIUrl()", () { test("https://api.github.com/repos/DirectMyFile/irc.dart slug is correct", From 0d90222d3a1d519b28c433bf75c87943e752b374 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Tue, 18 Jul 2017 19:05:47 -0700 Subject: [PATCH 057/496] More generic method fun --- lib/src/common/activity_service.dart | 48 +++++++---------- lib/src/common/authorizations_service.dart | 3 +- lib/src/common/gists_service.dart | 15 +++--- lib/src/common/git_service.dart | 2 +- lib/src/common/issues_service.dart | 24 ++++----- lib/src/common/orgs_service.dart | 19 +++---- lib/src/common/pulls_service.dart | 12 ++--- lib/src/common/repos_service.dart | 61 +++++++++------------- lib/src/common/users_service.dart | 14 +++-- lib/src/common/util/pagination.dart | 4 +- 10 files changed, 84 insertions(+), 118 deletions(-) diff --git a/lib/src/common/activity_service.dart b/lib/src/common/activity_service.dart index 7b28fa2b..4e0d029e 100644 --- a/lib/src/common/activity_service.dart +++ b/lib/src/common/activity_service.dart @@ -12,8 +12,7 @@ class ActivityService extends Service { /// API docs: https://developer.github.com/v3/activity/events/#list-public-events Stream listPublicEvents({int pages: 2}) { return new PaginationHelper(_github) - .objects("GET", "/events", Event.fromJSON, pages: pages) - as Stream; + .objects("GET", "/events", Event.fromJSON, pages: pages); } /// Lists public events for a network of repositories. @@ -23,7 +22,7 @@ class ActivityService extends Service { {int pages: 2}) { return new PaginationHelper(_github).objects( "GET", "/networks/${slug.fullName}/events", Event.fromJSON, - pages: pages) as Stream; + pages: pages); } /// Returns an [EventPoller] for repository network events. @@ -44,7 +43,7 @@ class ActivityService extends Service { Stream listRepositoryIssueEvents(RepositorySlug slug, {int pages}) { return new PaginationHelper(_github).objects( "GET", "/repos/${slug.fullName}/issues/events", Event.fromJSON, - pages: pages) as Stream; + pages: pages); } /// Returns an [EventPoller] for public events. @@ -58,7 +57,7 @@ class ActivityService extends Service { Stream listRepositoryEvents(RepositorySlug slug, {int pages}) { return new PaginationHelper(_github).objects( "GET", "/repos/${slug.fullName}/events", Event.fromJSON, - pages: pages) as Stream; + pages: pages); } /// Returns an [EventPoller] for repository events. @@ -72,8 +71,7 @@ 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 new PaginationHelper(_github) - .objects("GET", "/orgs/$name/events", Event.fromJSON, pages: pages) - as Stream; + .objects("GET", "/orgs/$name/events", Event.fromJSON, pages: pages); } /// Returns an [EventPoller] for public events for an organization. @@ -99,8 +97,8 @@ 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 new PaginationHelper(_github).objects( - "GET", "/users/$username/events", Event.fromJSON, pages: pages) - as Stream; + "GET", "/users/$username/events", Event.fromJSON, + pages: pages); } /// Lists the public events performed by a user. @@ -109,7 +107,7 @@ class ActivityService extends Service { Stream listPublicEventsPerformedByUser(String username, {int pages}) { return new PaginationHelper(_github).objects( "GET", "/users/$username/events/public", Event.fromJSON, - pages: pages) as Stream; + pages: pages); } /// Returns an [EventPoller] for the user's organization dashboard. @@ -126,9 +124,8 @@ class ActivityService extends Service { Stream listNotifications( {bool all: false, bool participating: false}) { return new PaginationHelper(_github).objects( - "GET", '/notifications', Notification.fromJSON, - params: {"all": all, "participating": participating}) - as Stream; + "GET", '/notifications', Notification.fromJSON, + params: {"all": all, "participating": participating}); } /// Lists all notifications for a given repository. @@ -136,12 +133,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 new PaginationHelper(_github).objects( - "GET", - '/repos/${repository.fullName}/notifications', - Notification.fromJSON, - params: {"all": all, "participating": participating}) - as Stream; + return new PaginationHelper(_github).objects("GET", + '/repos/${repository.fullName}/notifications', Notification.fromJSON, + params: {"all": all, "participating": participating}); } /// Marks all notifications up to [lastRead] as read. @@ -194,8 +188,7 @@ class ActivityService extends Service { /// API docs: https://developer.github.com/v3/activity/starring/#list-stargazers Stream listStargazers(RepositorySlug slug) { return new PaginationHelper(_github) - .objects("GET", "/repos/${slug.fullName}/stargazers", User.fromJSON) - as Stream; + .objects("GET", "/repos/${slug.fullName}/stargazers", User.fromJSON); } /// Lists all the repos starred by a user. @@ -203,16 +196,15 @@ 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) - .objects("GET", "/users/$user/starred", Repository.fromJSON) - as Stream; + .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 new PaginationHelper(_github).objects( - "GET", "/user/starred", Repository.fromJSON) as Stream; + return new PaginationHelper(_github) + .objects("GET", "/user/starred", Repository.fromJSON); } /// Checks if the currently authenticated user has starred the specified repository. @@ -250,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 new PaginationHelper(_github) .objects("GET", "/repos/${slug.fullName}/subscribers", User.fromJSON); } @@ -258,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 new PaginationHelper(_github) .objects("GET", '/users/$user/subscriptions', Repository.fromJSON); } @@ -266,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 new PaginationHelper(_github) .objects("GET", '/user/subscriptions', Repository.fromJSON); } diff --git a/lib/src/common/authorizations_service.dart b/lib/src/common/authorizations_service.dart index 21287f6f..32f9e940 100644 --- a/lib/src/common/authorizations_service.dart +++ b/lib/src/common/authorizations_service.dart @@ -15,8 +15,7 @@ class AuthorizationsService extends Service { /// API docs: https://developer.github.com/v3/oauth_authorizations/#list-your-authorizations Stream listAuthorizations() { return new PaginationHelper(_github) - .objects("GET", "/authorizations", Authorization.fromJSON) - as Stream; + .objects("GET", "/authorizations", Authorization.fromJSON); } /// Fetches an authorization specified by [id]. diff --git a/lib/src/common/gists_service.dart b/lib/src/common/gists_service.dart index 85a7a3bc..ba74a843 100644 --- a/lib/src/common/gists_service.dart +++ b/lib/src/common/gists_service.dart @@ -11,8 +11,8 @@ class GistsService extends Service { /// /// API docs: https://developer.github.com/v3/gists/#list-gists Stream listUserGists(String username) { - return new PaginationHelper(_github).objects( - "GET", "/users/$username/gists", Gist.fromJSON) as Stream; + return new PaginationHelper(_github) + .objects("GET", "/users/$username/gists", Gist.fromJSON); } /// Fetches the gists for the currently authenticated user. @@ -20,8 +20,8 @@ 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) - as Stream; + return new PaginationHelper(_github) + .objects("GET", "/gists", Gist.fromJSON); } /// Fetches the currently authenticated user's public gists. @@ -29,7 +29,7 @@ class GistsService extends Service { /// API docs: https://developer.github.com/v3/gists/#list-gists Stream listCurrentUserPublicGists() { return new PaginationHelper(_github) - .objects("GET", "/gists/public", Gist.fromJSON) as Stream; + .objects("GET", "/gists/public", Gist.fromJSON); } /// Fetches the currently authenticated user's starred gists. @@ -37,7 +37,7 @@ class GistsService extends Service { /// API docs: https://developer.github.com/v3/gists/#list-gists Stream listCurrentUserStarredGists() { return new PaginationHelper(_github) - .objects("GET", "/gists/starred", Gist.fromJSON) as Stream; + .objects("GET", "/gists/starred", Gist.fromJSON); } /// Fetches a Gist by the specified [id]. @@ -154,8 +154,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) - .objects("GET", "/gists/$gistId/comments", GistComment.fromJSON) - as Stream; + .objects("GET", "/gists/$gistId/comments", GistComment.fromJSON); } // 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 b5ce2edf..b71c7ed4 100644 --- a/lib/src/common/git_service.dart +++ b/lib/src/common/git_service.dart @@ -64,7 +64,7 @@ class GitService extends Service { } return new PaginationHelper(_github) - .objects('GET', path, GitReference.fromJSON) as Stream; + .objects('GET', path, GitReference.fromJSON); } /// Creates a new reference in a repository. diff --git a/lib/src/common/issues_service.dart b/lib/src/common/issues_service.dart index f28ed227..d2458356 100644 --- a/lib/src/common/issues_service.dart +++ b/lib/src/common/issues_service.dart @@ -118,8 +118,7 @@ class IssuesService extends Service { } return new PaginationHelper(_github) - .objects("GET", pathSegment, Issue.fromJSON, params: params) - as Stream; + .objects("GET", pathSegment, Issue.fromJSON, params: params); } /// Edit an issue. @@ -164,8 +163,7 @@ class IssuesService extends Service { /// API docs: https://developer.github.com/v3/issues/assignees/#list-assignees Stream listAssignees(RepositorySlug slug) { return new PaginationHelper(_github) - .objects("GET", "/repos/${slug.fullName}/assignees", User.fromJSON) - as Stream; + .objects("GET", "/repos/${slug.fullName}/assignees", User.fromJSON); } /// Checks if a user is an assignee for the specified repository. @@ -185,17 +183,15 @@ class IssuesService extends Service { return new PaginationHelper(_github).objects( 'GET', '/repos/${slug.fullName}/issues/$issueNumber/comments', - IssueComment.fromJSON) as Stream; + 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 new PaginationHelper(_github).objects( - 'GET', - '/repos/${slug.fullName}/issues/comments', - IssueComment.fromJSON) as Stream; + return new PaginationHelper(_github).objects('GET', + '/repos/${slug.fullName}/issues/comments', IssueComment.fromJSON); } /// Fetches the specified issue comment. @@ -235,9 +231,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 new PaginationHelper(_github).objects( - "GET", "/repos/${slug.fullName}/labels", IssueLabel.fromJSON) - as Stream; + return new PaginationHelper(_github) + .objects("GET", "/repos/${slug.fullName}/labels", IssueLabel.fromJSON); } /// Fetches a single label. @@ -283,7 +278,7 @@ class IssuesService extends Service { return new PaginationHelper(_github).objects( "GET", "/repos/${slug.fullName}/issues/$issueNumber/labels", - IssueLabel.fromJSON) as Stream; + IssueLabel.fromJSON); } /// Adds labels to an issue. @@ -341,8 +336,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( - "GET", "/repos/${slug.fullName}/milestones", Milestone.fromJSON) - as Stream; + "GET", "/repos/${slug.fullName}/milestones", Milestone.fromJSON); } // TODO: Implement getMilestone: https://developer.github.com/v3/issues/milestones/#get-a-single-milestone diff --git a/lib/src/common/orgs_service.dart b/lib/src/common/orgs_service.dart index 88afca3f..6eefeea2 100644 --- a/lib/src/common/orgs_service.dart +++ b/lib/src/common/orgs_service.dart @@ -17,8 +17,8 @@ class OrganizationsService extends Service { if (userName == null) { requestPath = "/user/orgs"; } - return new PaginationHelper(_github).objects( - "GET", requestPath, Organization.fromJSON) as Stream; + return new PaginationHelper(_github) + .objects("GET", requestPath, Organization.fromJSON); } /// Fetches the organization specified by [name]. @@ -74,7 +74,7 @@ class OrganizationsService extends Service { statusCode: 200, convert: Organization.fromJSON, // TODO: This is probably wrong. Map needs to be json encoded? - body: map) as Future; + body: map); } /// Lists all of the teams for the specified organization. @@ -82,7 +82,7 @@ class OrganizationsService extends Service { /// API docs: https://developer.github.com/v3/orgs/teams/#list-teams Stream listTeams(String orgName) { return new PaginationHelper(_github) - .objects("GET", "/orgs/$orgName/teams", Team.fromJSON) as Stream; + .objects("GET", "/orgs/$orgName/teams", Team.fromJSON); } /// Gets the team specified by the [teamId]. @@ -141,8 +141,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) - .objects("GET", "/teams/$teamId/members", TeamMember.fromJSON) - as Stream; + .objects("GET", "/teams/$teamId/members", TeamMember.fromJSON); } Future getTeamMemberStatus(int teamId, String user) { @@ -231,8 +230,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) - .objects("GET", "/teams/$teamId/repos", Repository.fromJSON) - as Stream; + .objects("GET", "/teams/$teamId/repos", Repository.fromJSON); } /// Checks if a team manages the specified repository. @@ -273,7 +271,7 @@ class OrganizationsService extends Service { /// API docs: https://developer.github.com/v3/orgs/teams/#list-user-teams Stream listUserTeams() { return new PaginationHelper(_github) - .objects("GET", "/user/teams", Team.fromJSON) as Stream; + .objects("GET", "/user/teams", Team.fromJSON); } /// Lists the hooks for the specified organization. @@ -281,8 +279,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", - (Map input) => Hook.fromJSON(org, input)) - as Stream; + (Map input) => Hook.fromJSON(org, input)); } /// Fetches a single hook by [id]. diff --git a/lib/src/common/pulls_service.dart b/lib/src/common/pulls_service.dart index 1edd5c87..7f0647ff 100644 --- a/lib/src/common/pulls_service.dart +++ b/lib/src/common/pulls_service.dart @@ -10,7 +10,7 @@ class PullRequestsService extends Service { Stream list(RepositorySlug slug, {int pages}) { return new PaginationHelper(_github).objects( "GET", "/repos/${slug.fullName}/pulls", PullRequest.fromJSON, - pages: pages) as Stream; + pages: pages); } /// Fetches a single pull request. @@ -56,7 +56,7 @@ class PullRequestsService extends Service { return new PaginationHelper(_github).objects( "GET", '/repos/${slug.fullName}/pulls/$number/commits', - RepositoryCommit.fromJSON) as Stream; + RepositoryCommit.fromJSON); } Stream listFiles(RepositorySlug slug, int number) { @@ -102,17 +102,15 @@ class PullRequestsService extends Service { return new PaginationHelper(_github).objects( "GET", "/repos/${slug.fullName}/pulls/$number/comments", - PullRequestComment.fromJSON) as Stream; + 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 new PaginationHelper(_github).objects( - "GET", - "/repos/${slug.fullName}/pulls/comments", - PullRequestComment.fromJSON) as Stream; + return new PaginationHelper(_github).objects("GET", + "/repos/${slug.fullName}/pulls/comments", PullRequestComment.fromJSON); } /// Creates a new pull request comment. diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 4d555beb..edfbd801 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -17,8 +17,7 @@ class RepositoriesService extends Service { var params = {"type": type, "sort": sort, "direction": direction}; return new PaginationHelper(_github) - .objects("GET", "/user/repos", Repository.fromJSON, params: params) - as Stream; + .objects("GET", "/user/repos", Repository.fromJSON, params: params); } /// Lists the repositories of the user specified by [user] in a streamed fashion. @@ -31,8 +30,8 @@ class RepositoriesService extends Service { var params = {"type": type, "sort": sort, "direction": direction}; return new PaginationHelper(_github).objects( - "GET", "/users/$user/repos", Repository.fromJSON, params: params) - as Stream; + "GET", "/users/$user/repos", Repository.fromJSON, + params: params); } /// List repositories for the specified [org]. @@ -45,8 +44,8 @@ class RepositoriesService extends Service { }; return new PaginationHelper(_github).objects( - "GET", "/orgs/$org/repos", Repository.fromJSON, params: params) - as Stream; + "GET", "/orgs/$org/repos", Repository.fromJSON, + params: params); } /// Lists all the public repositories on GitHub, in the order that they were @@ -174,8 +173,8 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/#list-teams Stream listTeams(RepositorySlug slug) { - return new PaginationHelper(_github).objects( - 'GET', '/repos/${slug.fullName}/teams', Team.fromJSON) as Stream; + return new PaginationHelper(_github) + .objects('GET', '/repos/${slug.fullName}/teams', Team.fromJSON); } /// Gets a language breakdown for the specified repository. @@ -191,8 +190,7 @@ class RepositoriesService extends Service { /// 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)) - as Stream; + 'GET', '/repos/${slug.fullName}/tags', (j) => new Tag.fromJson(j)); } /// Lists the branches of the specified repository. @@ -200,8 +198,7 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/#list-branches Stream listBranches(RepositorySlug slug) { return new PaginationHelper(_github) - .objects('GET', '/repos/${slug.fullName}/branches', Branch.fromJSON) - as Stream; + .objects('GET', '/repos/${slug.fullName}/branches', Branch.fromJSON); } /// Fetches the specified branch. @@ -215,9 +212,8 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/collaborators/#list Stream listCollaborators(RepositorySlug slug) { - return new PaginationHelper(_github).objects( - "GET", "/repos/${slug.fullName}/collaborators", User.fromJSON) - as Stream; + return new PaginationHelper(_github) + .objects("GET", "/repos/${slug.fullName}/collaborators", User.fromJSON); } Future isCollaborator(RepositorySlug slug, String user) { @@ -256,8 +252,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( - "GET", "/repos/${slug.fullName}/commits", RepositoryCommit.fromJSON) - as Stream; + "GET", "/repos/${slug.fullName}/commits", RepositoryCommit.fromJSON); } /// Fetches the specified commit. @@ -408,9 +403,8 @@ class RepositoriesService extends Service { /// /// API docs: https://developer.github.com/v3/repos/forks/#list-forks Stream listForks(RepositorySlug slug) { - return new PaginationHelper(_github).objects( - "GET", "/repos/${slug.fullName}/forks", Repository.fromJSON) - as Stream; + return new PaginationHelper(_github) + .objects("GET", "/repos/${slug.fullName}/forks", Repository.fromJSON); } /// Creates a fork for the authenticated user. @@ -428,10 +422,9 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/hooks/#list-hooks Stream listHooks(RepositorySlug slug) { return new PaginationHelper(_github).objects( - "GET", - "/repos/${slug.fullName}/hooks", - (Map input) => Hook.fromJSON(slug.fullName, input)) - as Stream; + "GET", + "/repos/${slug.fullName}/hooks", + (Map input) => Hook.fromJSON(slug.fullName, input)); } /// Fetches a single hook by [id]. @@ -485,8 +478,7 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/keys/#list Stream listDeployKeys(RepositorySlug slug) { return new PaginationHelper(_github) - .objects("GET", "/repos/${slug.fullName}/keys", PublicKey.fromJSON) - as Stream; + .objects("GET", "/repos/${slug.fullName}/keys", PublicKey.fromJSON); } // TODO: Implement getDeployKey: https://developer.github.com/v3/repos/keys/#get @@ -526,9 +518,8 @@ 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).objects( - "GET", "/repos/${slug.fullName}/releases", Release.fromJSON) - as Stream; + return new PaginationHelper(_github) + .objects("GET", "/repos/${slug.fullName}/releases", Release.fromJSON); } /// Fetches a single release. @@ -588,7 +579,7 @@ class RepositoriesService extends Service { return new PaginationHelper(_github).objects( "GET", "/repos/${slug.fullName}/stats/commit_activity", - YearCommitCountWeek.fromJSON) as Stream; + YearCommitCountWeek.fromJSON); } /// Fetches weekly addition and deletion counts. @@ -598,7 +589,7 @@ class RepositoriesService extends Service { return new PaginationHelper(_github).objects( "GET", "/repos/${slug.fullName}/stats/code_frequency", - WeeklyChangesCount.fromJSON) as Stream; + WeeklyChangesCount.fromJSON); } /// Fetches Participation Breakdowns. @@ -612,10 +603,8 @@ 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", - "/repos/${slug.fullName}/stats/punchcard", - PunchcardEntry.fromJSON) as Stream; + return new PaginationHelper(_github).objects("GET", + "/repos/${slug.fullName}/stats/punchcard", PunchcardEntry.fromJSON); } /// Lists the statuses of a repository at the specified reference. @@ -626,7 +615,7 @@ class RepositoriesService extends Service { return new PaginationHelper(_github).objects( "GET", "/repos/${slug.fullName}/commits/$ref/statuses", - RepositoryStatus.fromJSON) as Stream; + RepositoryStatus.fromJSON); } /// Creates a new status for a repository at the specified reference. diff --git a/lib/src/common/users_service.dart b/lib/src/common/users_service.dart index a204bf7e..b9f21d81 100644 --- a/lib/src/common/users_service.dart +++ b/lib/src/common/users_service.dart @@ -85,13 +85,13 @@ 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, - pages: pages, params: {"since": since}) as Stream; + 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) - .objects("GET", "/user/emails", UserEmail.fromJSON) as Stream; + .objects("GET", "/user/emails", UserEmail.fromJSON); /// Add Emails /// @@ -99,7 +99,7 @@ class UsersService extends Service { Stream addEmails(List emails) => new PaginationHelper(_github).objects( "POST", "/user/emails", UserEmail.fromJSON, - statusCode: 201, body: JSON.encode(emails)) as Stream; + statusCode: 201, body: JSON.encode(emails)); /// Delete Emails /// @@ -113,8 +113,7 @@ class UsersService extends Service { /// /// API docs: https://developer.github.com/v3/users/followers/#list-followers-of-a-user Stream listUserFollowers(String user) => new PaginationHelper(_github) - .objects("GET", "/users/$user/followers", User.fromJSON, - statusCode: 200) as Stream; + .objects("GET", "/users/$user/followers", User.fromJSON, statusCode: 200); /// Check if the current user is following the specified user. Future isFollowingUser(String user) => @@ -150,8 +149,7 @@ class UsersService extends Service { /// /// API docs: https://developer.github.com/v3/users/followers/#list-followers-of-a-user Stream listCurrentUserFollowers() => new PaginationHelper(_github) - .objects("GET", "/user/followers", User.fromJSON, statusCode: 200) - as Stream; + .objects("GET", "/user/followers", 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. @@ -161,7 +159,7 @@ class UsersService extends Service { Stream listPublicKeys([String userLogin]) { var path = userLogin == null ? "/user/keys" : "/users/$userLogin/keys"; return new PaginationHelper(_github) - .objects("GET", path, PublicKey.fromJSON) as Stream; + .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/pagination.dart b/lib/src/common/util/pagination.dart index fd905f55..ba5f67bc 100644 --- a/lib/src/common/util/pagination.dart +++ b/lib/src/common/util/pagination.dart @@ -1,7 +1,7 @@ part of github.common; /// Internal Helper for dealing with GitHub Pagination. -class PaginationHelper { +class PaginationHelper { final GitHub github; PaginationHelper(this.github); @@ -84,7 +84,7 @@ class PaginationHelper { } } - Stream objects(String method, String path, JSONConverter converter, + Stream objects(String method, String path, JSONConverter converter, {int pages, Map headers, Map params, From fa5b52059e754b4c098e189f4e7c768a3c646592 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Wed, 26 Jul 2017 10:40:24 -0700 Subject: [PATCH 058/496] make tool/build.dart executable --- tool/build.dart | 1 + 1 file changed, 1 insertion(+) mode change 100644 => 100755 tool/build.dart diff --git a/tool/build.dart b/tool/build.dart old mode 100644 new mode 100755 index 6a3347a9..f559d7ba --- a/tool/build.dart +++ b/tool/build.dart @@ -1,3 +1,4 @@ +#!/usr/bin/env dart --checked // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. From feb3fe1e61981b7932ed9f084b14aa34184d9206 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Wed, 26 Jul 2017 10:45:22 -0700 Subject: [PATCH 059/496] Update to latest json_serializable and source_gen --- lib/src/common.dart | 2 +- lib/src/common.g.dart | 124 ++++++++++++-------------------- lib/src/common/model/git.dart | 2 +- lib/src/common/model/repos.dart | 20 +++--- pubspec.yaml | 3 +- tool/phases.dart | 4 +- 6 files changed, 63 insertions(+), 92 deletions(-) diff --git a/lib/src/common.dart b/lib/src/common.dart index 7e9c01ab..4dbeee0c 100644 --- a/lib/src/common.dart +++ b/lib/src/common.dart @@ -9,7 +9,7 @@ import "package:html/dom.dart" as html; import "package:html/parser.dart" as html_parser; import "package:http/http.dart" as http; import "package:quiver/async.dart" show FutureGroup; -import "package:source_gen/generators/json_serializable.dart"; +import "package:json_serializable/annotations.dart"; import "package:xml/xml.dart" as xml; import 'util.dart'; diff --git a/lib/src/common.g.dart b/lib/src/common.g.dart index 21c67827..6e2f2f36 100644 --- a/lib/src/common.g.dart +++ b/lib/src/common.g.dart @@ -4,104 +4,74 @@ part of github.common; // ************************************************************************** // Generator: JsonSerializableGenerator -// Target: class GitTree // ************************************************************************** -GitTree _$GitTreeFromJson(Map json) => new GitTree( +GitTree _$GitTreeFromJson(Map json) => new GitTree( json['sha'] as String, json['url'] as String, json['truncated'] as bool, (json['tree'] as List) - ?.map((v0) => v0 == null ? null : new GitTreeEntry.fromJson(v0)) + ?.map((e) => e == null + ? null + : new GitTreeEntry.fromJson(e as Map)) ?.toList()); -// ************************************************************************** -// Generator: JsonSerializableGenerator -// Target: class GitTreeEntry -// ************************************************************************** - -GitTreeEntry _$GitTreeEntryFromJson(Map json) => new 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); - -// ************************************************************************** -// Generator: JsonSerializableGenerator -// Target: class GitHubComparison -// ************************************************************************** - -GitHubComparison _$GitHubComparisonFromJson(Map json) => new GitHubComparison( - json['url'] as String, - json['status'] as String, - json['ahead_by'] as int, - json['behind_by'] as int, - json['total_commits'] as int); - -// ************************************************************************** -// Generator: JsonSerializableGenerator -// Target: class Tag -// ************************************************************************** - -Tag _$TagFromJson(Map json) => new Tag( +GitTreeEntry _$GitTreeEntryFromJson(Map json) => + new 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); + +GitHubComparison _$GitHubComparisonFromJson(Map json) => + new GitHubComparison( + json['url'] as String, + json['status'] as String, + json['ahead_by'] as int, + json['behind_by'] as int, + json['total_commits'] as int); + +Tag _$TagFromJson(Map json) => new Tag( json['name'] as String, - json['commit'] == null ? null : new CommitInfo.fromJson(json['commit']), + json['commit'] == null + ? null + : new CommitInfo.fromJson(json['commit'] as Map), json['zipball_url'] as String, json['tarball_url'] as String); -// ************************************************************************** -// Generator: JsonSerializableGenerator -// Target: class CommitData -// ************************************************************************** - -CommitData _$CommitDataFromJson(Map json) => new CommitData( +CommitData _$CommitDataFromJson(Map json) => new CommitData( json['sha'] as String, json['commit'] == null ? null : new GitCommit.fromJson(json['commit']), json['url'] as String, json['html_url'] as String, json['comments_url'] as String, - json['author'] == null ? null : new CommitDataUser.fromJson(json['author']), + json['author'] == null + ? null + : new CommitDataUser.fromJson(json['author'] as Map), json['committer'] == null ? null - : new CommitDataUser.fromJson(json['committer']), - (json['parents'] as List) - ?.map((v0) => v0 as Map) - ?.toList()); - -// ************************************************************************** -// Generator: JsonSerializableGenerator -// Target: class CommitDataUser -// ************************************************************************** + : new CommitDataUser.fromJson( + json['committer'] as Map), + (json['parents'] as List)?.map((e) => e as Map)?.toList()); -CommitDataUser _$CommitDataUserFromJson(Map json) => new CommitDataUser( - json['login'] as String, json['id'] as int, json['type'] as String); +CommitDataUser _$CommitDataUserFromJson(Map json) => + new CommitDataUser( + json['login'] as String, json['id'] as int, json['type'] as String); -// ************************************************************************** -// Generator: JsonSerializableGenerator -// Target: class CommitInfo -// ************************************************************************** - -CommitInfo _$CommitInfoFromJson(Map json) => new CommitInfo( +CommitInfo _$CommitInfoFromJson(Map json) => new CommitInfo( json['sha'] as String, - json['tree'] == null ? null : new GitTree.fromJson(json['tree'])); - -// ************************************************************************** -// Generator: JsonSerializableGenerator -// Target: class UserInformation -// ************************************************************************** - -UserInformation _$UserInformationFromJson(Map json) => new UserInformation( - json['login'] as String, - json['id'] as int, - json['avatar_url'] as String, - json['html_url'] as String); + json['tree'] == null + ? null + : new GitTree.fromJson(json['tree'] as Map)); -// ************************************************************************** -// Generator: JsonSerializableGenerator -// Target: class Branch -// ************************************************************************** +UserInformation _$UserInformationFromJson(Map json) => + new UserInformation(json['login'] as String, json['id'] as int, + json['avatar_url'] as String, json['html_url'] as String); -Branch _$BranchFromJson(Map json) => new Branch(json['name'] as String, - json['commit'] == null ? null : new CommitData.fromJson(json['commit'])); +Branch _$BranchFromJson(Map json) => new Branch( + json['name'] as String, + json['commit'] == null + ? null + : new CommitData.fromJson(json['commit'] as Map)); diff --git a/lib/src/common/model/git.dart b/lib/src/common/model/git.dart index ad1c2cc9..c34feebe 100644 --- a/lib/src/common/model/git.dart +++ b/lib/src/common/model/git.dart @@ -164,7 +164,7 @@ class GitTree { /// GitHub's maximum limit. final bool truncated; - @JsonKey("tree") + @JsonKey(name: "tree") final List entries; GitTree(this.sha, this.url, this.truncated, this.entries); diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart index 7381bbe0..7dc7ec1c 100644 --- a/lib/src/common/model/repos.dart +++ b/lib/src/common/model/repos.dart @@ -6,13 +6,13 @@ class GitHubComparison { final String status; - @JsonKey('ahead_by') + @JsonKey(name: 'ahead_by') final int aheadBy; - @JsonKey('behind_by') + @JsonKey(name: 'behind_by') final int behindBy; - @JsonKey('total_commits') + @JsonKey(name: 'total_commits') final int totalCommits; GitHubComparison( @@ -206,9 +206,9 @@ class Tag { final String name; final CommitInfo commit; - @JsonKey('zipball_url') + @JsonKey(name: 'zipball_url') final String zipUrl; - @JsonKey('tarball_url') + @JsonKey(name: 'tarball_url') final String tarUrl; Tag(this.name, this.commit, this.zipUrl, this.tarUrl); @@ -225,13 +225,13 @@ class CommitData { final String sha; final GitCommit commit; - @JsonKey("url") + @JsonKey(name: "url") final String url; - @JsonKey("html_url") + @JsonKey(name: "html_url") final String htmlUrl; - @JsonKey("comments_url") + @JsonKey(name: "comments_url") final String commentsUrl; final CommitDataUser author, committer; @@ -277,11 +277,11 @@ class UserInformation { final int id; /// Avatar Url - @JsonKey("avatar_url") + @JsonKey(name: "avatar_url") final String avatarUrl; /// Url to the user's GitHub Profile - @JsonKey("html_url") + @JsonKey(name: "html_url") final String htmlUrl; UserInformation(this.login, this.id, this.avatarUrl, this.htmlUrl); diff --git a/pubspec.yaml b/pubspec.yaml index f68ff36d..e48e7054 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -8,12 +8,13 @@ environment: dependencies: html: '>=0.12.0 <0.14.0' http: '^0.11.3' + json_serializable: '^0.2.1' markdown: '^0.11.1' quiver: '>=0.20.0 <0.25.0' - source_gen: '^0.6.1' xml: '^2.0.0' dev_dependencies: browser: '^0.10.0+2' build_runner: ^0.3.0 + source_gen: '^0.7.0' test: '^0.12.0' mockito: '^1.0.1' diff --git a/tool/phases.dart b/tool/phases.dart index dd30b69c..588b9c23 100644 --- a/tool/phases.dart +++ b/tool/phases.dart @@ -1,9 +1,9 @@ import 'package:build_runner/build_runner.dart'; +import 'package:json_serializable/generators.dart'; import 'package:source_gen/source_gen.dart'; -import 'package:source_gen/generators/json_serializable_generator.dart'; final PhaseGroup phases = new PhaseGroup.singleAction( - new GeneratorBuilder(const [ + new PartBuilder(const [ const JsonSerializableGenerator(), ]), new InputSet('github', const ['lib/src/common.dart'])); From 9c4a07f98dc605ba95f960a710ebb39532eeb209 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Mon, 18 Sep 2017 16:35:15 -0700 Subject: [PATCH 060/496] Support the latest pkg/quiver, require the latest pkg/build_runner --- pubspec.yaml | 4 ++-- tool/build.dart | 2 +- tool/phases.dart | 13 ++++++++----- tool/watch.dart | 2 +- 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/pubspec.yaml b/pubspec.yaml index e48e7054..db47d4bd 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -10,11 +10,11 @@ dependencies: http: '^0.11.3' json_serializable: '^0.2.1' markdown: '^0.11.1' - quiver: '>=0.20.0 <0.25.0' + quiver: '>=0.20.0 <0.26.0' xml: '^2.0.0' dev_dependencies: browser: '^0.10.0+2' - build_runner: ^0.3.0 + build_runner: ^0.5.0 source_gen: '^0.7.0' test: '^0.12.0' mockito: '^1.0.1' diff --git a/tool/build.dart b/tool/build.dart index f559d7ba..339194aa 100755 --- a/tool/build.dart +++ b/tool/build.dart @@ -10,5 +10,5 @@ import 'package:build_runner/build_runner.dart'; import 'phases.dart'; Future main() async { - await build(phases, deleteFilesByDefault: true); + await build(buildActions, deleteFilesByDefault: true); } diff --git a/tool/phases.dart b/tool/phases.dart index 588b9c23..5e6df7a6 100644 --- a/tool/phases.dart +++ b/tool/phases.dart @@ -2,8 +2,11 @@ import 'package:build_runner/build_runner.dart'; import 'package:json_serializable/generators.dart'; import 'package:source_gen/source_gen.dart'; -final PhaseGroup phases = new PhaseGroup.singleAction( - new PartBuilder(const [ - const JsonSerializableGenerator(), - ]), - new InputSet('github', const ['lib/src/common.dart'])); +final buildActions = [ + new BuildAction( + new PartBuilder(const [ + const JsonSerializableGenerator(), + ]), + 'github', + inputs: ['lib/src/common.dart']) +]; diff --git a/tool/watch.dart b/tool/watch.dart index be2730bd..3bdaa675 100644 --- a/tool/watch.dart +++ b/tool/watch.dart @@ -7,5 +7,5 @@ import 'package:build_runner/build_runner.dart'; import 'phases.dart'; void main() { - watch(phases, deleteFilesByDefault: true); + watch(buildActions, deleteFilesByDefault: true); } From d78eb9efe3b3c8884adf699d8c84a7d0362ac582 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Wed, 27 Sep 2017 15:27:24 -0700 Subject: [PATCH 061/496] Use latest json_serializable and json_annotation Separates dev and runtime dependencies --- lib/src/common.dart | 2 +- pubspec.yaml | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/src/common.dart b/lib/src/common.dart index 4dbeee0c..5cf16a57 100644 --- a/lib/src/common.dart +++ b/lib/src/common.dart @@ -9,7 +9,7 @@ import "package:html/dom.dart" as html; import "package:html/parser.dart" as html_parser; import "package:http/http.dart" as http; import "package:quiver/async.dart" show FutureGroup; -import "package:json_serializable/annotations.dart"; +import "package:json_annotation/json_annotation.dart"; import "package:xml/xml.dart" as xml; import 'util.dart'; diff --git a/pubspec.yaml b/pubspec.yaml index db47d4bd..fd87f3cb 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -8,13 +8,14 @@ environment: dependencies: html: '>=0.12.0 <0.14.0' http: '^0.11.3' - json_serializable: '^0.2.1' + json_annotation: '^0.2.0' markdown: '^0.11.1' quiver: '>=0.20.0 <0.26.0' xml: '^2.0.0' dev_dependencies: browser: '^0.10.0+2' build_runner: ^0.5.0 + json_serializable: '^0.2.4' source_gen: '^0.7.0' test: '^0.12.0' mockito: '^1.0.1' From 5a5eaf156f4f62f62c766eac9da65840a9e94d3c Mon Sep 17 00:00:00 2001 From: Dustin Lessard Date: Sat, 27 Jan 2018 07:04:46 -0500 Subject: [PATCH 062/496] Updated options for list method. --- lib/src/common/pulls_service.dart | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/lib/src/common/pulls_service.dart b/lib/src/common/pulls_service.dart index 7f0647ff..50db6e57 100644 --- a/lib/src/common/pulls_service.dart +++ b/lib/src/common/pulls_service.dart @@ -7,10 +7,26 @@ part of github.common; class PullRequestsService extends Service { PullRequestsService(GitHub github) : super(github); - Stream list(RepositorySlug slug, {int pages}) { - return new PaginationHelper(_github).objects( - "GET", "/repos/${slug.fullName}/pulls", PullRequest.fromJSON, - pages: pages); + /// 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 = {}; + putValue("base", base, params); + putValue("direction", direction, params); + putValue("head", head, params); + putValue("sort", sort, params); + putValue("state", state, params); + + return new PaginationHelper(_github).objects("GET", + "/repos/${slug.fullName}/pulls?state=${state}", PullRequest.fromJSON, + pages: pages, params: params); } /// Fetches a single pull request. From 28df310c2b280012425af66874b09897fb270dee Mon Sep 17 00:00:00 2001 From: Dustin Lessard Date: Thu, 24 May 2018 09:16:28 -0400 Subject: [PATCH 063/496] fix for creating a pull request. --- 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 50db6e57..6d92c477 100644 --- a/lib/src/common/pulls_service.dart +++ b/lib/src/common/pulls_service.dart @@ -40,7 +40,7 @@ class PullRequestsService extends Service { /// /// API docs: https://developer.github.com/v3/pulls/#create-a-pull-request Future create( - RepositorySlug slug, CreateRelease request) { + RepositorySlug slug, CreatePullRequest request) { return _github.postJSON("/repos/${slug.fullName}/pulls", convert: PullRequestInformation.fromJSON, body: request.toJSON()) as Future; From 0e015cc776a3a4cb0eba50f279ea16581c15fac4 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Fri, 9 Mar 2018 16:55:00 -0800 Subject: [PATCH 064/496] cleanup and sort .gitignore --- .gitignore | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index 890a906e..43dbe764 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,5 @@ -build/ +.dart_tool +.packages .pub packages pubspec.lock -.packages -.idea/ -.settings -.buildlog -out/ -*.iml -.c9* From 4b7be293101b1ea195448e4bf6812e0a461af822 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Tue, 12 Jun 2018 15:30:38 -0700 Subject: [PATCH 065/496] Upgrade dependencies, regenerate code with latest json_serializable (#104) --- lib/src/common.g.dart | 138 +++++++++++++++++++++++------------------- pubspec.yaml | 12 ++-- tool/build.dart | 14 ----- tool/phases.dart | 12 ---- tool/watch.dart | 11 ---- 5 files changed, 82 insertions(+), 105 deletions(-) delete mode 100755 tool/build.dart delete mode 100644 tool/phases.dart delete mode 100644 tool/watch.dart diff --git a/lib/src/common.g.dart b/lib/src/common.g.dart index 6e2f2f36..b1940566 100644 --- a/lib/src/common.g.dart +++ b/lib/src/common.g.dart @@ -6,72 +6,88 @@ part of github.common; // Generator: JsonSerializableGenerator // ************************************************************************** -GitTree _$GitTreeFromJson(Map json) => new GitTree( - json['sha'] as String, - json['url'] as String, - json['truncated'] as bool, - (json['tree'] as List) - ?.map((e) => e == null - ? null - : new GitTreeEntry.fromJson(e as Map)) - ?.toList()); +GitTree _$GitTreeFromJson(Map json) { + return new GitTree( + json['sha'] as String, + json['url'] as String, + json['truncated'] as bool, + (json['tree'] as List) + ?.map((e) => e == null + ? null + : new GitTreeEntry.fromJson(e as Map)) + ?.toList()); +} -GitTreeEntry _$GitTreeEntryFromJson(Map json) => - new 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) { + return new 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); +} -GitHubComparison _$GitHubComparisonFromJson(Map json) => - new 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) { + return new GitHubComparison( + json['url'] as String, + json['status'] as String, + json['ahead_by'] as int, + json['behind_by'] as int, + json['total_commits'] as int); +} -Tag _$TagFromJson(Map json) => new Tag( - json['name'] as String, - json['commit'] == null - ? null - : new CommitInfo.fromJson(json['commit'] as Map), - json['zipball_url'] as String, - json['tarball_url'] as String); +Tag _$TagFromJson(Map json) { + return new Tag( + json['name'] as String, + json['commit'] == null + ? null + : new CommitInfo.fromJson(json['commit'] as Map), + json['zipball_url'] as String, + json['tarball_url'] as String); +} -CommitData _$CommitDataFromJson(Map json) => new CommitData( - json['sha'] as String, - json['commit'] == null ? null : new GitCommit.fromJson(json['commit']), - json['url'] as String, - json['html_url'] as String, - json['comments_url'] as String, - json['author'] == null - ? null - : new CommitDataUser.fromJson(json['author'] as Map), - json['committer'] == null - ? null - : new CommitDataUser.fromJson( - json['committer'] as Map), - (json['parents'] as List)?.map((e) => e as Map)?.toList()); +CommitData _$CommitDataFromJson(Map json) { + return new CommitData( + json['sha'] as String, + json['commit'] == null ? null : new GitCommit.fromJson(json['commit']), + json['url'] as String, + json['html_url'] as String, + json['comments_url'] as String, + json['author'] == null + ? null + : new CommitDataUser.fromJson(json['author'] as Map), + json['committer'] == null + ? null + : new CommitDataUser.fromJson( + json['committer'] as Map), + (json['parents'] as List) + ?.map((e) => e as Map) + ?.toList()); +} -CommitDataUser _$CommitDataUserFromJson(Map json) => - new CommitDataUser( - json['login'] as String, json['id'] as int, json['type'] as String); +CommitDataUser _$CommitDataUserFromJson(Map json) { + return new CommitDataUser( + json['login'] as String, json['id'] as int, json['type'] as String); +} -CommitInfo _$CommitInfoFromJson(Map json) => new CommitInfo( - json['sha'] as String, - json['tree'] == null - ? null - : new GitTree.fromJson(json['tree'] as Map)); +CommitInfo _$CommitInfoFromJson(Map json) { + return new CommitInfo( + json['sha'] as String, + json['tree'] == null + ? null + : new GitTree.fromJson(json['tree'] as Map)); +} -UserInformation _$UserInformationFromJson(Map json) => - new UserInformation(json['login'] as String, json['id'] as int, - json['avatar_url'] as String, json['html_url'] as String); +UserInformation _$UserInformationFromJson(Map json) { + return new UserInformation(json['login'] as String, json['id'] as int, + json['avatar_url'] as String, json['html_url'] as String); +} -Branch _$BranchFromJson(Map json) => new Branch( - json['name'] as String, - json['commit'] == null - ? null - : new CommitData.fromJson(json['commit'] as Map)); +Branch _$BranchFromJson(Map json) { + return new Branch( + json['name'] as String, + json['commit'] == null + ? null + : new CommitData.fromJson(json['commit'] as Map)); +} diff --git a/pubspec.yaml b/pubspec.yaml index fd87f3cb..bbb7f5b8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -8,14 +8,12 @@ environment: dependencies: html: '>=0.12.0 <0.14.0' http: '^0.11.3' - json_annotation: '^0.2.0' - markdown: '^0.11.1' - quiver: '>=0.20.0 <0.26.0' - xml: '^2.0.0' + json_annotation: '^0.2.8' + quiver: '>=0.20.0 <0.29.0' + xml: '>=2.0.0 <4.0.0' dev_dependencies: browser: '^0.10.0+2' - build_runner: ^0.5.0 - json_serializable: '^0.2.4' - source_gen: '^0.7.0' + build_runner: ^0.8.0 + json_serializable: ^0.5.7 test: '^0.12.0' mockito: '^1.0.1' diff --git a/tool/build.dart b/tool/build.dart deleted file mode 100755 index 339194aa..00000000 --- a/tool/build.dart +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env dart --checked -// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -import 'dart:async'; - -import 'package:build_runner/build_runner.dart'; - -import 'phases.dart'; - -Future main() async { - await build(buildActions, deleteFilesByDefault: true); -} diff --git a/tool/phases.dart b/tool/phases.dart deleted file mode 100644 index 5e6df7a6..00000000 --- a/tool/phases.dart +++ /dev/null @@ -1,12 +0,0 @@ -import 'package:build_runner/build_runner.dart'; -import 'package:json_serializable/generators.dart'; -import 'package:source_gen/source_gen.dart'; - -final buildActions = [ - new BuildAction( - new PartBuilder(const [ - const JsonSerializableGenerator(), - ]), - 'github', - inputs: ['lib/src/common.dart']) -]; diff --git a/tool/watch.dart b/tool/watch.dart deleted file mode 100644 index 3bdaa675..00000000 --- a/tool/watch.dart +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -import 'package:build_runner/build_runner.dart'; - -import 'phases.dart'; - -void main() { - watch(buildActions, deleteFilesByDefault: true); -} From daf20ebb416c7dd699a5ce1a31c2357dfe95113d Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Tue, 12 Jun 2018 15:42:47 -0700 Subject: [PATCH 066/496] cleanup: eliminate a lot of type errors and casts Generic type params FTW --- lib/src/common/activity_service.dart | 2 +- lib/src/common/gists_service.dart | 11 +++-------- lib/src/common/git_service.dart | 8 ++++---- lib/src/common/github.dart | 12 ++++++------ lib/src/common/issues_service.dart | 9 ++++----- lib/src/common/orgs_service.dart | 6 +++--- lib/src/common/pulls_service.dart | 3 +-- lib/src/common/repos_service.dart | 20 ++++++++------------ lib/src/common/search_service.dart | 12 ++++-------- lib/src/common/users_service.dart | 2 +- lib/src/common/util/json.dart | 2 +- lib/src/common/util/pagination.dart | 3 ++- 12 files changed, 38 insertions(+), 52 deletions(-) diff --git a/lib/src/common/activity_service.dart b/lib/src/common/activity_service.dart index 4e0d029e..c9b17453 100644 --- a/lib/src/common/activity_service.dart +++ b/lib/src/common/activity_service.dart @@ -280,7 +280,7 @@ class ActivityService extends Service { return _github.postJSON("/repos/${slug.fullName}/subscription", statusCode: StatusCodes.OK, convert: RepositorySubscription.fromJSON, - body: map) as Future; + body: map); } /// Deletes a Repository Subscription diff --git a/lib/src/common/gists_service.dart b/lib/src/common/gists_service.dart index ba74a843..86dd8b6f 100644 --- a/lib/src/common/gists_service.dart +++ b/lib/src/common/gists_service.dart @@ -68,9 +68,7 @@ class GistsService extends Service { map["files"] = f; return _github.postJSON("/gists", - statusCode: 201, - body: JSON.encode(map), - convert: Gist.fromJSON) as Future; + statusCode: 201, body: JSON.encode(map), convert: Gist.fromJSON); } /// Deletes the specified Gist. @@ -102,9 +100,7 @@ class GistsService extends Service { } return _github.postJSON("/gists/$id", - statusCode: 200, - body: JSON.encode(map), - convert: Gist.fromJSON) as Future; + statusCode: 200, body: JSON.encode(map), convert: Gist.fromJSON); } // TODO: Implement listGistCommits: https://developer.github.com/v3/gists/#list-gist-commits @@ -164,8 +160,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: request.toJSON(), - convert: GistComment.fromJSON) as Future; + body: request.toJSON(), 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 b71c7ed4..8724e92c 100644 --- a/lib/src/common/git_service.dart +++ b/lib/src/common/git_service.dart @@ -21,7 +21,7 @@ class GitService extends Service { return _github.postJSON('/repos/${slug.fullName}/git/blobs', convert: GitBlob.fromJSON, statusCode: StatusCodes.CREATED, - body: blob.toJSON()) as Future; + body: blob.toJSON()); } /// Fetches a commit from [slug] for a given [sha]. @@ -38,7 +38,7 @@ class GitService extends Service { return _github.postJSON('/repos/${slug.fullName}/git/commits', convert: GitCommit.fromJSON, statusCode: StatusCodes.CREATED, - body: commit.toJSON()) as Future; + body: commit.toJSON()); } /// Fetches a reference from a repository for the given [ref]. @@ -78,7 +78,7 @@ class GitService extends Service { return _github.postJSON('/repos/${slug.fullName}/git/refs', convert: GitReference.fromJSON, statusCode: StatusCodes.CREATED, - body: JSON.encode({'ref': ref, 'sha': sha})) as Future; + body: JSON.encode({'ref': ref, 'sha': sha})); } /// Updates a reference in a repository. @@ -149,6 +149,6 @@ class GitService extends Service { return _github.postJSON('/repos/${slug.fullName}/git/trees', convert: (j) => new GitTree.fromJson(j), statusCode: StatusCodes.CREATED, - body: tree.toJSON()) as Future; + body: tree.toJSON()); } } diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index 6e90646d..eb977810 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -204,12 +204,12 @@ 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, + Future getJSON(String path, {int statusCode, void fail(http.Response response), Map headers, Map params, - JSONConverter convert, + JSONConverter convert, String preview}) async { if (headers == null) headers = {}; @@ -218,7 +218,7 @@ class GitHub { } if (convert == null) { - convert = (input) => input; + convert = (input) => input as T; } headers.putIfAbsent("Accept", () => "application/vnd.github.v3+json"); @@ -261,12 +261,12 @@ 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, + Future postJSON(String path, {int statusCode, void fail(http.Response response), Map headers, Map params, - JSONConverter convert, + JSONConverter convert, String body, String preview}) async { if (headers == null) headers = {}; @@ -276,7 +276,7 @@ class GitHub { } if (convert == null) { - convert = (input) => input; + convert = (input) => input as T; } headers.putIfAbsent("Accept", () => "application/vnd.github.v3+json"); diff --git a/lib/src/common/issues_service.dart b/lib/src/common/issues_service.dart index d2458356..c5885095 100644 --- a/lib/src/common/issues_service.dart +++ b/lib/src/common/issues_service.dart @@ -211,7 +211,7 @@ class IssuesService extends Service { '/repos/${slug.fullName}/issues/$issueNumber/comments', body: it, convert: IssueComment.fromJSON, - statusCode: StatusCodes.CREATED) as Future; + statusCode: StatusCodes.CREATED); } // TODO: Implement editComment: https://developer.github.com/v3/issues/comments/#edit-a-comment @@ -249,7 +249,7 @@ class IssuesService extends Service { RepositorySlug slug, String name, String color) { return _github.postJSON("/repos/${slug.fullName}/labels", body: JSON.encode({"name": name, "color": color}), - convert: IssueLabel.fromJSON) as Future; + convert: IssueLabel.fromJSON); } /// Edits a label. @@ -258,7 +258,7 @@ class IssuesService extends Service { Future editLabel(RepositorySlug slug, String name, String color) { return _github.postJSON("/repos/${slug.fullName}/labels/$name", body: JSON.encode({"name": name, "color": color}), - convert: IssueLabel.fromJSON) as Future; + convert: IssueLabel.fromJSON); } /// Deletes a label. @@ -347,8 +347,7 @@ class IssuesService extends Service { Future createMilestone( RepositorySlug slug, CreateMilestone request) { return _github.postJSON("/repos/${slug.fullName}/milestones", - body: JSON.encode(request.toJSON()), - convert: Milestone.fromJSON) as Future; + body: JSON.encode(request.toJSON()), convert: Milestone.fromJSON); } // TODO: Implement editMilestone: https://developer.github.com/v3/issues/milestones/#update-a-milestone diff --git a/lib/src/common/orgs_service.dart b/lib/src/common/orgs_service.dart index 6eefeea2..ee6523cc 100644 --- a/lib/src/common/orgs_service.dart +++ b/lib/src/common/orgs_service.dart @@ -109,7 +109,7 @@ class OrganizationsService extends Service { statusCode: 201, convert: Team.fromJSON, // TODO: This is probably wrong, map needs to be json encoded? - body: map) as Future; + body: map); } /// Edits a Team. @@ -124,7 +124,7 @@ class OrganizationsService extends Service { statusCode: 200, convert: Team.fromJSON, // TODO: This is probably wrong, map needs to be json encoded? - body: map) as Future; + body: map); } /// Deletes the team specified by the [teamId] @@ -295,7 +295,7 @@ class OrganizationsService extends Service { Future createHook(String org, CreateHook hook) { return _github.postJSON("/orgs/$org/hooks", convert: (Map i) => Hook.fromJSON(org, i), - body: hook.toJSON()) as Future; + body: hook.toJSON()); } // 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 6d92c477..f4e6bb7b 100644 --- a/lib/src/common/pulls_service.dart +++ b/lib/src/common/pulls_service.dart @@ -42,8 +42,7 @@ class PullRequestsService extends Service { Future create( RepositorySlug slug, CreatePullRequest request) { return _github.postJSON("/repos/${slug.fullName}/pulls", - convert: PullRequestInformation.fromJSON, - body: request.toJSON()) as Future; + convert: PullRequestInformation.fromJSON, body: request.toJSON()); } /// Edit a pull request. diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index edfbd801..b9d04943 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -82,12 +82,10 @@ class RepositoriesService extends Service { {String org}) { if (org != null) { return _github.postJSON('/orgs/$org/repos', - body: repository.toJSON(), - convert: TeamRepository.fromJSON) as Future; + body: repository.toJSON(), convert: TeamRepository.fromJSON); } else { return _github.postJSON('/user/repos', - body: repository.toJSON(), - convert: Repository.fromJSON) as Future; + body: repository.toJSON(), convert: Repository.fromJSON); } } @@ -183,7 +181,7 @@ class RepositoriesService extends Service { Future listLanguages(RepositorySlug slug) => _github.getJSON("/repos/${slug.fullName}/languages", statusCode: StatusCodes.OK, - convert: (Map input) => new LanguageBreakdown(input)); + convert: (input) => new LanguageBreakdown(input)); /// Lists the tags of the specified repository. /// @@ -367,7 +365,7 @@ class RepositoriesService extends Service { // TODO: map probably needs to be json encoded body: map, statusCode: 200, - convert: ContentCreation.fromJSON) as Future; + convert: ContentCreation.fromJSON); } /// Deletes the specified file. @@ -413,8 +411,7 @@ class RepositoriesService extends Service { Future createFork(RepositorySlug slug, [CreateFork fork]) { if (fork == null) fork = new CreateFork(); return _github.postJSON("/repos/${slug.fullName}/forks", - body: fork.toJSON(), - convert: Repository.fromJSON) as Future; + body: fork.toJSON(), convert: Repository.fromJSON); } /// Lists the hooks of the specified repository. @@ -440,7 +437,7 @@ class RepositoriesService extends Service { Future createHook(RepositorySlug slug, CreateHook hook) { return _github.postJSON("/repos/${slug.fullName}/hooks", convert: (Map i) => Hook.fromJSON(slug.fullName, i), - body: hook.toJSON()) as Future; + body: hook.toJSON()); } // TODO: Implement editHook: https://developer.github.com/v3/repos/hooks/#edit-a-hook @@ -501,7 +498,7 @@ class RepositoriesService extends Service { return _github.postJSON("/repos/${slug.fullName}/merges", body: merge.toJSON(), convert: RepositoryCommit.fromJSON, - statusCode: 201) as Future; + statusCode: 201); } /// Fetches the GitHub pages information for the specified repository. @@ -625,8 +622,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) as Future; + body: request.toJSON(), convert: RepositoryStatus.fromJSON); } /// Gets a Combined Status for the specified repository and ref. diff --git a/lib/src/common/search_service.dart b/lib/src/common/search_service.dart index 3d7ebefe..a2bd0c1a 100644 --- a/lib/src/common/search_service.dart +++ b/lib/src/common/search_service.dart @@ -39,11 +39,9 @@ class SearchService extends Service { return; } - List items = input['items']; + var items = input['items'] as List; - items - .map((Map item) => Repository.fromJSON(item)) - .forEach(controller.add); + items.map((item) => Repository.fromJSON(item)).forEach(controller.add); }).onDone(controller.close); return controller.stream; @@ -87,11 +85,9 @@ class SearchService extends Service { return; } - List items = input['items']; + var items = input['items'] as List; - items - .map((Map item) => User.fromJSON(item)) - .forEach(controller.add); + items.map((item) => User.fromJSON(item)).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 b9f21d81..23e6a56b 100644 --- a/lib/src/common/users_service.dart +++ b/lib/src/common/users_service.dart @@ -38,7 +38,7 @@ class UsersService extends Service { // TODO: map probably needs to be JSON encoded. body: map, statusCode: 200, - convert: CurrentUser.fromJSON) as Future; + convert: CurrentUser.fromJSON); } /// Fetches a list of users specified by [names]. diff --git a/lib/src/common/util/json.dart b/lib/src/common/util/json.dart index 8abe399c..58a9eef4 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(dynamic input); +typedef T JSONConverter(S input); diff --git a/lib/src/common/util/pagination.dart b/lib/src/common/util/pagination.dart index ba5f67bc..904d7024 100644 --- a/lib/src/common/util/pagination.dart +++ b/lib/src/common/util/pagination.dart @@ -84,7 +84,8 @@ class PaginationHelper { } } - Stream objects(String method, String path, JSONConverter converter, + Stream objects( + String method, String path, JSONConverter converter, {int pages, Map headers, Map params, From 38f3b5f07f8335ca236f49ed618069fd1693b0ec Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Tue, 12 Jun 2018 15:43:00 -0700 Subject: [PATCH 067/496] cleanup: dartfmt example directory --- example/octocat.dart | 6 ++---- example/releases.dart | 6 ++---- example/repos.dart | 6 ++---- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/example/octocat.dart b/example/octocat.dart index 0db72e61..cea6c19d 100644 --- a/example/octocat.dart +++ b/example/octocat.dart @@ -21,11 +21,9 @@ void loadCat() { var index = random.nextInt(cats.length); var cat = cats[index]; print("Selected Octocat at ${index} (${cat.name})"); - $octocat.appendHtml( - """ + $octocat.appendHtml("""

${cat.name}

- """, - treeSanitizer: NodeTreeSanitizer.trusted); + """, treeSanitizer: NodeTreeSanitizer.trusted); }); } diff --git a/example/releases.dart b/example/releases.dart index 984f4570..e7810888 100644 --- a/example/releases.dart +++ b/example/releases.dart @@ -19,13 +19,11 @@ void loadReleases() { .toList() .then((releases) { for (var release in releases) { - releasesDiv.appendHtml( - """ + releasesDiv.appendHtml("""

${release.name}

- """, - treeSanitizer: NodeTreeSanitizer.trusted); + """, treeSanitizer: NodeTreeSanitizer.trusted); var 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 57b2ca8d..855f07e2 100644 --- a/example/repos.dart +++ b/example/repos.dart @@ -54,8 +54,7 @@ void updateRepos(List repos, document.querySelector("#repos").children.clear(); repos.sort(compare); for (var repo in repos) { - repositoriesDiv.appendHtml( - """ + repositoriesDiv.appendHtml("""

${repo.name}

@@ -73,8 +72,7 @@ void updateRepos(List repos, Size: ${repo.size} bytes

- """, - treeSanitizer: NodeTreeSanitizer.trusted); + """, treeSanitizer: NodeTreeSanitizer.trusted); } } From a32042020b27e7537f417c25a093cd7d21af338c Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Tue, 12 Jun 2018 15:54:53 -0700 Subject: [PATCH 068/496] fix: fix a number of type errors dealing with unencoded JSON maps Also update to latest Dart2 constant names --- CHANGELOG.md | 2 ++ benchmark/harness.dart | 10 +++++----- lib/src/common.dart | 3 ++- lib/src/common/activity_service.dart | 8 ++++---- lib/src/common/gists_service.dart | 6 +++--- lib/src/common/git_service.dart | 6 +++--- lib/src/common/github.dart | 12 ++++++------ lib/src/common/issues_service.dart | 19 +++++++++---------- lib/src/common/misc_service.dart | 3 +-- lib/src/common/model/authorizations.dart | 2 +- lib/src/common/model/gists.dart | 2 +- lib/src/common/model/git.dart | 8 ++++---- lib/src/common/model/issues.dart | 4 ++-- lib/src/common/model/keys.dart | 2 +- lib/src/common/model/pulls.dart | 4 ++-- lib/src/common/model/repos.dart | 2 +- lib/src/common/model/repos_contents.dart | 4 ++-- lib/src/common/model/repos_forks.dart | 2 +- lib/src/common/model/repos_hooks.dart | 2 +- lib/src/common/model/repos_merging.dart | 2 +- lib/src/common/model/repos_releases.dart | 2 +- lib/src/common/model/repos_statuses.dart | 2 +- lib/src/common/orgs_service.dart | 17 ++++------------- lib/src/common/pulls_service.dart | 10 +++++----- lib/src/common/repos_service.dart | 15 ++++++--------- lib/src/common/search_service.dart | 4 ++-- lib/src/common/users_service.dart | 9 +++------ lib/src/common/util/oauth2.dart | 4 ++-- lib/src/common/util/pagination.dart | 2 +- lib/src/server/hooks.dart | 4 ++-- pubspec.yaml | 2 +- test/experiment/error_handling.dart | 2 +- test/git_integration_test.dart | 4 ++-- test/git_test.dart | 8 ++++---- test/helper/http.dart | 10 +++++----- 35 files changed, 92 insertions(+), 106 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b1c93584..5e55015d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ - Make fields in many objects read-only. - Initial support for comparing commits. +- Require at least Dart `2.0.0-dev.36`. +- Fix a number of type issues dealing with JSON. ## v3.0.0 diff --git a/benchmark/harness.dart b/benchmark/harness.dart index 13643911..ac8438fe 100644 --- a/benchmark/harness.dart +++ b/benchmark/harness.dart @@ -43,11 +43,11 @@ void warmup() { } Future>> runBenchmarks( - int times, Map benchmarks) { + int times, Map benchmarks) async { warmup(); var group = new FutureGroup(); - var results = {}; + var results = >{}; benchmarks.forEach((String name, Benchmark benchmark) { results[name] = []; for (var i = 0; i < times; i++) { @@ -57,7 +57,7 @@ Future>> runBenchmarks( } }); - return group.future.then((_) { - return results; - }); + await group.future; + + return results; } diff --git a/lib/src/common.dart b/lib/src/common.dart index 5cf16a57..be4bb25a 100644 --- a/lib/src/common.dart +++ b/lib/src/common.dart @@ -3,7 +3,8 @@ library github.common; import "dart:async"; -import "dart:convert" show BASE64, JSON, UTF8, LineSplitter; +import "dart:convert" + show base64Decode, base64Encode, jsonEncode, jsonDecode, LineSplitter, utf8; import "package:html/dom.dart" as html; import "package:html/parser.dart" as html_parser; diff --git a/lib/src/common/activity_service.dart b/lib/src/common/activity_service.dart index c9b17453..cd6a2a82 100644 --- a/lib/src/common/activity_service.dart +++ b/lib/src/common/activity_service.dart @@ -147,7 +147,7 @@ class ActivityService extends Service { if (lastRead != null) data["last_read_at"] = lastRead.toIso8601String(); return _github - .request("PUT", "/notifications", body: JSON.encode(data)) + .request("PUT", "/notifications", body: jsonEncode(data)) .then((response) { return response.statusCode == 205; }); @@ -165,7 +165,7 @@ class ActivityService extends Service { return _github .request("PUT", "/repos/${slug.fullName}/notifications", - body: JSON.encode(data)) + body: jsonEncode(data)) .then((response) { return response.statusCode == 205; }); @@ -280,7 +280,7 @@ class ActivityService extends Service { return _github.postJSON("/repos/${slug.fullName}/subscription", statusCode: StatusCodes.OK, convert: RepositorySubscription.fromJSON, - body: map); + body: jsonEncode(map)); } /// Deletes a Repository Subscription @@ -326,7 +326,7 @@ class EventPoller { _lastFetched = response.headers['ETag']; - var json = JSON.decode(response.body) as List>; + var json = jsonDecode(response.body) as List>; if (!(onlyNew && _timer == null)) { for (var item in json) { diff --git a/lib/src/common/gists_service.dart b/lib/src/common/gists_service.dart index 86dd8b6f..72342f15 100644 --- a/lib/src/common/gists_service.dart +++ b/lib/src/common/gists_service.dart @@ -68,7 +68,7 @@ class GistsService extends Service { map["files"] = f; return _github.postJSON("/gists", - statusCode: 201, body: JSON.encode(map), convert: Gist.fromJSON); + statusCode: 201, body: jsonEncode(map), convert: Gist.fromJSON); } /// Deletes the specified Gist. @@ -100,7 +100,7 @@ class GistsService extends Service { } return _github.postJSON("/gists/$id", - statusCode: 200, body: JSON.encode(map), convert: Gist.fromJSON); + statusCode: 200, body: jsonEncode(map), convert: Gist.fromJSON); } // TODO: Implement listGistCommits: https://developer.github.com/v3/gists/#list-gist-commits @@ -139,7 +139,7 @@ class GistsService extends Service { return _github .request("POST", "/gists/$id/forks", statusCode: 201) .then((response) { - return Gist.fromJSON(JSON.decode(response.body) as Map); + return Gist.fromJSON(jsonDecode(response.body) as Map); }); } diff --git a/lib/src/common/git_service.dart b/lib/src/common/git_service.dart index 8724e92c..ab39621b 100644 --- a/lib/src/common/git_service.dart +++ b/lib/src/common/git_service.dart @@ -78,7 +78,7 @@ class GitService extends Service { return _github.postJSON('/repos/${slug.fullName}/git/refs', convert: GitReference.fromJSON, statusCode: StatusCodes.CREATED, - body: JSON.encode({'ref': ref, 'sha': sha})); + body: jsonEncode({'ref': ref, 'sha': sha})); } /// Updates a reference in a repository. @@ -87,7 +87,7 @@ class GitService extends Service { Future editReference( RepositorySlug slug, String ref, String sha, {bool force: false}) { - String body = JSON.encode({'sha': sha, 'force': force}); + 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()}; @@ -96,7 +96,7 @@ class GitService extends Service { body: body, headers: headers) .then((response) { return GitReference - .fromJSON(JSON.decode(response.body) as Map); + .fromJSON(jsonDecode(response.body) as Map); }); } diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index eb977810..4a381f82 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -227,14 +227,14 @@ class GitHub { headers.putIfAbsent("Authorization", () => "token ${auth.token}"); } else if (auth.isBasic) { var userAndPass = - BASE64.encode(UTF8.encode('${auth.username}:${auth.password}')); + base64Encode(utf8.encode('${auth.username}:${auth.password}')); headers.putIfAbsent("Authorization", () => "basic $userAndPass"); } var response = await request("GET", path, headers: headers, params: params, statusCode: statusCode, fail: fail); - var json = JSON.decode(response.body); + var json = jsonDecode(response.body); if (convert == null) { return json; @@ -285,7 +285,7 @@ class GitHub { headers.putIfAbsent("Authorization", () => "token ${auth.token}"); } else if (auth.isBasic) { var userAndPass = - BASE64.encode(UTF8.encode('${auth.username}:${auth.password}')); + base64Encode(utf8.encode('${auth.username}:${auth.password}')); headers.putIfAbsent("Authorization", () => "basic $userAndPass"); } @@ -295,7 +295,7 @@ class GitHub { body: body, statusCode: statusCode, fail: fail); - return convert(JSON.decode(response.body)); + return convert(jsonDecode(response.body)); } /// @@ -305,7 +305,7 @@ class GitHub { String message; List> errors; if (response.headers['content-type'].contains('application/json')) { - var json = JSON.decode(response.body); + var json = jsonDecode(response.body); message = json['message']; errors = json['errors'] as List>; } @@ -369,7 +369,7 @@ class GitHub { headers.putIfAbsent("Authorization", () => "token ${auth.token}"); } else if (auth.isBasic) { var userAndPass = - BASE64.encode(UTF8.encode('${auth.username}:${auth.password}')); + base64Encode(utf8.encode('${auth.username}:${auth.password}')); headers.putIfAbsent("Authorization", () => "basic $userAndPass"); } diff --git a/lib/src/common/issues_service.dart b/lib/src/common/issues_service.dart index c5885095..8b7f865b 100644 --- a/lib/src/common/issues_service.dart +++ b/lib/src/common/issues_service.dart @@ -129,7 +129,7 @@ class IssuesService extends Service { .request("PATCH", '/repos/${slug.fullName}/issues/$issueNumber', body: issue.toJSON()) .then((response) { - return Issue.fromJSON(JSON.decode(response.body) as Map) + return Issue.fromJSON(jsonDecode(response.body) as Map) as Future; }); } @@ -154,7 +154,7 @@ class IssuesService extends Service { throw new GitHubError(_github, response.body); } - return Issue.fromJSON(JSON.decode(response.body) as Map); + return Issue.fromJSON(jsonDecode(response.body) as Map); } /// Lists all available assignees (owners and collaborators) to which issues @@ -206,7 +206,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) { - var it = JSON.encode({"body": body}); + var it = jsonEncode({"body": body}); return _github.postJSON( '/repos/${slug.fullName}/issues/$issueNumber/comments', body: it, @@ -248,7 +248,7 @@ class IssuesService extends Service { Future createLabel( RepositorySlug slug, String name, String color) { return _github.postJSON("/repos/${slug.fullName}/labels", - body: JSON.encode({"name": name, "color": color}), + body: jsonEncode({"name": name, "color": color}), convert: IssueLabel.fromJSON); } @@ -257,7 +257,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: JSON.encode({"name": name, "color": color}), + body: jsonEncode({"name": name, "color": color}), convert: IssueLabel.fromJSON); } @@ -288,7 +288,7 @@ class IssuesService extends Service { RepositorySlug slug, int issueNumber, List labels) { return _github.postJSON( "/repos/${slug.fullName}/issues/$issueNumber/labels", - body: JSON.encode(labels), + body: jsonEncode(labels), convert: (input) => input.map((Map it) => IssueLabel.fromJSON(it))) as Future>; @@ -301,10 +301,9 @@ class IssuesService extends Service { RepositorySlug slug, int issueNumber, List labels) { return _github .request("PUT", "/repos/${slug.fullName}/issues/$issueNumber/labels", - body: JSON.encode(labels)) + body: jsonEncode(labels)) .then((response) { - return JSON - .decode(response.body) + return jsonDecode(response.body) .map((Map it) => IssueLabel.fromJSON(it)); }); } @@ -347,7 +346,7 @@ class IssuesService extends Service { Future createMilestone( RepositorySlug slug, CreateMilestone request) { return _github.postJSON("/repos/${slug.fullName}/milestones", - body: JSON.encode(request.toJSON()), convert: Milestone.fromJSON); + body: jsonEncode(request.toJSON()), 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 7aba42fb..92916851 100644 --- a/lib/src/common/misc_service.dart +++ b/lib/src/common/misc_service.dart @@ -41,8 +41,7 @@ class MiscService extends Service { {String mode: "markdown", String context}) { return _github .request("POST", "/markdown", - body: - JSON.encode({"text": input, "mode": mode, "context": context})) + body: jsonEncode({"text": input, "mode": mode, "context": context})) .then((response) { return response.body; }); diff --git a/lib/src/common/model/authorizations.dart b/lib/src/common/model/authorizations.dart index cc7dad88..cc4db16c 100644 --- a/lib/src/common/model/authorizations.dart +++ b/lib/src/common/model/authorizations.dart @@ -69,6 +69,6 @@ class CreateAuthorization { putValue("note_url", noteUrl, map); putValue("client_id", clientID, map); putValue("client_secret", clientSecret, map); - return JSON.encode(map); + return jsonEncode(map); } } diff --git a/lib/src/common/model/gists.dart b/lib/src/common/model/gists.dart index 674e53b5..8ba3f86d 100644 --- a/lib/src/common/model/gists.dart +++ b/lib/src/common/model/gists.dart @@ -172,6 +172,6 @@ class CreateGistComment { String toJSON() { var map = {}; map['body'] = body; - return JSON.encode(map); + return jsonEncode(map); } } diff --git a/lib/src/common/model/git.dart b/lib/src/common/model/git.dart index c34feebe..db87ddb2 100644 --- a/lib/src/common/model/git.dart +++ b/lib/src/common/model/git.dart @@ -30,7 +30,7 @@ class CreateGitBlob { CreateGitBlob(this.content, this.encoding); String toJSON() { - return JSON.encode({"content": content, "encoding": encoding}); + return jsonEncode({"content": content, "encoding": encoding}); } } @@ -123,7 +123,7 @@ class CreateGitCommit { putValue('author', author.toMap(), map); } - return JSON.encode(map); + return jsonEncode(map); } } @@ -216,7 +216,7 @@ class CreateGitTree { 'tree', entries.map((e) => e.toMap()).toList(growable: false), map); } - return JSON.encode(map); + return jsonEncode(map); } } @@ -302,7 +302,7 @@ class CreateGitTag { putValue('type', type, map); putValue('tagger', tagger.toMap(), map); - return JSON.encode(map); + return jsonEncode(map); } } diff --git a/lib/src/common/model/issues.dart b/lib/src/common/model/issues.dart index 0279e4c8..e56cf837 100644 --- a/lib/src/common/model/issues.dart +++ b/lib/src/common/model/issues.dart @@ -109,7 +109,7 @@ class IssueRequest { putValue("assignee", assignee, map); putValue("state", state, map); putValue("milestone", milestone, map); - return JSON.encode(map); + return jsonEncode(map); } } @@ -269,6 +269,6 @@ class CreateMilestone { putValue("state", state, map); putValue(description, description, map); putValue("due_on", dateToGitHubIso8601(dueOn), map); - return JSON.encode(map); + return jsonEncode(map); } } diff --git a/lib/src/common/model/keys.dart b/lib/src/common/model/keys.dart index 88c98566..787b8cc7 100644 --- a/lib/src/common/model/keys.dart +++ b/lib/src/common/model/keys.dart @@ -30,6 +30,6 @@ class CreatePublicKey { var map = {}; putValue("title", title, map); putValue("key", key, map); - return JSON.encode(map); + return jsonEncode(map); } } diff --git a/lib/src/common/model/pulls.dart b/lib/src/common/model/pulls.dart index b8541510..ec0c89a9 100644 --- a/lib/src/common/model/pulls.dart +++ b/lib/src/common/model/pulls.dart @@ -202,7 +202,7 @@ class CreatePullRequest { putValue("head", head, map); putValue("base", base, map); putValue("body", body, map); - return JSON.encode(map); + return jsonEncode(map); } } @@ -281,7 +281,7 @@ class CreatePullRequestComment { putValue("commit_id", commitId, map); putValue("path", path, map); putValue("position", position, map); - return JSON.encode(map); + return jsonEncode(map); } } diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart index 7dc7ec1c..b3b6f5bc 100644 --- a/lib/src/common/model/repos.dart +++ b/lib/src/common/model/repos.dart @@ -376,7 +376,7 @@ class CreateRepository { CreateRepository(this.name); String toJSON() { - return JSON.encode({ + return jsonEncode({ "name": name, "description": description, "homepage": homepage, diff --git a/lib/src/common/model/repos_contents.dart b/lib/src/common/model/repos_contents.dart index 87e25f41..3debbec1 100644 --- a/lib/src/common/model/repos_contents.dart +++ b/lib/src/common/model/repos_contents.dart @@ -38,7 +38,7 @@ class GitHubFile { /// Text Content String get text { if (_text == null) { - _text = UTF8.decode(BASE64.decode(content)); + _text = utf8.decode(base64Decode(content)); } return _text; } @@ -121,7 +121,7 @@ class CreateFile { putValue("content", content, map); putValue("branch", branch, map); putValue("committer", committer != null ? committer.toMap() : null, map); - return JSON.encode(map); + return jsonEncode(map); } } diff --git a/lib/src/common/model/repos_forks.dart b/lib/src/common/model/repos_forks.dart index 189455e9..dfd66ca5 100644 --- a/lib/src/common/model/repos_forks.dart +++ b/lib/src/common/model/repos_forks.dart @@ -9,6 +9,6 @@ class CreateFork { String toJSON() { var map = {}; putValue("organization", organization, map); - return JSON.encode(map); + return jsonEncode(map); } } diff --git a/lib/src/common/model/repos_hooks.dart b/lib/src/common/model/repos_hooks.dart index f5d6517b..7b500cde 100644 --- a/lib/src/common/model/repos_hooks.dart +++ b/lib/src/common/model/repos_hooks.dart @@ -64,7 +64,7 @@ class CreateHook { {this.events: const ["push"], this.active: true}); String toJSON() { - return JSON.encode( + return jsonEncode( {"name": name, "config": config, "events": events, "active": active}); } } diff --git a/lib/src/common/model/repos_merging.dart b/lib/src/common/model/repos_merging.dart index 4daa3923..2f090fe1 100644 --- a/lib/src/common/model/repos_merging.dart +++ b/lib/src/common/model/repos_merging.dart @@ -15,6 +15,6 @@ class CreateMerge { putValue("base", base, map); putValue("head", head, map); putValue("commit_message", commitMessage, map); - return JSON.encode(map); + return jsonEncode(map); } } diff --git a/lib/src/common/model/repos_releases.dart b/lib/src/common/model/repos_releases.dart index 12bfa81b..3920bf1d 100644 --- a/lib/src/common/model/repos_releases.dart +++ b/lib/src/common/model/repos_releases.dart @@ -160,6 +160,6 @@ class CreateRelease { putValue("body", body, map); putValue("draft", draft, map); putValue("release", release, map); - return JSON.encode(map); + return jsonEncode(map); } } diff --git a/lib/src/common/model/repos_statuses.dart b/lib/src/common/model/repos_statuses.dart index dc430b33..5af6c219 100644 --- a/lib/src/common/model/repos_statuses.dart +++ b/lib/src/common/model/repos_statuses.dart @@ -65,6 +65,6 @@ class CreateStatus { putValue("target_url", targetUrl, map); putValue("description", description, map); putValue("context", context, map); - return JSON.encode(map); + return jsonEncode(map); } } diff --git a/lib/src/common/orgs_service.dart b/lib/src/common/orgs_service.dart index ee6523cc..21b75077 100644 --- a/lib/src/common/orgs_service.dart +++ b/lib/src/common/orgs_service.dart @@ -71,10 +71,7 @@ class OrganizationsService extends Service { }); return _github.postJSON("/orgs/$org", - statusCode: 200, - convert: Organization.fromJSON, - // TODO: This is probably wrong. Map needs to be json encoded? - body: map); + statusCode: 200, convert: Organization.fromJSON, body: jsonEncode(map)); } /// Lists all of the teams for the specified organization. @@ -106,10 +103,7 @@ class OrganizationsService extends Service { }); return _github.postJSON("/orgs/$org/teams", - statusCode: 201, - convert: Team.fromJSON, - // TODO: This is probably wrong, map needs to be json encoded? - body: map); + statusCode: 201, convert: Team.fromJSON, body: jsonEncode(map)); } /// Edits a Team. @@ -121,10 +115,7 @@ class OrganizationsService extends Service { {"name": name, "description": description, "permission": permission}); return _github.postJSON("/teams/$teamId", - statusCode: 200, - convert: Team.fromJSON, - // TODO: This is probably wrong, map needs to be json encoded? - body: map); + statusCode: 200, convert: Team.fromJSON, body: jsonEncode(map)); } /// Deletes the team specified by the [teamId] @@ -210,7 +201,7 @@ class OrganizationsService extends Service { _github.handleStatusCode(response); } }).then((response) { - return new TeamMembershipState(JSON.decode(response.body)["state"]); + return new TeamMembershipState(jsonDecode(response.body)["state"]); // TODO: Not sure what should go here. }).then(completer.complete); diff --git a/lib/src/common/pulls_service.dart b/lib/src/common/pulls_service.dart index f4e6bb7b..9a03fd10 100644 --- a/lib/src/common/pulls_service.dart +++ b/lib/src/common/pulls_service.dart @@ -25,7 +25,7 @@ class PullRequestsService extends Service { putValue("state", state, params); return new PaginationHelper(_github).objects("GET", - "/repos/${slug.fullName}/pulls?state=${state}", PullRequest.fromJSON, + "/repos/${slug.fullName}/pulls?state=$state", PullRequest.fromJSON, pages: pages, params: params); } @@ -57,10 +57,10 @@ class PullRequestsService extends Service { return _github .request("POST", '/repos/${slug.fullName}/pulls/$number', - body: JSON.encode(map)) + body: jsonEncode(map)) .then((response) { return PullRequest - .fromJSON(JSON.decode(response.body) as Map); + .fromJSON(jsonDecode(response.body) as Map); }); } @@ -102,10 +102,10 @@ class PullRequestsService extends Service { return _github .request("PUT", "/repos/${slug.fullName}/pulls/$number/merge", - body: JSON.encode(json)) + body: jsonEncode(json)) .then((response) { return PullRequestMerge - .fromJSON(JSON.decode(response.body) as Map); + .fromJSON(jsonDecode(response.body) as Map); }); } diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index b9d04943..65d6e666 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -67,7 +67,7 @@ class RepositoriesService extends Service { return new PaginationHelper(_github) .fetchStreamed("GET", "/repositories", pages: pages, params: params) .expand((http.Response response) { - var list = JSON.decode(response.body) as List>; + var list = jsonDecode(response.body) as List>; return list.map((Map it) => Repository.fromJSON(it)); }); @@ -142,9 +142,7 @@ class RepositoriesService extends Service { "default_branch": "defaultBranch" }); return _github.postJSON("/repos/${repo.fullName}", - // TODO: data probably needs to be json encoded? - body: data, - statusCode: 200) as Future; + body: jsonEncode(data), statusCode: 200) as Future; } /// Deletes a repository. @@ -348,7 +346,7 @@ class RepositoriesService extends Service { body: file.toJSON()) .then((response) { return ContentCreation - .fromJSON(JSON.decode(response.body) as Map); + .fromJSON(jsonDecode(response.body) as Map); }); } @@ -362,8 +360,7 @@ class RepositoriesService extends Service { {"message": message, "content": content, "sha": sha, "branch": branch}); return _github.postJSON("/repos/${slug.fullName}/contents/$path", - // TODO: map probably needs to be json encoded - body: map, + body: jsonEncode(map), statusCode: 200, convert: ContentCreation.fromJSON); } @@ -378,10 +375,10 @@ class RepositoriesService extends Service { return _github .request("DELETE", "/repos/${slug.fullName}/contents/$path", - body: JSON.encode(map), statusCode: 200) + body: jsonEncode(map), statusCode: 200) .then((response) { return ContentCreation - .fromJSON(JSON.decode(response.body) as Map); + .fromJSON(jsonDecode(response.body) as Map); }); } diff --git a/lib/src/common/search_service.dart b/lib/src/common/search_service.dart index a2bd0c1a..d774121d 100644 --- a/lib/src/common/search_service.dart +++ b/lib/src/common/search_service.dart @@ -33,7 +33,7 @@ class SearchService extends Service { isFirst = false; - var input = JSON.decode(response.body); + var input = jsonDecode(response.body); if (input['items'] == null) { return; @@ -79,7 +79,7 @@ class SearchService extends Service { isFirst = false; - var input = JSON.decode(response.body); + var input = jsonDecode(response.body); if (input['items'] == null) { return; diff --git a/lib/src/common/users_service.dart b/lib/src/common/users_service.dart index 23e6a56b..d083f6e3 100644 --- a/lib/src/common/users_service.dart +++ b/lib/src/common/users_service.dart @@ -35,10 +35,7 @@ class UsersService extends Service { }); return _github.postJSON("/user", - // TODO: map probably needs to be JSON encoded. - body: map, - statusCode: 200, - convert: CurrentUser.fromJSON); + body: jsonEncode(map), statusCode: 200, convert: CurrentUser.fromJSON); } /// Fetches a list of users specified by [names]. @@ -99,14 +96,14 @@ class UsersService extends Service { Stream addEmails(List emails) => new PaginationHelper(_github).objects( "POST", "/user/emails", UserEmail.fromJSON, - statusCode: 201, body: JSON.encode(emails)); + statusCode: 201, body: jsonEncode(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: JSON.encode(emails), statusCode: 204) + body: jsonEncode(emails), statusCode: 204) .then((x) => x.statusCode == 204); /// List user followers. diff --git a/lib/src/common/util/oauth2.dart b/lib/src/common/util/oauth2.dart index fe4f1b8c..a5cda211 100644 --- a/lib/src/common/util/oauth2.dart +++ b/lib/src/common/util/oauth2.dart @@ -72,7 +72,7 @@ class OAuth2Flow { headers['Origin'] = origin; } - var body = JSON.encode({ + var body = jsonEncode({ "client_id": clientId, "client_secret": clientSecret, "code": code, @@ -82,7 +82,7 @@ class OAuth2Flow { return (github == null ? new http.Client() : github.client) .post("$baseUrl/access_token", body: body, headers: headers) .then((response) { - var json = JSON.decode(response.body) as Map; + var 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 904d7024..9081329e 100644 --- a/lib/src/common/util/pagination.dart +++ b/lib/src/common/util/pagination.dart @@ -76,7 +76,7 @@ class PaginationHelper { params: params, body: body, statusCode: statusCode)) { - var json = JSON.decode(response.body) as List; + var json = jsonDecode(response.body) as List; for (var item in json) { yield item; diff --git a/lib/src/server/hooks.dart b/lib/src/server/hooks.dart index 96972575..9f3fe9a3 100644 --- a/lib/src/server/hooks.dart +++ b/lib/src/server/hooks.dart @@ -28,9 +28,9 @@ class HookMiddleware { request.transform(const Utf8Decoder()).join().then((content) { _eventController.add(new HookEvent.fromJSON( request.headers.value("X-GitHub-Event"), - JSON.decode(content) as Map)); + jsonDecode(content) as Map)); request.response - ..write(JSON.encode({"handled": _eventController.hasListener})) + ..write(jsonEncode({"handled": _eventController.hasListener})) ..close(); }); } diff --git a/pubspec.yaml b/pubspec.yaml index bbb7f5b8..f2d0237b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ author: Kenneth Endfinger description: GitHub API Client Library homepage: https://github.com/DirectMyFile/github.dart environment: - sdk: '>=1.21.0 <2.0.0' + sdk: '>=2.0.0-dev.36 <2.0.0' dependencies: html: '>=0.12.0 <0.14.0' http: '^0.11.3' diff --git a/test/experiment/error_handling.dart b/test/experiment/error_handling.dart index 943cc0ef..80492d28 100644 --- a/test/experiment/error_handling.dart +++ b/test/experiment/error_handling.dart @@ -8,7 +8,7 @@ import '../helper.dart'; void main() { var github = createGitHubClient(); var response = new MockResponse( - JSON.encode({ + jsonEncode({ "message": "Invalid Entity", "errors": [ {"resource": "Issue", "field": "body", "code": "not_found"} diff --git a/test/git_integration_test.dart b/test/git_integration_test.dart index 9caba301..ef99f2af 100644 --- a/test/git_integration_test.dart +++ b/test/git_integration_test.dart @@ -46,9 +46,9 @@ void main() { var fetchedBlob = await github.git.getBlob(slug, createdBlobSha); - var base64Decoded = BASE64.decode(fetchedBlob.content); + var base64Decoded = base64Decode(fetchedBlob.content); - expect(UTF8.decode(base64Decoded), equals('bbb')); + expect(utf8.decode(base64Decoded), equals('bbb')); expect(fetchedBlob.encoding, equals('base64')); expect( fetchedBlob.url, diff --git a/test/git_test.dart b/test/git_test.dart index 439d434e..08bfbee6 100644 --- a/test/git_test.dart +++ b/test/git_test.dart @@ -1,7 +1,7 @@ library github.test.git_test; import 'dart:async'; -import 'dart:convert' show JSON; +import 'dart:convert' show jsonEncode, jsonDecode; import 'package:github/src/common.dart'; import 'package:github/src/util.dart'; @@ -116,7 +116,7 @@ void main() { verify(github.postJSON('/repos/o/n/git/refs', convert: GitReference.fromJSON, statusCode: StatusCodes.CREATED, - body: JSON.encode({'ref': someRef, 'sha': someSha}))); + body: jsonEncode({'ref': someRef, 'sha': someSha}))); }); test('creates valid JSON body', () { @@ -160,7 +160,7 @@ void main() { body: captureAny, headers: typed(captureAny, named: 'headers'))) .captured; - var body = JSON.decode(captured[0]); + var body = jsonDecode(captured[0]); var headers = captured[1]; expect(body['sha'], equals(someSha)); @@ -296,6 +296,6 @@ Map captureSentBody(MockGitHub github) { .captured .single; - var body = JSON.decode(bodyString) as Map; + var body = jsonDecode(bodyString) as Map; return body; } diff --git a/test/helper/http.dart b/test/helper/http.dart index d8668ede..4f6171ef 100644 --- a/test/helper/http.dart +++ b/test/helper/http.dart @@ -2,13 +2,13 @@ part of github.test.helper; final MockHTTPClient httpClient = new MockHTTPClient(); -typedef http.Response ResponseCreator(http.BaseRequest request); +typedef http.StreamedResponse ResponseCreator(http.BaseRequest request); class MockHTTPClient extends http.BaseClient { final Map responses = {}; @override - Future send(http.BaseRequest request) { + Future send(http.BaseRequest request) async { var matchingUrlCreatorKey = responses.keys.firstWhere( (it) => it.allMatches(request.url.toString()).isNotEmpty, orElse: () => null); @@ -17,7 +17,7 @@ class MockHTTPClient extends http.BaseClient { throw new Exception("No Response Configured"); } - return new Future.value(creator(request)); + return creator(request); } } @@ -27,7 +27,7 @@ class MockResponse extends http.Response { factory MockResponse.fromAsset(String name) { Map responseData = - JSON.decode(asset("responses/$name.json").readAsStringSync()) + jsonDecode(asset("responses/$name.json").readAsStringSync()) as Map; Map headers = responseData['headers'] as Map; @@ -35,7 +35,7 @@ class MockResponse extends http.Response { int statusCode = responseData['statusCode']; String actualBody; if (body is Map || body is List) { - actualBody = JSON.decode(body); + actualBody = jsonDecode(body); } else { actualBody = body.toString(); } From 32825ad13f7809067abf7208e9f7c296170b20f5 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Tue, 12 Jun 2018 15:55:09 -0700 Subject: [PATCH 069/496] fix: fix type error in explore_service --- lib/src/common/explore_service.dart | 2 +- lib/src/common/util/pagination.dart | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/src/common/explore_service.dart b/lib/src/common/explore_service.dart index fd6e8a82..f8994539 100644 --- a/lib/src/common/explore_service.dart +++ b/lib/src/common/explore_service.dart @@ -61,7 +61,7 @@ class ExploreService extends Service { var description = page.querySelector(".collection-description"); // TODO: This is most likely wrong - showcase.description = description; + showcase.description = description.text; showcase.lastUpdated = lastUpdated; showcase.title = title; showcase.items = []; diff --git a/lib/src/common/util/pagination.dart b/lib/src/common/util/pagination.dart index 9081329e..fea02a93 100644 --- a/lib/src/common/util/pagination.dart +++ b/lib/src/common/util/pagination.dart @@ -57,7 +57,7 @@ class PaginationHelper { } while (true); } - Stream jsonObjects(String method, String path, + Stream jsonObjects(String method, String path, {int pages, Map headers, Map params, @@ -79,7 +79,7 @@ class PaginationHelper { var json = jsonDecode(response.body) as List; for (var item in json) { - yield item; + yield item as T; } } } From 74dd48b2747e49cea193c7acddafab0d998e98b1 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Fri, 15 Jun 2018 15:29:49 -0700 Subject: [PATCH 070/496] Update generated code for latest release of source_gen --- lib/src/common.g.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/common.g.dart b/lib/src/common.g.dart index b1940566..134982f7 100644 --- a/lib/src/common.g.dart +++ b/lib/src/common.g.dart @@ -3,7 +3,7 @@ part of github.common; // ************************************************************************** -// Generator: JsonSerializableGenerator +// JsonSerializableGenerator // ************************************************************************** GitTree _$GitTreeFromJson(Map json) { From 4e6563ab8480423f5d571a233e52af7e61f47842 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Fri, 9 Mar 2018 18:31:09 -0800 Subject: [PATCH 071/496] add getLicense to repo service --- lib/src/common.g.dart | 99 ++++++++++++++++++++++++ lib/src/common/model/pulls.dart | 2 +- lib/src/common/model/repos.dart | 61 +++++++++++++++ lib/src/common/model/repos_contents.dart | 28 +++---- lib/src/common/repos_service.dart | 4 + test/data_object_test.dart | 44 +++++++++++ 6 files changed, 218 insertions(+), 20 deletions(-) create mode 100644 test/data_object_test.dart diff --git a/lib/src/common.g.dart b/lib/src/common.g.dart index 134982f7..a3015803 100644 --- a/lib/src/common.g.dart +++ b/lib/src/common.g.dart @@ -91,3 +91,102 @@ Branch _$BranchFromJson(Map json) { ? null : new CommitData.fromJson(json['commit'] as Map)); } + +LicenseDetails _$LicenseDetailsFromJson(Map json) { + return new 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 + : new Links.fromJson(json['_links'] as Map), + license: json['license'] == null + ? null + : new LicenseKind.fromJson(json['license'] as Map)); +} + +abstract class _$LicenseDetailsSerializerMixin { + String get name; + String get path; + String get sha; + int get size; + Uri get url; + Uri get htmlUrl; + Uri get gitUrl; + Uri get downloadUrl; + String get type; + String get content; + String get encoding; + Links get links; + LicenseKind get license; + Map toJson() => { + 'name': name, + 'path': path, + 'sha': sha, + 'size': size, + 'url': url?.toString(), + 'html_url': htmlUrl?.toString(), + 'git_url': gitUrl?.toString(), + 'download_url': downloadUrl?.toString(), + 'type': type, + 'content': content, + 'encoding': encoding, + '_links': links, + 'license': license + }; +} + +LicenseKind _$LicenseKindFromJson(Map json) { + return new 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); +} + +abstract class _$LicenseKindSerializerMixin { + String get key; + String get name; + String get spdxId; + Uri get url; + String get nodeId; + Map toJson() => { + 'key': key, + 'name': name, + 'spdx_id': spdxId, + 'url': url?.toString(), + 'node_id': nodeId + }; +} + +Links _$LinksFromJson(Map json) { + return new 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)); +} + +abstract class _$LinksSerializerMixin { + Uri get self; + Uri get git; + Uri get html; + Map toJson() => { + 'self': self?.toString(), + 'git': git?.toString(), + 'html': html?.toString() + }; +} diff --git a/lib/src/common/model/pulls.dart b/lib/src/common/model/pulls.dart index ec0c89a9..a0a07185 100644 --- a/lib/src/common/model/pulls.dart +++ b/lib/src/common/model/pulls.dart @@ -258,7 +258,7 @@ class PullRequestComment { ..updatedAt = parseDateTime(input['updated_at']) ..url = input['html_url'] ..pullRequestUrl = input['pull_request_url'] - ..links = Links.fromJSON(input['_links'] as Map); + ..links = new Links.fromJson(input['_links'] as Map); } } diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart index b3b6f5bc..07715af5 100644 --- a/lib/src/common/model/repos.dart +++ b/lib/src/common/model/repos.dart @@ -453,3 +453,64 @@ class LanguageBreakdown { return buffer.toString(); } } + +@JsonSerializable() +class LicenseDetails extends Object with _$LicenseDetailsSerializerMixin { + final String name; + final String path; + final String sha; + final int size; + final Uri url; + + @JsonKey(name: 'html_url') + final Uri htmlUrl; + @JsonKey(name: 'git_url') + final Uri gitUrl; + @JsonKey(name: 'download_url') + 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, + this.sha, + this.size, + this.url, + this.htmlUrl, + this.gitUrl, + this.downloadUrl, + this.type, + this.content, + this.encoding, + this.links, + this.license}); + + factory LicenseDetails.fromJson(Map json) => + _$LicenseDetailsFromJson(json); +} + +@JsonSerializable() +class LicenseKind extends Object with _$LicenseKindSerializerMixin { + final String key; + final String name; + + @JsonKey(name: 'spdx_id') + final String spdxId; + final Uri url; + + @JsonKey(name: 'node_id') + final String nodeId; + + LicenseKind({this.key, this.name, this.spdxId, this.url, this.nodeId}); + + factory LicenseKind.fromJson(Map json) => + _$LicenseKindFromJson(json); +} diff --git a/lib/src/common/model/repos_contents.dart b/lib/src/common/model/repos_contents.dart index 3debbec1..95586f8c 100644 --- a/lib/src/common/model/repos_contents.dart +++ b/lib/src/common/model/repos_contents.dart @@ -64,33 +64,23 @@ class GitHubFile { ..sha = input['sha'] ..gitUrl = input['git_url'] ..htmlUrl = input['html_url'] - ..links = Links.fromJSON(input['_links'] as Map) + ..links = new Links.fromJson(input['_links'] as Map) ..sourceRepository = slug; } } -/// File links. -class Links { - /// Git Link - @ApiName("git") - String git; +@JsonSerializable() +class Links extends Object with _$LinksSerializerMixin { + final Uri self; + final Uri git; + final Uri html; - /// Self Link - @ApiName("self") - String self; + Links({this.git, this.self, this.html}); - /// HTML Link - @ApiName("html") - String html; - - static Links fromJSON(Map input) { + factory Links.fromJson(Map input) { if (input == null) return null; - var links = new Links(); - links.git = input['git']; - links.self = input['self']; - links.html = input['html']; - return links; + return _$LinksFromJson(input); } } diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 65d6e666..3c774020 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -89,6 +89,10 @@ class RepositoriesService extends Service { } } + Future getLicense(RepositorySlug slug) => + _github.getJSON("/repos/${slug.owner}/${slug.name}/license", + convert: (json) => new LicenseDetails.fromJson(json)); + /// Fetches the repository specified by the [slug]. /// /// API docs: https://developer.github.com/v3/repos/#get diff --git a/test/data_object_test.dart b/test/data_object_test.dart new file mode 100644 index 00000000..76819cec --- /dev/null +++ b/test/data_object_test.dart @@ -0,0 +1,44 @@ +import 'dart:convert'; + +import 'package:test/test.dart'; +import 'package:github/server.dart'; + +final _licenseJson = r''' { + "name": "LICENSE", + "path": "LICENSE", + "sha": "68bcabfb39b7af5a1f5efbb8f651d51e16d60398", + "size": 2500, + "url": "https://api.github.com/repos/dart-lang/sdk/contents/LICENSE?ref=master", + "html_url": "https://github.com/dart-lang/sdk/blob/master/LICENSE", + "git_url": "https://api.github.com/repos/dart-lang/sdk/git/blobs/68bcabfb39b7af5a1f5efbb8f651d51e16d60398", + "download_url": "https://raw.githubusercontent.com/dart-lang/sdk/master/LICENSE", + "type": "file", + "content": "VGhpcyBsaWNlbnNlIGFwcGxpZXMgdG8gYWxsIHBhcnRzIG9mIERhcnQgdGhh\ndCBhcmUgbm90IGV4dGVybmFsbHkKbWFpbnRhaW5lZCBsaWJyYXJpZXMuIFRo\nZSBleHRlcm5hbCBtYWludGFpbmVkIGxpYnJhcmllcyB1c2VkIGJ5CkRhcnQg\nYXJlOgoKNy1aaXAgLSBpbiB0aGlyZF9wYXJ0eS83emlwCkpTQ1JFIC0gaW4g\ncnVudGltZS90aGlyZF9wYXJ0eS9qc2NyZQpBbnQgLSBpbiB0aGlyZF9wYXJ0\neS9hcGFjaGVfYW50CmFyZ3M0aiAtIGluIHRoaXJkX3BhcnR5L2FyZ3M0agpi\nemlwMiAtIGluIHRoaXJkX3BhcnR5L2J6aXAyCkNvbW1vbnMgSU8gLSBpbiB0\naGlyZF9wYXJ0eS9jb21tb25zLWlvCkNvbW1vbnMgTGFuZyBpbiB0aGlyZF9w\nYXJ0eS9jb21tb25zLWxhbmcKRWNsaXBzZSAtIGluIHRoaXJkX3BhcnR5L2Vj\nbGlwc2UKZ3N1dGlsIC0gaW4gdGhpcmRfcGFydHkvZ3N1dGlsCkd1YXZhIC0g\naW4gdGhpcmRfcGFydHkvZ3VhdmEKaGFtY3Jlc3QgLSBpbiB0aGlyZF9wYXJ0\neS9oYW1jcmVzdApIdHRwbGliMiAtIGluIHNhbXBsZXMvdGhpcmRfcGFydHkv\naHR0cGxpYjIKSlNPTiAtIGluIHRoaXJkX3BhcnR5L2pzb24KSlVuaXQgLSBp\nbiB0aGlyZF9wYXJ0eS9qdW5pdApOU1MgLSBpbiB0aGlyZF9wYXJ0eS9uc3Mg\nYW5kIHRoaXJkX3BhcnR5L25ldF9uc3MKT2F1dGggLSBpbiBzYW1wbGVzL3Ro\naXJkX3BhcnR5L29hdXRoMmNsaWVudApTUUxpdGUgLSBpbiB0aGlyZF9wYXJ0\neS9zcWxpdGUKd2ViZXJrbmVjaHQgLSBpbiB0aGlyZF9wYXJ0eS93ZWJlcmtu\nZWNodAp6bGliIC0gaW4gdGhpcmRfcGFydHkvemxpYgpmZXN0IC0gaW4gdGhp\ncmRfcGFydHkvZmVzdAptb2NraXRvIC0gaW4gdGhpcmRfcGFydHkvbW9ja2l0\nbwoKVGhlIGxpYnJhcmllcyBtYXkgaGF2ZSB0aGVpciBvd24gbGljZW5zZXM7\nIHdlIHJlY29tbWVuZCB5b3UgcmVhZCB0aGVtLAphcyB0aGVpciB0ZXJtcyBt\nYXkgZGlmZmVyIGZyb20gdGhlIHRlcm1zIGJlbG93LgoKQ29weXJpZ2h0IDIw\nMTIsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNl\ncnZlZC4KUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp\nbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cm1vZGlmaWNhdGlvbiwgYXJl\nIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0\naW9ucyBhcmUKbWV0OgogICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl\nIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogICAgICBu\nb3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93\naW5nIGRpc2NsYWltZXIuCiAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h\ncnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKICAgICAgY29weXJp\nZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm\nb2xsb3dpbmcKICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlv\nbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCiAgICAgIHdpdGgg\ndGhlIGRpc3RyaWJ1dGlvbi4KICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBH\nb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwogICAgICBjb250cmli\ndXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1\nY3RzIGRlcml2ZWQKICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQg\nc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgpUSElTIFNPRlRX\nQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQg\nQ09OVFJJQlVUT1JTCiJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJ\nRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCkxJTUlURUQgVE8s\nIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO\nRCBGSVRORVNTIEZPUgpBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xB\nSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVApPV05FUiBP\nUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ\nUkVDVCwgSU5DSURFTlRBTCwKU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05T\nRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVApMSU1JVEVE\nIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ\nQ0VTOyBMT1NTIE9GIFVTRSwKREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F\nU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZClRI\nRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD\nVCBMSUFCSUxJVFksIE9SIFRPUlQKKElOQ0xVRElORyBORUdMSUdFTkNFIE9S\nIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF\nCk9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T\nU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCg==\n", + "encoding": "base64", + "_links": { + "self": "https://api.github.com/repos/dart-lang/sdk/contents/LICENSE?ref=master", + "git": "https://api.github.com/repos/dart-lang/sdk/git/blobs/68bcabfb39b7af5a1f5efbb8f651d51e16d60398", + "html": "https://github.com/dart-lang/sdk/blob/master/LICENSE" + }, + "license": { + "key": "other", + "name": "Other", + "spdx_id": null, + "url": null, + "node_id": "MDc6TGljZW5zZTA=" + } +}'''; + +void main() { + test('License round-trip', () { + var licenseJson = jsonDecode(_licenseJson) as Map; + + var instance = new LicenseDetails.fromJson(licenseJson); + + var toJson = instance.toJson(); + + expect(_prettyEncode(toJson), _prettyEncode(licenseJson)); + }); +} + +String _prettyEncode(obj) => const JsonEncoder.withIndent(' ').convert(obj); From 182c2384d1e0feec7643ed1327ced618f8d2d38f Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Thu, 14 Dec 2017 10:54:40 -0800 Subject: [PATCH 072/496] Added getResponseDate helper and add etag for all responses --- lib/src/common.dart | 12 ++++++++++++ lib/src/common/github.dart | 5 ++++- pubspec.yaml | 1 + 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/lib/src/common.dart b/lib/src/common.dart index be4bb25a..e3a7bfe6 100644 --- a/lib/src/common.dart +++ b/lib/src/common.dart @@ -9,6 +9,7 @@ import "dart:convert" import "package:html/dom.dart" as html; import "package:html/parser.dart" as html_parser; import "package:http/http.dart" as http; +import 'package:http_parser/http_parser.dart' as http_parser; import "package:quiver/async.dart" show FutureGroup; import "package:json_annotation/json_annotation.dart"; import "package:xml/xml.dart" as xml; @@ -63,3 +64,14 @@ part "common/util/oauth2.dart"; part "common/util/pagination.dart"; part "common/util/service.dart"; part "common/util/utils.dart"; + +void _applyExpandos(Object target, http.Response response) { + _etagExpando[target] = response.headers['etag']; + _dateExpando[target] = http_parser.parseHttpDate(response.headers['date']); +} + +final _etagExpando = new Expando('etag'); +final _dateExpando = new Expando('date'); + +String getResponseEtag(Object obj) => _etagExpando[obj]; +DateTime getResponseDate(Object obj) => _dateExpando[obj]; diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index 4a381f82..6603fd98 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -237,10 +237,13 @@ class GitHub { var json = jsonDecode(response.body); if (convert == null) { + _applyExpandos(json, response); return json; } - return convert(json); + final returnValue = convert(json); + _applyExpandos(returnValue, response); + return returnValue; } /// Handles Post Requests that respond with JSO diff --git a/pubspec.yaml b/pubspec.yaml index f2d0237b..fce9cb30 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -8,6 +8,7 @@ environment: dependencies: html: '>=0.12.0 <0.14.0' http: '^0.11.3' + http_parser: ^3.1.1 json_annotation: '^0.2.8' quiver: '>=0.20.0 <0.29.0' xml: '>=2.0.0 <4.0.0' From c89c2ba72c647c9514ca2e844fc2fea244dd6415 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Thu, 21 Jun 2018 13:49:37 -0700 Subject: [PATCH 073/496] small dart2 fix (#107) --- lib/src/common/repos_service.dart | 4 ++-- lib/src/common/util/pagination.dart | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 3c774020..f601edbb 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -333,8 +333,8 @@ class RepositoriesService extends Service { } contents.file = GitHubFile.fromJSON(input as Map); } else { - contents.tree = (input as List>) - .map((Map it) => GitHubFile.fromJSON(it)) + contents.tree = (input as List) + .map((it) => GitHubFile.fromJSON(it)) .toList(); } return contents; diff --git a/lib/src/common/util/pagination.dart b/lib/src/common/util/pagination.dart index fea02a93..1a28b42d 100644 --- a/lib/src/common/util/pagination.dart +++ b/lib/src/common/util/pagination.dart @@ -92,7 +92,7 @@ class PaginationHelper { String body, int statusCode: 200, String preview}) { - return jsonObjects(method, path, + return jsonObjects(method, path, pages: pages, headers: headers, params: params, From 1d56949d84228ad54e2520fff51caf9776715a99 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Thu, 19 Jul 2018 14:37:26 -0700 Subject: [PATCH 074/496] remove use of quiver (#109) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also removed benchmark – not maintained --- benchmark/config.dart | 6 --- benchmark/harness.dart | 63 ---------------------------- benchmark/main.dart | 26 ------------ benchmark/repository.dart | 21 ---------- lib/src/common.dart | 1 - lib/src/common/orgs_service.dart | 17 ++------ lib/src/common/repos_service.dart | 30 ++++--------- lib/src/common/users_service.dart | 17 ++------ lib/src/common/util/crawler.dart | 34 ++++++--------- pubspec.yaml | 4 +- test/experiment/directcode_keys.dart | 33 --------------- 11 files changed, 28 insertions(+), 224 deletions(-) delete mode 100644 benchmark/config.dart delete mode 100644 benchmark/harness.dart delete mode 100644 benchmark/main.dart delete mode 100644 benchmark/repository.dart delete mode 100755 test/experiment/directcode_keys.dart diff --git a/benchmark/config.dart b/benchmark/config.dart deleted file mode 100644 index 0bfcaf29..00000000 --- a/benchmark/config.dart +++ /dev/null @@ -1,6 +0,0 @@ -part of github.benchmark; - -final RepositorySlug repositorySlug = - new RepositorySlug("DirectMyFile", "github.dart"); - -final String token = "5fdec2b77527eae85f188b7b2bfeeda170f26883"; diff --git a/benchmark/harness.dart b/benchmark/harness.dart deleted file mode 100644 index ac8438fe..00000000 --- a/benchmark/harness.dart +++ /dev/null @@ -1,63 +0,0 @@ -part of github.benchmark; - -typedef Future Benchmark(); - -class BenchmarkHelper { - static void prettyPrint(Map> results) { - print("Results:"); - results.forEach((name, result) { - int total = - result.map((it) => it.elapsedMilliseconds).reduce((a, b) => a + b); - num avg = total / result.length; - print(" - $name:"); - print(" - Average: ${avg}ms"); - print(" - Times:"); - - for (var resultz in result) { - print(" - ${resultz.elapsedMilliseconds}ms"); - } - }); - } -} - -Future> runBenchmark(int times, Benchmark benchmark) { - var group = new FutureGroup(); - for (var i = 0; i < times; i++) { - group.add(benchmark()); - } - return group.future; -} - -void warmup() { - print("Warming Up"); - int fib(int n) { - if (n < 2) return n; - return fib(n - 1) + fib(n - 2); - } - - for (var i = 1; i <= 5; i++) { - fib(20); - } - - print("Warm Up Complete"); -} - -Future>> runBenchmarks( - int times, Map benchmarks) async { - warmup(); - - var group = new FutureGroup(); - var results = >{}; - benchmarks.forEach((String name, Benchmark benchmark) { - results[name] = []; - for (var i = 0; i < times; i++) { - group.add(benchmark().then((watch) { - results[name].add(watch); - })); - } - }); - - await group.future; - - return results; -} diff --git a/benchmark/main.dart b/benchmark/main.dart deleted file mode 100644 index 96fbcde1..00000000 --- a/benchmark/main.dart +++ /dev/null @@ -1,26 +0,0 @@ -library github.benchmark; - -import "dart:async"; -import "dart:io"; - -import "package:github/server.dart"; - -import "package:quiver/async.dart"; - -part 'repository.dart'; -part 'harness.dart'; -part 'config.dart'; - -GitHub github; - -void main() { - int times = 10; - github = createGitHubClient(auth: new Authentication.withToken(token)); - runBenchmarks(times, { - "Fetch Repository": fetchRepository, - "Fetch Commits": fetchCommits - }).then((results) { - BenchmarkHelper.prettyPrint(results); - exit(0); - }); -} diff --git a/benchmark/repository.dart b/benchmark/repository.dart deleted file mode 100644 index 82ba5d8d..00000000 --- a/benchmark/repository.dart +++ /dev/null @@ -1,21 +0,0 @@ -part of github.benchmark; - -Future fetchRepository() { - var watch = new Stopwatch()..start(); - return github.repositories.getRepository(repositorySlug).then((repo) { - watch.stop(); - return watch; - }); -} - -Future fetchCommits() { - var watch = new Stopwatch()..start(); - - return github.repositories - .listCommits(repositorySlug) - .toList() - .then((commits) { - watch.stop(); - return watch; - }); -} diff --git a/lib/src/common.dart b/lib/src/common.dart index e3a7bfe6..58b2d6f8 100644 --- a/lib/src/common.dart +++ b/lib/src/common.dart @@ -10,7 +10,6 @@ import "package:html/dom.dart" as html; import "package:html/parser.dart" as html_parser; import "package:http/http.dart" as http; import 'package:http_parser/http_parser.dart' as http_parser; -import "package:quiver/async.dart" show FutureGroup; import "package:json_annotation/json_annotation.dart"; import "package:xml/xml.dart" as xml; diff --git a/lib/src/common/orgs_service.dart b/lib/src/common/orgs_service.dart index 21b75077..f9eddfa7 100644 --- a/lib/src/common/orgs_service.dart +++ b/lib/src/common/orgs_service.dart @@ -33,22 +33,11 @@ class OrganizationsService extends Service { }); /// Fetches the organizations specified by [names]. - Stream getMulti(List names) { - var controller = new StreamController(); - - var group = new FutureGroup(); - + Stream getMulti(List names) async* { for (var name in names) { - group.add(get(name).then((org) { - controller.add(org); - })); + var org = await get(name); + yield org; } - - group.future.then((_) { - controller.close(); - }); - - return controller.stream; } /// Edits an Organization diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index f601edbb..2084f7b6 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -106,22 +106,11 @@ class RepositoriesService extends Service { }); /// Fetches a list of repositories specified by [slugs]. - Stream getRepositories(List slugs) { - var controller = new StreamController(); - - var group = new FutureGroup(); - + Stream getRepositories(List slugs) async* { for (var slug in slugs) { - group.add(getRepository(slug).then((repo) { - controller.add(repo); - })); + var repo = await getRepository(slug); + yield repo; } - - group.future.then((_) { - controller.close(); - }); - - return controller.stream; } /// Edit a Repository. @@ -333,9 +322,8 @@ 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).map((it) => GitHubFile.fromJSON(it)).toList(); } return contents; }); @@ -349,8 +337,8 @@ class RepositoriesService extends Service { .request("PUT", "/repos/${slug.fullName}/contents/${file.path}", body: file.toJSON()) .then((response) { - return ContentCreation - .fromJSON(jsonDecode(response.body) as Map); + return ContentCreation.fromJSON( + jsonDecode(response.body) as Map); }); } @@ -381,8 +369,8 @@ class RepositoriesService extends Service { .request("DELETE", "/repos/${slug.fullName}/contents/$path", body: jsonEncode(map), statusCode: 200) .then((response) { - return ContentCreation - .fromJSON(jsonDecode(response.body) as Map); + return ContentCreation.fromJSON( + jsonDecode(response.body) as Map); }); } diff --git a/lib/src/common/users_service.dart b/lib/src/common/users_service.dart index d083f6e3..17f5d23d 100644 --- a/lib/src/common/users_service.dart +++ b/lib/src/common/users_service.dart @@ -39,22 +39,11 @@ class UsersService extends Service { } /// Fetches a list of users specified by [names]. - Stream getUsers(List names, {int pages}) { - var controller = new StreamController(); - - var group = new FutureGroup(); - + Stream getUsers(List names, {int pages}) async* { for (var name in names) { - group.add(getUser(name).then((user) { - controller.add(user); - })); + var user = await getUser(name); + yield user; } - - group.future.then((_) { - controller.close(); - }); - - return controller.stream; } /// Fetches the currently authenticated user. diff --git a/lib/src/common/util/crawler.dart b/lib/src/common/util/crawler.dart index 0ce469c3..32ccd10b 100644 --- a/lib/src/common/util/crawler.dart +++ b/lib/src/common/util/crawler.dart @@ -7,29 +7,19 @@ class RepositoryCrawler { RepositoryCrawler(this.github, this.slug); - Stream crawl() { - var controller = new StreamController(); - - var group = new FutureGroup(); - - void scan(String path) { - group.add(github.repositories.getContents(slug, path).then((contents) { - contents.tree.where((it) => it.type != "dir").forEach(controller.add); - - contents.tree.where((it) { - return it.type == "dir"; - }).forEach((file) { - scan(file.path); - }); - })); + Stream crawl() async* { + Stream scan(String path) async* { + var contents = await github.repositories.getContents(slug, path); + + for (var content in contents.tree) { + if (content.type == 'dir') { + yield* scan(content.path); + } else { + yield content; + } + } } - group.future.then((_) { - return controller.close(); - }); - - scan("/"); - - return controller.stream; + yield* scan("/"); } } diff --git a/pubspec.yaml b/pubspec.yaml index fce9cb30..566287db 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -10,11 +10,9 @@ dependencies: http: '^0.11.3' http_parser: ^3.1.1 json_annotation: '^0.2.8' - quiver: '>=0.20.0 <0.29.0' xml: '>=2.0.0 <4.0.0' dev_dependencies: - browser: '^0.10.0+2' - build_runner: ^0.8.0 + build_runner: ^0.9.0 json_serializable: ^0.5.7 test: '^0.12.0' mockito: '^1.0.1' diff --git a/test/experiment/directcode_keys.dart b/test/experiment/directcode_keys.dart deleted file mode 100755 index a3444f0c..00000000 --- a/test/experiment/directcode_keys.dart +++ /dev/null @@ -1,33 +0,0 @@ -import 'dart:async'; -import "package:github/server.dart"; - -import "package:quiver/async.dart"; - -Future main() async { - var github = createGitHubClient(); - - await github.organizations.get("DirectMyFile").then((organization) { - return github.organizations.listTeams(organization.name).toList(); - }).then((teams) { - var group = new FutureGroup(); - teams.forEach((team) { - group.add(github.organizations.listTeamMembers(team.id).toList()); - }); - return group.future; - }).then((mems) { - return mems.reduce((value, e) { - return new Set()..addAll(value)..addAll(e); - }); - }).then((members) { - var group = new FutureGroup(); - for (TeamMember member in members) { - group.add(github.users.listPublicKeys(member.login).toList().then((keys) { - print("${member.login}:"); - keys.forEach((key) { - print("- ${key.key}"); - }); - })); - } - return group.future; - }).then((_) => github.dispose()); -} From 7849616e093d9bddf24d3e79718757c1a235e09e Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Wed, 25 Jul 2018 19:08:35 -0700 Subject: [PATCH 075/496] Latest source gen, and other fixes (#111) --- analysis_options.yaml | 3 - lib/src/common.g.dart | 83 +++++++++--------------- lib/src/common/git_service.dart | 4 +- lib/src/common/model/authorizations.dart | 4 +- lib/src/common/model/issues.dart | 4 +- lib/src/common/model/orgs.dart | 4 +- lib/src/common/model/repos.dart | 8 ++- lib/src/common/model/repos_contents.dart | 4 +- lib/src/common/pulls_service.dart | 8 +-- pubspec.yaml | 4 +- 10 files changed, 52 insertions(+), 74 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index ba4f9bee..c0f1398c 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1,6 +1,3 @@ -analyzer: - strong-mode: true - linter: rules: - always_declare_return_types diff --git a/lib/src/common.g.dart b/lib/src/common.g.dart index a3015803..93a60dce 100644 --- a/lib/src/common.g.dart +++ b/lib/src/common.g.dart @@ -118,36 +118,22 @@ LicenseDetails _$LicenseDetailsFromJson(Map json) { : new LicenseKind.fromJson(json['license'] as Map)); } -abstract class _$LicenseDetailsSerializerMixin { - String get name; - String get path; - String get sha; - int get size; - Uri get url; - Uri get htmlUrl; - Uri get gitUrl; - Uri get downloadUrl; - String get type; - String get content; - String get encoding; - Links get links; - LicenseKind get license; - Map toJson() => { - 'name': name, - 'path': path, - 'sha': sha, - 'size': size, - 'url': url?.toString(), - 'html_url': htmlUrl?.toString(), - 'git_url': gitUrl?.toString(), - 'download_url': downloadUrl?.toString(), - 'type': type, - 'content': content, - 'encoding': encoding, - '_links': links, - 'license': license - }; -} +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 new LicenseKind( @@ -158,20 +144,14 @@ LicenseKind _$LicenseKindFromJson(Map json) { nodeId: json['node_id'] as String); } -abstract class _$LicenseKindSerializerMixin { - String get key; - String get name; - String get spdxId; - Uri get url; - String get nodeId; - Map toJson() => { - 'key': key, - 'name': name, - 'spdx_id': spdxId, - 'url': url?.toString(), - 'node_id': nodeId - }; -} +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 new Links( @@ -180,13 +160,8 @@ Links _$LinksFromJson(Map json) { html: json['html'] == null ? null : Uri.parse(json['html'] as String)); } -abstract class _$LinksSerializerMixin { - Uri get self; - Uri get git; - Uri get html; - Map toJson() => { - 'self': self?.toString(), - 'git': git?.toString(), - 'html': html?.toString() - }; -} +Map _$LinksToJson(Links instance) => { + 'self': instance.self?.toString(), + 'git': instance.git?.toString(), + 'html': instance.html?.toString() + }; diff --git a/lib/src/common/git_service.dart b/lib/src/common/git_service.dart index ab39621b..b16a7c56 100644 --- a/lib/src/common/git_service.dart +++ b/lib/src/common/git_service.dart @@ -95,8 +95,8 @@ class GitService extends Service { .request('PATCH', '/repos/${slug.fullName}/git/refs/$ref', body: body, headers: headers) .then((response) { - return GitReference - .fromJSON(jsonDecode(response.body) as Map); + return GitReference.fromJSON( + jsonDecode(response.body) as Map); }); } diff --git a/lib/src/common/model/authorizations.dart b/lib/src/common/model/authorizations.dart index cc4db16c..a46e41dd 100644 --- a/lib/src/common/model/authorizations.dart +++ b/lib/src/common/model/authorizations.dart @@ -22,8 +22,8 @@ class Authorization { ..id = input['id'] ..scopes = input['scopes'] as List ..token = input['token'] - ..app = AuthorizationApplication - .fromJSON(input['app'] as Map) + ..app = AuthorizationApplication.fromJSON( + input['app'] as Map) ..note = input['note'] ..noteUrl = input['note_url'] ..createdAt = parseDateTime(input['created_at']) diff --git a/lib/src/common/model/issues.dart b/lib/src/common/model/issues.dart index e56cf837..20e4d041 100644 --- a/lib/src/common/model/issues.dart +++ b/lib/src/common/model/issues.dart @@ -77,8 +77,8 @@ class Issue { ..milestone = Milestone.fromJSON(input['milestone'] as Map) ..commentsCount = input['comments'] - ..pullRequest = IssuePullRequest - .fromJSON(input['pull_request'] as Map) + ..pullRequest = IssuePullRequest.fromJSON( + input['pull_request'] as Map) ..createdAt = parseDateTime(input['created_at']) ..updatedAt = parseDateTime(input['updated_at']) ..closedAt = parseDateTime(input['closed_at']) diff --git a/lib/src/common/model/orgs.dart b/lib/src/common/model/orgs.dart index b5e9d22d..031e0bef 100644 --- a/lib/src/common/model/orgs.dart +++ b/lib/src/common/model/orgs.dart @@ -208,8 +208,8 @@ class TeamRepository extends Repository { ..pushedAt = parseDateTime(input['pushed_at']) ..owner = UserInformation.fromJSON(input['owner'] as Map) ..isPrivate = input['private'] - ..permissions = TeamRepositoryPermissions - .fromJSON(input['permissions'] as Map); + ..permissions = TeamRepositoryPermissions.fromJSON( + input['permissions'] as Map); } } diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart index 07715af5..1d97d025 100644 --- a/lib/src/common/model/repos.dart +++ b/lib/src/common/model/repos.dart @@ -455,7 +455,7 @@ class LanguageBreakdown { } @JsonSerializable() -class LicenseDetails extends Object with _$LicenseDetailsSerializerMixin { +class LicenseDetails { final String name; final String path; final String sha; @@ -495,10 +495,12 @@ class LicenseDetails extends Object with _$LicenseDetailsSerializerMixin { factory LicenseDetails.fromJson(Map json) => _$LicenseDetailsFromJson(json); + + Map toJson() => _$LicenseDetailsToJson(this); } @JsonSerializable() -class LicenseKind extends Object with _$LicenseKindSerializerMixin { +class LicenseKind { final String key; final String name; @@ -513,4 +515,6 @@ class LicenseKind extends Object with _$LicenseKindSerializerMixin { factory LicenseKind.fromJson(Map json) => _$LicenseKindFromJson(json); + + Map toJson() => _$LicenseKindToJson(this); } diff --git a/lib/src/common/model/repos_contents.dart b/lib/src/common/model/repos_contents.dart index 95586f8c..17335263 100644 --- a/lib/src/common/model/repos_contents.dart +++ b/lib/src/common/model/repos_contents.dart @@ -70,7 +70,7 @@ class GitHubFile { } @JsonSerializable() -class Links extends Object with _$LinksSerializerMixin { +class Links { final Uri self; final Uri git; final Uri html; @@ -82,6 +82,8 @@ class Links extends Object with _$LinksSerializerMixin { return _$LinksFromJson(input); } + + Map toJson() => _$LinksToJson(this); } /// Model class for a file or directory. diff --git a/lib/src/common/pulls_service.dart b/lib/src/common/pulls_service.dart index 9a03fd10..2837cd5a 100644 --- a/lib/src/common/pulls_service.dart +++ b/lib/src/common/pulls_service.dart @@ -59,8 +59,8 @@ class PullRequestsService extends Service { .request("POST", '/repos/${slug.fullName}/pulls/$number', body: jsonEncode(map)) .then((response) { - return PullRequest - .fromJSON(jsonDecode(response.body) as Map); + return PullRequest.fromJSON( + jsonDecode(response.body) as Map); }); } @@ -104,8 +104,8 @@ class PullRequestsService extends Service { .request("PUT", "/repos/${slug.fullName}/pulls/$number/merge", body: jsonEncode(json)) .then((response) { - return PullRequestMerge - .fromJSON(jsonDecode(response.body) as Map); + return PullRequestMerge.fromJSON( + jsonDecode(response.body) as Map); }); } diff --git a/pubspec.yaml b/pubspec.yaml index 566287db..02649b79 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -9,10 +9,10 @@ dependencies: html: '>=0.12.0 <0.14.0' http: '^0.11.3' http_parser: ^3.1.1 - json_annotation: '^0.2.8' + json_annotation: '>=0.2.8 <2.0.0' xml: '>=2.0.0 <4.0.0' dev_dependencies: build_runner: ^0.9.0 - json_serializable: ^0.5.7 + json_serializable: ^1.0.0 test: '^0.12.0' mockito: '^1.0.1' From 25a5e78f4cc068f9a3dd544cb2d834ecff336972 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Thu, 16 Aug 2018 12:02:08 -0700 Subject: [PATCH 076/496] 4 commits: dart2 support, latest json_serial, etc (#112) --- lib/src/common.g.dart | 43 ++++++++++++++++----------------- lib/src/common/model/repos.dart | 33 ++++--------------------- pubspec.yaml | 12 ++++----- test/git_test.dart | 12 ++++----- 4 files changed, 37 insertions(+), 63 deletions(-) diff --git a/lib/src/common.g.dart b/lib/src/common.g.dart index 93a60dce..e79eb520 100644 --- a/lib/src/common.g.dart +++ b/lib/src/common.g.dart @@ -7,19 +7,19 @@ part of github.common; // ************************************************************************** GitTree _$GitTreeFromJson(Map json) { - return new GitTree( + return GitTree( json['sha'] as String, json['url'] as String, json['truncated'] as bool, (json['tree'] as List) ?.map((e) => e == null ? null - : new GitTreeEntry.fromJson(e as Map)) + : GitTreeEntry.fromJson(e as Map)) ?.toList()); } GitTreeEntry _$GitTreeEntryFromJson(Map json) { - return new GitTreeEntry( + return GitTreeEntry( json['path'] as String, json['mode'] as String, json['type'] as String, @@ -29,7 +29,7 @@ GitTreeEntry _$GitTreeEntryFromJson(Map json) { } GitHubComparison _$GitHubComparisonFromJson(Map json) { - return new GitHubComparison( + return GitHubComparison( json['url'] as String, json['status'] as String, json['ahead_by'] as int, @@ -38,62 +38,61 @@ GitHubComparison _$GitHubComparisonFromJson(Map json) { } Tag _$TagFromJson(Map json) { - return new Tag( + return Tag( json['name'] as String, json['commit'] == null ? null - : new CommitInfo.fromJson(json['commit'] as Map), + : CommitInfo.fromJson(json['commit'] as Map), json['zipball_url'] as String, json['tarball_url'] as String); } CommitData _$CommitDataFromJson(Map json) { - return new CommitData( + return CommitData( json['sha'] as String, - json['commit'] == null ? null : new GitCommit.fromJson(json['commit']), + json['commit'] == null ? null : GitCommit.fromJson(json['commit']), json['url'] as String, json['html_url'] as String, json['comments_url'] as String, json['author'] == null ? null - : new CommitDataUser.fromJson(json['author'] as Map), + : CommitDataUser.fromJson(json['author'] as Map), json['committer'] == null ? null - : new CommitDataUser.fromJson( - json['committer'] as Map), + : CommitDataUser.fromJson(json['committer'] as Map), (json['parents'] as List) ?.map((e) => e as Map) ?.toList()); } CommitDataUser _$CommitDataUserFromJson(Map json) { - return new CommitDataUser( + return CommitDataUser( json['login'] as String, json['id'] as int, json['type'] as String); } CommitInfo _$CommitInfoFromJson(Map json) { - return new CommitInfo( + return CommitInfo( json['sha'] as String, json['tree'] == null ? null - : new GitTree.fromJson(json['tree'] as Map)); + : GitTree.fromJson(json['tree'] as Map)); } UserInformation _$UserInformationFromJson(Map json) { - return new UserInformation(json['login'] as String, json['id'] as int, + 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 new Branch( + return Branch( json['name'] as String, json['commit'] == null ? null - : new CommitData.fromJson(json['commit'] as Map)); + : CommitData.fromJson(json['commit'] as Map)); } LicenseDetails _$LicenseDetailsFromJson(Map json) { - return new LicenseDetails( + return LicenseDetails( name: json['name'] as String, path: json['path'] as String, sha: json['sha'] as String, @@ -112,10 +111,10 @@ LicenseDetails _$LicenseDetailsFromJson(Map json) { encoding: json['encoding'] as String, links: json['_links'] == null ? null - : new Links.fromJson(json['_links'] as Map), + : Links.fromJson(json['_links'] as Map), license: json['license'] == null ? null - : new LicenseKind.fromJson(json['license'] as Map)); + : LicenseKind.fromJson(json['license'] as Map)); } Map _$LicenseDetailsToJson(LicenseDetails instance) => @@ -136,7 +135,7 @@ Map _$LicenseDetailsToJson(LicenseDetails instance) => }; LicenseKind _$LicenseKindFromJson(Map json) { - return new LicenseKind( + return LicenseKind( key: json['key'] as String, name: json['name'] as String, spdxId: json['spdx_id'] as String, @@ -154,7 +153,7 @@ Map _$LicenseKindToJson(LicenseKind instance) => }; Links _$LinksFromJson(Map json) { - return new Links( + 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)); diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart index 1d97d025..d22524d8 100644 --- a/lib/src/common/model/repos.dart +++ b/lib/src/common/model/repos.dart @@ -1,18 +1,11 @@ part of github.common; -@JsonSerializable(createToJson: false) +@JsonSerializable(createToJson: false, fieldRename: FieldRename.snake) class GitHubComparison { final String url; - final String status; - - @JsonKey(name: 'ahead_by') final int aheadBy; - - @JsonKey(name: 'behind_by') final int behindBy; - - @JsonKey(name: 'total_commits') final int totalCommits; GitHubComparison( @@ -205,7 +198,6 @@ class CloneUrls { class Tag { final String name; final CommitInfo commit; - @JsonKey(name: 'zipball_url') final String zipUrl; @JsonKey(name: 'tarball_url') @@ -220,18 +212,12 @@ class Tag { String toString() => 'Tag: $name'; } -@JsonSerializable(createToJson: false) +@JsonSerializable(createToJson: false, fieldRename: FieldRename.snake) class CommitData { final String sha; final GitCommit commit; - - @JsonKey(name: "url") final String url; - - @JsonKey(name: "html_url") final String htmlUrl; - - @JsonKey(name: "comments_url") final String commentsUrl; final CommitDataUser author, committer; @@ -268,7 +254,7 @@ class CommitInfo { } /// User Information -@JsonSerializable(createToJson: false) +@JsonSerializable(createToJson: false, fieldRename: FieldRename.snake) class UserInformation { /// Owner Username final String login; @@ -277,11 +263,9 @@ class UserInformation { final int id; /// Avatar Url - @JsonKey(name: "avatar_url") final String avatarUrl; /// Url to the user's GitHub Profile - @JsonKey(name: "html_url") final String htmlUrl; UserInformation(this.login, this.id, this.avatarUrl, this.htmlUrl); @@ -454,7 +438,7 @@ class LanguageBreakdown { } } -@JsonSerializable() +@JsonSerializable(fieldRename: FieldRename.snake) class LicenseDetails { final String name; final String path; @@ -462,11 +446,8 @@ class LicenseDetails { final int size; final Uri url; - @JsonKey(name: 'html_url') final Uri htmlUrl; - @JsonKey(name: 'git_url') final Uri gitUrl; - @JsonKey(name: 'download_url') final Uri downloadUrl; final String type; @@ -499,16 +480,12 @@ class LicenseDetails { Map toJson() => _$LicenseDetailsToJson(this); } -@JsonSerializable() +@JsonSerializable(fieldRename: FieldRename.snake) class LicenseKind { final String key; final String name; - - @JsonKey(name: 'spdx_id') final String spdxId; final Uri url; - - @JsonKey(name: 'node_id') final String nodeId; LicenseKind({this.key, this.name, this.spdxId, this.url, this.nodeId}); diff --git a/pubspec.yaml b/pubspec.yaml index 02649b79..b8a61efb 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,15 +4,15 @@ author: Kenneth Endfinger description: GitHub API Client Library homepage: https://github.com/DirectMyFile/github.dart environment: - sdk: '>=2.0.0-dev.36 <2.0.0' + sdk: '>=2.0.0-dev.36 <3.0.0' dependencies: html: '>=0.12.0 <0.14.0' http: '^0.11.3' http_parser: ^3.1.1 - json_annotation: '>=0.2.8 <2.0.0' + json_annotation: ^1.1.0 xml: '>=2.0.0 <4.0.0' dev_dependencies: - build_runner: ^0.9.0 - json_serializable: ^1.0.0 - test: '^0.12.0' - mockito: '^1.0.1' + build_runner: ^0.10.0 + json_serializable: ^1.1.0 + test: ^1.3.0 + mockito: ^3.0.0 diff --git a/test/git_test.dart b/test/git_test.dart index 08bfbee6..238d63ea 100644 --- a/test/git_test.dart +++ b/test/git_test.dart @@ -133,8 +133,7 @@ void main() { // given http.Response expectedResponse = new http.Response('{}', 200); - when(github.request(any, any, - body: any, headers: typed(any, named: 'headers'))) + when(github.request(any, any, body: any, headers: any)) .thenReturn(new Future.value(expectedResponse)); // when @@ -142,22 +141,21 @@ void main() { // then verify(github.request('PATCH', '/repos/o/n/git/refs/heads/b', - headers: typed(any, named: 'headers'), body: any)); + headers: any, body: any)); }); test('creates valid JSON body', () { // given http.Response expectedResponse = new http.Response('{}', 200); - when(github.request(any, any, - body: any, headers: typed(any, named: 'headers'))) + when(github.request(any, any, body: any, headers: any)) .thenReturn(new Future.value(expectedResponse)); // when git.editReference(repo, 'heads/b', someSha, force: true); // then - var captured = verify(github.request(any, any, - body: captureAny, headers: typed(captureAny, named: 'headers'))) + var captured = verify( + github.request(any, any, body: captureAny, headers: captureAny)) .captured; var body = jsonDecode(captured[0]); From c5791e0cd39a7f188afada1c73da3657a696d49e Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Tue, 18 Sep 2018 13:18:17 -0700 Subject: [PATCH 077/496] =?UTF-8?q?5=20commits=20=E2=80=93=C2=A0migrations?= =?UTF-8?q?=20(#113)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Migrate all ApiName usages to JsonKey, remove ApiName * Migrate "User" classes to JsonSerializable, move to it's own library * Move a number of Repo classes to JsonSerializable * Move Pagination to a stand-alone library * Migrate git objects to JsonSerializable --- lib/src/common.dart | 7 +- lib/src/common.g.dart | 184 ++++++++++++++++++++++- lib/src/common/git_service.dart | 4 +- lib/src/common/model/activity.dart | 4 +- lib/src/common/model/authorizations.dart | 2 +- lib/src/common/model/gists.dart | 30 ++-- lib/src/common/model/git.dart | 118 ++++----------- lib/src/common/model/issues.dart | 34 ++--- lib/src/common/model/misc.dart | 6 +- lib/src/common/model/notifications.dart | 4 +- lib/src/common/model/orgs.dart | 73 +++------ lib/src/common/model/pulls.dart | 44 +++--- lib/src/common/model/repos.dart | 102 ++++--------- lib/src/common/model/repos_commits.dart | 12 +- lib/src/common/model/repos_contents.dart | 6 +- lib/src/common/model/repos_hooks.dart | 6 +- lib/src/common/model/repos_merging.dart | 2 +- lib/src/common/model/repos_pages.dart | 2 +- lib/src/common/model/repos_releases.dart | 24 +-- lib/src/common/model/repos_statuses.dart | 2 +- lib/src/common/model/search.dart | 17 +-- lib/src/common/model/users.dart | 109 +++++--------- lib/src/common/model/users.g.dart | 80 ++++++++++ lib/src/common/util/pagination.dart | 25 ++- lib/src/common/util/utils.dart | 8 - lib/src/util.dart | 18 --- test/experiment/link_header.dart | 2 +- test/git_test.dart | 4 +- 28 files changed, 506 insertions(+), 423 deletions(-) create mode 100644 lib/src/common/model/users.g.dart diff --git a/lib/src/common.dart b/lib/src/common.dart index 58b2d6f8..b164e70f 100644 --- a/lib/src/common.dart +++ b/lib/src/common.dart @@ -13,8 +13,13 @@ import 'package:http_parser/http_parser.dart' as http_parser; import "package:json_annotation/json_annotation.dart"; import "package:xml/xml.dart" as xml; +import 'common/model/users.dart'; +import "common/util/pagination.dart"; import 'util.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"; @@ -48,7 +53,6 @@ part "common/model/repos_releases.dart"; part "common/model/repos_stats.dart"; part "common/model/repos_statuses.dart"; part "common/model/search.dart"; -part "common/model/users.dart"; part "common/orgs_service.dart"; part "common/pulls_service.dart"; part "common/repos_service.dart"; @@ -60,7 +64,6 @@ part "common/util/crawler.dart"; part "common/util/errors.dart"; part "common/util/json.dart"; part "common/util/oauth2.dart"; -part "common/util/pagination.dart"; part "common/util/service.dart"; part "common/util/utils.dart"; diff --git a/lib/src/common.g.dart b/lib/src/common.g.dart index e79eb520..06578172 100644 --- a/lib/src/common.g.dart +++ b/lib/src/common.g.dart @@ -6,6 +6,71 @@ 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) { + var 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) { + var val = {}; + + void writeNotNull(String key, dynamic value) { + if (value != null) { + val[key] = value; + } + } + + writeNotNull('name', instance.name); + writeNotNull('email', instance.email); + writeNotNull('date', + instance.date == null ? null : dateToGitHubIso8601(instance.date)); + return val; +} + GitTree _$GitTreeFromJson(Map json) { return GitTree( json['sha'] as String, @@ -28,6 +93,80 @@ GitTreeEntry _$GitTreeEntryFromJson(Map json) { 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['defaultBranch'] 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) + ..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, @@ -37,6 +176,47 @@ GitHubComparison _$GitHubComparisonFromJson(Map json) { 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['defaultBranch'] 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); +} + +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, @@ -50,7 +230,9 @@ Tag _$TagFromJson(Map json) { CommitData _$CommitDataFromJson(Map json) { return CommitData( json['sha'] as String, - json['commit'] == null ? null : GitCommit.fromJson(json['commit']), + json['commit'] == null + ? null + : GitCommit.fromJson(json['commit'] as Map), json['url'] as String, json['html_url'] as String, json['comments_url'] as String, diff --git a/lib/src/common/git_service.dart b/lib/src/common/git_service.dart index b16a7c56..d4823cbd 100644 --- a/lib/src/common/git_service.dart +++ b/lib/src/common/git_service.dart @@ -21,7 +21,7 @@ class GitService extends Service { return _github.postJSON('/repos/${slug.fullName}/git/blobs', convert: GitBlob.fromJSON, statusCode: StatusCodes.CREATED, - body: blob.toJSON()); + body: jsonEncode(blob)); } /// Fetches a commit from [slug] for a given [sha]. @@ -38,7 +38,7 @@ class GitService extends Service { return _github.postJSON('/repos/${slug.fullName}/git/commits', convert: GitCommit.fromJSON, statusCode: StatusCodes.CREATED, - body: commit.toJSON()); + body: jsonEncode(commit)); } /// Fetches a reference from a repository for the given [ref]. diff --git a/lib/src/common/model/activity.dart b/lib/src/common/model/activity.dart index e28667ea..f0a96d78 100644 --- a/lib/src/common/model/activity.dart +++ b/lib/src/common/model/activity.dart @@ -8,7 +8,7 @@ class Event { Organization org; - @ApiName("created_at") + @JsonKey(name: "created_at") DateTime createdAt; String id; @@ -46,7 +46,7 @@ class RepositorySubscription { bool ignored; String reason; - @ApiName("created_at") + @JsonKey(name: "created_at") DateTime createdAt; RepositorySubscription(); diff --git a/lib/src/common/model/authorizations.dart b/lib/src/common/model/authorizations.dart index a46e41dd..8ae95596 100644 --- a/lib/src/common/model/authorizations.dart +++ b/lib/src/common/model/authorizations.dart @@ -38,7 +38,7 @@ class AuthorizationApplication { String url; String name; - @ApiName("client_id") + @JsonKey(name: "client_id") String clientID; AuthorizationApplication(); diff --git a/lib/src/common/model/gists.dart b/lib/src/common/model/gists.dart index 8ba3f86d..29fbbac7 100644 --- a/lib/src/common/model/gists.dart +++ b/lib/src/common/model/gists.dart @@ -9,22 +9,22 @@ class Gist { User user; List files; - @ApiName("html_url") + @JsonKey(name: "html_url") String htmlUrl; - @ApiName("comments") + @JsonKey(name: "comments") int commentsCount; - @ApiName("git_pull_url") + @JsonKey(name: "git_pull_url") String gitPullUrl; - @ApiName("git_push_url") + @JsonKey(name: "git_push_url") String gitPushUrl; - @ApiName("created_at") + @JsonKey(name: "created_at") DateTime createdAt; - @ApiName("updated_at") + @JsonKey(name: "updated_at") DateTime updatedAt; static Gist fromJSON(Map input) { @@ -64,7 +64,7 @@ class GistFile { String name; int size; - @ApiName("raw_url") + @JsonKey(name: "raw_url") String rawUrl; String type; String language; @@ -90,10 +90,10 @@ class GistFork { User user; int id; - @ApiName("created_at") + @JsonKey(name: "created_at") DateTime createdAt; - @ApiName("updated_at") + @JsonKey(name: "updated_at") DateTime updatedAt; static GistFork fromJSON(Map input) { @@ -113,16 +113,16 @@ class GistHistoryEntry { User user; - @ApiName("change_status/deletions") + @JsonKey(name: "change_status/deletions") int deletions; - @ApiName("change_status/additions") + @JsonKey(name: "change_status/additions") int additions; - @ApiName("change_status/total") + @JsonKey(name: "change_status/total") int totalChanges; - @ApiName("committed_at") + @JsonKey(name: "committed_at") DateTime committedAt; static GistHistoryEntry fromJSON(Map input) { @@ -143,10 +143,10 @@ class GistComment { int id; User user; - @ApiName("created_at") + @JsonKey(name: "created_at") DateTime createdAt; - @ApiName("updated_at") + @JsonKey(name: "updated_at") DateTime updatedAt; String body; diff --git a/lib/src/common/model/git.dart b/lib/src/common/model/git.dart index db87ddb2..4ee3f64b 100644 --- a/lib/src/common/model/git.dart +++ b/lib/src/common/model/git.dart @@ -23,21 +23,21 @@ class GitBlob { /// Model class for a new blob to be created. /// /// The [encoding] can be either 'utf-8' or 'base64'. +@JsonSerializable(createFactory: false) class CreateGitBlob { final String content; final String encoding; CreateGitBlob(this.content, this.encoding); - String toJSON() { - return jsonEncode({"content": content, "encoding": encoding}); - } + Map toJson() => _$CreateGitBlobToJson(this); } /// Model class for a git commit. /// /// Note: This is the raw [GitCommit]. The [RepositoryCommit] is a repository /// commit containing GitHub-specific information. +@JsonSerializable(createToJson: false) class GitCommit { String sha; String url; @@ -47,40 +47,13 @@ class GitCommit { GitTree tree; List parents; - @ApiName('comment_count') + @JsonKey(name: 'comment_count') int commentCount; GitCommit(); - factory GitCommit.fromJson(input) { - var commit = new GitCommit() - ..sha = input['sha'] - ..url = input['url'] - ..message = input['message'] - ..commentCount = input['comment_count']; - - if (input['author'] != null) { - commit.author = - GitCommitUser.fromJSON(input['author'] as Map); - } - - if (input['committer'] != null) { - commit.committer = - GitCommitUser.fromJSON(input['committer'] as Map); - } - - if (input['tree'] != null) { - commit.tree = new GitTree.fromJson(input['tree'] as Map); - } - - if (input['parents'] != null) { - commit.parents = (input['parents'] as List>) - .map((Map parent) => GitCommit.fromJSON(parent)) - .toList(); - } - - return commit; - } + factory GitCommit.fromJson(Map json) => + _$GitCommitFromJson(json); static GitCommit fromJSON(Map input) { if (input == null) return null; @@ -90,6 +63,7 @@ class GitCommit { } /// Model class for a new commit to be created. +@JsonSerializable(includeIfNull: false, createFactory: false) class CreateGitCommit { /// The commit message. final String message; @@ -109,49 +83,25 @@ class CreateGitCommit { CreateGitCommit(this.message, this.tree); - String toJSON() { - var map = {}; - putValue('message', message, map); - putValue('tree', tree, map); - putValue('parents', parents, map); - - if (committer != null) { - putValue('committer', committer.toMap(), map); - } - - if (author != null) { - putValue('author', author.toMap(), map); - } - - return jsonEncode(map); - } + Map toJson() => _$CreateGitCommitToJson(this); } /// Model class for an author or committer of a commit. The [GitCommitUser] may /// not correspond to a GitHub [User]. +@JsonSerializable(includeIfNull: false) class GitCommitUser { final String name; final String email; + + @JsonKey(toJson: dateToGitHubIso8601) final DateTime date; GitCommitUser(this.name, this.email, this.date); - static GitCommitUser fromJSON(Map input) { - if (input == null) return null; + factory GitCommitUser.fromJson(Map json) => + _$GitCommitUserFromJson(json); - return new GitCommitUser( - input['name'], input['email'], parseDateTime(input['date'])); - } - - Map toMap() { - var map = {}; - - putValue('name', name, map); - putValue('email', email, map); - putValue('date', dateToGitHubIso8601(date), map); - - return map; - } + Map toJson() => _$GitCommitUserToJson(this); } /// Model class for a GitHub tree. @@ -197,11 +147,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. - @ApiName("base_tree") + @JsonKey(name: "base_tree") String baseTree; /// The Objects specifying a tree structure. - @ApiName("tree") + @JsonKey(name: "tree") final List entries; CreateGitTree(this.entries); @@ -246,6 +196,7 @@ class CreateGitTreeEntry { } /// Model class for a reference. +@JsonSerializable(createToJson: false) class GitReference { String ref; String url; @@ -253,15 +204,12 @@ class GitReference { static GitReference fromJSON(Map input) { if (input == null) return null; - - return new GitReference() - ..ref = input['ref'] - ..url = input['url'] - ..object = GitObject.fromJSON(input['object'] as Map); + return _$GitReferenceFromJson(input); } } /// Model class for a tag. +@JsonSerializable(createToJson: false) class GitTag { String tag; String sha; @@ -272,14 +220,7 @@ class GitTag { static GitTag fromJSON(Map input) { if (input == null) return null; - - return new GitTag() - ..tag = input['tag'] - ..sha = input['sha'] - ..url = input['url'] - ..message = input['message'] - ..tagger = GitCommitUser.fromJSON(input['tagger'] as Map) - ..object = GitObject.fromJSON(input['object'] as Map); + return _$GitTagFromJson(input); } } @@ -300,24 +241,21 @@ class CreateGitTag { putValue('message', message, map); putValue('object', object, map); putValue('type', type, map); - putValue('tagger', tagger.toMap(), map); + putValue('tagger', tagger.toJson(), map); return jsonEncode(map); } } /// Model class for an object referenced by [GitReference] and [GitTag]. +@JsonSerializable(createToJson: false) class GitObject { - String type; - String sha; - String url; + final String type; + final String sha; + final String url; - static GitObject fromJSON(Map input) { - if (input == null) return null; + GitObject(this.type, this.sha, this.url); - return new GitObject() - ..type = input['type'] - ..sha = input['sha'] - ..url = input['url']; - } + factory GitObject.fromJson(Map json) => + _$GitObjectFromJson(json); } diff --git a/lib/src/common/model/issues.dart b/lib/src/common/model/issues.dart index 20e4d041..c044dc4e 100644 --- a/lib/src/common/model/issues.dart +++ b/lib/src/common/model/issues.dart @@ -8,7 +8,7 @@ class Issue { String url; /// Url to the Issue Page - @ApiName("html_url") + @JsonKey(name: "html_url") String htmlUrl; /// Issue Number @@ -33,29 +33,29 @@ class Issue { Milestone milestone; /// Number of Comments - @ApiName("comments") + @JsonKey(name: "comments") int commentsCount; /// A Pull Request - @ApiName("pull_request") + @JsonKey(name: "pull_request") IssuePullRequest pullRequest; /// Time that the issue was created at - @ApiName("created_at") + @JsonKey(name: "created_at") DateTime createdAt; /// The time that the issue was closed at - @ApiName("closed_at") + @JsonKey(name: "closed_at") DateTime closedAt; /// The time that the issue was updated at - @ApiName("updated_at") + @JsonKey(name: "updated_at") DateTime updatedAt; String body; /// The user who closed the issue - @ApiName("closed_by") + @JsonKey(name: "closed_by") User closedBy; static Issue fromJSON(Map input) { @@ -116,15 +116,15 @@ class IssueRequest { /// Model class for a pull request for an issue. class IssuePullRequest { /// Url to the Page for this Issue Pull Request - @ApiName("html_url") + @JsonKey(name: "html_url") String htmlUrl; /// Diff Url - @ApiName("diff_url") + @JsonKey(name: "diff_url") String diffUrl; /// Patch Url - @ApiName("patch_url") + @JsonKey(name: "patch_url") String patchUrl; static IssuePullRequest fromJSON(Map input) { @@ -151,10 +151,10 @@ class IssueComment { String url; - @ApiName("html_url") + @JsonKey(name: "html_url") String htmlUrl; - @ApiName("issue_url") + @JsonKey(name: "issue_url") String issueUrl; static IssueComment fromJSON(Map input) { @@ -216,23 +216,23 @@ class Milestone { User creator; /// Number of Open Issues - @ApiName("open_issues") + @JsonKey(name: "open_issues") int openIssuesCount; /// Number of Closed Issues - @ApiName("closed_issues") + @JsonKey(name: "closed_issues") int closedIssuesCount; /// Time the milestone was created at - @ApiName("created_at") + @JsonKey(name: "created_at") DateTime createdAt; /// The last time the milestone was updated at - @ApiName("updated_at") + @JsonKey(name: "updated_at") DateTime updatedAt; /// The due date for this milestone - @ApiName("due_on") + @JsonKey(name: "due_on") DateTime dueOn; static Milestone fromJSON(Map input) { diff --git a/lib/src/common/model/misc.dart b/lib/src/common/model/misc.dart index 3c995dc2..eeb275d7 100644 --- a/lib/src/common/model/misc.dart +++ b/lib/src/common/model/misc.dart @@ -43,13 +43,13 @@ class RateLimit { class APIStatus { String status; - @ApiName("last_updated") + @JsonKey(name: "last_updated") DateTime lastUpdatedAt; - @ApiName("created_on") + @JsonKey(name: "created_on") DateTime createdOn; - @ApiName("body") + @JsonKey(name: "body") String message; static APIStatus fromJSON(Map input) { diff --git a/lib/src/common/model/notifications.dart b/lib/src/common/model/notifications.dart index 5343bdf2..e186ab14 100644 --- a/lib/src/common/model/notifications.dart +++ b/lib/src/common/model/notifications.dart @@ -8,10 +8,10 @@ class Notification { String reason; bool unread; - @ApiName("updated_at") + @JsonKey(name: "updated_at") DateTime updatedAt; - @ApiName("last_read_at") + @JsonKey(name: "last_read_at") DateTime lastReadAt; static Notification fromJSON(Map input) { diff --git a/lib/src/common/model/orgs.dart b/lib/src/common/model/orgs.dart index 031e0bef..3e7acd2e 100644 --- a/lib/src/common/model/orgs.dart +++ b/lib/src/common/model/orgs.dart @@ -9,11 +9,11 @@ class Organization { int id; /// Url to Organization Profile - @ApiName("html_url") + @JsonKey(name: "html_url") String htmlUrl; /// Url to the Organization Avatar - @ApiName("avatar_url") + @JsonKey(name: "avatar_url") String avatarUrl; /// Organization Name @@ -32,27 +32,27 @@ class Organization { String email; /// Number of Public Repositories - @ApiName("public_repos") + @JsonKey(name: "public_repos") int publicReposCount; /// Number of Public Gists - @ApiName("public_gists") + @JsonKey(name: "public_gists") int publicGistsCount; /// Number of Followers - @ApiName("followers") + @JsonKey(name: "followers") int followersCount; /// Number of People this Organization is Following - @ApiName("following") + @JsonKey(name: "following") int followingCount; /// Time this organization was created - @ApiName("created_at") + @JsonKey(name: "created_at") DateTime createdAt; /// Time this organization was updated - @ApiName("updated_at") + @JsonKey(name: "updated_at") DateTime updatedAt; static Organization fromJSON(Map input) { @@ -104,11 +104,11 @@ class Team { String permission; /// Number of Members - @ApiName("members_count") + @JsonKey(name: "members_count") int membersCount; /// Number of Repositories - @ApiName("repos_count") + @JsonKey(name: "repos_count") int reposCount; /// Organization @@ -147,18 +147,18 @@ class TeamMember { int id; /// Url to Member Avatar - @ApiName("avatar_url") + @JsonKey(name: "avatar_url") String avatarUrl; /// Member Type String type; /// If the member is a site administrator - @ApiName("site_admin") + @JsonKey(name: "site_admin") bool siteAdmin; /// Profile of the Member - @ApiName("html_url") + @JsonKey(name: "html_url") String htmlUrl; static TeamMember fromJSON(Map input) { @@ -176,60 +176,31 @@ class TeamMember { } /// Model class for a team repository. +@JsonSerializable(createToJson: false) class TeamRepository extends Repository { /// Repository Permissions. TeamRepositoryPermissions permissions; static TeamRepository fromJSON(Map input) { if (input == null) return null; - - return new TeamRepository() - ..name = input['name'] - ..id = input['id'] - ..fullName = input['full_name'] - ..isFork = input['fork'] - ..htmlUrl = input['html_url'] - ..description = input['description'] - ..cloneUrls = CloneUrls.fromJSON(input) - ..homepage = input['homepage'] - ..size = input['size'] - ..stargazersCount = input['stargazers_count'] - ..watchersCount = input['watchers_count'] - ..language = input['language'] - ..hasIssues = input['has_issues'] - ..hasDownloads = input['has_downloads'] - ..hasWiki = input['has_wiki'] - ..defaultBranch = input['default_branch'] - ..openIssuesCount = input['open_issues_count'] - ..networkCount = input['network_count'] - ..subscribersCount = input['subscribers_count'] - ..forksCount = input['forks_count'] - ..createdAt = parseDateTime(input['created_at']) - ..pushedAt = parseDateTime(input['pushed_at']) - ..owner = UserInformation.fromJSON(input['owner'] as Map) - ..isPrivate = input['private'] - ..permissions = TeamRepositoryPermissions.fromJSON( - input['permissions'] as Map); + return _$TeamRepositoryFromJson(input); } } /// Model class for team repository permissions. +@JsonSerializable(createToJson: false) class TeamRepositoryPermissions { /// Administrative Access - bool admin; + final bool admin; /// Push Access - bool push; + final bool push; /// Pull Access - bool pull; + final bool pull; - static TeamRepositoryPermissions fromJSON(Map input) { - if (input == null) return null; + TeamRepositoryPermissions(this.admin, this.push, this.pull); - return new TeamRepositoryPermissions() - ..admin = input['admin'] - ..push = input['push'] - ..pull = input['pull']; - } + factory TeamRepositoryPermissions.fromJson(Map json) => + _$TeamRepositoryPermissionsFromJson(json); } diff --git a/lib/src/common/model/pulls.dart b/lib/src/common/model/pulls.dart index a0a07185..7ccfea6b 100644 --- a/lib/src/common/model/pulls.dart +++ b/lib/src/common/model/pulls.dart @@ -6,15 +6,15 @@ class PullRequestInformation { final bool isCompletePullRequest; /// Url to the Pull Request Page - @ApiName("html_url") + @JsonKey(name: "html_url") String htmlUrl; /// Url to the diff for this Pull Request - @ApiName("diff_url") + @JsonKey(name: "diff_url") String diffUrl; /// Url to the patch for this Pull Request - @ApiName("patch_url") + @JsonKey(name: "patch_url") String patchUrl; /// Pull Request Number @@ -30,19 +30,19 @@ class PullRequestInformation { String body; /// Time the pull request was created - @ApiName("created_at") + @JsonKey(name: "created_at") DateTime createdAt; /// Time the pull request was updated - @ApiName("updated_at") + @JsonKey(name: "updated_at") DateTime updatedAt; /// Time the pull request was closed - @ApiName("closed_at") + @JsonKey(name: "closed_at") DateTime closedAt; /// Time the pull request was merged - @ApiName("merged_at") + @JsonKey(name: "merged_at") DateTime mergedAt; /// The Pull Request Head @@ -81,7 +81,7 @@ class PullRequestInformation { /// Model class for a Complete Pull Request. class PullRequest extends PullRequestInformation { - @ApiName("merge_commit_sha") + @JsonKey(name: "merge_commit_sha") String mergeCommitSha; /// If the pull request was merged @@ -91,7 +91,7 @@ class PullRequest extends PullRequestInformation { bool mergeable; /// The user who merged the pull request - @ApiName("merged_by") + @JsonKey(name: "merged_by") User mergedBy; /// Number of comments @@ -209,36 +209,36 @@ class CreatePullRequest { /// Model class for a pull request comment. class PullRequestComment { int id; - @ApiName("diff_hunk") + @JsonKey(name: "diff_hunk") String diffHunk; String path; int position; - @ApiName("original_position") + @JsonKey(name: "original_position") int originalPosition; - @ApiName("commit_id") + @JsonKey(name: "commit_id") String commitID; - @ApiName("original_commit_id") + @JsonKey(name: "original_commit_id") String originalCommitID; User user; String body; - @ApiName("created_at") + @JsonKey(name: "created_at") DateTime createdAt; - @ApiName("updated_at") + @JsonKey(name: "updated_at") DateTime updatedAt; - @ApiName("html_url") + @JsonKey(name: "html_url") String url; - @ApiName("pull_request_url") + @JsonKey(name: "pull_request_url") String pullRequestUrl; - @ApiName("_links") + @JsonKey(name: "_links") Links links; static PullRequestComment fromJSON(Map input) { @@ -266,7 +266,7 @@ class PullRequestComment { class CreatePullRequestComment { String body; - @ApiName("commit_id") + @JsonKey(name: "commit_id") String commitId; String path; @@ -289,11 +289,11 @@ class PullRequestFile { String sha; String filename; String status; - @ApiName("additions") + @JsonKey(name: "additions") int additionsCount; - @ApiName("deletions") + @JsonKey(name: "deletions") int deletionsCount; - @ApiName("changes") + @JsonKey(name: "changes") int changesCount; String blobUrl; String rawUrl; diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart index d22524d8..c3ad0c62 100644 --- a/lib/src/common/model/repos.dart +++ b/lib/src/common/model/repos.dart @@ -31,6 +31,7 @@ class GitHubComparison { } /// Model class for a repository. +@JsonSerializable(createToJson: false) class Repository { /// Repository Name String name; @@ -39,29 +40,29 @@ class Repository { int id; /// Full Repository Name - @ApiName("full_name") + @JsonKey(name: "full_name") String fullName; /// Repository Owner UserInformation owner; /// If the Repository is Private - @ApiName("private") + @JsonKey(name: "private") bool isPrivate; /// If the Repository is a fork - @ApiName("fork") + @JsonKey(name: "fork") bool isFork; /// Url to the GitHub Repository Page - @ApiName("html_url") + @JsonKey(name: "html_url") String htmlUrl; /// Repository Description String description; /// Repository Clone Urls - @ApiName("clone_urls") + @JsonKey(name: "clone_urls") CloneUrls cloneUrls; /// Url to the Repository Homepage @@ -71,87 +72,58 @@ class Repository { int size; /// Repository Stars - @ApiName("stargazers_count") + @JsonKey(name: "stargazers_count") int stargazersCount; /// Repository Watchers - @ApiName("watchers_count") + @JsonKey(name: "watchers_count") int watchersCount; /// Repository Language String language; /// If the Repository has Issues Enabled - @ApiName("has_issues") + @JsonKey(name: "has_issues") bool hasIssues; /// If the Repository has the Wiki Enabled - @ApiName("has_wiki") + @JsonKey(name: "has_wiki") bool hasWiki; /// If the Repository has any Downloads - @ApiName("has_downloads") + @JsonKey(name: "has_downloads") bool hasDownloads; /// Number of Forks - @ApiName("forks_count") + @JsonKey(name: "forks_count") int forksCount; /// Number of Open Issues - @ApiName("open_issues_count") + @JsonKey(name: "open_issues_count") int openIssuesCount; /// Repository Default Branch String defaultBranch; /// Number of Subscribers - @ApiName("subscribers_count") + @JsonKey(name: "subscribers_count") int subscribersCount; /// Number of users in the network - @ApiName("network_count") + @JsonKey(name: "network_count") int networkCount; /// The time the repository was created at - @ApiName("created_at") + @JsonKey(name: "created_at") DateTime createdAt; /// The last time the repository was pushed at - @ApiName("pushed_at") + @JsonKey(name: "pushed_at") DateTime pushedAt; - static Repository fromJSON(Map input, - [Repository instance]) { + static Repository fromJSON(Map input) { if (input == null) return null; - - if (instance == null) instance = new Repository(); - - return instance - ..name = input['name'] - ..id = input['id'] - ..fullName = input['full_name'] - ..isFork = input['fork'] - ..htmlUrl = input['html_url'] - ..description = input['description'] - ..cloneUrls = CloneUrls.fromJSON(input) - ..homepage = input['homepage'] - ..size = input['size'] - ..stargazersCount = input['stargazers_count'] - ..watchersCount = input['watchers_count'] - ..language = input['language'] - ..hasIssues = input['has_issues'] - ..hasDownloads = input['has_downloads'] - ..hasWiki = input['has_wiki'] - ..defaultBranch = input['default_branch'] - ..openIssuesCount = input['open_issues_count'] - ..networkCount = input['network_count'] - ..subscribersCount = input['subscribers_count'] - ..forksCount = input['forks_count'] - ..createdAt = parseDateTime(input['created_at']) - ..pushedAt = parseDateTime(input['pushed_at']) - ..isPrivate = input['private'] - ..owner = - UserInformation.fromJSON(input['owner'] as Map); + return _$RepositoryFromJson(input); } /// Gets the Repository Slug (Full Name). @@ -162,36 +134,32 @@ class Repository { } /// Repository Clone Urls +@JsonSerializable(createToJson: false) class CloneUrls { /// Git Protocol /// /// git://github.com/user/repo.git - String git; + final String git; /// SSH Protocol /// /// git@github.com:user/repo.git - String ssh; + final String ssh; /// HTTPS Protocol /// /// https://github.com/user/repo.git - String https; + final String https; /// Subversion Protocol /// /// https://github.com/user/repo - String svn; + final String svn; - static CloneUrls fromJSON(Map input) { - if (input == null) return null; + CloneUrls(this.git, this.ssh, this.https, this.svn); - return new CloneUrls() - ..git = input['git_url'] - ..ssh = input['ssh_url'] - ..https = input['clone_url'] - ..svn = input['svn_url']; - } + factory CloneUrls.fromJson(Map json) => + _$CloneUrlsFromJson(json); } @JsonSerializable(createToJson: false) @@ -272,12 +240,6 @@ class UserInformation { factory UserInformation.fromJson(Map json) => _$UserInformationFromJson(json); - - static UserInformation fromJSON(Map input) { - if (input == null) return null; - - return new UserInformation.fromJson(input); - } } /// A Repository Slug @@ -329,24 +291,24 @@ class CreateRepository { bool private = false; /// If the repository should have issues enabled. - @ApiName("has_issues") + @JsonKey(name: "has_issues") bool hasIssues = true; /// If the repository should have the wiki enabled. - @ApiName("has_wiki") + @JsonKey(name: "has_wiki") bool hasWiki = true; /// If the repository should have downloads enabled. - @ApiName("has_downloads") + @JsonKey(name: "has_downloads") bool hasDownloads = true; /// The Team ID (Only for Creating a Repository for an Organization) @OnlyWhen("Creating a repository for an organization") - @ApiName("team_id") + @JsonKey(name: "team_id") int teamID; /// If GitHub should auto initialize the repository. - @ApiName("auto_init") + @JsonKey(name: "auto_init") bool autoInit = false; /// .gitignore template (only when [autoInit] is true) diff --git a/lib/src/common/model/repos_commits.dart b/lib/src/common/model/repos_commits.dart index 10dcc0e0..62b300f6 100644 --- a/lib/src/common/model/repos_commits.dart +++ b/lib/src/common/model/repos_commits.dart @@ -13,11 +13,11 @@ class RepositoryCommit { String sha; /// Url to Commit Page - @ApiName("html_url") + @JsonKey(name: "html_url") String htmlUrl; /// Comments url. - @ApiName("comments_url") + @JsonKey(name: "comments_url") String commentsUrl; /// A reference to the raw [GitCommit]. @@ -53,7 +53,7 @@ class RepositoryCommit { if (input['parents'] != null) { commit.parents = (input['parents'] as List>) - .map((parent) => GitCommit.fromJSON(parent)) + .map((parent) => GitCommit.fromJson(parent)) .toList(); } @@ -90,7 +90,7 @@ class CommitStats { /// Model class of a file that was changed in a commit. class CommitFile { - @ApiName("filename") + @JsonKey(name: "filename") String name; int additions; @@ -98,10 +98,10 @@ class CommitFile { int changes; String status; - @ApiName("raw_url") + @JsonKey(name: "raw_url") String rawUrl; - @ApiName("blob_url") + @JsonKey(name: "blob_url") String blobUrl; String patch; diff --git a/lib/src/common/model/repos_contents.dart b/lib/src/common/model/repos_contents.dart index 17335263..ad7527c5 100644 --- a/lib/src/common/model/repos_contents.dart +++ b/lib/src/common/model/repos_contents.dart @@ -24,15 +24,15 @@ class GitHubFile { String sha; /// Url to file - @ApiName("html_url") + @JsonKey(name: "html_url") String htmlUrl; /// Git Url - @ApiName("git_url") + @JsonKey(name: "git_url") String gitUrl; /// Links - @ApiName("_links") + @JsonKey(name: "_links") Links links; /// Text Content diff --git a/lib/src/common/model/repos_hooks.dart b/lib/src/common/model/repos_hooks.dart index 7b500cde..372b415d 100644 --- a/lib/src/common/model/repos_hooks.dart +++ b/lib/src/common/model/repos_hooks.dart @@ -6,7 +6,7 @@ class Hook { List events; /// Content Type - @ApiName("config/content_type") + @JsonKey(name: "config/content_type") String contentType; /// If the hook is active @@ -19,11 +19,11 @@ class Hook { String name; /// The time the hook was created - @ApiName("created_at") + @JsonKey(name: "created_at") DateTime createdAt; /// The last time the hook was updated - @ApiName("updated_at") + @JsonKey(name: "updated_at") DateTime updatedAt; /// The Repository Name diff --git a/lib/src/common/model/repos_merging.dart b/lib/src/common/model/repos_merging.dart index 2f090fe1..019c0765 100644 --- a/lib/src/common/model/repos_merging.dart +++ b/lib/src/common/model/repos_merging.dart @@ -5,7 +5,7 @@ class CreateMerge { final String base; final String head; - @ApiName("commit_message") + @JsonKey(name: "commit_message") String commitMessage; CreateMerge(this.base, this.head); diff --git a/lib/src/common/model/repos_pages.dart b/lib/src/common/model/repos_pages.dart index e1a78d30..e916b619 100644 --- a/lib/src/common/model/repos_pages.dart +++ b/lib/src/common/model/repos_pages.dart @@ -9,7 +9,7 @@ class RepositoryPages { String status; /// If the repo has a custom 404 - @ApiName("custom_404") + @JsonKey(name: "custom_404") bool hasCustom404; static RepositoryPages fromJSON(Map input) { diff --git a/lib/src/common/model/repos_releases.dart b/lib/src/common/model/repos_releases.dart index 3920bf1d..a2b92b69 100644 --- a/lib/src/common/model/repos_releases.dart +++ b/lib/src/common/model/repos_releases.dart @@ -3,26 +3,26 @@ part of github.common; /// Model class for a release. class Release { /// Url to this Release - @ApiName("html_url") + @JsonKey(name: "html_url") String htmlUrl; /// Tarball of the Repository Tree at the commit of this release. - @ApiName("tarball_url") + @JsonKey(name: "tarball_url") String tarballUrl; /// ZIP of the Repository Tree at the commit of this release. - @ApiName("zipball_url") + @JsonKey(name: "zipball_url") String zipballUrl; /// Release ID int id; /// Release Tag Name - @ApiName("tag_name") + @JsonKey(name: "tag_name") String tagName; /// Target Commit - @ApiName("target_commitish") + @JsonKey(name: "target_commitish") String targetCommitsh; /// Release Name @@ -41,11 +41,11 @@ class Release { bool prerelease; /// The time this release was created at. - @ApiName("created_at") + @JsonKey(name: "created_at") DateTime createdAt; /// The time this release was published at. - @ApiName("published_at") + @JsonKey(name: "published_at") DateTime publishedAt; /// The author of this release. @@ -80,7 +80,7 @@ class Release { /// Model class for a release asset. class ReleaseAsset { /// Url to download the asset. - @ApiName("browser_download_url") + @JsonKey(name: "browser_download_url") String browserDownloadUrl; /// Asset ID @@ -96,22 +96,22 @@ class ReleaseAsset { String state; /// Asset Content Type - @ApiName("content_type") + @JsonKey(name: "content_type") String contentType; /// Size of Asset int size; /// Number of Downloads - @ApiName("download_count") + @JsonKey(name: "download_count") int downloadCount; /// Time the asset was created at - @ApiName("created_at") + @JsonKey(name: "created_at") DateTime createdAt; /// Time the asset was last updated - @ApiName("updated_at") + @JsonKey(name: "updated_at") DateTime updatedAt; static ReleaseAsset fromJSON(Map input) { diff --git a/lib/src/common/model/repos_statuses.dart b/lib/src/common/model/repos_statuses.dart index 5af6c219..bc096bf8 100644 --- a/lib/src/common/model/repos_statuses.dart +++ b/lib/src/common/model/repos_statuses.dart @@ -51,7 +51,7 @@ class RepositoryStatus { class CreateStatus { final String state; - @ApiName("target_url") + @JsonKey(name: "target_url") String targetUrl; String description; diff --git a/lib/src/common/model/search.dart b/lib/src/common/model/search.dart index 899e1e14..6cf07f5a 100644 --- a/lib/src/common/model/search.dart +++ b/lib/src/common/model/search.dart @@ -1,10 +1,10 @@ part of github.common; class SearchResults { - @ApiName("total_count") + @JsonKey(name: "total_count") int totalCount; - @ApiName("incomplete_results") + @JsonKey(name: "incomplete_results") bool incompleteResults; List items; @@ -27,16 +27,3 @@ class SearchResults { return results; } } - -abstract class SearchResult { - int score; -} - -class RepositorySearchResult extends Repository with SearchResult { - static RepositorySearchResult fromJSON(Map input) { - var result = new RepositorySearchResult(); - Repository.fromJSON(input, result); - result.score = input['score']; - return result; - } -} diff --git a/lib/src/common/model/users.dart b/lib/src/common/model/users.dart index 7be7dece..5f77e423 100644 --- a/lib/src/common/model/users.dart +++ b/lib/src/common/model/users.dart @@ -1,7 +1,11 @@ -part of github.common; +import "package:json_annotation/json_annotation.dart"; + +part 'users.g.dart'; /// Model class for a user. +@JsonSerializable(createToJson: false) class User { + @JsonKey(ignore: true) Map json; /// User's Username @@ -11,15 +15,15 @@ class User { int id; /// Avatar URL - @ApiName("avatar_url") + @JsonKey(name: "avatar_url") String avatarUrl; /// Url to this user's profile. - @ApiName("html_url") + @JsonKey(name: "html_url") String htmlUrl; /// If the user is a site administrator - @ApiName("site_admin") + @JsonKey(name: "site_admin") bool siteAdmin; /// User's Name @@ -44,27 +48,27 @@ class User { String bio; /// Number of public repositories that this user has - @ApiName("public_repos") + @JsonKey(name: "public_repos") int publicReposCount; /// Number of public gists that this user has - @ApiName("public_gists") + @JsonKey(name: "public_gists") int publicGistsCount; /// Number of followers that this user has - @ApiName("followers") + @JsonKey(name: "followers") int followersCount; /// Number of Users that this user follows - @ApiName("following") + @JsonKey(name: "following") int followingCount; /// The time this [User] was created. - @ApiName("created_at") + @JsonKey(name: "created_at") DateTime createdAt; /// Last time this [User] was updated. - @ApiName("updated_at") + @JsonKey(name: "updated_at") DateTime updatedAt; static User fromJSON(Map input) { @@ -75,41 +79,23 @@ class User { return null; } - return new User() - ..login = input['login'] - ..id = input['id'] - ..avatarUrl = input['avatar_url'] - ..htmlUrl = input['html_url'] - ..bio = input['bio'] - ..name = input['name'] - ..siteAdmin = input['site_admin'] - ..company = input['company'] - ..blog = input['blog'] - ..location = input['location'] - ..email = input['email'] - ..hirable = input['hirable'] - ..publicGistsCount = input['public_gists'] - ..publicReposCount = input['public_repos'] - ..followersCount = input['followers'] - ..followingCount = input['following'] - ..createdAt = parseDateTime(input['created_at']) - ..updatedAt = parseDateTime(input['updated_at']) - ..json = input; + return _$UserFromJson(input)..json = input; } } /// The Currently Authenticated User +@JsonSerializable(createToJson: false) class CurrentUser extends User { /// Number of Private Repositories - @ApiName("total_private_repos") + @JsonKey(name: "total_private_repos") int privateReposCount; /// Number of Owned Private Repositories that the user owns - @ApiName("owned_private_repos") + @JsonKey(name: "owned_private_repos") int ownedPrivateReposCount; /// The User's Disk Usage - @ApiName("disk_usage") + @JsonKey(name: "disk_usage") int diskUsage; /// The User's GitHub Plan @@ -117,35 +103,24 @@ class CurrentUser extends User { static CurrentUser fromJSON(Map input) { if (input == null) return null; - - return new CurrentUser() - ..login = input['login'] - ..id = input['id'] - ..avatarUrl = input['avatar_url'] - ..htmlUrl = input['html_url'] - ..bio = input['bio'] - ..name = input['name'] - ..siteAdmin = input['site_admin'] - ..company = input['company'] - ..blog = input['blog'] - ..location = input['location'] - ..email = input['email'] - ..hirable = input['hirable'] - ..publicGistsCount = input['public_gists'] - ..publicReposCount = input['public_repos'] - ..followersCount = input['followers'] - ..followingCount = input['following'] - ..createdAt = parseDateTime(input['created_at']) - ..updatedAt = parseDateTime(input['updated_at']) - ..privateReposCount = input['total_private_repos'] - ..ownedPrivateReposCount = input['owned_private_repos'] - ..plan = UserPlan.fromJSON(input['plan'] as Map) - ..json = input; + return _$CurrentUserFromJson(input)..json = input; } } /// A Users GitHub Plan +@JsonSerializable(createToJson: false) class UserPlan { + UserPlan(); + + factory UserPlan.fromJson(Map json) => + _$UserPlanFromJson(json); + + @deprecated + static UserPlan fromJSON(Map input) { + if (input == null) return null; + return _$UserPlanFromJson(input); + } + // Plan Name String name; @@ -153,24 +128,16 @@ class UserPlan { int space; // Number of Private Repositories - @ApiName("private_repos") + @JsonKey(name: "private_repos") int privateReposCount; // Number of Collaborators - @ApiName("collaborators") + @JsonKey(name: "collaborators") int collaboratorsCount; - - static UserPlan fromJSON(Map input) { - if (input == null) return null; - return new UserPlan() - ..name = input['name'] - ..space = input['space'] - ..privateReposCount = input['private_repos'] - ..collaboratorsCount = input['collaborators']; - } } /// Model class for a user's email address. +@JsonSerializable(createToJson: false) class UserEmail { String email; bool verified; @@ -178,10 +145,6 @@ class UserEmail { static UserEmail fromJSON(Map input) { if (input == null) return null; - - return new UserEmail() - ..email = input['email'] - ..primary = input['primary'] - ..verified = input['verified']; + return _$UserEmailFromJson(input); } } diff --git a/lib/src/common/model/users.g.dart b/lib/src/common/model/users.g.dart new file mode 100644 index 00000000..df8ef137 --- /dev/null +++ b/lib/src/common/model/users.g.dart @@ -0,0 +1,80 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'users.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +User _$UserFromJson(Map json) { + return User() + ..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); +} + +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) + ..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); +} + +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; +} + +UserEmail _$UserEmailFromJson(Map json) { + return UserEmail() + ..email = json['email'] as String + ..verified = json['verified'] as bool + ..primary = json['primary'] as bool; +} diff --git a/lib/src/common/util/pagination.dart b/lib/src/common/util/pagination.dart index 1a28b42d..61a45637 100644 --- a/lib/src/common/util/pagination.dart +++ b/lib/src/common/util/pagination.dart @@ -1,4 +1,9 @@ -part of github.common; +import "dart:async"; +import "dart:convert" show jsonDecode; + +import "package:http/http.dart" as http; + +import '../../common.dart'; /// Internal Helper for dealing with GitHub Pagination. class PaginationHelper { @@ -102,3 +107,21 @@ class PaginationHelper { .map(converter); } } + +//TODO(kevmoo): use regex here. +Map parseLinkHeader(String input) { + var out = {}; + var parts = input.split(", "); + for (var part in parts) { + if (part[0] != "<") { + throw new FormatException("Invalid Link Header"); + } + var kv = part.split("; "); + var url = kv[0].substring(1); + url = url.substring(0, url.length - 1); + var key = kv[1]; + key = key.replaceAll('"', "").substring(4); + out[key] = url; + } + return out; +} diff --git a/lib/src/common/util/utils.dart b/lib/src/common/util/utils.dart index 01eb08e8..fbe31ba0 100644 --- a/lib/src/common/util/utils.dart +++ b/lib/src/common/util/utils.dart @@ -8,14 +8,6 @@ class NotReadyYet { const NotReadyYet(this.message); } -/// Specifies the original API Field Name -class ApiName { - /// Original API Field Name - final String name; - - const ApiName(this.name); -} - /// Specifies that something should be only used when the specified condition is met. class OnlyWhen { /// Condition diff --git a/lib/src/util.dart b/lib/src/util.dart index 5fc09f13..3edfac1a 100644 --- a/lib/src/util.dart +++ b/lib/src/util.dart @@ -39,24 +39,6 @@ void putValue(String name, dynamic value, Map map) { } } -//TODO(kevmoo): use regex here. -Map parseLinkHeader(String input) { - var out = {}; - var parts = input.split(", "); - for (var part in parts) { - if (part[0] != "<") { - throw new FormatException("Invalid Link Header"); - } - var kv = part.split("; "); - var url = kv[0].substring(1); - url = url.substring(0, url.length - 1); - var key = kv[1]; - key = key.replaceAll('"', "").substring(4); - out[key] = url; - } - return out; -} - List> mapToList(Map input) { var out = >[]; for (var key in input.keys) { diff --git a/test/experiment/link_header.dart b/test/experiment/link_header.dart index 3d750174..33ca393d 100644 --- a/test/experiment/link_header.dart +++ b/test/experiment/link_header.dart @@ -1,4 +1,4 @@ -import 'package:github/src/util.dart'; +import 'package:github/src/common/util/pagination.dart'; void main() { var it = parseLinkHeader( diff --git a/test/git_test.dart b/test/git_test.dart index 238d63ea..024140e6 100644 --- a/test/git_test.dart +++ b/test/git_test.dart @@ -40,7 +40,7 @@ void main() { verify(github.postJSON('/repos/o/n/git/blobs', convert: GitBlob.fromJSON, statusCode: StatusCodes.CREATED, - body: blob.toJSON())); + body: jsonEncode(blob))); }); test('creates valid JSON body', () { @@ -70,7 +70,7 @@ void main() { verify(github.postJSON('/repos/o/n/git/commits', convert: GitCommit.fromJSON, statusCode: StatusCodes.CREATED, - body: commit.toJSON())); + body: jsonEncode(commit))); }); test('creates valid JSON body', () { From 1f50bc7e9dc1cebf190e4229ccb2f3c28b799f83 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Wed, 19 Sep 2018 03:29:08 -0700 Subject: [PATCH 078/496] Fix encoded name of Repository.defaultBranch (#114) --- lib/src/common.g.dart | 4 ++-- lib/src/common/model/repos.dart | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/src/common.g.dart b/lib/src/common.g.dart index 06578172..d70ea812 100644 --- a/lib/src/common.g.dart +++ b/lib/src/common.g.dart @@ -146,7 +146,7 @@ TeamRepository _$TeamRepositoryFromJson(Map json) { ..hasDownloads = json['has_downloads'] as bool ..forksCount = json['forks_count'] as int ..openIssuesCount = json['open_issues_count'] as int - ..defaultBranch = json['defaultBranch'] as String + ..defaultBranch = json['default_branch'] as String ..subscribersCount = json['subscribers_count'] as int ..networkCount = json['network_count'] as int ..createdAt = json['created_at'] == null @@ -201,7 +201,7 @@ Repository _$RepositoryFromJson(Map json) { ..hasDownloads = json['has_downloads'] as bool ..forksCount = json['forks_count'] as int ..openIssuesCount = json['open_issues_count'] as int - ..defaultBranch = json['defaultBranch'] as String + ..defaultBranch = json['default_branch'] as String ..subscribersCount = json['subscribers_count'] as int ..networkCount = json['network_count'] as int ..createdAt = json['created_at'] == null diff --git a/lib/src/common/model/repos.dart b/lib/src/common/model/repos.dart index c3ad0c62..1c2db534 100644 --- a/lib/src/common/model/repos.dart +++ b/lib/src/common/model/repos.dart @@ -103,6 +103,7 @@ class Repository { int openIssuesCount; /// Repository Default Branch + @JsonKey(name: 'default_branch') String defaultBranch; /// Number of Subscribers From 84c68a4d8c227f98765aaee3252b53978066c836 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Mon, 15 Oct 2018 10:32:26 -0700 Subject: [PATCH 079/496] Remove sort_constructors_first lint --- analysis_options.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index c0f1398c..6e26fd11 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -32,7 +32,6 @@ linter: - prefer_is_not_empty - prefer_is_not_empty - slash_for_doc_comments - - sort_constructors_first - sort_unnamed_constructors_first - super_goes_last - test_types_in_equals From a3b3e1a837f4e4f2a529ba8b5a785eb1461d5938 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Mon, 15 Oct 2018 10:39:00 -0700 Subject: [PATCH 080/496] Support latest pkg:http version --- lib/browser.dart | 3 +++ pubspec.yaml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/browser.dart b/lib/browser.dart index 5a3d0c24..3a875d2b 100644 --- a/lib/browser.dart +++ b/lib/browser.dart @@ -14,6 +14,9 @@ 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 new GitHub( auth: auth, client: new BrowserClient(), endpoint: endpoint); } diff --git a/pubspec.yaml b/pubspec.yaml index b8a61efb..f957b8bb 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -7,7 +7,7 @@ environment: sdk: '>=2.0.0-dev.36 <3.0.0' dependencies: html: '>=0.12.0 <0.14.0' - http: '^0.11.3' + http: '>=0.11.3 <0.13.0' http_parser: ^3.1.1 json_annotation: ^1.1.0 xml: '>=2.0.0 <4.0.0' From 55efecc45229eca4779d397552159175504f1195 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Mon, 15 Oct 2018 10:45:37 -0700 Subject: [PATCH 081/496] Remove services requiring HTML parsing Not exposed via a regular API - likely fragile --- CHANGELOG.md | 2 + lib/src/common.dart | 4 - lib/src/common/explore_service.dart | 143 ---------------------------- lib/src/common/github.dart | 9 -- lib/src/common/misc_service.dart | 33 ------- lib/src/common/model/explore.dart | 26 ----- pubspec.yaml | 1 - test/experiment/showcases.dart | 9 -- test/experiment/trending.dart | 9 -- 9 files changed, 2 insertions(+), 234 deletions(-) delete mode 100644 lib/src/common/explore_service.dart delete mode 100644 lib/src/common/model/explore.dart delete mode 100755 test/experiment/showcases.dart delete mode 100644 test/experiment/trending.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e55015d..a7617836 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ - Initial support for comparing commits. - Require at least Dart `2.0.0-dev.36`. - Fix a number of type issues dealing with JSON. +- *BREAKING* Removed `ExploreService` – `GitHub.explore`. +- *BREAKING* Removed `MiscService.listOctodex`. ## v3.0.0 diff --git a/lib/src/common.dart b/lib/src/common.dart index b164e70f..2499e7dc 100644 --- a/lib/src/common.dart +++ b/lib/src/common.dart @@ -6,8 +6,6 @@ import "dart:async"; import "dart:convert" show base64Decode, base64Encode, jsonEncode, jsonDecode, LineSplitter, utf8; -import "package:html/dom.dart" as html; -import "package:html/parser.dart" as html_parser; import "package:http/http.dart" as http; import 'package:http_parser/http_parser.dart' as http_parser; import "package:json_annotation/json_annotation.dart"; @@ -24,7 +22,6 @@ part "common.g.dart"; part "common/activity_service.dart"; part "common/authorizations_service.dart"; part "common/blog_service.dart"; -part "common/explore_service.dart"; part "common/gists_service.dart"; part "common/git_service.dart"; part "common/github.dart"; @@ -33,7 +30,6 @@ part "common/misc_service.dart"; part "common/model/activity.dart"; part "common/model/authorizations.dart"; part "common/model/blog.dart"; -part "common/model/explore.dart"; part "common/model/gists.dart"; part "common/model/git.dart"; part "common/model/issues.dart"; diff --git a/lib/src/common/explore_service.dart b/lib/src/common/explore_service.dart deleted file mode 100644 index f8994539..00000000 --- a/lib/src/common/explore_service.dart +++ /dev/null @@ -1,143 +0,0 @@ -part of github.common; - -/// The [ExploreService] provides methods for exploring GitHub. -/// -/// API docs: https://github.com/explore -class ExploreService extends Service { - ExploreService(GitHub github) : super(github); - - Stream listTrendingRepositories( - {String language, String since: "daily"}) { - var url = "https://github.com/trending"; - - if (language != null) url += "?l=$language"; - - if (since != null) - url += language == null ? "?since=$since" : "&since=$since"; - - var controller = new StreamController(); - - _github.client.get(url).then((response) { - var doc = html_parser.parse(response.body); - var items = doc.querySelectorAll( - "li.repo-leaderboard-list-item.leaderboard-list-item"); - - for (var item in items) { - var repo = new TrendingRepository(); - repo.rank = item.querySelector("a.leaderboard-list-rank").text; - repo.titleObject = - item.querySelector("h2.repo-leaderboard-title").querySelector("a"); - var desc = item.querySelector("p.repo-leaderboard-description"); - - if (desc == null) { - repo.description = "No Description"; - } else { - repo.description = desc.text; - } - - controller.add(repo); - } - - controller.close(); - }); - - return controller.stream; - } - - Future getShowcase(ShowcaseInfo info) { - var completer = new Completer(); - - _github.client.get(info.url).then((response) { - var doc = html_parser.parse(response.body); - var showcase = new Showcase(); - - var title = doc.querySelector(".collection-header").text; - var lastUpdated = parseDateTime(doc - .querySelector(".meta-info.last-updated") - .querySelector("time") - .attributes['datetime']); - var page = doc.querySelector(".collection-page"); - - var description = page.querySelector(".collection-description"); - - // TODO: This is most likely wrong - showcase.description = description.text; - showcase.lastUpdated = lastUpdated; - showcase.title = title; - showcase.items = []; - - var repos = page.querySelectorAll(".collection-repo"); - - for (var repo in repos) { - var repoTitle = repo.querySelector(".collection-repo-title"); - var path = repoTitle.querySelector("a").attributes['href']; - var url = "https://githb.com$path"; - var name = path.substring(1); - - var item = new ShowcaseItem(); - - item.name = name; - - item.url = url; - - showcase.items.add(item); - } - - completer.complete(showcase); - }); - - return completer.future; - } - - Stream listShowcases() { - var controller = new StreamController(); - - Function handleResponse; - - handleResponse = (response) { - var doc = html_parser.parse(response.body); - - var cards = doc.querySelectorAll(".collection-card"); - - for (var card in cards) { - var title = card.querySelector(".collection-card-title").text; - var description = card.querySelector(".collection-card-body").text; - var img = card.querySelector(".collection-card-image"); - var url = "https://github.com" + img.attributes['href']; - - var showcase = new ShowcaseInfo(); - - showcase - ..title = title - ..description = description - ..url = url; - - controller.add(showcase); - } - - var pag = doc.querySelector(".pagination"); - - var links = pag.querySelectorAll("a"); - - bool didFetchMore = false; - - for (var link in links) { - if (link.text.contains("Next")) { - didFetchMore = true; - - var client = new http.Client(); - - client.get(link.attributes['href']).then(handleResponse); - } - } - - if (!didFetchMore) { - controller.close(); - } - }; - - _github.client.get("https://github.com/showcases").then(handleResponse); - - return controller.stream; - } -} diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index 6603fd98..bed6e5c8 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -26,7 +26,6 @@ class GitHub { ActivityService _activity; AuthorizationsService _authorizations; BlogService _blog; - ExploreService _explore; GistsService _gists; GitService _git; IssuesService _issues; @@ -103,14 +102,6 @@ class GitHub { return _blog; } - /// Service to explore GitHub. - ExploreService get explore { - if (_explore == null) { - _explore = new ExploreService(this); - } - return _explore; - } - /// Service for gist related methods of the GitHub API. GistsService get gists { if (_gists == null) { diff --git a/lib/src/common/misc_service.dart b/lib/src/common/misc_service.dart index 92916851..03d97cd2 100644 --- a/lib/src/common/misc_service.dart +++ b/lib/src/common/misc_service.dart @@ -65,39 +65,6 @@ class MiscService extends Service { _github.getJSON("https://status.github.com/api/status.json", statusCode: StatusCodes.OK, convert: APIStatus.fromJSON); - /// Returns a stream of Octocats from Octodex. - /// - /// See: https://octodex.github.com/ - Stream listOctodex({bool cors: false}) { - var controller = new StreamController(); - - var u = "http://feeds.feedburner.com/Octocats.xml"; - - _github.client - .get( - "${cors ? "http://whateverorigin.org/get?url=" : ""}${cors ? Uri.encodeComponent(u) : u}") - .then((response) { - var document = html_parser.parse(response.body); - document.querySelectorAll("entry").forEach((entry) { - var name = entry.querySelector("title").text; - var c = "" + - entry.querySelector("content").innerHtml + - ""; - var content = html_parser.parse(c); - var image = content.querySelector("a img").attributes['src']; - var url = entry.querySelector("link").attributes['href']; - - controller.add(new Octocat() - ..image = image - ..name = name - ..url = url); - }); - return controller.close(); - }); - - return controller.stream; - } - /// Returns an ASCII Octocat with the specified [text]. Future getOctocat([String text]) { var params = {}; diff --git a/lib/src/common/model/explore.dart b/lib/src/common/model/explore.dart deleted file mode 100644 index fdb3ff70..00000000 --- a/lib/src/common/model/explore.dart +++ /dev/null @@ -1,26 +0,0 @@ -part of github.common; - -class TrendingRepository { - String rank; - html.Element titleObject; - String get title => titleObject.text; - - String get url => "https://github.com/$title"; - String description; -} - -class ShowcaseInfo { - String title; - String description; - String url; -} - -class Showcase extends ShowcaseInfo { - DateTime lastUpdated; - List items; -} - -class ShowcaseItem { - String name; - String url; -} diff --git a/pubspec.yaml b/pubspec.yaml index f957b8bb..481e2f89 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -6,7 +6,6 @@ homepage: https://github.com/DirectMyFile/github.dart environment: sdk: '>=2.0.0-dev.36 <3.0.0' dependencies: - html: '>=0.12.0 <0.14.0' http: '>=0.11.3 <0.13.0' http_parser: ^3.1.1 json_annotation: ^1.1.0 diff --git a/test/experiment/showcases.dart b/test/experiment/showcases.dart deleted file mode 100755 index 76aca0c4..00000000 --- a/test/experiment/showcases.dart +++ /dev/null @@ -1,9 +0,0 @@ -import "package:github/server.dart"; - -void main() { - var github = createGitHubClient(); - - github.explore.listShowcases().listen((info) { - print("- ${info.title}"); - }).onDone(() => github.dispose()); -} diff --git a/test/experiment/trending.dart b/test/experiment/trending.dart deleted file mode 100644 index ff14fd58..00000000 --- a/test/experiment/trending.dart +++ /dev/null @@ -1,9 +0,0 @@ -import "package:github/server.dart"; - -void main() { - var github = createGitHubClient(); - - github.explore - .listTrendingRepositories(language: "Dart", since: "month") - .listen((repo) => print("${repo.title}: ${repo.description}")); -} From cb8fb9e5e984f34e1d303ab81a60c1af6b4c2f0c Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Mon, 15 Oct 2018 10:47:53 -0700 Subject: [PATCH 082/496] Remove services requiring XML parsing Not exposed via a regular API - likely fragile --- CHANGELOG.md | 1 + lib/src/common.dart | 3 --- lib/src/common/blog_service.dart | 24 --------------------- lib/src/common/github.dart | 9 -------- lib/src/common/model/blog.dart | 36 -------------------------------- pubspec.yaml | 1 - test/experiment/blog.dart | 9 -------- 7 files changed, 1 insertion(+), 82 deletions(-) delete mode 100644 lib/src/common/blog_service.dart delete mode 100644 lib/src/common/model/blog.dart delete mode 100755 test/experiment/blog.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index a7617836..3af46cf4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - Fix a number of type issues dealing with JSON. - *BREAKING* Removed `ExploreService` – `GitHub.explore`. - *BREAKING* Removed `MiscService.listOctodex`. +- *BREAKING* Removed `BlogService` - `GitHub.blog`. ## v3.0.0 diff --git a/lib/src/common.dart b/lib/src/common.dart index 2499e7dc..129ef6a8 100644 --- a/lib/src/common.dart +++ b/lib/src/common.dart @@ -9,7 +9,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:xml/xml.dart" as xml; import 'common/model/users.dart'; import "common/util/pagination.dart"; @@ -21,7 +20,6 @@ export "common/util/pagination.dart"; part "common.g.dart"; part "common/activity_service.dart"; part "common/authorizations_service.dart"; -part "common/blog_service.dart"; part "common/gists_service.dart"; part "common/git_service.dart"; part "common/github.dart"; @@ -29,7 +27,6 @@ part "common/issues_service.dart"; part "common/misc_service.dart"; part "common/model/activity.dart"; part "common/model/authorizations.dart"; -part "common/model/blog.dart"; part "common/model/gists.dart"; part "common/model/git.dart"; part "common/model/issues.dart"; diff --git a/lib/src/common/blog_service.dart b/lib/src/common/blog_service.dart deleted file mode 100644 index a8477c46..00000000 --- a/lib/src/common/blog_service.dart +++ /dev/null @@ -1,24 +0,0 @@ -part of github.common; - -/// The [BlogService] provides methods to retrieve blog posts from GitHub. -class BlogService extends Service { - BlogService(GitHub github) : super(github); - - /// Returns a stream of blog posts for the specified [url]. - Stream listPosts([String url = "https://github.com/blog.atom"]) { - var controller = new StreamController(); - _github.client.get(url).then((response) { - var document = xml.parse(response.body); - - var entries = document.rootElement.findElements("entry"); - - for (var entry in entries) { - controller.add(BlogPost.fromXML(entry)); - } - - controller.close(); - }); - - return controller.stream; - } -} diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index bed6e5c8..9c5dabad 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -25,7 +25,6 @@ class GitHub { ActivityService _activity; AuthorizationsService _authorizations; - BlogService _blog; GistsService _gists; GitService _git; IssuesService _issues; @@ -94,14 +93,6 @@ class GitHub { return _authorizations; } - /// Service to retrieve blog posts. - BlogService get blog { - if (_blog == null) { - _blog = new BlogService(this); - } - return _blog; - } - /// Service for gist related methods of the GitHub API. GistsService get gists { if (_gists == null) { diff --git a/lib/src/common/model/blog.dart b/lib/src/common/model/blog.dart deleted file mode 100644 index 0efe91bc..00000000 --- a/lib/src/common/model/blog.dart +++ /dev/null @@ -1,36 +0,0 @@ -part of github.common; - -/// Model class for a blog post. -class BlogPost { - DateTime publishedAt; - DateTime updatedAt; - - String title; - String url; - String category; - String content; - String author; - - static BlogPost fromXML(xml.XmlElement node) { - var children = node.children; - - xml.XmlElement query(String tagName) => children - .firstWhere((it) => it is xml.XmlElement && it.name.local == tagName); - - var title = query("title").text; - var content = query("content").text; - var link = query("link").getAttribute("href"); - var category = query("category").text; - var author = query("author").children[0].text; - - var post = new BlogPost(); - - post.author = author; - post.title = title; - post.content = content; - post.category = category; - post.url = link; - - return post; - } -} diff --git a/pubspec.yaml b/pubspec.yaml index 481e2f89..f52f0ccd 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -9,7 +9,6 @@ dependencies: http: '>=0.11.3 <0.13.0' http_parser: ^3.1.1 json_annotation: ^1.1.0 - xml: '>=2.0.0 <4.0.0' dev_dependencies: build_runner: ^0.10.0 json_serializable: ^1.1.0 diff --git a/test/experiment/blog.dart b/test/experiment/blog.dart deleted file mode 100755 index 82f03b41..00000000 --- a/test/experiment/blog.dart +++ /dev/null @@ -1,9 +0,0 @@ -import "package:github/server.dart"; - -void main() { - var github = createGitHubClient(); - - github.blog.listPosts().listen((post) { - print(post.title); - }).onDone(() => github.dispose()); -} From 81da51a330c93fc8893599d16504f0ce90e67d33 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Mon, 15 Oct 2018 10:53:35 -0700 Subject: [PATCH 083/496] support latest build_runner version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index f52f0ccd..5a6c613d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -10,7 +10,7 @@ dependencies: http_parser: ^3.1.1 json_annotation: ^1.1.0 dev_dependencies: - build_runner: ^0.10.0 + build_runner: ^1.0.0 json_serializable: ^1.1.0 test: ^1.3.0 mockito: ^3.0.0 From d8d9eb20f3aea3abbf908550fe970f585d7e3c39 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Thu, 18 Oct 2018 13:45:33 -0600 Subject: [PATCH 084/496] Add .travis.yml --- .travis.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..852e00a4 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,11 @@ +language: dart +sudo: required +addons: + chrome: stable +dart: + - stable +dart_task: + - test: --platform vm + - test: --platform chrome + - dartanalyzer: lib example test + - dartfmt: true From d55add9b144095cd22be7345ba102d020837bee2 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Thu, 18 Oct 2018 13:53:50 -0600 Subject: [PATCH 085/496] comment out tests for now --- .travis.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 852e00a4..c6c96925 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,8 @@ addons: dart: - stable dart_task: - - test: --platform vm - - test: --platform chrome + # TODO enable once tests are working + # - test: --platform vm + # - test: --platform chrome - dartanalyzer: lib example test - dartfmt: true From a95de753150f78035030eb7c494d944fa7508e73 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Thu, 18 Oct 2018 14:57:18 -0600 Subject: [PATCH 086/496] avoid broken things in master --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index c6c96925..e89347f1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,8 +5,8 @@ addons: dart: - stable dart_task: - # TODO enable once tests are working + # TODO enable once automated tests are working # - test: --platform vm # - test: --platform chrome - - dartanalyzer: lib example test + - dartanalyzer: lib test # TODO fix examples and add example dir - dartfmt: true From 5070a07fc4db783ca34123f48fea894d54bc1ea7 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Thu, 25 Oct 2018 08:43:41 -0700 Subject: [PATCH 087/496] Update to latest json_ packages (#117) --- lib/src/common.g.dart | 4 ++-- pubspec.yaml | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/src/common.g.dart b/lib/src/common.g.dart index d70ea812..2cad0091 100644 --- a/lib/src/common.g.dart +++ b/lib/src/common.g.dart @@ -34,7 +34,7 @@ GitCommit _$GitCommitFromJson(Map json) { } Map _$CreateGitCommitToJson(CreateGitCommit instance) { - var val = {}; + final val = {}; void writeNotNull(String key, dynamic value) { if (value != null) { @@ -56,7 +56,7 @@ GitCommitUser _$GitCommitUserFromJson(Map json) { } Map _$GitCommitUserToJson(GitCommitUser instance) { - var val = {}; + final val = {}; void writeNotNull(String key, dynamic value) { if (value != null) { diff --git a/pubspec.yaml b/pubspec.yaml index 5a6c613d..f1b5853d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,13 +4,13 @@ author: Kenneth Endfinger description: GitHub API Client Library homepage: https://github.com/DirectMyFile/github.dart environment: - sdk: '>=2.0.0-dev.36 <3.0.0' + sdk: '>=2.0.0 <3.0.0' dependencies: http: '>=0.11.3 <0.13.0' http_parser: ^3.1.1 - json_annotation: ^1.1.0 + json_annotation: ^2.0.0 dev_dependencies: build_runner: ^1.0.0 - json_serializable: ^1.1.0 + json_serializable: ^2.0.0 test: ^1.3.0 mockito: ^3.0.0 From 6c3c051a36fad9c4ab67cf2b7322a92ab62e5389 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Tue, 6 Nov 2018 11:20:18 -0700 Subject: [PATCH 088/496] Update version for 4.0.0 release --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index f1b5853d..4780ed1f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 4.0.0-dev +version: 4.0.0 author: Kenneth Endfinger description: GitHub API Client Library homepage: https://github.com/DirectMyFile/github.dart From fb5630900009811be72ec76e57239a3667ca16fc Mon Sep 17 00:00:00 2001 From: Phil Quitslund Date: Mon, 19 Nov 2018 06:23:39 -0800 Subject: [PATCH 089/496] update version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ddb1eaed..3d0b9f27 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ First, add the following to your pubspec.yaml: ```yaml dependencies: - github: "^3.0.0" + github: "^4.0.0" ``` Then import the library and use it: From 2729e2236392dece265f1c399d7aa68f143c6a55 Mon Sep 17 00:00:00 2001 From: Phil Quitslund Date: Mon, 19 Nov 2018 06:25:53 -0800 Subject: [PATCH 090/496] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3d0b9f27..b42f8d3b 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ First, add the following to your pubspec.yaml: ```yaml dependencies: - github: "^4.0.0" + github: ^4.0.0 ``` Then import the library and use it: From c42eda95f0046d448789240dbdf854678d4c4439 Mon Sep 17 00:00:00 2001 From: Phil Quitslund Date: Tue, 11 Dec 2018 07:23:53 -0800 Subject: [PATCH 091/496] de-dup lints (#125) --- analysis_options.yaml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index 6e26fd11..0395b8f5 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -8,7 +8,6 @@ linter: - avoid_return_types_on_setters - await_only_futures - camel_case_types - - camel_case_types - close_sinks - comment_references # - constant_identifier_names @@ -16,7 +15,6 @@ linter: - directives_ordering - empty_catches - empty_constructor_bodies - - empty_constructor_bodies - empty_statements - hash_and_equals - implementation_imports @@ -30,13 +28,11 @@ linter: - package_names - package_prefixed_library_names - prefer_is_not_empty - - prefer_is_not_empty - slash_for_doc_comments - sort_unnamed_constructors_first - super_goes_last - test_types_in_equals - throw_in_finally - - throw_in_finally - type_annotate_public_apis - type_init_formals - unawaited_futures From b538795e1f84e191353b0e6cf0742a265ab7112e Mon Sep 17 00:00:00 2001 From: Phil Quitslund Date: Sat, 22 Dec 2018 12:21:07 -0800 Subject: [PATCH 092/496] add badges --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index ddb1eaed..f8d02996 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,8 @@ # GitHub for Dart +[![Build Status](https://travis-ci.org/DirectMyFile/github.dart.svg?branch=master)](https://travis-ci.org/DirectMyFile/github.dart) +[![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. Please submit issues and pull requests, join my IRC channel (#directcode on irc.esper.net), help out, or just give me encouragement. From 0bc98cdbc3d1d76e0baaa0d3b9d0d42aab1ab3c5 Mon Sep 17 00:00:00 2001 From: Phil Quitslund Date: Sat, 22 Dec 2018 13:22:47 -0800 Subject: [PATCH 093/496] add badges (#127) ![image](https://user-images.githubusercontent.com/67586/50378310-1d135780-05e4-11e9-95ca-59dea19daf86.png) /cc @robbecker-wf @Pacane --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index b42f8d3b..1b345a50 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,8 @@ # GitHub for Dart +[![Build Status](https://travis-ci.org/DirectMyFile/github.dart.svg?branch=master)](https://travis-ci.org/DirectMyFile/github.dart) +[![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. Please submit issues and pull requests, join my IRC channel (#directcode on irc.esper.net), help out, or just give me encouragement. From ed76e626f9bf825ed184fe930f3b4f0ab8296f4f Mon Sep 17 00:00:00 2001 From: Jimmy Shiau Date: Sun, 23 Dec 2018 05:23:05 +0800 Subject: [PATCH 094/496] Fixed cast error (#122) --- lib/src/common/model/repos_hooks.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/common/model/repos_hooks.dart b/lib/src/common/model/repos_hooks.dart index 372b415d..bad1cc5e 100644 --- a/lib/src/common/model/repos_hooks.dart +++ b/lib/src/common/model/repos_hooks.dart @@ -35,7 +35,7 @@ class Hook { if (input == null) return null; return new Hook() - ..events = input['events'] as List + ..events = input['events']?.cast() ..active = input['active'] ..name = input['name'] ..id = input['id'] From 0a04ae19e06f95b8afe018d666eea96585869492 Mon Sep 17 00:00:00 2001 From: Phil Quitslund Date: Sat, 22 Dec 2018 14:27:30 -0800 Subject: [PATCH 095/496] fix casts (#126) --- lib/src/common/model/issues.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/src/common/model/issues.dart b/lib/src/common/model/issues.dart index c044dc4e..f9477085 100644 --- a/lib/src/common/model/issues.dart +++ b/lib/src/common/model/issues.dart @@ -61,8 +61,9 @@ class Issue { static Issue fromJSON(Map input) { if (input == null) return null; - var labels = input['labels'] as List>; - if (labels == null) labels = []; + List> labels = + input['labels'].cast>(); + if (labels == null) labels = >[]; return new Issue() ..id = input['id'] From 0ca7ae4c1c40575bb6e441522b378f4f2d689887 Mon Sep 17 00:00:00 2001 From: pq Date: Fri, 4 Jan 2019 05:17:13 -0800 Subject: [PATCH 096/496] 4.0.1 --- CHANGELOG.md | 4 ++++ pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3af46cf4..e242de8e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## v4.0.1 + +- Fix cast errors in event and issue queries. + ## v4.0.0 - Make fields in many objects read-only. diff --git a/pubspec.yaml b/pubspec.yaml index 4780ed1f..d24592c3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 4.0.0 +version: 4.0.1 author: Kenneth Endfinger description: GitHub API Client Library homepage: https://github.com/DirectMyFile/github.dart From 9a9416b16e3c41ec17c4b1452ebc7a0452d45350 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Sun, 6 Jan 2019 10:01:22 -0700 Subject: [PATCH 097/496] Fix and improve examples (#130) # Summary The examples didn't all work and it was tedious to keep adding the github token to each example's URL to test. # Note The Releases example still has type errors and does not work yet. # Changes - Add a cast to fix type errors when loading emoji and languages - Add a github token input on the main example page that is saved in session storage and used by each example. Now you can just enter your token once! - Clean up the example common `init` method and renamed to `initViewSourceButton` for clarity - Added the script name to the view source query param so you can tell what file source you are viewing - Removed external network dependencies from the examples - Remove dev dependency on `markdown` # Testing - `pub run build_runner serve example` - Try entering your github token at `http://localhost:8080/`. - It should save and be used on each example page automatically - It should go away if you close the browser and reload the examples - smoke test each example (except Releases, it doesn't work) --- example/common.dart | 46 ++++++++++---------- example/emoji.dart | 42 +++++++++--------- example/emoji.html | 29 +++++++------ example/index.dart | 10 +++++ example/index.html | 43 +++++++++++++------ example/languages.dart | 42 +++++++----------- example/languages.html | 30 +++++++------ example/markdown.dart | 9 ++-- example/markdown.html | 33 +++++++------- example/octocat.dart | 29 ------------- example/octocat.html | 24 ----------- example/organization.dart | 71 ++++++++++++------------------- example/organization.html | 14 +++--- example/readme.dart | 26 +++++------ example/readme.html | 18 ++------ example/releases.dart | 11 +++-- example/releases.html | 11 ++--- example/repos.dart | 21 +++------ example/repos.html | 22 ++++------ example/stars.dart | 11 +++-- example/stars.html | 10 ++--- example/status.dart | 8 ++-- example/status.html | 4 +- example/user_info.dart | 26 ++++++----- example/user_info.html | 20 ++++----- example/users.dart | 39 ++++++----------- example/users.html | 13 +----- example/zen.dart | 15 ++----- example/zen.html | 14 ++---- lib/src/common.dart | 4 +- lib/src/common/misc_service.dart | 6 ++- lib/src/common/repos_service.dart | 3 +- pubspec.yaml | 4 +- 33 files changed, 296 insertions(+), 412 deletions(-) create mode 100644 example/index.dart delete mode 100644 example/octocat.dart delete mode 100644 example/octocat.html diff --git a/example/common.dart b/example/common.dart index b7e75180..f5cc63fe 100644 --- a/example/common.dart +++ b/example/common.dart @@ -1,24 +1,16 @@ +import "dart:async"; import "dart:html"; import "package:github/browser.dart"; -import "package:github/markdown.dart" as markdown; - -void init(String script, {void onReady()}) { - var stopwatch = new Stopwatch(); - - if (onReady != null) { - document.onReadyStateChange.listen((event) { - if (document.readyState == ReadyState.COMPLETE) { - stopwatch.stop(); - print( - "Document Finished Loading in ${stopwatch.elapsedMilliseconds}ms"); - onReady(); - } - }); - } - document.querySelector("#view-source").onClick.listen((_) { - var popup = window.open("view_source.html", "View Source"); +/// Wires up a listener to a button with an id of view-source, +/// if it exists, to show the script source +/// If you don't care about showing the source, or don't have a +/// 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((_) { + var popup = window.open("view_source.html?script=$script", "View Source"); String code; var fetched = false; @@ -30,10 +22,12 @@ void init(String script, {void onReady()}) { } window.addEventListener("message", (event) { - if (event.data['command'] == "ready") { - ready = true; - if (fetched) { - sendCode(); + if (event is MessageEvent) { + if (event.data['command'] == "ready") { + ready = true; + if (fetched) { + sendCode(); + } } } }); @@ -51,11 +45,15 @@ void init(String script, {void onReady()}) { Map queryString = Uri.parse(window.location.href).queryParameters; +/// 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']; + GitHub _createGitHub() { - initGitHub(); return new GitHub( - auth: queryString["token"] != null - ? new Authentication.withToken(queryString["token"]) + auth: token != null + ? new Authentication.withToken(token) : new Authentication.anonymous()); } diff --git a/example/emoji.dart b/example/emoji.dart index 9747a188..7dc8d05b 100644 --- a/example/emoji.dart +++ b/example/emoji.dart @@ -1,35 +1,31 @@ +import 'dart:async'; import "dart:html"; import "common.dart"; DivElement emojiDiv; -Map emojis; -void main() { - init("emoji.dart", onReady: () { - emojiDiv = querySelector("#emojis"); - loadEmojis(); - var searchBox = querySelector("#search-box") as InputElement; - searchBox.onKeyUp.listen((event) { - filter(searchBox.value); - }); +Future main() async { + await initViewSourceButton("emoji.dart"); + emojiDiv = querySelector("#emojis"); + await loadEmojis(); + var searchBox = querySelector("#search-box") as InputElement; + searchBox.onKeyUp.listen((event) { + filter(searchBox.value); }); } -void loadEmojis() { - github.misc.listEmojis().then((info) { - emojis = info; - info.forEach((name, url) { - var h = new DivElement(); - h.classes.add("box"); - h.classes.add("item"); - h.classes.add("emoji-box"); - h.style.textAlign = "center"; - h.append(new ImageElement(src: url, width: 64, height: 64) - ..classes.add("emoji")); - h.append(new ParagraphElement()..text = ":${name}:"); - emojiDiv.append(h); - }); +Future loadEmojis() async { + var emojis = await github.misc.listEmojis(); + + emojis.forEach((name, url) { + var h = new 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:"); + emojiDiv.append(h); }); } diff --git a/example/emoji.html b/example/emoji.html index 61c228a3..bdafb143 100644 --- a/example/emoji.html +++ b/example/emoji.html @@ -3,25 +3,26 @@ GitHub Emoji - - - + - -
-

GitHub Emoji

-    -
View the Source
-   - -

-
+ +

GitHub Emoji

+ +
- - + + \ No newline at end of file diff --git a/example/index.dart b/example/index.dart new file mode 100644 index 00000000..8ccf4e8b --- /dev/null +++ b/example/index.dart @@ -0,0 +1,10 @@ +import 'dart:html'; + +void main() { + InputElement tokenInput = querySelector('#token'); + String token = window.sessionStorage['token']; + tokenInput.value = token; + tokenInput.onKeyUp.listen((_) { + window.sessionStorage['token'] = tokenInput.value; + }); +} diff --git a/example/index.html b/example/index.html index a0c42619..644d3bb9 100644 --- a/example/index.html +++ b/example/index.html @@ -6,23 +6,40 @@ GitHub for Dart - Demos - - - +

GitHub for Dart - Demos

+
+ These demos will work without a github token, but it is easy to exhaust the rate limit + without specifying a token. The demos will stop working when that happens. To use a + personal github token, enter it in the input below. It will be saved in session storage, + which goes away when you close your browser. Alternatively, you can add a + querystring parameter to specify your token on any of the examples like + ?token=[yourtoken] -

Repositories

-

Organization

-

Users

-

User Information

-

Language Breakdown

-

Releases

-

Stars

-

Emoji

-

Zen

+

Github Token:

+ + Readme + Repositories + Organization + Users + User Information + Language Breakdown + Releases + Stars + Emoji + Markdown + Zen + + - + \ No newline at end of file diff --git a/example/languages.dart b/example/languages.dart index c52cff0d..8eb0d983 100644 --- a/example/languages.dart +++ b/example/languages.dart @@ -1,6 +1,5 @@ import "dart:html"; -import 'markdown.dart' as markdown; import "package:github/browser.dart"; import "common.dart"; @@ -8,17 +7,15 @@ DivElement tableDiv; LanguageBreakdown breakdown; -void main() { - initGitHub(); - init("languages.dart", onReady: () { - tableDiv = querySelector("#table"); - loadRepository(); - }); +Future main() async { + await initViewSourceButton("languages.dart"); + tableDiv = querySelector("#table"); + await loadRepository(); } -void loadRepository() { +Future loadRepository() async { var user = "dart-lang"; - var reponame = "bleeding_edge"; + var reponame = "sdk"; var params = queryString; @@ -30,14 +27,11 @@ void loadRepository() { reponame = params["repo"]; } - document.getElementById("name").setInnerHtml("${user}/${reponame}"); + document.getElementById("name").setInnerHtml("$user/$reponame"); - github.repositories - .listLanguages(new RepositorySlug(user, reponame)) - .then((b) { - breakdown = b; - reloadTable(); - }); + var repo = new RepositorySlug(user, reponame); + breakdown = await github.repositories.listLanguages(repo); + reloadTable(); } bool isReloadingTable = false; @@ -48,8 +42,8 @@ void reloadTable({int accuracy: 4}) { } isReloadingTable = true; - - github.misc.renderMarkdown(generateMarkdown(accuracy)).then((html) { + String md = generateMarkdown(accuracy); + github.misc.renderMarkdown(md).then((html) { tableDiv.setInnerHtml(html, treeSanitizer: NodeTreeSanitizer.trusted); isReloadingTable = false; }); @@ -63,19 +57,15 @@ String generateMarkdown(int accuracy) { int total = totalBytes(breakdown); var data = breakdown.toList(); - var tableData = []; - + 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); - tableData.add({ - "Name": name, - "Bytes": bytes, - "Percentage": "${percentage.toStringAsFixed(accuracy)}%" - }); + md += '|$name|$bytes|${percentage.toStringAsFixed(accuracy)}|\n'; }); - return markdown.table(tableData); + return md; } diff --git a/example/languages.html b/example/languages.html index 79276407..92c48de3 100755 --- a/example/languages.html +++ b/example/languages.html @@ -6,27 +6,31 @@ Repository Languages - - - - + - -
-

Repository Languages

+ +

Repository Languages

-
View the Source
-

-
+ +

- - + + - + \ No newline at end of file diff --git a/example/markdown.dart b/example/markdown.dart index 56d1d0e1..d883ef30 100644 --- a/example/markdown.dart +++ b/example/markdown.dart @@ -1,8 +1,7 @@ -import "common.dart"; import "package:github/browser.dart"; +import "common.dart"; -void main() { - init("markdown.dart", onReady: () { - GitHubBrowserHelper.renderMarkdown(github, "*[markdown]"); - }); +Future main() async { + await initViewSourceButton("markdown.dart"); + GitHubBrowserHelper.renderMarkdown(github, "*[markdown]"); } diff --git a/example/markdown.html b/example/markdown.html index 50f45df5..f18f75bb 100644 --- a/example/markdown.html +++ b/example/markdown.html @@ -3,49 +3,46 @@ GitHub Markdown Rendering - + - - -
-
View the Source
+

- - + + \ No newline at end of file diff --git a/example/octocat.dart b/example/octocat.dart deleted file mode 100644 index cea6c19d..00000000 --- a/example/octocat.dart +++ /dev/null @@ -1,29 +0,0 @@ -import "dart:html"; - -import "dart:math" show Random; - -import "common.dart"; - -DivElement $octocat; - -Random random = new Random(); - -void main() { - init("octocat.dart", onReady: () { - $octocat = querySelector("#octocat"); - loadCat(); - }); -} - -void loadCat() { - github.misc.listOctodex(cors: true).toList().then((cats) { - print("${cats.length} octocats"); - var index = random.nextInt(cats.length); - var cat = cats[index]; - print("Selected Octocat at ${index} (${cat.name})"); - $octocat.appendHtml(""" -

${cat.name}

- - """, treeSanitizer: NodeTreeSanitizer.trusted); - }); -} diff --git a/example/octocat.html b/example/octocat.html deleted file mode 100644 index ec03f087..00000000 --- a/example/octocat.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - GitHub - Octocat - - - - - - - -
-
View the Source
-

-
- -
- - - - - - \ No newline at end of file diff --git a/example/organization.dart b/example/organization.dart index f5d92150..111a7290 100644 --- a/example/organization.dart +++ b/example/organization.dart @@ -1,54 +1,39 @@ +import "dart:async"; import "dart:html"; import "package:github/browser.dart"; import "common.dart"; -DivElement $org; +DivElement $output; +InputElement $input; +ButtonElement $btn; -void main() { - init("organization.dart", onReady: () { - $org = querySelector("#org"); - loadOrganization(); +Future main() async { + await initViewSourceButton('organization.dart'); + $output = querySelector("#output"); + $input = querySelector('#input'); + $btn = querySelector('#submit'); + $input.onChange.listen((_) { + loadOrganization($input.value); }); + $btn.onClick.listen((_) { + loadOrganization($input.value); + }); + $btn.click(); } -void loadOrganization() { - var org = "DirectMyFile"; - - if (queryString["name"] != null) { - org = queryString["name"]; +Future loadOrganization(String orgToLoad) async { + try { + Organization org = await github.organizations.get(orgToLoad); + String html = ''' +
Name: ${org.name} +
Id: ${org.id} +
Company: ${org.company} +
Followers: ${org.followersCount} +
Following: ${org.followingCount} +'''; + $output.innerHtml = html; + } on OrganizationNotFound { + $output.innerHtml = 'Not found.'; } - - github.organizations.get(org).then((Organization org) { - return github.organizations.listTeams(org.name).toList(); - }).then((List teams) { - for (var team in teams) { - var e = new DivElement()..id = "team-${team.name}"; - e.classes.add("team"); - $org.append(e); - e.append(new HeadingElement.h3()..text = team.name); - github.organizations - .listTeamMembers(team.id) - .toList() - .then((List members) { - var divs = members.map((member) { - var h = new DivElement(); - h.classes.add("box"); - h.classes.add("user"); - h.style.textAlign = "center"; - h.append( - new ImageElement(src: member.avatarUrl, width: 64, height: 64) - ..classes.add("avatar")); - h.append(new AnchorElement(href: member.htmlUrl) - ..append(new ParagraphElement()..text = member.login)); - return h; - }); - divs.forEach(e.append); - }); - } - }).catchError((error) { - if (error is OrganizationNotFound) { - window.alert(error.message); - } - }); } diff --git a/example/organization.html b/example/organization.html index ad782694..53e0818f 100644 --- a/example/organization.html +++ b/example/organization.html @@ -3,22 +3,20 @@ GitHub Organization - - - -

GitHub Organization

-
View the Source
+
+ +
-
+
+ + - - \ No newline at end of file diff --git a/example/readme.dart b/example/readme.dart index 70847991..46eebd73 100644 --- a/example/readme.dart +++ b/example/readme.dart @@ -1,3 +1,4 @@ +import 'dart:convert'; import "dart:html"; import "package:github/browser.dart"; @@ -6,17 +7,16 @@ import "common.dart"; DivElement readmeDiv; -void main() { - init("readme.dart", onReady: () { - readmeDiv = querySelector("#readme"); - loadReadme(); - }); -} - -void loadReadme() { - github.repositories - .getReadme(new RepositorySlug("DirectMyFile", "github.dart")) - .then((file) => github.misc.renderMarkdown(file.content)) - .then((html) => - readmeDiv.appendHtml(html, validator: NodeTreeSanitizer.trusted)); +Future main() async { + await initViewSourceButton("readme.dart"); + readmeDiv = querySelector("#readme"); + var repo = new RepositorySlug("DirectMyFile", "github.dart"); + var 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); + readmeDiv.appendHtml(html, treeSanitizer: NodeTreeSanitizer.trusted); } diff --git a/example/readme.html b/example/readme.html index d22733a4..00321b71 100644 --- a/example/readme.html +++ b/example/readme.html @@ -3,23 +3,13 @@ GitHub.dart README - - - - - - -
-
View the Source
-

-
- + + +

- - - + \ No newline at end of file diff --git a/example/releases.dart b/example/releases.dart index e7810888..8a71cc2c 100644 --- a/example/releases.dart +++ b/example/releases.dart @@ -6,11 +6,10 @@ import "common.dart"; DivElement releasesDiv; -void main() { - init("releases.dart", onReady: () { - releasesDiv = querySelector("#releases"); - loadReleases(); - }); +Future main() async { + await initViewSourceButton("releases.dart"); + releasesDiv = querySelector("#releases"); + loadReleases(); } void loadReleases() { @@ -27,7 +26,7 @@ void loadReleases() { var 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/releases.html b/example/releases.html index bc83c95a..81e42972 100644 --- a/example/releases.html +++ b/example/releases.html @@ -3,22 +3,19 @@ GitHub Releases - - - -

GitHub Releases

-
View the Source

+ +

- - + + \ No newline at end of file diff --git a/example/repos.dart b/example/repos.dart index 855f07e2..8eeecd83 100644 --- a/example/repos.dart +++ b/example/repos.dart @@ -1,7 +1,7 @@ +import "dart:async"; import "dart:html"; import "package:github/browser.dart"; -import "package:github/dates.dart"; import "common.dart"; @@ -17,34 +17,25 @@ Map> sorts = { "size": (Repository a, Repository b) => b.size.compareTo(a.size) }; -void main() { - var stopwatch = new Stopwatch(); - stopwatch.start(); +Future main() async { + await initViewSourceButton('repos.dart'); repositoriesDiv = querySelector("#repos"); - document.onReadyStateChange.listen((event) { - if (document.readyState == ReadyState.COMPLETE) { - stopwatch.stop(); - print("Document Finished Loading in ${stopwatch.elapsedMilliseconds}ms"); - loadRepos(); - } - }); + loadRepos(); 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]); }); }); - - init("repos.dart"); } List _reposCache; @@ -67,7 +58,7 @@ void updateRepos(List repos,
Forks: ${repo.forksCount}
- Created: ${friendlyDateTime(repo.createdAt)} + Created: ${repo.createdAt}
Size: ${repo.size} bytes

diff --git a/example/repos.html b/example/repos.html index 05ef0782..d142119b 100644 --- a/example/repos.html +++ b/example/repos.html @@ -3,29 +3,25 @@ GitHub for Dart - Repositories - - - -

GitHub for Dart - Repositories

-
View the Source
-
Reload
-
Sort by Stars
-
Sort by Forks
-
Sort by Creation Date
-
Sort by Last Push
-
Sort by Size
+ + + + + + +

- - + + \ No newline at end of file diff --git a/example/stars.dart b/example/stars.dart index 56a989e2..9cebf0f2 100644 --- a/example/stars.dart +++ b/example/stars.dart @@ -5,11 +5,10 @@ import "common.dart"; DivElement $stars; -void main() { - init("stars.dart", onReady: () { - $stars = querySelector("#stars"); - loadStars(); - }); +Future main() async { + await initViewSourceButton("stars.dart"); + $stars = querySelector("#stars"); + loadStars(); } void loadStars() { @@ -24,7 +23,7 @@ void loadStars() { repo = queryString["repo"]; } - querySelector("#title").appendText(" for ${user}/${repo}"); + querySelector("#title").appendText(" for $user/$repo"); github.activity .listStargazers(new RepositorySlug(user, repo)) diff --git a/example/stars.html b/example/stars.html index 24fb81c8..d6175d62 100644 --- a/example/stars.html +++ b/example/stars.html @@ -3,25 +3,21 @@ GitHub Stars - - - -

GitHub Stars

   -
View the Source
+

- - + + \ No newline at end of file diff --git a/example/status.dart b/example/status.dart index 10ee6b88..3b890b1f 100644 --- a/example/status.dart +++ b/example/status.dart @@ -1,6 +1,6 @@ import 'dart:async'; -import "dart:html"; import "dart:convert"; +import "dart:html"; Future main() async { var request = await HttpRequest.request( @@ -8,9 +8,9 @@ Future main() async { requestHeaders: {"Origin": window.location.origin}); var text = request.responseText; - var json = JSON.decode(text); + var map = json.decode(text); querySelector("#status") - ..appendText(json["status"]) - ..classes.add("status-${json["status"]}"); + ..appendText(map["status"]) + ..classes.add("status-${map["status"]}"); } diff --git a/example/status.html b/example/status.html index e12d0adc..f0156762 100644 --- a/example/status.html +++ b/example/status.html @@ -15,8 +15,8 @@

- - + + diff --git a/example/user_info.dart b/example/user_info.dart index 7601a981..66785da3 100644 --- a/example/user_info.dart +++ b/example/user_info.dart @@ -5,11 +5,10 @@ import "common.dart"; DivElement info; -void main() { - init("user_info.dart", onReady: () { - info = document.getElementById("info"); - loadUser(); - }); +Future main() async { + await initViewSourceButton("user_info.dart"); + info = document.getElementById("info"); + loadUser(); } GitHub createClient(String token) { @@ -17,14 +16,16 @@ GitHub createClient(String token) { } void loadUser() { - var token = document.getElementById("token") as InputElement; - document.getElementById("load").onClick.listen((event) { - if (token.value == null || token.value.isEmpty) { + var localToken = document.getElementById("token") as InputElement; + + var loadBtn = document.getElementById("load"); + loadBtn.onClick.listen((event) { + if (localToken.value == null || localToken.value.isEmpty) { window.alert("Please Enter a Token"); return; } - github = createClient(token.value); + github = createClient(localToken.value); github.users.getCurrentUser().then((CurrentUser user) { info.children.clear(); @@ -37,7 +38,7 @@ void loadUser() { if (value != null) { info.appendHtml("""
- ${name}: ${value.toString()} + $name: ${value.toString()} """); } } @@ -58,4 +59,9 @@ void loadUser() { } }); }); + + if (token != null) { + localToken.value = token; + loadBtn.click(); + } } diff --git a/example/user_info.html b/example/user_info.html index 06016735..5808fd28 100644 --- a/example/user_info.html +++ b/example/user_info.html @@ -6,28 +6,26 @@ GitHub - User Information - - -

GitHub User Information

-

Gets information about you from GitHub. Input a personal token that has the 'user' permission. This token is not stored.

+

Gets information about you from GitHub. Input a personal token that has the 'user' permission. This token is not + stored.

- + Github Token:   -
Load Information
-
View the Source
-

+ + +

- - + + - + \ No newline at end of file diff --git a/example/users.dart b/example/users.dart index a587315e..db0af40d 100644 --- a/example/users.dart +++ b/example/users.dart @@ -1,43 +1,36 @@ +import "dart:async"; import "dart:html"; import "package:github/browser.dart"; -import "package:github/dates.dart"; import "common.dart"; DivElement usersDiv; -void main() { - init("users.dart", onReady: () { - usersDiv = querySelector("#users"); - loadUsers(); - }); +Future main() async { + await initViewSourceButton("users.dart"); + usersDiv = querySelector("#users"); + loadUsers(); } void loadUsers() { - String column = "left"; - github.users.listUsers(pages: 2).take(12).listen((User baseUser) { github.users.getUser(baseUser.login).then((user) { - var m = new DivElement(); - - m.classes.addAll(["box", "user", "middle", "center"]); - - var h = new DivElement()..classes.add("middle"); + var userDiv = new DivElement(); for (int i = 1; i <= 2; i++) { - h.append(new BRElement()); + userDiv.append(new BRElement()); } - h.append( + userDiv.append( GitHubBrowserHelper.createAvatarImage(user, width: 64, height: 64) ..classes.add("avatar")); var buff = new StringBuffer(); buff ..writeln("Username: ${user.login}") - ..writeln("Created: ${friendlyDateTime(user.createdAt)}") - ..writeln("Updated: ${friendlyDateTime(user.updatedAt)}"); + ..writeln("Created: ${user.createdAt}") + ..writeln("Updated: ${user.updatedAt}"); if (user.company != null && user.company.isNotEmpty) { buff.writeln("Company: ${user.company}"); @@ -45,19 +38,11 @@ void loadUsers() { buff.writeln("Followers: ${user.followersCount}"); - h.append(new ParagraphElement() + userDiv.append(new ParagraphElement() ..appendHtml(buff.toString().replaceAll("\n", "
"), treeSanitizer: NodeTreeSanitizer.trusted)); - m.append(h); - - usersDiv.querySelector("#${column}"); - - if (column == "left") { - column = "right"; - } else { - column = "left"; - } + usersDiv.append(userDiv); }); }); } diff --git a/example/users.html b/example/users.html index 71ef7b2e..12673d2e 100644 --- a/example/users.html +++ b/example/users.html @@ -3,26 +3,17 @@ GitHub - Oldest Users - - - -

GitHub - Oldest Users

-
View the Source
+

-
-
-
- - - + \ No newline at end of file diff --git a/example/zen.dart b/example/zen.dart index b8414173..85a14048 100644 --- a/example/zen.dart +++ b/example/zen.dart @@ -1,15 +1,8 @@ import "dart:html"; import "common.dart"; -DivElement $zen; - -void main() { - init("zen.dart", onReady: () { - $zen = querySelector("#zen"); - loadZen(); - }); -} - -void loadZen() { - github.misc.getZen().then((zen) => $zen.appendText(zen)); +Future main() async { + await initViewSourceButton("zen.dart"); + String msg = await github.misc.getZen(); + querySelector("#zen").text = msg; } diff --git a/example/zen.html b/example/zen.html index e1d99665..0149ee16 100644 --- a/example/zen.html +++ b/example/zen.html @@ -3,25 +3,19 @@ GitHub Zen - - - -

GitHub Zen

-
View the Source
+

-
-

-
+

Loading...

+ + - - \ No newline at end of file diff --git a/lib/src/common.dart b/lib/src/common.dart index 129ef6a8..bac67b78 100644 --- a/lib/src/common.dart +++ b/lib/src/common.dart @@ -62,7 +62,9 @@ part "common/util/utils.dart"; void _applyExpandos(Object target, http.Response response) { _etagExpando[target] = response.headers['etag']; - _dateExpando[target] = http_parser.parseHttpDate(response.headers['date']); + if (response.headers['date'] != null) { + _dateExpando[target] = http_parser.parseHttpDate(response.headers['date']); + } } final _etagExpando = new Expando('etag'); diff --git a/lib/src/common/misc_service.dart b/lib/src/common/misc_service.dart index 03d97cd2..f61061b1 100644 --- a/lib/src/common/misc_service.dart +++ b/lib/src/common/misc_service.dart @@ -12,8 +12,10 @@ class MiscService extends Service { /// /// API docs: https://developer.github.com/v3/emojis/ Future> listEmojis() { - return _github.getJSON("/emojis", statusCode: StatusCodes.OK) - as Future>; + var r = _github.getJSON>("/emojis", + statusCode: StatusCodes.OK, + convert: (Map json) => json.cast()); + return r; } /// Lists available .gitignore template names. diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 2084f7b6..7cb2a3f9 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -172,7 +172,8 @@ class RepositoriesService extends Service { Future listLanguages(RepositorySlug slug) => _github.getJSON("/repos/${slug.fullName}/languages", statusCode: StatusCodes.OK, - convert: (input) => new LanguageBreakdown(input)); + convert: (Map input) => + new LanguageBreakdown(input.cast())); /// Lists the tags of the specified repository. /// diff --git a/pubspec.yaml b/pubspec.yaml index d24592c3..b72bdfda 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -10,7 +10,9 @@ dependencies: http_parser: ^3.1.1 json_annotation: ^2.0.0 dev_dependencies: - build_runner: ^1.0.0 + build_runner: any + build_test: any + build_web_compilers: any json_serializable: ^2.0.0 test: ^1.3.0 mockito: ^3.0.0 From 5ca841b42a3247c1e50b275aa11ea04528a8e83c Mon Sep 17 00:00:00 2001 From: George Lesica Date: Sun, 6 Jan 2019 10:20:43 -0700 Subject: [PATCH 098/496] Fix json bugs and make random improvements (#131) I ran into some JSON parsing bugs while trying to use this, so I fixed those by converting the relevant models to use json_serializable. While I was at it, I also fixed some random annoyances. One example is that I fixed all the lints. --- lib/server.dart | 11 +- lib/src/common.dart | 3 +- lib/src/common/activity_service.dart | 4 +- lib/src/common/issues_service.dart | 2 +- lib/src/common/model/activity.dart | 2 +- lib/src/common/model/authorizations.dart | 2 +- lib/src/common/model/gists.dart | 16 +-- lib/src/common/model/issues.dart | 10 +- lib/src/common/model/pulls.dart | 8 +- lib/src/common/model/repos_commits.dart | 4 +- lib/src/common/model/repos_releases.dart | 87 +++++++------- lib/src/common/model/repos_releases.g.dart | 110 ++++++++++++++++++ lib/src/common/model/repos_stats.dart | 2 +- lib/src/common/model/users.dart | 9 +- lib/src/common/model/users.g.dart | 21 ++++ lib/src/common/repos_service.dart | 11 +- lib/src/common/search_service.dart | 2 +- lib/src/common/users_service.dart | 8 +- lib/src/server/hooks.dart | 10 +- test/assets/responses/create_release.dart | 8 ++ test/assets/responses/release.dart | 88 ++++++++++++++ test/assets/responses/release_asset.dart | 38 ++++++ .../common/model/repos_releases_test.dart | 42 +++++++ 23 files changed, 405 insertions(+), 93 deletions(-) create mode 100644 lib/src/common/model/repos_releases.g.dart create mode 100644 test/assets/responses/create_release.dart create mode 100644 test/assets/responses/release.dart create mode 100644 test/assets/responses/release_asset.dart create mode 100644 test/unit/common/model/repos_releases_test.dart diff --git a/lib/server.dart b/lib/server.dart index 735e72bf..a4a0d3ae 100644 --- a/lib/server.dart +++ b/lib/server.dart @@ -35,13 +35,10 @@ const List COMMON_GITHUB_TOKEN_ENV_KEYS = const [ /// If the above fails, the GITHUB_USERNAME and GITHUB_PASSWORD keys will be checked. Authentication findAuthenticationFromEnvironment() { if (Platform.isMacOS) { - try { - var result = Process.runSync("security", - const ["find-internet-password", "-g", "-s", "github.com"]); + var result = Process.runSync( + "security", const ["find-internet-password", "-g", "-s", "github.com"]); - if (result.exitCode != 0) { - throw "Don't use keychain."; - } + if (result.exitCode == 0) { String out = result.stdout.toString(); String username = out.split('"acct"="')[1]; @@ -50,8 +47,6 @@ Authentication findAuthenticationFromEnvironment() { String password = result.stderr.toString().split("password:")[1].trim(); password = password.substring(1, password.length - 1); return new Authentication.basic(username.trim(), password.trim()); - } catch (e) { - print(e); } } diff --git a/lib/src/common.dart b/lib/src/common.dart index bac67b78..cc011d43 100644 --- a/lib/src/common.dart +++ b/lib/src/common.dart @@ -10,10 +10,12 @@ 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 '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"; @@ -42,7 +44,6 @@ 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_releases.dart"; part "common/model/repos_stats.dart"; part "common/model/repos_statuses.dart"; part "common/model/search.dart"; diff --git a/lib/src/common/activity_service.dart b/lib/src/common/activity_service.dart index cd6a2a82..b71cb88c 100644 --- a/lib/src/common/activity_service.dart +++ b/lib/src/common/activity_service.dart @@ -188,7 +188,7 @@ class ActivityService extends Service { /// API docs: https://developer.github.com/v3/activity/starring/#list-stargazers Stream listStargazers(RepositorySlug slug) { return new PaginationHelper(_github) - .objects("GET", "/repos/${slug.fullName}/stargazers", User.fromJSON); + .objects("GET", "/repos/${slug.fullName}/stargazers", User.fromJson); } /// Lists all the repos starred by a user. @@ -243,7 +243,7 @@ class ActivityService extends Service { /// API docs: https://developer.github.com/v3/activity/watching/#list-watchers Stream listWatchers(RepositorySlug slug) { return new PaginationHelper(_github) - .objects("GET", "/repos/${slug.fullName}/subscribers", User.fromJSON); + .objects("GET", "/repos/${slug.fullName}/subscribers", User.fromJson); } /// Lists the repositories the specified user is watching. diff --git a/lib/src/common/issues_service.dart b/lib/src/common/issues_service.dart index 8b7f865b..3b9b4f39 100644 --- a/lib/src/common/issues_service.dart +++ b/lib/src/common/issues_service.dart @@ -163,7 +163,7 @@ class IssuesService extends Service { /// API docs: https://developer.github.com/v3/issues/assignees/#list-assignees Stream listAssignees(RepositorySlug slug) { return new PaginationHelper(_github) - .objects("GET", "/repos/${slug.fullName}/assignees", User.fromJSON); + .objects("GET", "/repos/${slug.fullName}/assignees", User.fromJson); } /// Checks if a user is an assignee for the specified repository. diff --git a/lib/src/common/model/activity.dart b/lib/src/common/model/activity.dart index f0a96d78..416a3a58 100644 --- a/lib/src/common/model/activity.dart +++ b/lib/src/common/model/activity.dart @@ -33,7 +33,7 @@ class Event { ..org = Organization.fromJSON(input['org'] as Map) ..createdAt = parseDateTime(input['created_at']) ..id = input['id'] - ..actor = User.fromJSON(input['actor'] as Map) + ..actor = User.fromJson(input['actor'] as Map) ..payload = input['payload'] as Map; return event; diff --git a/lib/src/common/model/authorizations.dart b/lib/src/common/model/authorizations.dart index 8ae95596..c32b2fbd 100644 --- a/lib/src/common/model/authorizations.dart +++ b/lib/src/common/model/authorizations.dart @@ -29,7 +29,7 @@ class Authorization { ..createdAt = parseDateTime(input['created_at']) ..updatedAt = parseDateTime(input['updated_at']) ..json = input - ..user = User.fromJSON(input['user'] as Map); + ..user = User.fromJson(input['user'] as Map); } } diff --git a/lib/src/common/model/gists.dart b/lib/src/common/model/gists.dart index 29fbbac7..967b6ed0 100644 --- a/lib/src/common/model/gists.dart +++ b/lib/src/common/model/gists.dart @@ -34,8 +34,8 @@ class Gist { ..id = input['id'] ..description = input['description'] ..public = input['public'] - ..owner = User.fromJSON(input['owner'] as Map) - ..user = User.fromJSON(input['user'] as Map); + ..owner = User.fromJson(input['owner'] as Map) + ..user = User.fromJson(input['user'] as Map); if (input['files'] != null) { gist.files = []; @@ -43,7 +43,7 @@ class Gist { for (var key in input['files'].keys) { var map = copyOf(input['files'][key]) as Map; map['name'] = key; - gist.files.add(GistFile.fromJSON(map)); + gist.files.add(GistFile.fromJson(map)); } } @@ -71,7 +71,7 @@ class GistFile { bool truncated; String content; - static GistFile fromJSON(Map input) { + static GistFile fromJson(Map input) { if (input == null) return null; return new GistFile() @@ -96,11 +96,11 @@ class GistFork { @JsonKey(name: "updated_at") DateTime updatedAt; - static GistFork fromJSON(Map input) { + static GistFork fromJson(Map input) { if (input == null) return null; return new GistFork() - ..user = User.fromJSON(input['user'] as Map) + ..user = User.fromJson(input['user'] as Map) ..id = input['id'] ..createdAt = parseDateTime(input['created_at']) ..updatedAt = parseDateTime(input['updated_at']); @@ -130,7 +130,7 @@ class GistHistoryEntry { return new GistHistoryEntry() ..version = input['version'] - ..user = User.fromJSON(input['user'] as Map) + ..user = User.fromJson(input['user'] as Map) ..deletions = input['change_status']['deletions'] ..additions = input['change_status']['additions'] ..totalChanges = input['change_status']['total'] @@ -156,7 +156,7 @@ class GistComment { return new GistComment() ..id = input['id'] - ..user = User.fromJSON(input['user'] as Map) + ..user = User.fromJson(input['user'] as Map) ..createdAt = parseDateTime(input['created_at']) ..updatedAt = parseDateTime(input['updated_at']) ..body = input['body']; diff --git a/lib/src/common/model/issues.dart b/lib/src/common/model/issues.dart index f9477085..3a00fd4b 100644 --- a/lib/src/common/model/issues.dart +++ b/lib/src/common/model/issues.dart @@ -72,9 +72,9 @@ class Issue { ..number = input['number'] ..state = input['state'] ..title = input['title'] - ..user = User.fromJSON(input['user'] as Map) + ..user = User.fromJson(input['user'] as Map) ..labels = labels.map(IssueLabel.fromJSON).toList(growable: false) - ..assignee = User.fromJSON(input['assignee'] as Map) + ..assignee = User.fromJson(input['assignee'] as Map) ..milestone = Milestone.fromJSON(input['milestone'] as Map) ..commentsCount = input['comments'] @@ -83,7 +83,7 @@ class Issue { ..createdAt = parseDateTime(input['created_at']) ..updatedAt = parseDateTime(input['updated_at']) ..closedAt = parseDateTime(input['closed_at']) - ..closedBy = User.fromJSON(input['closed_by'] as Map) + ..closedBy = User.fromJson(input['closed_by'] as Map) ..body = input['body']; } @@ -164,7 +164,7 @@ class IssueComment { return new IssueComment() ..id = input['id'] ..body = input['body'] - ..user = User.fromJSON(input['user'] as Map) + ..user = User.fromJson(input['user'] as Map) ..createdAt = parseDateTime(input['created_at']) ..updatedAt = parseDateTime(input['updated_at']) ..url = input['url'] @@ -245,7 +245,7 @@ class Milestone { ..state = input['state'] ..title = input['title'] ..description = input['description'] - ..creator = User.fromJSON(input['creator'] as Map) + ..creator = User.fromJson(input['creator'] as Map) ..openIssuesCount = input['open_issues'] ..closedIssuesCount = input['closed_issues'] ..createdAt = parseDateTime(input['created_at']) diff --git a/lib/src/common/model/pulls.dart b/lib/src/common/model/pulls.dart index 7ccfea6b..52db9ab6 100644 --- a/lib/src/common/model/pulls.dart +++ b/lib/src/common/model/pulls.dart @@ -74,7 +74,7 @@ class PullRequestInformation { pr.updatedAt = parseDateTime(input['updated_at']); pr.closedAt = parseDateTime(input['closed_at']); pr.mergedAt = parseDateTime(input['merged_at']); - pr.user = User.fromJSON(input['user'] as Map); + pr.user = User.fromJson(input['user'] as Map); return pr; } } @@ -121,7 +121,7 @@ class PullRequest extends PullRequestInformation { pr.mergeable = input['mergeable']; pr.merged = input['merged']; pr.id = input['id']; - pr.mergedBy = User.fromJSON(input['merged_by'] as Map); + pr.mergedBy = User.fromJson(input['merged_by'] as Map); pr.mergeCommitSha = input['merge_commit_sha']; pr.commentsCount = input['comments']; pr.commitsCount = input['commits']; @@ -174,7 +174,7 @@ class PullRequestHead { head.label = input['label']; head.ref = input['ref']; head.sha = input['sha']; - head.user = User.fromJSON(input['user'] as Map); + head.user = User.fromJson(input['user'] as Map); head.repo = Repository.fromJSON(input['repo'] as Map); return head; } @@ -252,7 +252,7 @@ class PullRequestComment { ..originalPosition = input['original_position'] ..commitID = input['commit_id'] ..originalCommitID = input['original_commit_id'] - ..user = User.fromJSON(input['user'] as Map) + ..user = User.fromJson(input['user'] as Map) ..body = input['body'] ..createdAt = parseDateTime(input['created_at']) ..updatedAt = parseDateTime(input['updated_at']) diff --git a/lib/src/common/model/repos_commits.dart b/lib/src/common/model/repos_commits.dart index 62b300f6..01fb98ff 100644 --- a/lib/src/common/model/repos_commits.dart +++ b/lib/src/common/model/repos_commits.dart @@ -47,8 +47,8 @@ class RepositoryCommit { ..htmlUrl = input['html_url'] ..commentsUrl = input['comments_url'] ..commit = GitCommit.fromJSON(input['commit'] as Map) - ..author = User.fromJSON(input['author'] as Map) - ..committer = User.fromJSON(input['committer'] as Map) + ..author = User.fromJson(input['author'] as Map) + ..committer = User.fromJson(input['committer'] as Map) ..stats = CommitStats.fromJSON(input['stats'] as Map); if (input['parents'] != null) { diff --git a/lib/src/common/model/repos_releases.dart b/lib/src/common/model/repos_releases.dart index a2b92b69..23fe085d 100644 --- a/lib/src/common/model/repos_releases.dart +++ b/lib/src/common/model/repos_releases.dart @@ -1,7 +1,14 @@ -part of github.common; +import 'package:github/src/common/model/users.dart'; +import 'package:json_annotation/json_annotation.dart'; + +part 'repos_releases.g.dart'; /// Model class for a release. +@JsonSerializable() class Release { + @JsonKey(ignore: true) + Map json; + /// Url to this Release @JsonKey(name: "html_url") String htmlUrl; @@ -37,7 +44,7 @@ class Release { /// If the release is a draft. bool draft; - /// If the release is a pre release. + /// If the release is a pre-release. bool prerelease; /// The time this release was created at. @@ -49,36 +56,35 @@ class Release { DateTime publishedAt; /// The author of this release. + @JsonKey(toJson: _authorToJson) User author; /// Release Assets + @JsonKey(toJson: _assetsToJson) List assets; - static Release fromJSON(Map input) { + static Release fromJson(Map input) { if (input == null) return null; - return new Release() - ..htmlUrl = input['html_url'] - ..tarballUrl = input['tarball_url'] - ..zipballUrl = input['zipball_url'] - ..id = input['id'] - ..tagName = input['tag_name'] - ..targetCommitsh = input['target_commitish'] - ..body = input['body'] - ..description = input['description'] - ..draft = input['draft'] - ..prerelease = input['prelease'] - ..author = input['author'] - ..assets = new List.from(input['assets'] - .map((Map it) => ReleaseAsset.fromJSON(it))) - ..name = input['name'] - ..createdAt = parseDateTime(input['created_at']) - ..publishedAt = parseDateTime(input['published_at']); + return _$ReleaseFromJson(input)..json = input; + } + + static List> _assetsToJson(List value) => + value.map((asset) => asset.toJson()).toList(); + + static Map _authorToJson(User value) => value.toJson(); + + Map toJson() { + return _$ReleaseToJson(this); } } /// Model class for a release asset. +@JsonSerializable() class ReleaseAsset { + @JsonKey(ignore: true) + Map json; + /// Url to download the asset. @JsonKey(name: "browser_download_url") String browserDownloadUrl; @@ -114,29 +120,28 @@ class ReleaseAsset { @JsonKey(name: "updated_at") DateTime updatedAt; - static ReleaseAsset fromJSON(Map input) { + static ReleaseAsset fromJson(Map input) { if (input == null) return null; - return new ReleaseAsset() - ..browserDownloadUrl = input['browser_download_url'] - ..name = input['name'] - ..id = input['id'] - ..label = input['label'] - ..state = input['state'] - ..contentType = input['content_type'] - ..size = input['size'] - ..downloadCount = input['download_count'] - ..createdAt = parseDateTime(input['created_at']) - ..updatedAt = parseDateTime(input['updated_at']); + return _$ReleaseAssetFromJson(input)..json = input; + } + + Map toJson() { + return _$ReleaseAssetToJson(this); } } /// Model class for a new release to be created. +@JsonSerializable() class CreateRelease { + Map json; + /// Tag Name to Base off of + @JsonKey(name: 'tag_name') final String tagName; /// Commit to Target + @JsonKey(name: 'target_commitish') String targetCommitish; /// Release Name @@ -149,17 +154,17 @@ class CreateRelease { bool draft; /// If the release should actually be released. - bool release; + bool prerelease; CreateRelease(this.tagName); - String toJSON() { - var map = {}; - putValue("tag_name", tagName, map); - putValue("name", name, map); - putValue("body", body, map); - putValue("draft", draft, map); - putValue("release", release, map); - return jsonEncode(map); + static CreateRelease fromJson(Map input) { + if (input == null) return null; + + return _$CreateReleaseFromJson(input)..json = input; + } + + Map toJson() { + return _$CreateReleaseToJson(this); } } diff --git a/lib/src/common/model/repos_releases.g.dart b/lib/src/common/model/repos_releases.g.dart new file mode 100644 index 00000000..b4a3b20b --- /dev/null +++ b/lib/src/common/model/repos_releases.g.dart @@ -0,0 +1,110 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'repos_releases.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +Release _$ReleaseFromJson(Map json) { + return Release() + ..htmlUrl = json['html_url'] as String + ..tarballUrl = json['tarball_url'] as String + ..zipballUrl = json['zipball_url'] as String + ..id = json['id'] as int + ..tagName = json['tag_name'] as String + ..targetCommitsh = 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 + ..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) => + e == null ? null : ReleaseAsset.fromJson(e as Map)) + ?.toList(); +} + +Map _$ReleaseToJson(Release instance) => { + 'html_url': instance.htmlUrl, + 'tarball_url': instance.tarballUrl, + 'zipball_url': instance.zipballUrl, + 'id': instance.id, + 'tag_name': instance.tagName, + 'target_commitish': instance.targetCommitsh, + 'name': instance.name, + 'body': instance.body, + 'description': instance.description, + 'draft': instance.draft, + '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) + }; + +ReleaseAsset _$ReleaseAssetFromJson(Map json) { + return ReleaseAsset() + ..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 + ..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) => + { + 'browser_download_url': instance.browserDownloadUrl, + 'id': instance.id, + 'name': instance.name, + 'label': instance.label, + 'state': instance.state, + 'content_type': instance.contentType, + 'size': instance.size, + 'download_count': instance.downloadCount, + 'created_at': instance.createdAt?.toIso8601String(), + 'updated_at': instance.updatedAt?.toIso8601String() + }; + +CreateRelease _$CreateReleaseFromJson(Map json) { + return CreateRelease(json['tag_name'] as String) + ..json = json['json'] as Map + ..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; +} + +Map _$CreateReleaseToJson(CreateRelease instance) => + { + 'json': instance.json, + 'tag_name': instance.tagName, + 'target_commitish': instance.targetCommitish, + 'name': instance.name, + 'body': instance.body, + 'draft': instance.draft, + 'prerelease': instance.prerelease + }; diff --git a/lib/src/common/model/repos_stats.dart b/lib/src/common/model/repos_stats.dart index b80c1e71..7215d786 100644 --- a/lib/src/common/model/repos_stats.dart +++ b/lib/src/common/model/repos_stats.dart @@ -15,7 +15,7 @@ class ContributorStatistics { if (input == null) return null; return new ContributorStatistics() - ..author = User.fromJSON(input['author'] as Map) + ..author = User.fromJson(input['author'] as Map) ..total = input['total'] ..weeks = (input['weeks'] as List>) .map((it) => ContributorWeekStatistics.fromJSON(it)); diff --git a/lib/src/common/model/users.dart b/lib/src/common/model/users.dart index 5f77e423..4c837aef 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(createToJson: false) +@JsonSerializable() class User { @JsonKey(ignore: true) Map json; @@ -71,16 +71,19 @@ class User { @JsonKey(name: "updated_at") DateTime updatedAt; - static User fromJSON(Map input) { + static User fromJson(Map input) { if (input == null) return null; if (input['avatar_url'] == null) { - print(input); return null; } return _$UserFromJson(input)..json = input; } + + Map toJson() { + return _$UserToJson(this); + } } /// The Currently Authenticated User diff --git a/lib/src/common/model/users.g.dart b/lib/src/common/model/users.g.dart index df8ef137..cd737c40 100644 --- a/lib/src/common/model/users.g.dart +++ b/lib/src/common/model/users.g.dart @@ -32,6 +32,27 @@ User _$UserFromJson(Map json) { : DateTime.parse(json['updated_at'] as String); } +Map _$UserToJson(User instance) => { + 'login': instance.login, + 'id': instance.id, + 'avatar_url': instance.avatarUrl, + 'html_url': instance.htmlUrl, + 'site_admin': instance.siteAdmin, + 'name': instance.name, + 'company': instance.company, + 'blog': instance.blog, + 'location': instance.location, + 'email': instance.email, + 'hirable': instance.hirable, + 'bio': instance.bio, + 'public_repos': instance.publicReposCount, + 'public_gists': instance.publicGistsCount, + 'followers': instance.followersCount, + 'following': instance.followingCount, + 'created_at': instance.createdAt?.toIso8601String(), + 'updated_at': instance.updatedAt?.toIso8601String() + }; + 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 7cb2a3f9..28bc17af 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -154,7 +154,7 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/#list-contributors Stream listContributors(RepositorySlug slug, {bool anon: false}) { return new PaginationHelper(_github).objects( - 'GET', '/repos/${slug.fullName}/contributors', User.fromJSON, + 'GET', '/repos/${slug.fullName}/contributors', User.fromJson, params: {"anon": anon.toString()}) as Stream; } @@ -203,7 +203,7 @@ class RepositoriesService extends Service { /// API docs: https://developer.github.com/v3/repos/collaborators/#list Stream listCollaborators(RepositorySlug slug) { return new PaginationHelper(_github) - .objects("GET", "/repos/${slug.fullName}/collaborators", User.fromJSON); + .objects("GET", "/repos/${slug.fullName}/collaborators", User.fromJson); } Future isCollaborator(RepositorySlug slug, String user) { @@ -506,7 +506,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) - .objects("GET", "/repos/${slug.fullName}/releases", Release.fromJSON); + .objects("GET", "/repos/${slug.fullName}/releases", Release.fromJson); } /// Fetches a single release. @@ -514,14 +514,15 @@ class RepositoriesService extends Service { /// 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); + convert: Release.fromJson); /// 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: release.toJSON()) as Future; + convert: Release.fromJson, + body: jsonEncode(release.toJson())) as Future; } // TODO: Implement editRelease: https://developer.github.com/v3/repos/releases/#edit-a-release diff --git a/lib/src/common/search_service.dart b/lib/src/common/search_service.dart index d774121d..a834ddb5 100644 --- a/lib/src/common/search_service.dart +++ b/lib/src/common/search_service.dart @@ -87,7 +87,7 @@ class SearchService extends Service { var items = input['items'] as List; - items.map((item) => User.fromJSON(item)).forEach(controller.add); + items.map((item) => User.fromJson(item)).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 17f5d23d..dc2c7aea 100644 --- a/lib/src/common/users_service.dart +++ b/lib/src/common/users_service.dart @@ -11,7 +11,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. /// @@ -70,7 +70,7 @@ 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, + new PaginationHelper(_github).objects("GET", "/users", User.fromJson, pages: pages, params: {"since": since}); /// Lists all email addresses for the currently authenticated user. @@ -99,7 +99,7 @@ class UsersService extends Service { /// /// API docs: https://developer.github.com/v3/users/followers/#list-followers-of-a-user Stream listUserFollowers(String user) => new PaginationHelper(_github) - .objects("GET", "/users/$user/followers", User.fromJSON, 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) => @@ -135,7 +135,7 @@ class UsersService extends Service { /// /// API docs: https://developer.github.com/v3/users/followers/#list-followers-of-a-user Stream listCurrentUserFollowers() => new PaginationHelper(_github) - .objects("GET", "/user/followers", User.fromJSON, statusCode: 200); + .objects("GET", "/user/followers", 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. diff --git a/lib/src/server/hooks.dart b/lib/src/server/hooks.dart index 9f3fe9a3..70dc9c63 100644 --- a/lib/src/server/hooks.dart +++ b/lib/src/server/hooks.dart @@ -97,7 +97,7 @@ class RepositoryEvent extends HookEvent { ..action = json["action"] ..repository = Repository.fromJSON(json["repository"] as Map) - ..sender = User.fromJSON(json["sender"] as Map); + ..sender = User.fromJson(json["sender"] as Map); } } @@ -122,7 +122,7 @@ class ForkEvent extends HookEvent { static ForkEvent fromJSON(Map json) { return new ForkEvent() ..forkee = Repository.fromJSON(json["forkee"] as Map) - ..sender = User.fromJSON(json["sender"] as Map); + ..sender = User.fromJson(json["sender"] as Map); } } @@ -137,12 +137,12 @@ class IssueEvent extends HookEvent { static IssueEvent fromJSON(Map json) { return new IssueEvent() ..action = json["action"] - ..assignee = User.fromJSON(json["assignee"] as Map) + ..assignee = User.fromJson(json["assignee"] as Map) ..label = IssueLabel.fromJSON(json["label"] as Map) ..issue = Issue.fromJSON(json["issue"] as Map) ..repository = Repository.fromJSON(json["repository"] as Map) - ..sender = User.fromJSON(json["sender"] as Map); + ..sender = User.fromJson(json["sender"] as Map); } } @@ -161,6 +161,6 @@ class PullRequestEvent extends HookEvent { Repository.fromJSON(json["repository"] as Map) ..pullRequest = PullRequest.fromJSON(json["pull_request"] as Map) - ..sender = User.fromJSON(json["sender"] as Map); + ..sender = User.fromJson(json["sender"] as Map); } } diff --git a/test/assets/responses/create_release.dart b/test/assets/responses/create_release.dart new file mode 100644 index 00000000..5b0abfe6 --- /dev/null +++ b/test/assets/responses/create_release.dart @@ -0,0 +1,8 @@ +const Map createReleasePayload = { + "tag_name": "v1.0.0", + "target_commitish": "master", + "name": "v1.0.0", + "body": "Description of the release", + "draft": false, + "prerelease": false +}; diff --git a/test/assets/responses/release.dart b/test/assets/responses/release.dart new file mode 100644 index 00000000..d8682ce0 --- /dev/null +++ b/test/assets/responses/release.dart @@ -0,0 +1,88 @@ +/// https://developer.github.com/v3/repos/releases/#get-the-latest-release +const Map releasePayload = { + "url": "https://api.github.com/repos/octocat/Hello-World/releases/1", + "html_url": "https://github.com/octocat/Hello-World/releases/v1.0.0", + "assets_url": + "https://api.github.com/repos/octocat/Hello-World/releases/1/assets", + "upload_url": + "https://uploads.github.com/repos/octocat/Hello-World/releases/1/assets{?name,label}", + "tarball_url": + "https://api.github.com/repos/octocat/Hello-World/tarball/v1.0.0", + "zipball_url": + "https://api.github.com/repos/octocat/Hello-World/zipball/v1.0.0", + "id": 1, + "node_id": "MDc6UmVsZWFzZTE=", + "tag_name": "v1.0.0", + "target_commitish": "master", + "name": "v1.0.0", + "body": "Description of the release", + "draft": false, + "prerelease": false, + "created_at": "2013-02-27T19:35:32Z", + "published_at": "2013-02-27T19:35:32Z", + "author": { + "login": "octocat", + "id": 1, + "node_id": "MDQ6VXNlcjE=", + "avatar_url": "https://github.com/images/error/octocat_happy.gif", + "gravatar_id": "", + "url": "https://api.github.com/users/octocat", + "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", + "repos_url": "https://api.github.com/users/octocat/repos", + "events_url": "https://api.github.com/users/octocat/events{/privacy}", + "received_events_url": + "https://api.github.com/users/octocat/received_events", + "type": "User", + "site_admin": false + }, + "assets": [ + { + "url": + "https://api.github.com/repos/octocat/Hello-World/releases/assets/1", + "browser_download_url": + "https://github.com/octocat/Hello-World/releases/download/v1.0.0/example.zip", + "id": 1, + "node_id": "MDEyOlJlbGVhc2VBc3NldDE=", + "name": "example.zip", + "label": "short description", + "state": "uploaded", + "content_type": "application/zip", + "size": 1024, + "download_count": 42, + "created_at": "2013-02-27T19:35:32Z", + "updated_at": "2013-02-27T19:35:32Z", + "uploader": { + "login": "octocat", + "id": 1, + "node_id": "MDQ6VXNlcjE=", + "avatar_url": "https://github.com/images/error/octocat_happy.gif", + "gravatar_id": "", + "url": "https://api.github.com/users/octocat", + "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", + "repos_url": "https://api.github.com/users/octocat/repos", + "events_url": "https://api.github.com/users/octocat/events{/privacy}", + "received_events_url": + "https://api.github.com/users/octocat/received_events", + "type": "User", + "site_admin": false + } + } + ] +}; diff --git a/test/assets/responses/release_asset.dart b/test/assets/responses/release_asset.dart new file mode 100644 index 00000000..9971d6f8 --- /dev/null +++ b/test/assets/responses/release_asset.dart @@ -0,0 +1,38 @@ +const Map releaseAssetPayload = { + "url": "https://api.github.com/repos/octocat/Hello-World/releases/assets/1", + "browser_download_url": + "https://github.com/octocat/Hello-World/releases/download/v1.0.0/example.zip", + "id": 1, + "node_id": "MDEyOlJlbGVhc2VBc3NldDE=", + "name": "example.zip", + "label": "short description", + "state": "uploaded", + "content_type": "application/zip", + "size": 1024, + "download_count": 42, + "created_at": "2013-02-27T19:35:32Z", + "updated_at": "2013-02-27T19:35:32Z", + "uploader": { + "login": "octocat", + "id": 1, + "node_id": "MDQ6VXNlcjE=", + "avatar_url": "https://github.com/images/error/octocat_happy.gif", + "gravatar_id": "", + "url": "https://api.github.com/users/octocat", + "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", + "repos_url": "https://api.github.com/users/octocat/repos", + "events_url": "https://api.github.com/users/octocat/events{/privacy}", + "received_events_url": + "https://api.github.com/users/octocat/received_events", + "type": "User", + "site_admin": false + } +}; diff --git a/test/unit/common/model/repos_releases_test.dart b/test/unit/common/model/repos_releases_test.dart new file mode 100644 index 00000000..4e001fb1 --- /dev/null +++ b/test/unit/common/model/repos_releases_test.dart @@ -0,0 +1,42 @@ +import 'package:github/src/common/model/repos_releases.dart'; +import 'package:test/test.dart'; + +import '../../../assets/responses/create_release.dart'; +import '../../../assets/responses/release.dart'; +import '../../../assets/responses/release_asset.dart'; + +void main() { + group('Release', () { + test('fromJson', () { + expect(() => Release.fromJson(releasePayload), returnsNormally); + }); + + test('toJson', () { + final release = Release.fromJson(releasePayload); + expect(() => release.toJson(), returnsNormally); + }); + }); + + group('ReleaseAsset', () { + test('fromJson', () { + expect(() => ReleaseAsset.fromJson(releaseAssetPayload), returnsNormally); + }); + + test('toJson', () { + final releaseAsset = ReleaseAsset.fromJson(releaseAssetPayload); + expect(() => releaseAsset.toJson(), returnsNormally); + }); + }); + + group('CreateRelease', () { + test('fromJson', () { + expect( + () => CreateRelease.fromJson(createReleasePayload), returnsNormally); + }); + + test('toJson', () { + final createRelease = CreateRelease.fromJson(createReleasePayload); + expect(() => createRelease.toJson(), returnsNormally); + }); + }); +} From 1e792c55eaf8a45f6f1b927dd7b00ddb2ea3b558 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Wed, 9 Jan 2019 11:01:10 -0800 Subject: [PATCH 099/496] Fix RepositoriesService.listContributors --- CHANGELOG.md | 4 ++++ lib/src/common/repos_service.dart | 4 ++-- pubspec.yaml | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e242de8e..417457e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## v4.0.2 + +- Fix return type of `RepositoriesService.listContributors`. + ## v4.0.1 - Fix cast errors in event and issue queries. diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 28bc17af..e357b57c 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -152,10 +152,10 @@ 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}) { return new PaginationHelper(_github).objects( 'GET', '/repos/${slug.fullName}/contributors', User.fromJson, - params: {"anon": anon.toString()}) as Stream; + params: {"anon": anon.toString()}); } /// Lists the teams of the specified repository. diff --git a/pubspec.yaml b/pubspec.yaml index b72bdfda..3fce5159 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 4.0.1 +version: 4.0.2-dev author: Kenneth Endfinger description: GitHub API Client Library homepage: https://github.com/DirectMyFile/github.dart From 2a17b08deae445c35631b7b31184539854572278 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Wed, 9 Jan 2019 11:05:43 -0800 Subject: [PATCH 100/496] Fix return type of `RepositoriesService.createRelease` --- CHANGELOG.md | 1 + lib/src/common/repos_service.dart | 10 ++++------ 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 417457e0..3f4cb1ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ ## v4.0.2 - Fix return type of `RepositoriesService.listContributors`. +- Fix return type of `RepositoriesService.createRelease`. ## v4.0.1 diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index e357b57c..3dbcb7e2 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -135,7 +135,7 @@ class RepositoriesService extends Service { "default_branch": "defaultBranch" }); return _github.postJSON("/repos/${repo.fullName}", - body: jsonEncode(data), statusCode: 200) as Future; + body: jsonEncode(data), statusCode: 200); } /// Deletes a repository. @@ -474,8 +474,7 @@ class RepositoriesService extends Service { /// /// 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()) - as Future; + return _github.postJSON("/repos/${slug.fullName}/keys", body: key.toJSON()); } // TODO: Implement editDeployKey: https://developer.github.com/v3/repos/keys/#edit @@ -519,10 +518,9 @@ class RepositoriesService extends Service { /// 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) { + Future createRelease(RepositorySlug slug, CreateRelease release) { return _github.postJSON("/repos/${slug.fullName}/releases", - convert: Release.fromJson, - body: jsonEncode(release.toJson())) as Future; + convert: Release.fromJson, body: jsonEncode(release.toJson())); } // TODO: Implement editRelease: https://developer.github.com/v3/repos/releases/#edit-a-release From 45ee744f120b08c4ae0057b645bfd8065834b5fd Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Wed, 9 Jan 2019 11:39:27 -0800 Subject: [PATCH 101/496] Fixed `RepositoriesService.listContributorStats` --- CHANGELOG.md | 7 ++++ lib/src/common.g.dart | 20 ++++++++++++ lib/src/common/model/repos_stats.dart | 46 +++++++++++++-------------- lib/src/common/repos_service.dart | 40 +++++++++++------------ lib/src/common/util/errors.dart | 5 +++ 5 files changed, 74 insertions(+), 44 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3f4cb1ff..7932cf8e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ - Fix return type of `RepositoriesService.listContributors`. - Fix return type of `RepositoriesService.createRelease`. +- Fixed `RepositoriesService.listContributorStats`. + - 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 + `ContributorWeekStatistics` immutable. Since these classes are only meant as + return values, we're not treating this as a breaking change. ## v4.0.1 diff --git a/lib/src/common.g.dart b/lib/src/common.g.dart index 2cad0091..8b064b6b 100644 --- a/lib/src/common.g.dart +++ b/lib/src/common.g.dart @@ -346,3 +346,23 @@ Map _$LinksToJson(Links instance) => { '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); +} diff --git a/lib/src/common/model/repos_stats.dart b/lib/src/common/model/repos_stats.dart index 7215d786..358bef0a 100644 --- a/lib/src/common/model/repos_stats.dart +++ b/lib/src/common/model/repos_stats.dart @@ -1,51 +1,51 @@ part of github.common; /// Model class for a contributor's statistics for a repository. +@JsonSerializable(createToJson: false) class ContributorStatistics { /// The Author - User author; + final User author; /// Total Commits - int total; + final int total; /// Weekly Statistics - List weeks; + final List weeks; - static ContributorStatistics fromJSON(Map input) { - if (input == null) return null; + ContributorStatistics(this.author, this.total, this.weeks); - return new ContributorStatistics() - ..author = User.fromJson(input['author'] as Map) - ..total = input['total'] - ..weeks = (input['weeks'] as List>) - .map((it) => ContributorWeekStatistics.fromJSON(it)); - } + factory ContributorStatistics.fromJson(Map json) => + _$ContributorStatisticsFromJson(json); } /// Model class to represent the number of additions, deletions and commits /// a contributor made in a given week. +@JsonSerializable(createToJson: false) class ContributorWeekStatistics { /// Beginning of the Week (As a Unix Timestamp) - String start; + @JsonKey(name: 'w') + final int start; /// Number of Additions - int additions; + @JsonKey(name: 'a') + final int additions; /// Number of Deletions - int deletions; + @JsonKey(name: 'd') + final int deletions; /// Number of Commits - int commits; + @JsonKey(name: 'c') + final int commits; - static ContributorWeekStatistics fromJSON(Map input) { - if (input == null) return null; + ContributorWeekStatistics( + this.start, this.additions, this.deletions, this.commits); - return new ContributorWeekStatistics() - ..additions = input['a'] - ..deletions = input['d'] - ..commits = input['c'] - ..start = input['w']; - } + factory ContributorWeekStatistics.fromJson(Map json) => + _$ContributorWeekStatisticsFromJson(json); + + String toString() => + 'ContributorWeekStatistics(start: $start, commits: $commits, additions: $additions, deletions: $deletions)'; } /// Model class for contributor participation. diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index 3dbcb7e2..bc690d48 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -533,29 +533,27 @@ class RepositoriesService extends Service { /// Lists repository contributor statistics. /// + /// It's possible that this API will throw [NotReady] in which case you should + /// try the call again later. + /// /// API docs: https://developer.github.com/v3/repos/statistics/#contributors - Future> listContributorStats(RepositorySlug slug, - {int limit: 30}) { - var completer = new Completer>(); + Future> listContributorStats( + RepositorySlug slug, + ) async { var path = "/repos/${slug.fullName}/stats/contributors"; - var handle; - handle = (json) { - if (json is Map) { - new Future.delayed(new Duration(milliseconds: 200), () { - _github.getJSON(path, - statusCode: 200, - convert: handle, - params: {"per_page": limit.toString()}); - }); - return null; - } else { - completer.complete(json.map( - (Map it) => ContributorStatistics.fromJSON(it))); - } - }; - _github - .getJSON(path, convert: handle, params: {"per_page": limit.toString()}); - return completer.future; + var response = await _github.request('GET', path, + headers: {"Accept": "application/vnd.github.v3+json"}); + + if (response.statusCode == 200) { + return (jsonDecode(response.body) as List) + .map((e) => ContributorStatistics.fromJson(e)) + .toList(); + } else if (response.statusCode == 202) { + throw NotReady(_github, path); + } + _github.handleStatusCode(response); + // will never get here! + return null; } /// Fetches commit counts for the past year. diff --git a/lib/src/common/util/errors.dart b/lib/src/common/util/errors.dart index fcad2baf..6b21d2db 100644 --- a/lib/src/common/util/errors.dart +++ b/lib/src/common/util/errors.dart @@ -13,6 +13,11 @@ class GitHubError implements Exception { String toString() => "GitHub Error: $message"; } +class NotReady extends GitHubError { + 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); From 6e328d301ee8040bfce3ddb3e2697e336df335d7 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Wed, 9 Jan 2019 12:19:43 -0800 Subject: [PATCH 102/496] Use pkg:meta alwaysThrows to flag always throwing functions --- lib/src/common.dart | 1 + lib/src/common/github.dart | 2 +- lib/src/common/repos_service.dart | 2 -- pubspec.yaml | 1 + 4 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/src/common.dart b/lib/src/common.dart index cc011d43..0e55c00f 100644 --- a/lib/src/common.dart +++ b/lib/src/common.dart @@ -9,6 +9,7 @@ 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 'common/model/repos_releases.dart'; import 'common/model/users.dart'; diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index 9c5dabad..f7dab6b5 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -286,6 +286,7 @@ class GitHub { /// /// Internal method to handle status codes /// + @meta.alwaysThrows void handleStatusCode(http.Response response) { String message; List> errors; @@ -396,7 +397,6 @@ class GitHub { if (statusCode != null && statusCode != response.statusCode) { fail != null ? fail(response) : null; handleStatusCode(response); - return null; } else return response; } diff --git a/lib/src/common/repos_service.dart b/lib/src/common/repos_service.dart index bc690d48..5a1f2b1e 100644 --- a/lib/src/common/repos_service.dart +++ b/lib/src/common/repos_service.dart @@ -552,8 +552,6 @@ class RepositoriesService extends Service { throw NotReady(_github, path); } _github.handleStatusCode(response); - // will never get here! - return null; } /// Fetches commit counts for the past year. diff --git a/pubspec.yaml b/pubspec.yaml index 3fce5159..f47d20a8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -9,6 +9,7 @@ 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 3985afa605e5ff8beda87113559a02915b13719b Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Wed, 9 Jan 2019 12:55:52 -0800 Subject: [PATCH 103/496] GitHub: remove redundant auth logic --- lib/src/common/github.dart | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index f7dab6b5..ff678920 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -205,14 +205,6 @@ class GitHub { headers.putIfAbsent("Accept", () => "application/vnd.github.v3+json"); - if (auth.isToken) { - headers.putIfAbsent("Authorization", () => "token ${auth.token}"); - } else if (auth.isBasic) { - var userAndPass = - base64Encode(utf8.encode('${auth.username}:${auth.password}')); - headers.putIfAbsent("Authorization", () => "basic $userAndPass"); - } - var response = await request("GET", path, headers: headers, params: params, statusCode: statusCode, fail: fail); @@ -266,14 +258,6 @@ class GitHub { headers.putIfAbsent("Accept", () => "application/vnd.github.v3+json"); - if (auth.isToken) { - headers.putIfAbsent("Authorization", () => "token ${auth.token}"); - } else if (auth.isBasic) { - var userAndPass = - base64Encode(utf8.encode('${auth.username}:${auth.password}')); - headers.putIfAbsent("Authorization", () => "basic $userAndPass"); - } - var response = await request("POST", path, headers: headers, params: params, From ddf660d97354ef09ee396ffbab3c6eb12c29ceea Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Wed, 9 Jan 2019 12:56:29 -0800 Subject: [PATCH 104/496] GitHub: code reorg --- lib/src/common/github.dart | 94 +++++++++++++++++++------------------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index ff678920..62d9383b 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -267,53 +267,6 @@ class GitHub { return convert(jsonDecode(response.body)); } - /// - /// Internal method to handle status codes - /// - @meta.alwaysThrows - void handleStatusCode(http.Response response) { - String message; - List> errors; - if (response.headers['content-type'].contains('application/json')) { - var json = jsonDecode(response.body); - message = json['message']; - errors = json['errors'] as List>; - } - switch (response.statusCode) { - case 404: - throw new NotFound(this, "Requested Resource was Not Found"); - break; - case 401: - throw new AccessForbidden(this); - case 400: - if (message == "Problems parsing JSON") { - throw new InvalidJSON(this, message); - } else if (message == "Body should be a JSON Hash") { - throw new InvalidJSON(this, message); - } else - throw new BadRequest(this); - break; - case 422: - var buff = new 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']; - buff - ..writeln(" Resource: $resource") - ..writeln(" Field $field") - ..write(" Code: $code"); - } - } - throw new ValidationFailed(this, buff.toString()); - } - throw new UnknownError(this, message); - } - /// Handles Authenticated Requests in an easy to understand way. /// /// [method] is the HTTP method. @@ -385,6 +338,53 @@ class GitHub { return response; } + /// + /// Internal method to handle status codes + /// + @meta.alwaysThrows + void handleStatusCode(http.Response response) { + String message; + List> errors; + if (response.headers['content-type'].contains('application/json')) { + var json = jsonDecode(response.body); + message = json['message']; + errors = json['errors'] as List>; + } + switch (response.statusCode) { + case 404: + throw new NotFound(this, "Requested Resource was Not Found"); + break; + case 401: + throw new AccessForbidden(this); + case 400: + if (message == "Problems parsing JSON") { + throw new InvalidJSON(this, message); + } else if (message == "Body should be a JSON Hash") { + throw new InvalidJSON(this, message); + } else + throw new BadRequest(this); + break; + case 422: + var buff = new 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']; + buff + ..writeln(" Resource: $resource") + ..writeln(" Field $field") + ..write(" Code: $code"); + } + } + throw new ValidationFailed(this, buff.toString()); + } + throw new UnknownError(this, message); + } + /// Disposes of this GitHub Instance. /// No other methods on this instance should be called after this method is called. void dispose() { From 6849af7d570bc67ad0c23306c179369914cafb9c Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Wed, 9 Jan 2019 13:11:35 -0800 Subject: [PATCH 105/496] GitHub: Share JSON logic between postJSON and getJSON Lot's of duplicate logic. Also applies expandos to post responses --- lib/src/common/github.dart | 100 ++++++++++++++++++++----------------- 1 file changed, 54 insertions(+), 46 deletions(-) diff --git a/lib/src/common/github.dart b/lib/src/common/github.dart index 62d9383b..4fd3c7a6 100644 --- a/lib/src/common/github.dart +++ b/lib/src/common/github.dart @@ -187,38 +187,19 @@ class GitHub { /// 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 fail(http.Response response), - Map headers, - Map params, - JSONConverter convert, - String preview}) async { - if (headers == null) headers = {}; - - if (preview != null) { - headers["Accept"] = preview; - } - - if (convert == null) { - convert = (input) => input as T; - } - - headers.putIfAbsent("Accept", () => "application/vnd.github.v3+json"); - - var response = await request("GET", path, - headers: headers, params: params, statusCode: statusCode, fail: fail); - - var json = jsonDecode(response.body); - - if (convert == null) { - _applyExpandos(json, response); - return json; - } - - final returnValue = convert(json); - _applyExpandos(returnValue, response); - return returnValue; - } + {int statusCode, + void fail(http.Response response), + 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 JSO /// @@ -239,32 +220,59 @@ class GitHub { /// 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}) async { - if (headers == null) headers = {}; + {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); + + Future _requestJson( + String method, + String path, { + int statusCode, + void fail(http.Response response), + Map headers, + Map params, + JSONConverter convert, + String body, + String preview, + }) async { + convert ??= (input) => input as T; + headers ??= {}; if (preview != null) { headers["Accept"] = preview; } - if (convert == null) { - convert = (input) => input as T; - } - headers.putIfAbsent("Accept", () => "application/vnd.github.v3+json"); - var response = await request("POST", path, + var response = await request(method, path, headers: headers, params: params, body: body, statusCode: statusCode, fail: fail); - return convert(jsonDecode(response.body)); + + var json = jsonDecode(response.body); + + if (convert == null) { + _applyExpandos(json, response); + return json; + } + + final returnValue = convert(json); + _applyExpandos(returnValue, response); + return returnValue; } /// Handles Authenticated Requests in an easy to understand way. From 32cc4f0a3b40288ac37575691fa6ec4f4099a272 Mon Sep 17 00:00:00 2001 From: Rob Becker Date: Thu, 10 Jan 2019 06:31:23 -0700 Subject: [PATCH 106/496] Add Code Search (#120) * Add code search * Don't parse code search results as users * additional fixes for dart 2 * update doc string, remove TODO * add a search example, use localstorage * use consistent single quotes * fix rate limit error handling * made json_serializable .. not quite working yet * fix up remaining issues * simplify by using a completer, add comments * make the return type a stream and make pages and perPage required * cleanup - add changelog entry - remove example updates - un required pages and perPage * simplify Don't do shenanigans with another stream controller, just map the stream from the pagination helper This helps to limit network requests until consumers pull values update the search example to use "await for" * more cleaning, update changelog * bump version to 4.1.0 * update to 4.1.0 in the changelog too --- CHANGELOG.md | 6 ++- example/index.html | 1 + example/search.dart | 51 ++++++++++++++++++++ example/search.html | 37 ++++++++++++++ lib/src/common.dart | 9 +++- lib/src/common.g.dart | 24 ++++++++++ lib/src/common/model/search.dart | 66 +++++++++++++++++++------ lib/src/common/search_service.dart | 77 +++++++++++++++++++++++++++++- pubspec.yaml | 2 +- test/code_search_test.dart | 17 +++++++ 10 files changed, 272 insertions(+), 18 deletions(-) create mode 100644 example/search.dart create mode 100644 example/search.html create mode 100644 test/code_search_test.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index 7932cf8e..b1fecab3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## v4.0.2 +## v4.1.0 - Fix return type of `RepositoriesService.listContributors`. - Fix return type of `RepositoriesService.createRelease`. @@ -9,6 +9,10 @@ - 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 + - Made `CodeSearchResults` class to hold search results + - Made `CodeSearchItem` class to hold each search result item + - Added a code search example ## v4.0.1 diff --git a/example/index.html b/example/index.html index 644d3bb9..16befe79 100644 --- a/example/index.html +++ b/example/index.html @@ -35,6 +35,7 @@

GitHub for Dart - Demos

Language Breakdown Releases Stars + Code Search Emoji Markdown Zen diff --git a/example/search.dart b/example/search.dart new file mode 100644 index 00000000..06f76f9c --- /dev/null +++ b/example/search.dart @@ -0,0 +1,51 @@ +import 'dart:html'; +import 'package:github/browser.dart'; +import 'common.dart'; + +Future main() async { + await initViewSourceButton('search.dart'); + + var searchBtn = querySelector('#submit'); + searchBtn.onClick.listen(search); +} + +Future search(_) async { + Stream resultsStream = github.search.code( + val('query'), + language: val('language'), + filename: val('filename'), + user: val('user'), + repo: val('repo'), + org: val('org'), + extension: val('ext'), + 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')), + ); + DivElement resultsDiv = querySelector('#results'); + resultsDiv.innerHtml = ''; + + int count = 0; + await for (var 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; + resultsDiv.append(DivElement() + ..append(AnchorElement(href: url.toString()) + ..text = path + ..target = '_blank')); + } + } +} + +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 new file mode 100644 index 00000000..0642e3db --- /dev/null +++ b/example/search.html @@ -0,0 +1,37 @@ + + + + + GitHub Code Search + + + +

GitHub Search

+
Repo:
+
Language:
+
Filename:
+
Extension:
+
Username:
+
Org:
+
Fork: (true, only)
+
Path:
+
Size:
+
Query:
+
+ In File Contents
+ In Path +
+
+ Per Page: + Pages: +
+
+ +
+
+ + + + + + \ No newline at end of file diff --git a/lib/src/common.dart b/lib/src/common.dart index 0e55c00f..2dfeb6ae 100644 --- a/lib/src/common.dart +++ b/lib/src/common.dart @@ -4,7 +4,14 @@ library github.common; import "dart:async"; import "dart:convert" - show base64Decode, base64Encode, jsonEncode, jsonDecode, LineSplitter, utf8; + 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; diff --git a/lib/src/common.g.dart b/lib/src/common.g.dart index 8b064b6b..823f52d1 100644 --- a/lib/src/common.g.dart +++ b/lib/src/common.g.dart @@ -366,3 +366,27 @@ ContributorWeekStatistics _$ContributorWeekStatisticsFromJson( 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 = json['items'] == null + ? null + : 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 = 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); +} diff --git a/lib/src/common/model/search.dart b/lib/src/common/model/search.dart index 6cf07f5a..9faaea3a 100644 --- a/lib/src/common/model/search.dart +++ b/lib/src/common/model/search.dart @@ -1,29 +1,67 @@ part of github.common; -class SearchResults { +abstract class SearchResults { + int totalCount; + bool incompleteResults; + List items; +} + +@JsonSerializable(generateToJsonFunction: false, createToJson: false) +class CodeSearchResults implements SearchResults { @JsonKey(name: "total_count") int totalCount; @JsonKey(name: "incomplete_results") bool incompleteResults; - List items; + @JsonKey(fromJson: CodeSearchItem.fromJsonList) + List items; + + static CodeSearchResults fromJson(Map input) => + _$CodeSearchResultsFromJson(input); +} - static SearchResults fromJSON( - Map input, JSONConverter resultConverter) { - var results = new SearchResults(); - results - ..totalCount = input['total_count'] - ..incompleteResults = input['incomplete_results']; +@JsonSerializable(generateToJsonFunction: false, createToJson: false) +class CodeSearchItem { + @JsonKey() + String name; - var itemList = input['items']; + @JsonKey() + String path; - results.items = []; + @JsonKey() + String sha; - for (var item in itemList) { - results.items.add(resultConverter(item)); - } + @JsonKey(fromJson: Uri.parse) + Uri url; - return results; + @JsonKey(name: 'git_url', fromJson: Uri.parse) + Uri gitUrl; + + @JsonKey(name: 'html_url', fromJson: Uri.parse) + Uri htmlUrl; + + @JsonKey(fromJson: Repository.fromJSON) + Repository repository; + + static CodeSearchItem fromJson(Map input) { + return _$CodeSearchItemFromJson(input); + } + + static List fromJsonList(List input) { + var result = []; + for (var item in input) { + if (item is Map) { + result.add(CodeSearchItem.fromJson(item)); + } + } + return result; } } + +// TODO: Issue Search +// @JsonSerializable(generateToJsonFunction: false, createToJson: false) +// class IssueSearchResults extends SearchResults {} + +// @JsonSerializable(generateToJsonFunction: false, createToJson: false) +// class IssueSearchItem {} diff --git a/lib/src/common/search_service.dart b/lib/src/common/search_service.dart index a834ddb5..fc4b3424 100644 --- a/lib/src/common/search_service.dart +++ b/lib/src/common/search_service.dart @@ -47,7 +47,82 @@ class SearchService extends Service { return controller.stream; } - // TODO: Implement code: https://developer.github.com/v3/search/#search-code + /// Search through code for a given [query]. + /// By default you will get all search results if you consume all + /// events on the returned stream. To limit results, set the + /// [pages] and [perPage] parameters. + /// + /// You can include any github qualifiers in the query directly + /// or you can set some of the optional params to set the qualifiers + /// For example, these do the same thing: + /// code('awesome language:dart') and + /// code('awesome', language: 'dart') + /// + /// 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, + bool inFile: true, + bool inPath: false, + }) { + // Add qualifiers to the query + // Known Issue: If a query already has a qualifier and the same + // qualifier parameter is passed in, it will be duplicated. + // Example: code('example repo:ex', repo: 'ex') will result in + // a query of "example repo:ex repo:ex" + query += _searchQualifier('language', language); + query += _searchQualifier('filename', filename); + query += _searchQualifier('extension', extension); + query += _searchQualifier('user', user); + query += _searchQualifier('org', org); + query += _searchQualifier('repo', repo); + query += _searchQualifier('fork', fork); + query += _searchQualifier('path', path); + query += _searchQualifier('size', size); + + // build up the in: qualifier based on the 2 booleans + String _in = ''; + if (inFile) { + _in = 'file'; + } + if (inPath) { + if (_in.isEmpty) { + _in = 'path'; + } else { + _in = 'file,path'; + } + } + if (_in.isNotEmpty) { + query += ' in:$_in'; + } + + var params = {}; + params['q'] = query ?? ''; + if (perPage != null) { + params['per_page'] = perPage.toString(); + } + + return new PaginationHelper(_github) + .fetchStreamed("GET", "/search/code", params: params, pages: pages) + .map((r) => CodeSearchResults.fromJson(json.decode(r.body))); + } + + String _searchQualifier(String key, String value) { + if (value != null && value.isNotEmpty) { + return ' $key:$value'; + } + return ''; + } // TODO: Implement issues: https://developer.github.com/v3/search/#search-issues /// Search for users using [query]. diff --git a/pubspec.yaml b/pubspec.yaml index f47d20a8..25e65f22 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: github -version: 4.0.2-dev +version: 4.1.0 author: Kenneth Endfinger description: GitHub API Client Library homepage: https://github.com/DirectMyFile/github.dart diff --git a/test/code_search_test.dart b/test/code_search_test.dart new file mode 100644 index 00000000..be02d802 --- /dev/null +++ b/test/code_search_test.dart @@ -0,0 +1,17 @@ +import 'dart:io'; +import 'package:github/server.dart'; + +Future main() async { + print('Searching ...'); + GitHub github = new GitHub(); + + Stream resultsStream = github.search + .code('github', repo: 'DirectMyFile/github.dart', perPage: 5, pages: 1); + var results = await resultsStream.first; + print('${results.totalCount} results'); + int k = 1; + for (var i in results.items) { + print('${k++} ${i.path}'); + } + exit(0); +} From 8b7a001699dd3e0517ab34794c08fad4ac93253d Mon Sep 17 00:00:00 2001 From: Aaron Madison Date: Fri, 1 Mar 2019 15:59:45 -0600 Subject: [PATCH 107/496] 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 108/496] 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 109/496] 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 110/496] 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 111/496] 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 112/496] 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 113/496] 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 114/496] 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 115/496] 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 116/496] 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 117/496] 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 118/496] 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 119/496] 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 120/496] 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 121/496] 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 122/496] 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 123/496] 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 124/496] 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 125/496] 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 126/496] 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 127/496] 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 128/496] 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 129/496] 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 130/496] 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 131/496] 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 132/496] 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 133/496] 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 134/496] 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 135/496] 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 136/496] 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 137/496] 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 138/496] 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 139/496] 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 140/496] 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 141/496] 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 142/496] 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 143/496] 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 144/496] 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 145/496] 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 146/496] 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 147/496] 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 148/496] 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 149/496] 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 150/496] 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 151/496] 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 152/496] 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 153/496] 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 154/496] 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 155/496] 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 156/496] 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 157/496] 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 158/496] 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 159/496] 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 160/496] 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 161/496] 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 162/496] 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 163/496] 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 164/496] 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 165/496] 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 166/496] 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 167/496] 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 168/496] 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 169/496] 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 170/496] 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 171/496] 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 172/496] 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 173/496] 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 174/496] 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 175/496] 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 176/496] 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 177/496] 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 178/496] 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 179/496] 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 180/496] 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 181/496] 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 182/496] 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 183/496] 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 184/496] 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 185/496] 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 186/496] 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 187/496] 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 188/496] 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 189/496] 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 190/496] 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 191/496] 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 192/496] 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 193/496] 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 194/496] 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 195/496] 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 196/496] 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 197/496] 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 198/496] 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 199/496] 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 200/496] 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 201/496] 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 202/496] 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 203/496] 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 204/496] `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 205/496] 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 206/496] 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 207/496] 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 208/496] 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 209/496] 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 210/496] 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 231/496] 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 232/496] 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 233/496] 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 234/496] 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 235/496] 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 236/496] 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 237/496] 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 238/496] 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 239/496] 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 240/496] 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 241/496] 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 242/496] 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 243/496] 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 244/496] 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 245/496] 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 246/496] 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 247/496] 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 248/496] 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 249/496] 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 250/496] 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 251/496] 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 252/496] 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 253/496] 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 254/496] 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 255/496] 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 256/496] 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 257/496] 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 258/496] 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 259/496] 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 260/496] 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 261/496] 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 262/496] 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 263/496] 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 264/496] 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 265/496] 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 266/496] 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 267/496] 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 268/496] 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 269/496] 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 270/496] 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 271/496] 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 272/496] 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 273/496] 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 274/496] 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 275/496] 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 276/496] 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 277/496] 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 278/496] 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 279/496] 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 280/496] 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 281/496] 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 282/496] 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 283/496] 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 284/496] 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 285/496] 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 286/496] 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 287/496] 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 288/496] 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 289/496] 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 290/496] 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 291/496] 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 292/496] 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 293/496] 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 294/496] 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 295/496] 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 296/496] 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 297/496] 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 298/496] 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 299/496] 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 300/496] 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 301/496] 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 302/496] 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 303/496] 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 304/496] 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 305/496] 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 306/496] 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 307/496] 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 308/496] 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 309/496] 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 310/496] 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 311/496] 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 312/496] 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 313/496] 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 314/496] 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 315/496] 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 316/496] 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 317/496] 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 318/496] 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 319/496] 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 320/496] 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 321/496] 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 322/496] 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 323/496] 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 324/496] 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 325/496] 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 326/496] 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 327/496] 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 328/496] 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 329/496] 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 330/496] 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 331/496] 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 332/496] 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 333/496] 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 334/496] 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 335/496] 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 336/496] 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 337/496] 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 338/496] 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 339/496] 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 340/496] 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 341/496] 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 342/496] 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 343/496] 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 344/496] 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 345/496] 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 346/496] 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 347/496] 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 348/496] 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 349/496] 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 350/496] 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 351/496] 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 352/496] 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 353/496] 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 354/496] 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 355/496] 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 356/496] 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 357/496] 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 358/496] 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 359/496] 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 360/496] 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 361/496] 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 362/496] 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 363/496] 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 364/496] 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 365/496] 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 366/496] 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 367/496] 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 368/496] 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 369/496] 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 370/496] 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 371/496] 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 372/496] 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 373/496] 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 374/496] 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 375/496] 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 376/496] 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 377/496] 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 378/496] 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 379/496] 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 380/496] 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 381/496] 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 382/496] 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 383/496] 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 384/496] 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 385/496] 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 386/496] 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 387/496] 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 388/496] 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 389/496] 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 390/496] 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 391/496] 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 392/496] 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 393/496] 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 394/496] 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 395/496] 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 396/496] 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 397/496] 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 398/496] 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 399/496] 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 400/496] 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 401/496] 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 402/496] 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 403/496] 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 404/496] 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 405/496] 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 406/496] 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 407/496] 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 408/496] 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 409/496] 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 410/496] 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 411/496] 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 412/496] 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 413/496] 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 414/496] 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 415/496] 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 416/496] 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 417/496] 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 418/496] 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 419/496] 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 420/496] 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 421/496] 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 422/496] 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 423/496] 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 424/496] 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 425/496] 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 426/496] 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 427/496] 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 428/496] 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 429/496] 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 430/496] 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 431/496] 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 432/496] 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 433/496] 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 434/496] 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 435/496] 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 436/496] 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 437/496] 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 438/496] 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 439/496] [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 440/496] 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 441/496] 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 442/496] 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 443/496] 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 444/496] 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 445/496] 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 446/496] 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 447/496] 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 448/496] 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 449/496] 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 450/496] 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 451/496] 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 452/496] 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 453/496] 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 454/496] 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 455/496] 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 456/496] 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 457/496] 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 458/496] 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 459/496] 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 460/496] 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 461/496] 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 462/496] 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 463/496] 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 464/496] 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 465/496] 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 466/496] 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 467/496] 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 468/496] 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 469/496] 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 470/496] 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 471/496] 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 472/496] 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 473/496] 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 474/496] 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 475/496] 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 476/496] 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 477/496] 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 478/496] 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 479/496] 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 480/496] 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 481/496] 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 482/496] 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 483/496] 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 484/496] 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 485/496] 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 486/496] 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 487/496] 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 488/496] 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 489/496] 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 490/496] 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 491/496] 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 492/496] 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 493/496] 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 494/496] 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 495/496] 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 496/496] 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