Skip to content

Commit 6f7bdeb

Browse files
gspencergoogBuchimi
authored andcommitted
Add fake dependency on flutter_gpu for the docs (flutter#153325)
## Description This adds a fake dependency to the docs generation for the `flutter_gpu` package so that it will be included in the docs even though Flutter itself doesn't depend on it directly. ## Related Issues - Fixes flutter#153320 ## Tests - Adding a test to the canary files that the docs generation script looks for. (Not yet added: still draft)
1 parent 6f93873 commit 6f7bdeb

File tree

2 files changed

+180
-9
lines changed

2 files changed

+180
-9
lines changed

dev/tools/create_api_docs.dart

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@ import 'dartdoc_checker.dart';
2323
const String kDummyPackageName = 'Flutter';
2424
const String kPlatformIntegrationPackageName = 'platform_integration';
2525

26+
/// Additional package dependencies that we want to have in the docs,
27+
/// but not actually depend on them.
28+
const Map<String, (String path, String version)> kFakeDependencies = <String, (String, String)>{
29+
'flutter_gpu': ('flutter_gpu/gpu.dart', '\n sdk: flutter'),
30+
};
31+
2632
class PlatformDocsSection {
2733
const PlatformDocsSection({
2834
required this.zipName,
@@ -235,6 +241,12 @@ class Configurator {
235241
}
236242
}
237243

244+
// Add a fake references for libraries that we don't actually depend on so
245+
// that they will be included in the docs.
246+
for (final String package in kFakeDependencies.keys) {
247+
yield kFakeDependencies[package]!.$1;
248+
}
249+
238250
// Add a fake package for platform integration APIs.
239251
yield '$kPlatformIntegrationPackageName/android.dart';
240252
yield '$kPlatformIntegrationPackageName/ios.dart';
@@ -252,8 +264,11 @@ class Configurator {
252264
'environment:',
253265
" sdk: '>=3.2.0-0 <4.0.0'",
254266
'dependencies:',
255-
for (final String package in findPackageNames(filesystem)) ' $package:\n sdk: flutter',
267+
for (final String package in findPackageNames(filesystem))
268+
' $package:\n sdk: flutter',
256269
' $kPlatformIntegrationPackageName: 0.0.1',
270+
for (final String package in kFakeDependencies.keys)
271+
' $package: ${kFakeDependencies[package]!.$2}',
257272
'dependency_overrides:',
258273
' $kPlatformIntegrationPackageName:',
259274
' path: ${docsRoot.childDirectory(kPlatformIntegrationPackageName).path}',
@@ -326,14 +341,16 @@ class Configurator {
326341
if (assetsDir.existsSync()) {
327342
assetsDir.deleteSync(recursive: true);
328343
}
329-
copyDirectorySync(
330-
docsRoot.childDirectory('assets'),
331-
assetsDir,
332-
onFileCopied: (File src, File dest) {
333-
print('Copied ${path.canonicalize(src.absolute.path)} to ${path.canonicalize(dest.absolute.path)}');
334-
},
335-
filesystem: filesystem,
336-
);
344+
if (assetSource.existsSync()) {
345+
copyDirectorySync(
346+
assetSource,
347+
assetsDir,
348+
onFileCopied: (File src, File dest) {
349+
print('Copied ${path.canonicalize(src.absolute.path)} to ${path.canonicalize(dest.absolute.path)}');
350+
},
351+
filesystem: filesystem,
352+
);
353+
}
337354
}
338355

339356
/// Generates an OpenSearch XML description that can be used to add a custom
@@ -712,6 +729,9 @@ class DartdocGenerator {
712729
.childDirectory('flutter_driver')
713730
.childDirectory('FlutterDriver')
714731
.childFile('FlutterDriver.connectedTo.html'),
732+
flutterDirectory
733+
.childDirectory('flutter_gpu')
734+
.childFile('flutter_gpu-library.html'),
715735
flutterDirectory.childDirectory('flutter_test').childDirectory('WidgetTester').childFile('pumpWidget.html'),
716736
flutterDirectory.childDirectory('material').childFile('Material-class.html'),
717737
flutterDirectory.childDirectory('material').childFile('Tooltip-class.html'),

dev/tools/test/create_api_docs_test.dart

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,157 @@ void main() {
225225
});
226226
});
227227

228+
group('Configurator', () {
229+
late MemoryFileSystem fs;
230+
late FakeProcessManager fakeProcessManager;
231+
late Directory publishRoot;
232+
late Directory packageRoot;
233+
late Directory docsRoot;
234+
late File searchTemplate;
235+
late apidocs.Configurator configurator;
236+
late FakePlatform fakePlatform;
237+
late apidocs.FlutterInformation flutterInformation;
238+
239+
void setUpWithEnvironment(Map<String, String> environment) {
240+
fakePlatform = FakePlatform(environment: environment);
241+
flutterInformation = apidocs.FlutterInformation(
242+
filesystem: fs,
243+
processManager: fakeProcessManager,
244+
platform: fakePlatform,
245+
);
246+
apidocs.FlutterInformation.instance = flutterInformation;
247+
}
248+
249+
setUp(() {
250+
fs = MemoryFileSystem.test();
251+
publishRoot = fs.directory('/path/to/publish');
252+
packageRoot = fs.directory('/path/to/package');
253+
docsRoot = fs.directory('/path/to/docs');
254+
searchTemplate = docsRoot.childDirectory('lib').childFile('opensearch.xml');
255+
fs.directory('/home/user/flutter/packages').createSync(recursive: true);
256+
fakeProcessManager = FakeProcessManager.empty();
257+
setUpWithEnvironment(<String, String>{});
258+
publishRoot.createSync(recursive: true);
259+
packageRoot.createSync(recursive: true);
260+
docsRoot.createSync(recursive: true);
261+
final List<String> files = <String>[
262+
'README.md',
263+
'analysis_options.yaml',
264+
'dartdoc_options.yaml',
265+
searchTemplate.path,
266+
publishRoot.childFile('opensearch.xml').path,
267+
];
268+
for (final String file in files) {
269+
docsRoot.childFile(file).createSync(recursive: true);
270+
}
271+
searchTemplate.writeAsStringSync('{SITE_URL}');
272+
configurator = apidocs.Configurator(
273+
docsRoot: docsRoot,
274+
packageRoot: packageRoot,
275+
publishRoot: publishRoot,
276+
filesystem: fs,
277+
processManager: fakeProcessManager,
278+
platform: fakePlatform,
279+
);
280+
fakeProcessManager.addCommands(<FakeCommand>[
281+
const FakeCommand(
282+
command: <String>['flutter', '--version', '--machine'],
283+
stdout: testVersionInfo,
284+
),
285+
const FakeCommand(
286+
command: <Pattern>['git', 'status', '-b', '--porcelain'],
287+
stdout: '## $branchName',
288+
),
289+
const FakeCommand(
290+
command: <String>['git', 'rev-parse', 'HEAD'],
291+
),
292+
const FakeCommand(
293+
command: <String>['/flutter/bin/flutter', 'pub', 'global', 'list'],
294+
),
295+
FakeCommand(
296+
command: <Pattern>[
297+
'/flutter/bin/flutter',
298+
'pub',
299+
'global',
300+
'run',
301+
'--enable-asserts',
302+
'dartdoc',
303+
'--output',
304+
'/path/to/publish/flutter',
305+
'--allow-tools',
306+
'--json',
307+
'--validate-links',
308+
'--link-to-source-excludes',
309+
'/flutter/bin/cache',
310+
'--link-to-source-root',
311+
'/flutter',
312+
'--link-to-source-uri-template',
313+
'https://github.com/flutter/flutter/blob/main/%f%#L%l%',
314+
'--inject-html',
315+
'--use-base-href',
316+
'--header',
317+
'/path/to/docs/styles.html',
318+
'--header',
319+
'/path/to/docs/analytics-header.html',
320+
'--header',
321+
'/path/to/docs/survey.html',
322+
'--header',
323+
'/path/to/docs/snippets.html',
324+
'--header',
325+
'/path/to/docs/opensearch.html',
326+
'--footer',
327+
'/path/to/docs/analytics-footer.html',
328+
'--footer-text',
329+
'/path/to/package/footer.html',
330+
'--allow-warnings-in-packages',
331+
// match package names
332+
RegExp(r'^(\w+,)+(\w+)$'),
333+
'--exclude-packages',
334+
RegExp(r'^(\w+,)+(\w+)$'),
335+
'--exclude',
336+
// match dart package URIs
337+
RegExp(r'^([\w\/:.]+,)+([\w\/:.]+)$'),
338+
'--favicon',
339+
'/path/to/docs/favicon.ico',
340+
'--package-order',
341+
'flutter,Dart,${apidocs.kPlatformIntegrationPackageName},flutter_test,flutter_driver',
342+
'--auto-include-dependencies',
343+
],
344+
),
345+
]);
346+
});
347+
348+
test('.generateConfiguration generates pubspec.yaml', () async {
349+
configurator.generateConfiguration();
350+
expect(packageRoot.childFile('pubspec.yaml').existsSync(), isTrue);
351+
expect(packageRoot.childFile('pubspec.yaml').readAsStringSync(), contains('flutter_gpu:'));
352+
expect(packageRoot.childFile('pubspec.yaml').readAsStringSync(), contains('dependency_overrides:'));
353+
expect(packageRoot.childFile('pubspec.yaml').readAsStringSync(), contains('platform_integration:'));
354+
});
355+
356+
test('.generateConfiguration generates fake lib', () async {
357+
configurator.generateConfiguration();
358+
expect(packageRoot.childDirectory('lib').existsSync(), isTrue);
359+
expect(packageRoot.childDirectory('lib').childFile('temp_doc.dart').existsSync(), isTrue);
360+
expect(packageRoot.childDirectory('lib').childFile('temp_doc.dart').readAsStringSync(), contains('library temp_doc;'));
361+
expect(packageRoot.childDirectory('lib').childFile('temp_doc.dart').readAsStringSync(), contains("import 'package:flutter_gpu/gpu.dart';"));
362+
});
363+
364+
test('.generateConfiguration generates page footer', () async {
365+
configurator.generateConfiguration();
366+
expect(packageRoot.childFile('footer.html').existsSync(), isTrue);
367+
expect(packageRoot.childFile('footer.html').readAsStringSync(), contains('<script src="footer.js">'));
368+
expect(publishRoot.childDirectory('flutter').childFile('footer.js').existsSync(), isTrue);
369+
expect(publishRoot.childDirectory('flutter').childFile('footer.js').readAsStringSync(), contains(RegExp(r'Flutter 2.5.0 •.*• stable')));
370+
});
371+
372+
test('.generateConfiguration generates search metadata', () async {
373+
configurator.generateConfiguration();
374+
expect(publishRoot.childFile('opensearch.xml').existsSync(), isTrue);
375+
expect(publishRoot.childFile('opensearch.xml').readAsStringSync(), contains('https://api.flutter.dev/'));
376+
});
377+
});
378+
228379
group('DartDocGenerator', () {
229380
late apidocs.DartdocGenerator generator;
230381
late MemoryFileSystem fs;

0 commit comments

Comments
 (0)