diff --git a/lib/codegen/python/pkg_request.dart b/lib/codegen/python/pkg_request.dart index 13fcf139..4fd58f58 100644 --- a/lib/codegen/python/pkg_request.dart +++ b/lib/codegen/python/pkg_request.dart @@ -1,102 +1,155 @@ +import 'dart:io'; +import 'dart:convert'; import 'package:jinja/jinja.dart' as jj; -import 'package:apidash/models/models.dart' show RequestModel; -import 'package:apidash/utils/utils.dart' show padMultilineString, rowsToMap; import 'package:apidash/consts.dart'; +import 'package:apidash/utils/utils.dart' + show getValidRequestUri, padMultilineString, rowsToMap; +import 'package:apidash/models/models.dart' show RequestModel; class PythonRequestCodeGen { - int kHeadersPadding = 16; - String kPythonTemplate = ''' -import requests + final String kTemplateStart = """import requests -def main(): - url = '{{url}}'{{params}}{{body}}{{headers}} +url = '{{url}}' - response = requests.{{method}}( - url{{request_params}}{{request_headers}}{{request_body}} - ) +"""; - status_code = response.status_code - if 200 <= status_code < 300: - print('Status Code:', status_code) - print('Response Body:', response.text) - else: - print('Error Status Code:', status_code) - print('Error Response Body:', response.reason) + String kTemplateParams = """ -main() -'''; +params = {{params}} - String? getCode(RequestModel requestModel, String defaultUriScheme) { +"""; + int kParamsPadding = 9; + + String kTemplateBody = """ + +payload = r'''{{body}}''' + +"""; + + String kTemplateJson = """ + +payload = {{body}} + +"""; + + String kTemplateHeaders = """ + +headers = {{headers}} + +"""; + + int kHeadersPadding = 10; + + String kTemplateRequest = """ + +response = requests.{{method}}(url +"""; + + String kStringRequestParams = """, params=params"""; + + String kStringRequestBody = """, data=payload"""; + + String kStringRequestJson = """, json=payload"""; + + String kStringRequestHeaders = """, headers=headers"""; + + final String kStringRequestEnd = """) + +print('Status Code:', response.status_code) +print('Response Body:', response.text) +"""; + + String? getCode( + RequestModel requestModel, + String defaultUriScheme, + ) { try { + String result = ""; + bool hasParams = false; bool hasHeaders = false; bool hasBody = false; - bool hasParams = false; + bool hasJsonBody = false; String url = requestModel.url; - if (!url.contains('://') && url.isNotEmpty) { - url = '$defaultUriScheme://$url'; + if (!url.contains("://") && url.isNotEmpty) { + url = "$defaultUriScheme://$url"; } - var paramsList = requestModel.requestParams; - String params = ''; - if (paramsList != null) { - for (var param in paramsList) { - if (param.name.isNotEmpty) { - hasParams = true; - params += '\n "${param.name}": "${param.value}",'; + var rec = getValidRequestUri(url, requestModel.requestParams); + Uri? uri = rec.$1; + if (uri != null) { + var templateStartUrl = jj.Template(kTemplateStart); + result += templateStartUrl + .render({"url": "${uri.scheme}://${uri.authority}${uri.path}"}); + + if (uri.hasQuery) { + hasParams = true; + var params = uri.queryParameters; + if (params.isNotEmpty) { + var templateParams = jj.Template(kTemplateParams); + var paramsString = kEncoder.convert(params); + paramsString = padMultilineString(paramsString, kParamsPadding); + result += templateParams.render({"params": paramsString}); } } - } - var method = requestModel.method.name.toLowerCase(); - - var requestBody = requestModel.requestBody; - String requestBodyString = ''; - if (requestBody != null && requestBody.isNotEmpty) { - hasBody = true; - var bodyType = requestModel.requestBodyContentType; - if (bodyType == ContentType.json) { - int index = requestBody.lastIndexOf("}"); - index--; - while (requestBody[index] == " " || requestBody[index] == "\n") { - index--; - } - if (requestBody[index] == ",") { - requestBody = requestBody.substring(0, index) + - requestBody.substring(index + 1); + var method = requestModel.method; + var requestBody = requestModel.requestBody; + if (kMethodsWithBody.contains(method) && requestBody != null) { + var contentLength = utf8.encode(requestBody).length; + if (contentLength > 0) { + if (requestModel.requestBodyContentType == ContentType.json) { + hasJsonBody = true; + var templateBody = jj.Template(kTemplateJson); + result += templateBody.render({"body": requestBody}); + } else { + hasBody = true; + var templateBody = jj.Template(kTemplateBody); + result += templateBody.render({"body": requestBody}); + } } } - requestBodyString = "data = '''$requestBody'''"; - } - var headersList = requestModel.requestHeaders; - String headers = ''; - if (headersList != null || hasBody) { - var head = rowsToMap(requestModel.requestHeaders) ?? {}; - if (head.isNotEmpty || hasBody) { - if (hasBody) { - head["content-type"] = - kContentTypeMap[requestModel.requestBodyContentType] ?? ""; + var headersList = requestModel.requestHeaders; + if (headersList != null || hasBody) { + var headers = rowsToMap(requestModel.requestHeaders) ?? {}; + if (headers.isNotEmpty || hasBody) { + hasHeaders = true; + if (hasBody) { + headers[HttpHeaders.contentTypeHeader] = + kContentTypeMap[requestModel.requestBodyContentType] ?? ""; + } + var headersString = kEncoder.convert(headers); + headersString = padMultilineString(headersString, kHeadersPadding); + var templateHeaders = jj.Template(kTemplateHeaders); + result += templateHeaders.render({"headers": headersString}); } - headers = kEncoder.convert(head); - headers = padMultilineString(headers, kHeadersPadding); } - hasHeaders = headers.isNotEmpty; + + var templateRequest = jj.Template(kTemplateRequest); + result += templateRequest.render({ + "method": method.name.toLowerCase(), + }); + + if (hasParams) { + result += kStringRequestParams; + } + + if (hasBody) { + result += kStringRequestBody; + } + + if (hasJsonBody) { + result += kStringRequestJson; + } + + if (hasHeaders) { + result += kStringRequestHeaders; + } + + result += kStringRequestEnd; } - - var template = jj.Template(kPythonTemplate); - var pythonCode = template.render({ - 'url': url, - 'params': hasParams ? '\n\n params = {$params \n }' : '', - 'body': hasBody ? '\n\n $requestBodyString' : '', - 'headers': hasHeaders ? '\n\n headers = $headers' : '', - 'method': method, - 'request_params': hasParams ? ', params=params' : '', - 'request_headers': hasHeaders ? ', headers=headers' : '', - 'request_body': hasBody ? ', data=data' : '', - }); - - return pythonCode; + return result; } catch (e) { return null; }