Skip to content

Commit a853afd

Browse files
committed
Impl pattern iterator (Github commits)
1 parent cf5a916 commit a853afd

File tree

4 files changed

+67
-0
lines changed

4 files changed

+67
-0
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class Commit {
2+
String message;
3+
4+
Commit(this.message);
5+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import 'dart:convert';
2+
import 'dart:io';
3+
import '../pattern/github_repo.dart';
4+
5+
class GitHubLoader {
6+
static Future<GitHubRepo> get({required userName, required repoName}) async {
7+
final url = Uri.http(
8+
'api.github.com',
9+
'repos/$userName/$repoName/commits',
10+
{'per_page': '10'},
11+
);
12+
final json = await _loadCommits(url);
13+
return GitHubRepo(json);
14+
}
15+
16+
static Future<List<dynamic>> _loadCommits(Uri url) async {
17+
final client = HttpClient();
18+
try {
19+
final response = await client.getUrl(url);
20+
final request = await response.close();
21+
final content = await request.transform(utf8.decoder).join();
22+
return jsonDecode(content);
23+
} finally {
24+
client.close();
25+
}
26+
}
27+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import 'github/commit.dart';
2+
import 'github/github_loader.dart';
3+
import 'pattern/github_repo.dart';
4+
5+
void main() async {
6+
final GitHubRepo gitHubRepo = await GitHubLoader.get(
7+
userName: 'RefactoringGuru',
8+
repoName: 'design-patterns-dart',
9+
);
10+
11+
print(
12+
'Iterate last 10 commits.'
13+
'\n----------------------------',
14+
);
15+
16+
for (Commit commit in gitHubRepo.commitIterator()) {
17+
print(commit.message);
18+
}
19+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import '../github/commit.dart';
2+
3+
class GitHubRepo {
4+
GitHubRepo(this._json);
5+
6+
Iterable<Commit> commitIterator() sync* {
7+
for (final jsonCommit in _json) {
8+
var message = jsonCommit['commit']['message'] as String;
9+
message = message.replaceAll(RegExp(r'\n+'), ' ');
10+
11+
yield Commit(message);
12+
}
13+
}
14+
15+
final List<dynamic> _json;
16+
}

0 commit comments

Comments
 (0)