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)
final bool storeDateTimeValuesAsText;
@JsonKey(name: 'column_name_case', defaultValue: ColumnNameCase.snake)
final ColumnNameCase columnNameCase;
@internal
const DriftOptions.defaults({
this.generateFromJsonStringConstructor = false,
@ -107,6 +110,7 @@ class DriftOptions {
this.sqliteAnalysisOptions,
this.storeDateTimeValuesAsText = false,
this.dialect = const DialectOptions(SqlDialect.sqlite, null),
this.columnNameCase = ColumnNameCase.snake,
});
DriftOptions({
@ -127,6 +131,7 @@ class DriftOptions {
required this.modules,
required this.sqliteAnalysisOptions,
required this.storeDateTimeValuesAsText,
required this.columnNameCase,
this.dialect,
}) {
// ignore: deprecated_member_use_from_same_package
@ -282,3 +287,48 @@ enum SqlModule {
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:collection/collection.dart';
import 'package:drift/drift.dart' show DriftSqlType;
import 'package:drift_dev/src/analysis/options.dart';
import 'package:recase/recase.dart';
import 'package:sqlparser/sqlparser.dart' show ReferenceAction;
@ -335,7 +336,10 @@ class ColumnParser {
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);
AppliedTypeConverter? converter;
@ -484,3 +488,25 @@ class PendingColumnInformation {
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_always_required',
'scoped_dart_components',
'store_date_time_values_as_text'
'store_date_time_values_as_text',
'column_name_case'
],
);
final val = DriftOptions(
@ -77,6 +78,11 @@ DriftOptions _$DriftOptionsFromJson(Map json) => $checkedCreate(
v == null ? null : SqliteAnalysisOptions.fromJson(v as Map)),
storeDateTimeValuesAsText: $checkedConvert(
'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',
(v) => v == null ? null : DialectOptions.fromJson(v as Map)),
);
@ -103,6 +109,7 @@ DriftOptions _$DriftOptionsFromJson(Map json) => $checkedCreate(
'modules': 'sqlite_modules',
'sqliteAnalysisOptions': 'sqlite',
'storeDateTimeValuesAsText': 'store_date_time_values_as_text',
'columnNameCase': 'column_name_case',
'dialect': 'sql'
},
);
@ -133,6 +140,7 @@ Map<String, dynamic> _$DriftOptionsToJson(DriftOptions instance) =>
instance.namedParametersAlwaysRequired,
'scoped_dart_components': instance.scopedDartComponents,
'store_date_time_values_as_text': instance.storeDateTimeValuesAsText,
'column_name_case': _$ColumnNameCaseEnumMap[instance.columnNameCase]!,
};
const _$SqlModuleEnumMap = {
@ -144,6 +152,16 @@ const _$SqlModuleEnumMap = {
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',
json,