Skip to content

Commit

Permalink
Fix issue with dashes in definitions (#100)
Browse files Browse the repository at this point in the history
* FIXED issue with dashes in definitions

* Fixed enum names. Removed _ symbols from swagger enum names

* Removed unused import

* Updated pubspec and changelog

Co-authored-by: Uladzimir Paliukhovich <Uladzimir_Paliukhovich@epam.com>
  • Loading branch information
Vovanella95 and Uladzimir Paliukhovich committed Dec 9, 2020
1 parent d70e79a commit 9221bff
Show file tree
Hide file tree
Showing 14 changed files with 243 additions and 36 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
# 1.4.5

* Fixed Issue ([#99](https://github.com/epam-cross-platform-lab/swagger-dart-code-generator/issues/99))
* **BREAKING**: Fixed enums naming. Enums with _ are replaced by PascalCase. For example, Response_type replaced by ResponseType.

# 1.4.4

* Fixed issue with build_only_models flag
Expand Down
39 changes: 38 additions & 1 deletion example/lib/example_swagger.swagger
Original file line number Diff line number Diff line change
Expand Up @@ -502,7 +502,7 @@
"200": {
"description": "successful operation",
"schema": {
"$ref": "#/definitions/Order"
"$ref": "#/definitions/Order-With-Dash"
}
},
"400": {
Expand Down Expand Up @@ -910,6 +910,43 @@
"name": "Order"
}
},
"Order-With-Dash": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"format": "int64"
},
"petId": {
"type": "integer",
"format": "int64"
},
"quantity": {
"type": "integer",
"format": "int32"
},
"shipDate": {
"type": "string",
"format": "date-time"
},
"status": {
"type": "string",
"description": "Order Status",
"enum": [
"placed",
"approved",
"delivered"
]
},
"complete": {
"type": "boolean",
"default": false
}
},
"xml": {
"name": "Order"
}
},
"Category": {
"type": "object",
"properties": {
Expand Down
18 changes: 18 additions & 0 deletions example/lib/generated_code/example_swagger.enums.swagger.dart
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,24 @@ const $OrderStatusMap = {
OrderStatus.swaggerGeneratedUnknown: 'swaggerGeneratedUnknown'
};

enum OrderWithDashStatus {
@JsonValue('swaggerGeneratedUnknown')
swaggerGeneratedUnknown,
@JsonValue('placed')
placed,
@JsonValue('approved')
approved,
@JsonValue('delivered')
delivered
}

const $OrderWithDashStatusMap = {
OrderWithDashStatus.placed: 'placed',
OrderWithDashStatus.approved: 'approved',
OrderWithDashStatus.delivered: 'delivered',
OrderWithDashStatus.swaggerGeneratedUnknown: 'swaggerGeneratedUnknown'
};

enum PetStatus {
@JsonValue('swaggerGeneratedUnknown')
swaggerGeneratedUnknown,
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

81 changes: 79 additions & 2 deletions example/lib/generated_code/example_swagger.swagger.dart
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ abstract class ExampleSwagger extends ChopperService {
@Get(path: '/pet/findByStatus')
Future<chopper.Response<List<Pet>>> _findPetsByStatus(
{@Query('status') @required String status,
@Query('color') @required List<PetFindByStatusGetColor> color});
@Query('color') @required List<String> color});

///Finds Pets by tags
///@param tags Tags to filter by
Expand Down Expand Up @@ -108,7 +108,8 @@ abstract class ExampleSwagger extends ChopperService {
///@param body order placed for purchasing the pet
@Post(path: '/store/order')
Future<chopper.Response<Order>> placeOrder({@Body() @required Order body});
Future<chopper.Response<OrderWithDash>> placeOrder(
{@Body() @required Order body});

///Find purchase order by ID
///@param orderId ID of pet that needs to be fetched
Expand Down Expand Up @@ -185,6 +186,7 @@ abstract class ExampleSwagger extends ChopperService {
final Map<Type, Object Function(Map<String, dynamic>)>
ExampleSwaggerJsonDecoderMappings = {
Order: Order.fromJsonFactory,
OrderWithDash: OrderWithDash.fromJsonFactory,
Category: Category.fromJsonFactory,
User: User.fromJsonFactory,
Tag: Tag.fromJsonFactory,
Expand Down Expand Up @@ -226,6 +228,41 @@ class Order {
Map<String, dynamic> toJson() => _$OrderToJson(this);
}

@JsonSerializable(explicitToJson: true)
class OrderWithDash {
OrderWithDash({
this.id,
this.petId,
this.quantity,
this.shipDate,
this.status,
this.complete,
});

factory OrderWithDash.fromJson(Map<String, dynamic> json) =>
_$OrderWithDashFromJson(json);

@JsonKey(name: 'id', includeIfNull: false, defaultValue: 36)
final int id;
@JsonKey(name: 'petId', includeIfNull: false, defaultValue: 36)
final int petId;
@JsonKey(name: 'quantity', includeIfNull: false, defaultValue: 36)
final int quantity;
@JsonKey(name: 'shipDate', includeIfNull: false)
final DateTime shipDate;
@JsonKey(
name: 'status',
includeIfNull: false,
toJson: orderWithDashStatusToJson,
fromJson: orderWithDashStatusFromJson)
final enums.OrderWithDashStatus status;
@JsonKey(name: 'complete', includeIfNull: false)
final bool complete;
static const fromJsonFactory = _$OrderWithDashFromJson;
static const toJsonFactory = _$OrderWithDashToJson;
Map<String, dynamic> toJson() => _$OrderWithDashToJson(this);
}

@JsonSerializable(explicitToJson: true)
class Category {
Category({
Expand Down Expand Up @@ -467,6 +504,46 @@ List<enums.OrderStatus> orderStatusListFromJson(List orderStatus) {
return orderStatus.map((e) => orderStatusFromJson(e.toString())).toList();
}

String orderWithDashStatusToJson(
enums.OrderWithDashStatus orderWithDashStatus) {
return enums.$OrderWithDashStatusMap[orderWithDashStatus];
}

enums.OrderWithDashStatus orderWithDashStatusFromJson(
String orderWithDashStatus) {
if (orderWithDashStatus == null) {
return enums.OrderWithDashStatus.swaggerGeneratedUnknown;
}

return enums.$OrderWithDashStatusMap.entries
.firstWhere((element) => element.value == orderWithDashStatus,
orElse: () => null)
?.key ??
enums.OrderWithDashStatus.swaggerGeneratedUnknown;
}

List<String> orderWithDashStatusListToJson(
List<enums.OrderWithDashStatus> orderWithDashStatus) {
if (orderWithDashStatus == null) {
return null;
}

return orderWithDashStatus
.map((e) => enums.$OrderWithDashStatusMap[e])
.toList();
}

List<enums.OrderWithDashStatus> orderWithDashStatusListFromJson(
List orderWithDashStatus) {
if (orderWithDashStatus == null) {
return [];
}

return orderWithDashStatus
.map((e) => orderWithDashStatusFromJson(e.toString()))
.toList();
}

String petStatusToJson(enums.PetStatus petStatus) {
return enums.$PetStatusMap[petStatus];
}
Expand Down
31 changes: 31 additions & 0 deletions example/lib/generated_code/example_swagger.swagger.g2.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 2 additions & 3 deletions lib/src/code_generators/swagger_converter_generator.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import 'dart:convert';
import 'package:swagger_dart_code_generator/src/code_generators/v2/swagger_models_generator_v2.dart';
import 'package:swagger_dart_code_generator/src/code_generators/swagger_models_generator.dart';
import 'package:swagger_dart_code_generator/src/definitions.dart';
import 'package:swagger_dart_code_generator/src/extensions/string_extension.dart';
import 'package:recase/recase.dart';
Expand All @@ -26,8 +26,7 @@ ${_generateModelsMapping(dartCode)}};''';
continue;
}

final validatedName =
SwaggerModelsGeneratorV2().getValidatedClassName(key);
final validatedName = SwaggerModelsGenerator.getValidatedClassName(key);

result.add('\t$validatedName: $validatedName.fromJsonFactory,');
}
Expand Down
16 changes: 12 additions & 4 deletions lib/src/code_generators/swagger_enums_generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,9 @@ abstract class SwaggerEnumsGenerator {

final enumsFromClasses = definitions.keys
.map((String className) {
return generateEnumsFromClasses(className.pascalCase,
return generateEnumsFromClasses(
SwaggerModelsGenerator.getValidatedClassName(
className.pascalCase),
definitions[className] as Map<String, dynamic>);
})
.where((element) => element.isNotEmpty)
Expand All @@ -49,7 +51,7 @@ $enumsFromClasses\n$enumsFromRequests\n$enumsFromResponses''';
return '';
}

final enumsFromClasses = responses.keys
final enumsFromResponses = responses.keys
.map((String className) {
final response = responses[className];
final content = response['content'] as Map<String, dynamic>;
Expand All @@ -61,12 +63,14 @@ $enumsFromClasses\n$enumsFromRequests\n$enumsFromResponses''';
}

return generateEnumsFromClasses(
className.pascalCase, schema as Map<String, dynamic>);
SwaggerModelsGenerator.getValidatedClassName(
className.pascalCase),
schema as Map<String, dynamic>);
})
.where((element) => element.isNotEmpty)
.join('\n');

return enumsFromClasses;
return enumsFromResponses;
}

static SwaggerRequestParameter getOriginalOrOverriddenRequestParameter(
Expand Down Expand Up @@ -120,6 +124,8 @@ $enumsFromClasses\n$enumsFromRequests\n$enumsFromResponses''';
swaggerRequest.type,
swaggerRequestParameter.name);

name = SwaggerModelsGenerator.getValidatedClassName(name);

if (enumNames.contains(name)) {
continue;
}
Expand Down Expand Up @@ -284,6 +290,8 @@ $enumMap

String generateEnumContentIfPossible(
Map<String, dynamic> map, String enumName) {
enumName = SwaggerModelsGenerator.getValidatedClassName(enumName);

if (map['enum'] != null) {
final enumValues = map['enum'] as List<dynamic>;
final stringValues = enumValues.map((e) => e.toString()).toList();
Expand Down

0 comments on commit 9221bff

Please sign in to comment.