dart-sass/tool/grind/frameworks.dart
Natalie Weizenbaum 8090b992de
Test against real-world Sass frameworks (#1487)
In a future commit, I'll update these jobs to only run just before
release, since they're expected to be substantially less likely to
fail and we don't want to waste cycles. For now, I have them runnning
always to verify that they run successfully at least once.
2021-09-17 23:17:41 +00:00

72 lines
2.4 KiB
Dart

// Copyright 2021 Google Inc. Use of this source code is governed by an
// MIT-style license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT.
import 'dart:convert';
import 'package:grinder/grinder.dart';
import 'package:http/http.dart' as http;
import 'utils.dart';
@Task('Download Bootstrap 5.x for testing purposes.')
Future<void> fetchBootstrap5() => _getLatestRelease('twbs/bootstrap');
@Task('Download Bootstrap 4.x for testing purposes.')
Future<void> fetchBootstrap4() =>
_getLatestRelease('twbs/bootstrap', pattern: RegExp(r'^v4\.'));
@Task('Download Bourbon for testing purposes.')
Future<void> fetchBourbon() => _getLatestRelease('thoughtbot/bourbon');
@Task('Download Foundation for testing purposes.')
Future<void> fetchFoundation() =>
_getLatestRelease('foundation/foundation-sites');
@Task('Download Bulma for testing purposes.')
Future<void> fetchBulma() => _getLatestRelease('jgthms/bulma');
/// Clones the latest release of the given GitHub repository [slug].
///
/// If [pattern] is passed, this will clone the latest release that matches that
/// pattern.
Future<void> _getLatestRelease(String slug, {Pattern? pattern}) async {
await cloneOrCheckout('git://github.com/$slug',
await _findLatestRelease(slug, pattern: pattern));
}
/// Returns the tag name of the latest release for the given GitHub repository
/// [slug].
///
/// If [pattern] is passed, this will find the latest release that matches that
/// pattern.
Future<String> _findLatestRelease(String slug, {Pattern? pattern}) async {
var releases = await _fetchReleases(slug);
if (pattern == null) return releases[0]['tag_name'] as String;
var page = 1;
while (releases.isNotEmpty) {
for (var release in releases) {
var tagName = release['tag_name'] as String;
if (pattern.allMatches(tagName).isNotEmpty) return tagName;
}
page++;
releases = await _fetchReleases(slug, page: page);
}
fail("Couldn't find a release of $slug matching $pattern.");
}
/// Fetches the GitHub releases page for the repo at [slug].
Future<List<Map<String, dynamic>>> _fetchReleases(String slug,
{int page = 1}) async {
var result = json.decode(await http.read(
Uri.parse("https://api.github.com/repos/$slug/releases?page=$page"),
headers: {
"accept": "application/vnd.github.v3+json",
"authorization": githubAuthorization
})) as List<dynamic>;
return result.cast<Map<String, dynamic>>();
}