Skip to content

Commit dbed1d3

Browse files
committed
test: Generate sceen access test
1 parent 95315b3 commit dbed1d3

15 files changed

+976
-24
lines changed

bin/generate_screen_access.dart

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
//.title
2+
// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
3+
//
4+
// Dart/Flutter (DF) Packages by DevCetra.com & contributors. SSee LICENSE file
5+
// in root directory.
6+
//
7+
// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
8+
//.title~
9+
10+
// import 'dart:io' show Directory;
11+
12+
import 'package:df_generate_screen/df_generate_screen.dart';
13+
import 'package:df_log/df_log.dart';
14+
15+
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
16+
17+
void main(List<String> args) async {
18+
DebugLog.debugOnly = false;
19+
await generateScreenAccessApp(args);
20+
}

lib/src/_index.g.dart

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,21 @@
88
//.title~
99

1010
// --- PUBLIC FILES ---
11-
export 'run_generate_screens_app.dart';
12-
export 'generate_screen.dart';
11+
export 'generate_screen/generate.dart';
12+
export 'generate_screen/app.dart';
13+
export 'generate_screen_access/generator.dart';
14+
export 'generate_screen_access/app.dart';
15+
export 'generate_screen_bindings/generate_screen_access.dart';
16+
export 'generate_screen_bindings/run_generte_screen_bindings_app.dart';
1317

1418
// --- PRIVATE FILES (EXCLUDED) ---
15-
// export '_insight.dart';
16-
// export '_generator_converger.dart';
1719
// export '_index.g.dart';
18-
// export '_insight_mappers.dart';
20+
// export 'generate_screen/_insight.dart';
21+
// export 'generate_screen/_generator_converger.dart';
22+
// export 'generate_screen/_insight_mappers.dart';
23+
// export 'generate_screen_access/_extract_class_insights_from_dart_file.dart';
24+
// export 'generate_screen_bindings/generate_parts/_generate_screen_bindings_file.dart';
25+
// export 'generate_screen_bindings/generate_parts/_replacements.dart';
1926

2027
// --- GENERATED FILES (EXCLUDED) ---
21-
// None found.
28+
// None found.
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
//.title
2+
// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
3+
//
4+
// Dart/Flutter (DF) Packages by DevCetra.com & contributors. See LICENSE file
5+
// in root directory.
6+
//
7+
// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
8+
//.title~
9+
10+
import 'package:df_gen_core/df_gen_core.dart';
11+
import 'package:df_log/df_log.dart';
12+
import 'package:df_config/df_config.dart';
13+
import 'package:df_string/df_string.dart';
14+
15+
import 'package:path/path.dart' as p;
16+
17+
import '_insight.dart';
18+
19+
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
20+
21+
final generatorConverger = _GeneratorConverger(
22+
(replacements, templates) async {
23+
final [
24+
controllerTemplate,
25+
screenTemplate,
26+
viewTemplate,
27+
bindingsTemplate,
28+
] = templates;
29+
30+
for (final replacement in replacements) {
31+
final templates = {
32+
replacement.insight.controllerFileName: controllerTemplate,
33+
replacement.insight.screenFileName: screenTemplate,
34+
replacement.insight.viewFileName: viewTemplate,
35+
replacement.insight.bindingsFileName: bindingsTemplate,
36+
};
37+
for (final entry in templates.entries) {
38+
final fileName = entry.key;
39+
final template = entry.value;
40+
41+
// Fill the template with the replacement data.
42+
final output = replaceData(
43+
template,
44+
replacement.replacements,
45+
);
46+
47+
// Determine the output file path.
48+
final folderName = replacement.insight.screenClassName.toSnakeCase();
49+
final outputFilePath = p.join(replacement.insight.path, folderName, fileName);
50+
51+
// Write the generated Dart file.
52+
await writeFile(outputFilePath, output);
53+
54+
// Fix the generated Dart file.
55+
await fixDartFile(outputFilePath);
56+
57+
// Format the generated Dart file.
58+
await fmtDartFile(outputFilePath);
59+
60+
// Log a success.
61+
debugLogSuccess('Generated "${previewPath(outputFilePath)}"');
62+
}
63+
}
64+
},
65+
);
66+
67+
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
68+
69+
typedef _GeneratorConverger = GeneratorConverger<Insight, Enum, String>;
File renamed without changes.

lib/src/run_generate_screens_app.dart renamed to lib/src/generate_screen/app.dart

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import 'package:args/args.dart';
1111
import 'package:df_gen_core/df_gen_core.dart';
1212

13-
import '_index.g.dart';
13+
import '../../df_generate_screen.dart';
1414

1515
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
1616

@@ -106,14 +106,11 @@ Future<void> runGenerateScreensApp(List<String> args) async {
106106
})
107107
.nonNulls
108108
.toSet();
109-
return entries != null
110-
? Map<String, String>.fromEntries(entries)
111-
: null;
109+
return entries != null ? Map<String, String>.fromEntries(entries) : null;
112110
}
113111

114112
bool toBool(String option) {
115-
return results[option]?.toString().toLowerCase().trim() ==
116-
true.toString();
113+
return results[option]?.toString().toLowerCase().trim() == true.toString();
117114
}
118115

119116
return _ArgsChecker(
@@ -147,8 +144,7 @@ Future<void> runGenerateScreensApp(List<String> args) async {
147144
viewTemplateFilePath: args.stateTemplateFilePath,
148145
path: args.path!,
149146
isAccessibleOnlyIfLoggedIn: args.isAccessibleOnlyIfLoggedIn ?? false,
150-
isAccessibleOnlyIfLoggedInAndVerified:
151-
args.isAccessibleOnlyIfLoggedInAndVerified ?? false,
147+
isAccessibleOnlyIfLoggedInAndVerified: args.isAccessibleOnlyIfLoggedInAndVerified ?? false,
152148
isAccessibleOnlyIfLoggedOut: args.isAccessibleOnlyIfLoggedOut ?? false,
153149
isRedirectable: args.isRedirectable ?? false,
154150
internalParameters: args.internalParameters ?? const {},
@@ -219,10 +215,8 @@ class _ArgsChecker extends ValidArgsChecker {
219215
if (controllerTemplateFilePath != null) controllerTemplateFilePath,
220216
if (screenTemplateFilePath != null) screenTemplateFilePath,
221217
if (stateTemplateFilePath != null) stateTemplateFilePath,
222-
if (configurationTemplateFilePath != null)
223-
configurationTemplateFilePath,
224-
if (isAccessibleOnlyIfLoggedInAndVerified != null)
225-
isAccessibleOnlyIfLoggedInAndVerified,
218+
if (configurationTemplateFilePath != null) configurationTemplateFilePath,
219+
if (isAccessibleOnlyIfLoggedInAndVerified != null) isAccessibleOnlyIfLoggedInAndVerified,
226220
if (isAccessibleOnlyIfLoggedIn != null) isAccessibleOnlyIfLoggedIn,
227221
if (isAccessibleOnlyIfLoggedOut != null) isAccessibleOnlyIfLoggedOut,
228222
if (isRedirectable != null) isRedirectable,

lib/src/generate_screen.dart renamed to lib/src/generate_screen/generate.dart

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ Future<void> generateScreen({
2121
String? fallbackDartSdkPath,
2222
required String outputDirPath,
2323
required String screenName,
24-
required String? controllerTemplateFilePath,
25-
required String? screenTemplateFilePath,
26-
required String? viewTemplateFilePath,
27-
required String? bindingsTemplateFilePath,
24+
String? controllerTemplateFilePath,
25+
String? screenTemplateFilePath,
26+
String? viewTemplateFilePath,
27+
String? bindingsTemplateFilePath,
2828
String path = '',
2929
bool isAccessibleOnlyIfLoggedIn = false,
3030
bool isAccessibleOnlyIfLoggedInAndVerified = false,
@@ -85,8 +85,7 @@ Future<void> generateScreen({
8585
screenFileName: '${screenName.toSnakeCase()}.dart',
8686
viewFileName: '_view.dart',
8787
isAccessibleOnlyIfLoggedIn: isAccessibleOnlyIfLoggedIn,
88-
isAccessibleOnlyIfLoggedInAndVerified:
89-
isAccessibleOnlyIfLoggedInAndVerified,
88+
isAccessibleOnlyIfLoggedInAndVerified: isAccessibleOnlyIfLoggedInAndVerified,
9089
isAccessibleOnlyIfLoggedOut: isAccessibleOnlyIfLoggedOut,
9190
isRedirectable: isRedirectable,
9291
internalParameters: internalParameters,
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
//.title
2+
// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
3+
//
4+
// Dart/Flutter (DF) Packages by DevCetra.com & contributors. See LICENSE file
5+
// in root directory.
6+
//
7+
// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
8+
//.title~
9+
10+
import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
11+
import 'package:path/path.dart' as p;
12+
import 'package:df_gen_core/df_gen_core.dart';
13+
14+
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
15+
16+
Future<List<_ClassInsight>> extractClassInsightsFromDartFile(
17+
AnalysisContextCollection analysisContextCollection,
18+
String filePath,
19+
) async {
20+
final analyzer = DartAnnotatedClassAnalyzer(
21+
filePath: filePath,
22+
analysisContextCollection: analysisContextCollection,
23+
);
24+
25+
final insights = <_ClassInsight>[];
26+
await analyzer.analyze(
27+
inclClassAnnotations: {'GenerateScreenBindings'},
28+
onPostAnalysis: (params) {
29+
final fullPathName = params.fullFilePath;
30+
final fileName = p.basename(fullPathName);
31+
final dirPath = p.dirname(fullPathName);
32+
final insight = _ClassInsight(
33+
className: params.className,
34+
annotation: null,
35+
dirPath: dirPath,
36+
fileName: fileName,
37+
);
38+
insights.add(insight);
39+
},
40+
);
41+
return insights;
42+
}
43+
44+
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
45+
46+
typedef _ClassInsight = ClassInsight<Null>;
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
//.title
2+
// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
3+
//
4+
// 🇽🇾🇿 & Dev
5+
//
6+
// Licencing details are in the LICENSE file in the root directory.
7+
//
8+
// ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
9+
//.title~
10+
11+
import 'package:args/args.dart';
12+
import 'package:df_gen_core/df_gen_core.dart';
13+
14+
import 'generator.dart';
15+
16+
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
17+
18+
/// A command line app for generating screen access.
19+
Future<void> generateScreenAccessApp(List<String> args) async {
20+
await runCommandLineApp(
21+
title: 'Generate Screens',
22+
description: 'A command line app for generating screens',
23+
args: args,
24+
parser: ArgParser()
25+
..addFlag(
26+
'help',
27+
abbr: 'h',
28+
negatable: false,
29+
help: 'Help information.',
30+
)
31+
..addOption(
32+
'roots',
33+
abbr: 'r',
34+
help: 'Root directory paths separated by `&`.',
35+
defaultsTo: toLocalSystemPathFormat('/lib/screens'),
36+
)
37+
..addOption(
38+
'subs',
39+
abbr: 's',
40+
help: 'Sub-directory paths separated by `&`.',
41+
)
42+
..addOption(
43+
'patterns',
44+
abbr: 'p',
45+
help: 'Path patterns separated by `&`.',
46+
)
47+
..addOption(
48+
'additional-screen-class-names',
49+
help: 'Additional screen class names separated by `&`.',
50+
)
51+
..addOption(
52+
'template',
53+
abbr: 't',
54+
help: 'Template file path.',
55+
)
56+
..addOption(
57+
'output',
58+
abbr: 'o',
59+
help: 'Output file path.',
60+
defaultsTo: '.',
61+
),
62+
onResults: (parser, results) {
63+
return _ArgsChecker(
64+
fallbackDartSdkPath: results['dart-sdk'],
65+
templateFilePath: results['template'],
66+
rootPaths: splitArg(results['roots'])?.toSet(),
67+
subPaths: splitArg(results['subs'])?.toSet(),
68+
pathPatterns: splitArg(results['patterns'])?.toSet(),
69+
outputFilePath: results['output'],
70+
);
71+
},
72+
action: (parser, results, args) async {
73+
final outputFilePath = args.outputFilePath!;
74+
await generateScreenAccess(
75+
rootDirPaths: args.rootPaths ?? const {},
76+
subDirPaths: args.subPaths ?? const {},
77+
pathPatterns: args.pathPatterns ?? {},
78+
templateFilePath: args.templateFilePath!,
79+
outputFilePath: outputFilePath,
80+
);
81+
await fmtDartFile(outputFilePath);
82+
},
83+
);
84+
}
85+
86+
class _ArgsChecker extends ValidArgsChecker {
87+
//
88+
//
89+
//
90+
91+
final Set<String>? rootPaths;
92+
final Set<String>? subPaths;
93+
final Set<String>? pathPatterns;
94+
final String? templateFilePath;
95+
final String? outputFilePath;
96+
final String? fallbackDartSdkPath;
97+
98+
//
99+
//
100+
//
101+
102+
const _ArgsChecker({
103+
required this.rootPaths,
104+
required this.subPaths,
105+
required this.pathPatterns,
106+
required this.templateFilePath,
107+
required this.outputFilePath,
108+
required this.fallbackDartSdkPath,
109+
});
110+
111+
//
112+
//
113+
//
114+
115+
@override
116+
List<dynamic> get args {
117+
final paths = [
118+
if (this.rootPaths != null) this.rootPaths,
119+
if (this.subPaths != null) this.subPaths,
120+
];
121+
return [
122+
paths,
123+
...paths,
124+
if (this.pathPatterns != null) this.pathPatterns,
125+
this.templateFilePath,
126+
this.outputFilePath,
127+
if (fallbackDartSdkPath != null) fallbackDartSdkPath,
128+
];
129+
}
130+
}

0 commit comments

Comments
 (0)