Adds column_name_case option

This commit is contained in:
ValentinVignal 2022-12-01 23:26:33 +08:00
parent 6503624ff1
commit 3835e0aae4
No known key found for this signature in database
GPG Key ID: 040FFDADFB7EF05A
3 changed files with 96 additions and 2 deletions

View File

@ -87,6 +87,9 @@ class DriftOptions {
@JsonKey(defaultValue: false) @JsonKey(defaultValue: false)
final bool storeDateTimeValuesAsText; final bool storeDateTimeValuesAsText;
@JsonKey(name: 'column_name_case', defaultValue: ColumnNameCase.snake)
final ColumnNameCase columnNameCase;
@internal @internal
const DriftOptions.defaults({ const DriftOptions.defaults({
this.generateFromJsonStringConstructor = false, this.generateFromJsonStringConstructor = false,
@ -107,6 +110,7 @@ class DriftOptions {
this.sqliteAnalysisOptions, this.sqliteAnalysisOptions,
this.storeDateTimeValuesAsText = false, this.storeDateTimeValuesAsText = false,
this.dialect = const DialectOptions(SqlDialect.sqlite, null), this.dialect = const DialectOptions(SqlDialect.sqlite, null),
this.columnNameCase = ColumnNameCase.snake,
}); });
DriftOptions({ DriftOptions({
@ -127,6 +131,7 @@ class DriftOptions {
required this.modules, required this.modules,
required this.sqliteAnalysisOptions, required this.sqliteAnalysisOptions,
required this.storeDateTimeValuesAsText, required this.storeDateTimeValuesAsText,
required this.columnNameCase,
this.dialect, this.dialect,
}) { }) {
// ignore: deprecated_member_use_from_same_package // ignore: deprecated_member_use_from_same_package
@ -282,3 +287,48 @@ enum SqlModule {
spellfix1, spellfix1,
} }
/// The possible values for the case of the column names.
enum ColumnNameCase {
/// Preserves the case of the column name as it is in the dart code.
///
/// `myColumn` -> `myColumn`.
preserve,
/// Use camelCase.
///
/// `my_column` -> `myColumn`.
@JsonValue('camelCase')
camel,
/// Use CONSTANT_CASE.
///
/// `myColumn` -> `MY_COLUMN`.
@JsonValue('CONSTANT_CASE')
constant,
/// Use snake_case.
///
/// `myColumn` -> `my_column`.
@JsonValue('snake_case')
snake,
/// Use PascalCase.
///
/// `my_column` -> `MyColumn`.
// ignore: constant_identifier_names
@JsonValue('PascalCase')
pascal,
/// Use lowercase.
///
/// `myColumn` -> `mycolumn`.
@JsonValue('lowercase')
lower,
/// Use UPPERCASE.
///
/// `myColumn` -> `MYCOLUMN`.
@JsonValue('UPPERCASE')
upper,
}

View File

@ -3,6 +3,7 @@ import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/type.dart'; import 'package:analyzer/dart/element/type.dart';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:drift/drift.dart' show DriftSqlType; import 'package:drift/drift.dart' show DriftSqlType;
import 'package:drift_dev/src/analysis/options.dart';
import 'package:recase/recase.dart'; import 'package:recase/recase.dart';
import 'package:sqlparser/sqlparser.dart' show ReferenceAction; import 'package:sqlparser/sqlparser.dart' show ReferenceAction;
@ -335,7 +336,10 @@ class ColumnParser {
remainingExpr = inner; remainingExpr = inner;
} }
final sqlName = foundExplicitName ?? ReCase(getter.name.lexeme).snakeCase; _resolver.resolver.driver.options.columnNameCase;
final sqlName = foundExplicitName ??
_resolver.resolver.driver.options.columnNameCase
.apply(getter.name.lexeme);
final sqlType = _startMethodToColumnType(foundStartMethod); final sqlType = _startMethodToColumnType(foundStartMethod);
AppliedTypeConverter? converter; AppliedTypeConverter? converter;
@ -484,3 +488,25 @@ class PendingColumnInformation {
PendingColumnInformation(this.column, {this.referencesColumnInSameTable}); PendingColumnInformation(this.column, {this.referencesColumnInSameTable});
} }
extension on ColumnNameCase {
String apply(String name) {
final reCase = ReCase(name);
switch (this) {
case ColumnNameCase.preserve:
return name;
case ColumnNameCase.camel:
return reCase.camelCase;
case ColumnNameCase.constant:
return reCase.constantCase;
case ColumnNameCase.snake:
return reCase.snakeCase;
case ColumnNameCase.pascal:
return reCase.pascalCase;
case ColumnNameCase.lower:
return name.toLowerCase();
case ColumnNameCase.upper:
return name.toUpperCase();
}
}
}

View File

@ -30,7 +30,8 @@ DriftOptions _$DriftOptionsFromJson(Map json) => $checkedCreate(
'named_parameters', 'named_parameters',
'named_parameters_always_required', 'named_parameters_always_required',
'scoped_dart_components', 'scoped_dart_components',
'store_date_time_values_as_text' 'store_date_time_values_as_text',
'column_name_case'
], ],
); );
final val = DriftOptions( final val = DriftOptions(
@ -77,6 +78,11 @@ DriftOptions _$DriftOptionsFromJson(Map json) => $checkedCreate(
v == null ? null : SqliteAnalysisOptions.fromJson(v as Map)), v == null ? null : SqliteAnalysisOptions.fromJson(v as Map)),
storeDateTimeValuesAsText: $checkedConvert( storeDateTimeValuesAsText: $checkedConvert(
'store_date_time_values_as_text', (v) => v as bool? ?? false), 'store_date_time_values_as_text', (v) => v as bool? ?? false),
columnNameCase: $checkedConvert(
'column_name_case',
(v) =>
$enumDecodeNullable(_$ColumnNameCaseEnumMap, v) ??
ColumnNameCase.snake),
dialect: $checkedConvert('sql', dialect: $checkedConvert('sql',
(v) => v == null ? null : DialectOptions.fromJson(v as Map)), (v) => v == null ? null : DialectOptions.fromJson(v as Map)),
); );
@ -103,6 +109,7 @@ DriftOptions _$DriftOptionsFromJson(Map json) => $checkedCreate(
'modules': 'sqlite_modules', 'modules': 'sqlite_modules',
'sqliteAnalysisOptions': 'sqlite', 'sqliteAnalysisOptions': 'sqlite',
'storeDateTimeValuesAsText': 'store_date_time_values_as_text', 'storeDateTimeValuesAsText': 'store_date_time_values_as_text',
'columnNameCase': 'column_name_case',
'dialect': 'sql' 'dialect': 'sql'
}, },
); );
@ -133,6 +140,7 @@ Map<String, dynamic> _$DriftOptionsToJson(DriftOptions instance) =>
instance.namedParametersAlwaysRequired, instance.namedParametersAlwaysRequired,
'scoped_dart_components': instance.scopedDartComponents, 'scoped_dart_components': instance.scopedDartComponents,
'store_date_time_values_as_text': instance.storeDateTimeValuesAsText, 'store_date_time_values_as_text': instance.storeDateTimeValuesAsText,
'column_name_case': _$ColumnNameCaseEnumMap[instance.columnNameCase]!,
}; };
const _$SqlModuleEnumMap = { const _$SqlModuleEnumMap = {
@ -144,6 +152,16 @@ const _$SqlModuleEnumMap = {
SqlModule.spellfix1: 'spellfix1', SqlModule.spellfix1: 'spellfix1',
}; };
const _$ColumnNameCaseEnumMap = {
ColumnNameCase.none: 'none',
ColumnNameCase.camel: 'camelCase',
ColumnNameCase.constant: 'CONSTANT_CASE',
ColumnNameCase.snake: 'snake_case',
ColumnNameCase.pascal: 'PascalCase',
ColumnNameCase.lower: 'lowercase',
ColumnNameCase.upper: 'UPPERCASE',
};
DialectOptions _$DialectOptionsFromJson(Map json) => $checkedCreate( DialectOptions _$DialectOptionsFromJson(Map json) => $checkedCreate(
'DialectOptions', 'DialectOptions',
json, json,