From 3034aa80d5385ba400c55f7552c8c49c74194ad4 Mon Sep 17 00:00:00 2001 From: morpheus-30 Date: Tue, 4 Jul 2023 23:06:09 +0530 Subject: [PATCH] Revert "Revert "Added python http client codegen and Updated python into language dropdown"" This reverts commit f229c2aa95fc458857129423a8e6cc56a2862f69. --- lib/codegen/codegen.dart | 3 + lib/codegen/python/pkg_http_client.dart | 82 +++++++++++++++++++++++++ lib/consts.dart | 3 +- test/widget_test.dart | 31 ++++++++++ 4 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 lib/codegen/python/pkg_http_client.dart create mode 100644 test/widget_test.dart diff --git a/lib/codegen/codegen.dart b/lib/codegen/codegen.dart index eb5bb0ef..a004c2dc 100644 --- a/lib/codegen/codegen.dart +++ b/lib/codegen/codegen.dart @@ -1,4 +1,5 @@ import 'package:apidash/codegen/kotlin/pkg_okhttp.dart'; +import 'python/pkg_http_client.dart'; import 'package:apidash/consts.dart'; import 'package:apidash/models/models.dart' show RequestModel; @@ -15,6 +16,8 @@ class Codegen { return DartHttpCodeGen().getCode(requestModel, defaultUriScheme); case CodegenLanguage.kotlinOkHttp: return KotlinOkHttpCodeGen().getCode(requestModel); + case CodegenLanguage.pythonHttpClient: + return PythonHttpClient().getCode(requestModel); default: throw ArgumentError('Invalid codegenLanguage'); } diff --git a/lib/codegen/python/pkg_http_client.dart b/lib/codegen/python/pkg_http_client.dart new file mode 100644 index 00000000..1be3f34d --- /dev/null +++ b/lib/codegen/python/pkg_http_client.dart @@ -0,0 +1,82 @@ +import 'package:apidash/consts.dart'; + +import '../../models/request_model.dart'; + +class PythonHttpClient { + final String headerSnippet = """ +import http.client +import json + +"""; + + final String footerSnippet = """ +res = conn.getresponse() +data = res.read() +print(data.decode("utf-8")) +"""; + + String getCode(RequestModel requestModel) { + String result = ""; + result += headerSnippet; + result += + "conn = http.client.HTTPSConnection('${getUrl(requestModel)["host"]}'${getUrl(requestModel)["port"]})\n"; + result += "payload = json.dumps(${requestModel.requestBody ?? ""})\n"; + result += + """headers = {\n'Content-Type':'${requestModel.requestBodyContentType == ContentType.json ? 'application/json' : 'text/plain'}'\n${addHeaders(requestModel)}},\n"""; + result += + "conn.request(\"${requestModel.method.name.toUpperCase()}\", \"${getUrl(requestModel)["endpoint"]}${addQueryParams(requestModel)}\", payload, headers)\n"; + result += footerSnippet; + + return result; + } + + String addHeaders(RequestModel requestModel) { + String result = ""; + if (requestModel.requestHeaders == null) { + return result; + } + for (final header in requestModel.requestHeaders!) { + result += """'${header.k}':'${header.v}',\n"""; + } + return result; + } + + String addQueryParams(RequestModel requestModel) { + String result = ""; + if (requestModel.requestParams == null) { + return result; + } + result += "?"; + for (final queryParam in requestModel.requestParams!) { + result += + "${queryParam.k.toString().replaceAll(" ", "%20")}=${queryParam.v.toString().replaceAll(" ", "%20")}&"; + } + return result.substring(0, result.length - 1); + } + + Map getUrl(RequestModel requestModel) { + String result = ""; + if (requestModel.url.startsWith('http://') || + requestModel.url.startsWith('https://')) { + result = requestModel.url.substring(requestModel.url.indexOf('://') + 3); + }else{ + result = requestModel.url; + } + Map resultMap = {}; + if (result.contains(":")) { + resultMap["host"] = result.substring(0, result.indexOf(':')); + resultMap["port"] = + ",${result.substring(result.indexOf(':') + 1, result.contains('/') ? result.indexOf('/') : result.length)}"; + resultMap["endpoint"] = + "/${result.substring(result.contains('/') ? result.indexOf('/') + 1 : result.length)}"; + } else { + resultMap["host"] = result.contains("/") + ? result.substring(0, result.indexOf('/')) + : result; + resultMap["port"] = ""; + resultMap["endpoint"] = + "/${result.substring(result.contains('/') ? result.indexOf('/') + 1 : result.length)}"; + } + return resultMap; + } +} diff --git a/lib/consts.dart b/lib/consts.dart index f1390a3c..40193bfe 100644 --- a/lib/consts.dart +++ b/lib/consts.dart @@ -230,7 +230,8 @@ const kDefaultContentType = ContentType.json; enum CodegenLanguage { dartHttp("Dart (http)"), - kotlinOkHttp("Kotlin (OkHttp)"); + kotlinOkHttp("Kotlin (OkHttp)"), + pythonHttpClient("Python (http.client)"); const CodegenLanguage(this.label); final String label; diff --git a/test/widget_test.dart b/test/widget_test.dart new file mode 100644 index 00000000..c0e5cab0 --- /dev/null +++ b/test/widget_test.dart @@ -0,0 +1,31 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility in the flutter_test package. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:apidash/app.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'package:apidash/main.dart'; + +void main() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(const DashApp()); + + // Verify that our counter starts at 0. + expect(find.text('0'), findsOneWidget); + expect(find.text('1'), findsNothing); + + // Tap the '+' icon and trigger a frame. + await tester.tap(find.byIcon(Icons.add)); + await tester.pump(); + + // Verify that our counter has incremented. + expect(find.text('0'), findsNothing); + expect(find.text('1'), findsOneWidget); + }); +}