mirror of
https://github.com/foss42/apidash.git
synced 2025-06-03 08:16:25 +08:00
Added python http client codegen and Updated python into language dropdown
This commit is contained in:
@ -1,4 +1,5 @@
|
|||||||
import 'package:apidash/codegen/kotlin/pkg_okhttp.dart';
|
import 'package:apidash/codegen/kotlin/pkg_okhttp.dart';
|
||||||
|
import 'python/pkg_http_client.dart';
|
||||||
import 'package:apidash/consts.dart';
|
import 'package:apidash/consts.dart';
|
||||||
|
|
||||||
import 'package:apidash/models/models.dart' show RequestModel;
|
import 'package:apidash/models/models.dart' show RequestModel;
|
||||||
@ -15,6 +16,8 @@ class Codegen {
|
|||||||
return DartHttpCodeGen().getCode(requestModel, defaultUriScheme);
|
return DartHttpCodeGen().getCode(requestModel, defaultUriScheme);
|
||||||
case CodegenLanguage.kotlinOkHttp:
|
case CodegenLanguage.kotlinOkHttp:
|
||||||
return KotlinOkHttpCodeGen().getCode(requestModel);
|
return KotlinOkHttpCodeGen().getCode(requestModel);
|
||||||
|
case CodegenLanguage.pythonHttpClient:
|
||||||
|
return PythonHttpClient().getCode(requestModel);
|
||||||
default:
|
default:
|
||||||
throw ArgumentError('Invalid codegenLanguage');
|
throw ArgumentError('Invalid codegenLanguage');
|
||||||
}
|
}
|
||||||
|
82
lib/codegen/python/pkg_http_client.dart
Normal file
82
lib/codegen/python/pkg_http_client.dart
Normal file
@ -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.replaceAll(" ", "%20")}=${queryParam.v.replaceAll(" ", "%20")}&";
|
||||||
|
}
|
||||||
|
return result.substring(0, result.length - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, String> 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<String, String> 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;
|
||||||
|
}
|
||||||
|
}
|
@ -230,7 +230,8 @@ const kDefaultContentType = ContentType.json;
|
|||||||
|
|
||||||
enum CodegenLanguage {
|
enum CodegenLanguage {
|
||||||
dartHttp("Dart (http)"),
|
dartHttp("Dart (http)"),
|
||||||
kotlinOkHttp("Kotlin (OkHttp)");
|
kotlinOkHttp("Kotlin (OkHttp)"),
|
||||||
|
pythonHttpClient("Python (http.client)");
|
||||||
|
|
||||||
const CodegenLanguage(this.label);
|
const CodegenLanguage(this.label);
|
||||||
final String label;
|
final String label;
|
||||||
|
31
test/widget_test.dart
Normal file
31
test/widget_test.dart
Normal file
@ -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);
|
||||||
|
});
|
||||||
|
}
|
Reference in New Issue
Block a user