From 3835e0aae490fe17b5a366f69c1a14b157309f01 Mon Sep 17 00:00:00 2001 From: ValentinVignal Date: Thu, 1 Dec 2022 23:26:33 +0800 Subject: [PATCH] :sparkles: Adds column_name_case option --- drift_dev/lib/src/analysis/options.dart | 50 +++++++++++++++++++ .../src/analysis/resolver/dart/column.dart | 28 ++++++++++- .../lib/src/generated/analysis/options.g.dart | 20 +++++++- 3 files changed, 96 insertions(+), 2 deletions(-) diff --git a/drift_dev/lib/src/analysis/options.dart b/drift_dev/lib/src/analysis/options.dart index 545971c2..90740119 100644 --- a/drift_dev/lib/src/analysis/options.dart +++ b/drift_dev/lib/src/analysis/options.dart @@ -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, +} diff --git a/drift_dev/lib/src/analysis/resolver/dart/column.dart b/drift_dev/lib/src/analysis/resolver/dart/column.dart index 75f38124..8fb68adf 100644 --- a/drift_dev/lib/src/analysis/resolver/dart/column.dart +++ b/drift_dev/lib/src/analysis/resolver/dart/column.dart @@ -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(); + } + } +} diff --git a/drift_dev/lib/src/generated/analysis/options.g.dart b/drift_dev/lib/src/generated/analysis/options.g.dart index 6b424df9..5e24526f 100644 --- a/drift_dev/lib/src/generated/analysis/options.g.dart +++ b/drift_dev/lib/src/generated/analysis/options.g.dart @@ -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 _$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,