Skip to content

Commit 1acbdba

Browse files
authored
Merge pull request #244 from SpinlockLabs/nullsafe
nullsafe migration
2 parents db48a60 + 3649025 commit 1acbdba

File tree

104 files changed

+2101
-2183
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

104 files changed

+2101
-2183
lines changed

.github/workflows/dart.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ jobs:
88
runs-on: ubuntu-latest
99

1010
container:
11-
image: google/dart:latest
11+
image: google/dart:2.12
1212

1313
steps:
1414
- uses: actions/checkout@v1

CHANGELOG.md

+8-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
## 8.0.0
2+
- Allow start page, per_page, number of pages options to pagination helper
3+
- Allow page options for listTags
4+
5+
## 8.0.0-nullsafe.1
6+
- Update to null safety
7+
18
## 7.0.4
29
- Add hasPages attribute to Repository https://github.com/SpinlockLabs/github.dart/pull/238
310

@@ -69,7 +76,7 @@
6976
- For web: browser specific helper methods have moved. use import `package:github/browser_helper.dart` (renderMarkdown, and createAvatorImage)
7077
- `createGithubClient(...)` has been removed. Just create a GitHub object directly now.
7178
- `findAuthenticationFromEnvironment` now works in both server/flutter and web environments
72-
- On the web, it will check the query string first, then localstorage
79+
- On the web, it will check the query string first, then session storage
7380
- all static methods are now factory constructors
7481
- fromJSON is now fromJson everywhere
7582
- toJSON is now toJson everywhere

build.yaml

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
targets:
2+
$default:
3+
builders:
4+
json_serializable:
5+
options:
6+
# Options configure how source code is generated for every
7+
# `@JsonSerializable`-annotated class in the package.
8+
field_rename: snake

example/common.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ export 'package:github/browser_helper.dart';
1212
/// view source button, then you don't need to call this method
1313
Future<void> initViewSourceButton(String script) async {
1414
// query the DOM for the view source button, handle clicks
15-
document.querySelector('#view-source')?.onClick?.listen((_) {
15+
document.querySelector('#view-source')?.onClick.listen((_) {
1616
final popup = window.open('view_source.html?script=$script', 'View Source');
17-
String code;
17+
String? code;
1818

1919
var fetched = false;
2020
var ready = false;

example/emoji.dart

+8-8
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import 'dart:html';
33

44
import 'common.dart';
55

6-
Element emojiDiv;
6+
Element? emojiDiv;
77

88
Future<void> main() async {
99
await initViewSourceButton('emoji.dart');
@@ -25,23 +25,23 @@ Future<void> loadEmojis() async {
2525
h.append(
2626
ImageElement(src: url, width: 64, height: 64)..classes.add('emoji'));
2727
h.append(ParagraphElement()..text = ':$name:');
28-
emojiDiv.append(h);
28+
emojiDiv!.append(h);
2929
});
3030
}
3131

32-
String lastQuery;
32+
String? lastQuery;
3333

34-
void filter(String query) {
34+
void filter(String? query) {
3535
if (lastQuery != null && lastQuery == query) {
3636
return;
3737
}
3838
lastQuery = query;
39-
final boxes = emojiDiv.children;
39+
final boxes = emojiDiv!.children;
4040
for (final box in boxes) {
41-
final boxName = box.querySelector('p');
42-
final t = boxName.text;
41+
final boxName = box.querySelector('p')!;
42+
final t = boxName.text!;
4343
final name = t.substring(1, t.length - 1);
44-
if (name.contains(query)) {
44+
if (name.contains(query!)) {
4545
box.style.display = 'inline';
4646
} else {
4747
box.style.display = 'none';

example/index.dart

+4-4
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ import 'dart:html';
22
import 'common.dart';
33

44
void main() {
5-
final InputElement tokenInput = querySelector('#token');
6-
tokenInput.value = github.auth.token ?? '';
7-
window.sessionStorage['GITHUB_TOKEN'] = tokenInput.value;
5+
final tokenInput = querySelector('#token') as InputElement;
6+
tokenInput.value = github.auth!.token ?? '';
7+
window.sessionStorage['GITHUB_TOKEN'] = tokenInput.value!;
88
tokenInput.onKeyUp.listen((_) {
9-
window.sessionStorage['GITHUB_TOKEN'] = tokenInput.value;
9+
window.sessionStorage['GITHUB_TOKEN'] = tokenInput.value!;
1010
});
1111
}

example/languages.dart

+8-17
Original file line numberDiff line numberDiff line change
@@ -3,31 +3,22 @@ import 'dart:html';
33
import 'package:github/github.dart';
44
import 'common.dart';
55

6-
DivElement tableDiv;
6+
DivElement? tableDiv;
77

8-
LanguageBreakdown breakdown;
8+
late LanguageBreakdown breakdown;
99

1010
Future<void> main() async {
1111
await initViewSourceButton('languages.dart');
12-
tableDiv = querySelector('#table');
12+
tableDiv = querySelector('#table') as DivElement?;
1313
await loadRepository();
1414
}
1515

1616
Future<void> loadRepository() async {
17-
var user = 'dart-lang';
18-
var reponame = 'sdk';
19-
2017
final params = queryString;
18+
var user = params['user'] ?? 'dart-lang';
19+
var reponame = params['repo'] ?? 'sdk';
2120

22-
if (params.containsKey('user')) {
23-
user = params['user'];
24-
}
25-
26-
if (params.containsKey('repo')) {
27-
reponame = params['repo'];
28-
}
29-
30-
document.getElementById('name').setInnerHtml('$user/$reponame');
21+
document.getElementById('name')!.setInnerHtml('$user/$reponame');
3122

3223
final repo = RepositorySlug(user, reponame);
3324
breakdown = await github.repositories.listLanguages(repo);
@@ -44,7 +35,7 @@ void reloadTable({int accuracy = 4}) {
4435
isReloadingTable = true;
4536
final md = generateMarkdown(accuracy);
4637
github.misc.renderMarkdown(md).then((html) {
47-
tableDiv.setInnerHtml(html, treeSanitizer: NodeTreeSanitizer.trusted);
38+
tableDiv!.setInnerHtml(html, treeSanitizer: NodeTreeSanitizer.trusted);
4839
isReloadingTable = false;
4940
});
5041
}
@@ -62,7 +53,7 @@ String generateMarkdown(int accuracy) {
6253
data.sort((a, b) => b[1].compareTo(a[1]));
6354

6455
data.forEach((info) {
65-
final String name = info[0];
56+
final String? name = info[0];
6657
final int bytes = info[1];
6758
final num percentage = (bytes / total) * 100;
6859
md += '|$name|$bytes|${percentage.toStringAsFixed(accuracy)}|\n';

example/organization.dart

+14-14
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,25 @@ import 'dart:html';
44
import 'package:github/github.dart';
55
import 'common.dart';
66

7-
DivElement $output;
8-
InputElement $input;
9-
ButtonElement $btn;
7+
DivElement? $output;
8+
InputElement? $input;
9+
ButtonElement? $btn;
1010

1111
Future<void> main() async {
1212
await initViewSourceButton('organization.dart');
13-
$output = querySelector('#output');
14-
$input = querySelector('#input');
15-
$btn = querySelector('#submit');
16-
$input.onChange.listen((_) {
17-
loadOrganization($input.value);
13+
$output = querySelector('#output') as DivElement?;
14+
$input = querySelector('#input') as InputElement?;
15+
$btn = querySelector('#submit') as ButtonElement?;
16+
$input!.onChange.listen((_) {
17+
loadOrganization($input!.value);
1818
});
19-
$btn.onClick.listen((_) {
20-
loadOrganization($input.value);
19+
$btn!.onClick.listen((_) {
20+
loadOrganization($input!.value);
2121
});
22-
$btn.click();
22+
$btn!.click();
2323
}
2424

25-
Future<void> loadOrganization(String orgToLoad) async {
25+
Future<void> loadOrganization(String? orgToLoad) async {
2626
try {
2727
final org = await github.organizations.get(orgToLoad);
2828
final html = '''
@@ -32,8 +32,8 @@ Future<void> loadOrganization(String orgToLoad) async {
3232
<br/>Followers: ${org.followersCount}
3333
<br/>Following: ${org.followingCount}
3434
''';
35-
$output.innerHtml = html;
35+
$output!.innerHtml = html;
3636
} on OrganizationNotFound {
37-
$output.innerHtml = 'Not found.';
37+
$output!.innerHtml = 'Not found.';
3838
}
3939
}

example/readme.dart

+1-3
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,9 @@ import 'package:github/github.dart';
44

55
import 'common.dart';
66

7-
DivElement readmeDiv;
8-
97
Future<void> main() async {
108
await initViewSourceButton('readme.dart');
11-
readmeDiv = querySelector('#readme');
9+
var readmeDiv = querySelector('#readme')!;
1210
var repo = RepositorySlug('SpinlockLabs', 'github.dart');
1311
final readme = await github.repositories.getReadme(repo);
1412
final html = await github.misc.renderMarkdown(readme.text);

example/releases.dart

+5-8
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ import 'package:github/github.dart';
44

55
import 'common.dart';
66

7-
DivElement releasesDiv;
7+
DivElement? releasesDiv;
88

99
Future<void> main() async {
1010
await initViewSourceButton('releases.dart');
11-
releasesDiv = querySelector('#releases');
11+
releasesDiv = querySelector('#releases') as DivElement?;
1212
loadReleases();
1313
}
1414

@@ -19,17 +19,14 @@ void loadReleases() {
1919
.toList()
2020
.then((releases) {
2121
for (final release in releases) {
22-
releasesDiv.appendHtml('''
22+
releasesDiv!.appendHtml('''
2323
<div class="repo box" id="release-${release.id}">
2424
<h1>${release.name}</h1>
2525
</div>
2626
''', treeSanitizer: NodeTreeSanitizer.trusted);
27-
final rel = releasesDiv.querySelector('#release-${release.id}');
27+
final rel = releasesDiv!.querySelector('#release-${release.id}');
2828
void append(String key, String value) {
29-
if (value == null) {
30-
return;
31-
}
32-
rel.appendHtml('<br/><b>$key</b>: $value',
29+
rel!.appendHtml('<br/><b>$key</b>: $value',
3330
treeSanitizer: NodeTreeSanitizer.trusted);
3431
}
3532

example/repos.dart

+21-20
Original file line numberDiff line numberDiff line change
@@ -5,54 +5,55 @@ import 'package:github/github.dart';
55

66
import 'common.dart';
77

8-
DivElement repositoriesDiv;
9-
List<Repository> repos;
8+
DivElement? repositoriesDiv;
9+
List<Repository>? repos;
1010

1111
Map<String, Comparator<Repository>> sorts = {
1212
'stars': (Repository a, Repository b) =>
1313
b.stargazersCount.compareTo(a.stargazersCount),
1414
'forks': (Repository a, Repository b) => b.forksCount.compareTo(a.forksCount),
15-
'created': (Repository a, Repository b) => b.createdAt.compareTo(a.createdAt),
16-
'pushed': (Repository a, Repository b) => b.pushedAt.compareTo(a.pushedAt),
15+
'created': (Repository a, Repository b) =>
16+
b.createdAt!.compareTo(a.createdAt!),
17+
'pushed': (Repository a, Repository b) => b.pushedAt!.compareTo(a.pushedAt!),
1718
'size': (Repository a, Repository b) => b.size.compareTo(a.size)
1819
};
1920

2021
Future<void> main() async {
2122
await initViewSourceButton('repos.dart');
2223

23-
repositoriesDiv = querySelector('#repos');
24+
repositoriesDiv = querySelector('#repos') as DivElement?;
2425

2526
loadRepos();
2627

27-
querySelector('#reload').onClick.listen((event) {
28+
querySelector('#reload')!.onClick.listen((event) {
2829
loadRepos();
2930
});
3031

3132
sorts.keys.forEach((name) {
32-
querySelector('#sort-$name').onClick.listen((event) {
33+
querySelector('#sort-$name')!.onClick.listen((event) {
3334
if (_reposCache == null) {
3435
loadRepos(sorts[name]);
3536
}
36-
updateRepos(_reposCache, sorts[name]);
37+
updateRepos(_reposCache!, sorts[name]);
3738
});
3839
});
3940
}
4041

41-
List<Repository> _reposCache;
42+
List<Repository>? _reposCache;
4243

4344
void updateRepos(
4445
List<Repository> repos, [
45-
int Function(Repository a, Repository b) compare,
46+
int Function(Repository a, Repository b)? compare,
4647
]) {
47-
document.querySelector('#repos').children.clear();
48+
document.querySelector('#repos')!.children.clear();
4849
repos.sort(compare);
4950
for (final repo in repos) {
50-
repositoriesDiv.appendHtml('''
51+
repositoriesDiv!.appendHtml('''
5152
<div class="repo" id="repo_${repo.name}">
5253
<div class="line"></div>
5354
<h2><a href="${repo.htmlUrl}">${repo.name}</a></h2>
54-
${repo.description != "" && repo.description != null ? "<b>Description</b>: ${repo.description}<br/>" : ""}
55-
<b>Language</b>: ${repo.language ?? "Unknown"}
55+
${repo.description != "" ? "<b>Description</b>: ${repo.description}<br/>" : ""}
56+
<b>Language</b>: ${repo.language}
5657
<br/>
5758
<b>Default Branch</b>: ${repo.defaultBranch}
5859
<br/>
@@ -69,15 +70,15 @@ void updateRepos(
6970
}
7071
}
7172

72-
void loadRepos([int Function(Repository a, Repository b) compare]) {
73-
final title = querySelector('#title');
74-
if (title.text.contains('(')) {
73+
void loadRepos([int Function(Repository a, Repository b)? compare]) {
74+
final title = querySelector('#title')!;
75+
if (title.text!.contains('(')) {
7576
title.replaceWith(HeadingElement.h2()
7677
..text = 'GitHub for Dart - Repositories'
7778
..id = 'title');
7879
}
7980

80-
var user = 'SpinlockLabs';
81+
String? user = 'SpinlockLabs';
8182

8283
if (queryString.containsKey('user')) {
8384
user = queryString['user'];
@@ -86,13 +87,13 @@ void loadRepos([int Function(Repository a, Repository b) compare]) {
8687
if (queryString.containsKey('sort') && compare == null) {
8788
final sorter = queryString['sort'];
8889
if (sorts.containsKey(sorter)) {
89-
compare = sorts[sorter];
90+
compare = sorts[sorter!];
9091
}
9192
}
9293

9394
compare ??= (a, b) => a.name.compareTo(b.name);
9495

95-
github.repositories.listUserRepositories(user).toList().then((repos) {
96+
github.repositories.listUserRepositories(user!).toList().then((repos) {
9697
_reposCache = repos;
9798
updateRepos(repos, compare);
9899
});

0 commit comments

Comments
 (0)