From 4866c1c5207e05e5252ff9096ad0fb26e621d10b Mon Sep 17 00:00:00 2001 From: Nikhil Date: Sun, 23 Mar 2025 15:19:53 +0530 Subject: [PATCH 01/13] Added alamofire --- lib/codegen/codegen.dart | 3 + lib/codegen/swift/alamofire.dart | 152 +++++++++++++++++++++++++++++++ lib/consts.dart | 3 +- 3 files changed, 157 insertions(+), 1 deletion(-) create mode 100644 lib/codegen/swift/alamofire.dart diff --git a/lib/codegen/codegen.dart b/lib/codegen/codegen.dart index ae224eaa..f00dcbb1 100644 --- a/lib/codegen/codegen.dart +++ b/lib/codegen/codegen.dart @@ -1,3 +1,4 @@ +import 'package:apidash/codegen/swift/alamofire.dart'; import 'package:apidash/consts.dart'; import 'package:apidash/models/models.dart'; import 'package:apidash/utils/utils.dart' show getNewUuid; @@ -117,6 +118,8 @@ class Codegen { return PhpHttpPlugCodeGen().getCode(rM); case CodegenLanguage.swiftUrlSession: return SwiftURLSessionCodeGen().getCode(rM); + case CodegenLanguage.swiftAlamofire: + return SwiftAlamofireCodeGen().getCode(rM); } } } diff --git a/lib/codegen/swift/alamofire.dart b/lib/codegen/swift/alamofire.dart new file mode 100644 index 00000000..3f41a884 --- /dev/null +++ b/lib/codegen/swift/alamofire.dart @@ -0,0 +1,152 @@ +import 'package:apidash_core/apidash_core.dart'; +import 'package:jinja/jinja.dart' as jj; +import 'package:path/path.dart' as path; + +class SwiftAlamofireCodeGen { + final String kTemplateStart = """ +import Alamofire + +"""; + + final String kTemplateFormDataImport = """ +import MultipartFormData + +"""; + + final String kTemplateFormData = ''' +let boundary = try! Boundary() +let multipartFormData = try! MultipartFormData(boundary: boundary) { +{% for param in formData %} + {% if param.type == 'text' %} + Subpart { + ContentDisposition(name: "{{param.name}}") + } body: { + Data("{{param.value}}".utf8) + } + {% elif param.type == 'file' %} + try Subpart { + ContentDisposition(name: "{{param.name}}", filename: "{{param.filename}}") + ContentType(mimeType: MimeType(pathExtension: "{{param.extension}}")) + } body: { + try Data(contentsOf: URL(fileURLWithPath: "{{param.filepath}}")) + } + {% endif %} +{% endfor %} +} + +'''; + + final String kTemplateJsonData = ''' +let parameters = "{{jsonData}}" +let postData = parameters.data(using: .utf8) + +'''; + + final String kTemplateTextData = ''' +let parameters = "{{textData}}" +let postData = parameters.data(using: .utf8) + +'''; + + final String kTemplateRequest = """ +AF.request("{{url}}", method: .{{method}}, parameters: {{parameters}}, encoding: {{encoding}}) + .responseJSON { response in + switch response.result { + case .success(let value): + print("Response: \\(value)") + case .failure(let error): + print("Error: \\(error)") + } + } +"""; + + final String kTemplateHeaders = """ +{% for header, value in headers %} +request.addValue("{{value}}", forHTTPHeaderField: "{{header}}") +{% endfor %} + +"""; + + String? getCode(HttpRequestModel requestModel) { + try { + String result = kTemplateStart; + + if (requestModel.hasFormData) { + result += kTemplateFormDataImport; + } + + var rec = + getValidRequestUri(requestModel.url, requestModel.enabledParams); + Uri? uri = rec.$1; + + var headers = requestModel.enabledHeadersMap; + var parameters = 'nil'; + + if (requestModel.hasFormData) { + var formDataList = requestModel.formDataMapList.map((param) { + if (param['type'] == 'file') { + final filePath = param['value'] as String; + final fileName = path.basename(filePath); + final fileExtension = + path.extension(fileName).toLowerCase().replaceFirst('.', ''); + return { + 'type': 'file', + 'name': param['name'], + 'filename': fileName, + 'extension': fileExtension, + 'filepath': filePath + }; + } else { + return { + 'type': 'text', + 'name': param['name'], + 'value': param['value'] + }; + } + }).toList(); + + var templateFormData = jj.Template(kTemplateFormData); + result += templateFormData.render({ + "formData": formDataList, + }); + + parameters = "multipartFormData"; + } else if (requestModel.hasJsonData) { + var templateJsonData = jj.Template(kTemplateJsonData); + result += templateJsonData.render({ + "jsonData": + requestModel.body!.replaceAll('"', '\\"').replaceAll('\n', '\\n'), + }); + + parameters = "parameters"; + } else if (requestModel.hasTextData) { + var templateTextData = jj.Template(kTemplateTextData); + result += templateTextData.render({ + "textData": + requestModel.body!.replaceAll('"', '\\"').replaceAll('\n', '\\n'), + }); + + parameters = "parameters"; + } + + var templateRequest = jj.Template(kTemplateRequest); + result += templateRequest.render({ + "url": uri.toString(), + "method": requestModel.method.name.toLowerCase(), + "parameters": parameters, + "encoding": requestModel.hasFormData ? "JSONEncoding.default" : "URLEncoding.default" + }); + + if (headers.isNotEmpty) { + var templateHeader = jj.Template(kTemplateHeaders); + result += templateHeader.render({"headers": headers}); + } + + + + return result; + } catch (e) { + return null; + } + } +} diff --git a/lib/consts.dart b/lib/consts.dart index 595aa69e..cd126f24 100644 --- a/lib/consts.dart +++ b/lib/consts.dart @@ -129,7 +129,8 @@ enum CodegenLanguage { rustReqwest("Rust (reqwest)", "rust", "rs"), rustCurl("Rust (curl-rust)", "rust", "rs"), rustUreq("Rust (ureq)", "rust", "rs"), - swiftUrlSession("Swift (URLSession)", "swift", "swift"); + swiftUrlSession("Swift (URLSession)", "swift", "swift"), + swiftAlamofire("Swift (Alamofire)", "swift", "swift"); const CodegenLanguage(this.label, this.codeHighlightLang, this.ext); final String label; From 154e3580e590ffe5a4cedbc84b7fe04e52ff2ea3 Mon Sep 17 00:00:00 2001 From: Nikhil Date: Sat, 12 Apr 2025 02:01:36 +0530 Subject: [PATCH 02/13] fixing --- lib/codegen/swift/alamofire.dart | 138 +++++++++++++++---------------- 1 file changed, 65 insertions(+), 73 deletions(-) diff --git a/lib/codegen/swift/alamofire.dart b/lib/codegen/swift/alamofire.dart index 3f41a884..8ba1b101 100644 --- a/lib/codegen/swift/alamofire.dart +++ b/lib/codegen/swift/alamofire.dart @@ -4,96 +4,77 @@ import 'package:path/path.dart' as path; class SwiftAlamofireCodeGen { final String kTemplateStart = """ +import Foundation import Alamofire - -"""; - - final String kTemplateFormDataImport = """ -import MultipartFormData - """; final String kTemplateFormData = ''' -let boundary = try! Boundary() -let multipartFormData = try! MultipartFormData(boundary: boundary) { +let multipartFormData = MultipartFormData() {% for param in formData %} {% if param.type == 'text' %} - Subpart { - ContentDisposition(name: "{{param.name}}") - } body: { - Data("{{param.value}}".utf8) - } +multipartFormData.append(Data("{{param.value}}".utf8), withName: "{{param.name}}") {% elif param.type == 'file' %} - try Subpart { - ContentDisposition(name: "{{param.name}}", filename: "{{param.filename}}") - ContentType(mimeType: MimeType(pathExtension: "{{param.extension}}")) - } body: { - try Data(contentsOf: URL(fileURLWithPath: "{{param.filepath}}")) - } +let fileURL = URL(fileURLWithPath: "{{param.filepath}}") +multipartFormData.append(fileURL, withName: "{{param.name}}", fileName: "{{param.filename}}") {% endif %} {% endfor %} -} - '''; final String kTemplateJsonData = ''' -let parameters = "{{jsonData}}" -let postData = parameters.data(using: .utf8) - +let jsonString = """{{jsonData}}""" +let jsonData = jsonString.data(using: .utf8) '''; final String kTemplateTextData = ''' -let parameters = "{{textData}}" -let postData = parameters.data(using: .utf8) - +let textString = """{{textData}}""" +let textData = textString.data(using: .utf8) '''; final String kTemplateRequest = """ -AF.request("{{url}}", method: .{{method}}, parameters: {{parameters}}, encoding: {{encoding}}) - .responseJSON { response in - switch response.result { - case .success(let value): - print("Response: \\(value)") - case .failure(let error): - print("Error: \\(error)") +let url = "{{url}}" + +{% if hasFormData %} +AF.upload(multipartFormData: multipartFormData, to: url, method: .{{method}}{% if hasHeaders %}, headers: {{headers}}{% endif %}) +{% elif hasBody %} +AF.upload({% if hasJsonData %}jsonData{% else %}textData{% endif %}!, to: url, method: .{{method}}{% if hasHeaders %}, headers: {{headers}}{% endif %}) +{% else %} +AF.request(url, method: .{{method}}{% if hasHeaders %}, headers: {{headers}}{% endif %}) +{% endif %} +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \\(responseString)") } + case .failure(let error): + print("Error: \\(error)") } -"""; - - final String kTemplateHeaders = """ -{% for header, value in headers %} -request.addValue("{{value}}", forHTTPHeaderField: "{{header}}") -{% endfor %} + exit(0) +} +dispatchMain() """; String? getCode(HttpRequestModel requestModel) { try { String result = kTemplateStart; - if (requestModel.hasFormData) { - result += kTemplateFormDataImport; - } - - var rec = - getValidRequestUri(requestModel.url, requestModel.enabledParams); + var rec = getValidRequestUri(requestModel.url, requestModel.enabledParams); Uri? uri = rec.$1; - + var headers = requestModel.enabledHeadersMap; - var parameters = 'nil'; + bool hasBody = false; + bool hasJsonData = false; if (requestModel.hasFormData) { var formDataList = requestModel.formDataMapList.map((param) { if (param['type'] == 'file') { final filePath = param['value'] as String; final fileName = path.basename(filePath); - final fileExtension = - path.extension(fileName).toLowerCase().replaceFirst('.', ''); return { 'type': 'file', 'name': param['name'], 'filename': fileName, - 'extension': fileExtension, 'filepath': filePath }; } else { @@ -109,44 +90,55 @@ request.addValue("{{value}}", forHTTPHeaderField: "{{header}}") result += templateFormData.render({ "formData": formDataList, }); - - parameters = "multipartFormData"; - } else if (requestModel.hasJsonData) { + + hasBody = true; + } + else if (requestModel.hasJsonData) { var templateJsonData = jj.Template(kTemplateJsonData); result += templateJsonData.render({ - "jsonData": - requestModel.body!.replaceAll('"', '\\"').replaceAll('\n', '\\n'), + "jsonData": requestModel.body!.replaceAll('"', '\\"').replaceAll('\n', '\\n'), }); - - parameters = "parameters"; - } else if (requestModel.hasTextData) { + + headers.putIfAbsent("Content-Type", () => "application/json"); + hasBody = true; + hasJsonData = true; + } + // Handle text data + else if (requestModel.hasTextData) { var templateTextData = jj.Template(kTemplateTextData); result += templateTextData.render({ - "textData": - requestModel.body!.replaceAll('"', '\\"').replaceAll('\n', '\\n'), + "textData": requestModel.body!.replaceAll('"', '\\"').replaceAll('\n', '\\n'), }); - - parameters = "parameters"; + + headers.putIfAbsent(kHeaderContentType, () => requestModel.bodyContentType.header); + hasBody = true; + } + + String headersString = "nil"; + bool hasHeaders = false; + if (headers.isNotEmpty) { + List headerItems = []; + headers.forEach((key, value) { + headerItems.add('"$key": "$value"'); + }); + headersString = "[${headerItems.join(', ')}]"; + hasHeaders = true; } var templateRequest = jj.Template(kTemplateRequest); result += templateRequest.render({ "url": uri.toString(), "method": requestModel.method.name.toLowerCase(), - "parameters": parameters, - "encoding": requestModel.hasFormData ? "JSONEncoding.default" : "URLEncoding.default" + "headers": headersString, + "hasHeaders": hasHeaders, + "hasFormData": requestModel.hasFormData, + "hasBody": hasBody, + "hasJsonData": hasJsonData }); - if (headers.isNotEmpty) { - var templateHeader = jj.Template(kTemplateHeaders); - result += templateHeader.render({"headers": headers}); - } - - - return result; } catch (e) { return null; } } -} +} \ No newline at end of file From 857b3660b4f31f5e67e913e1b5a23801a31d3bf9 Mon Sep 17 00:00:00 2001 From: Nikhil Date: Sun, 13 Apr 2025 19:21:18 +0530 Subject: [PATCH 03/13] adding tests --- .../codegen/swift_alamofire_codegen_test.dart | 334 ++++++++++++++++++ 1 file changed, 334 insertions(+) create mode 100644 test/codegen/swift_alamofire_codegen_test.dart diff --git a/test/codegen/swift_alamofire_codegen_test.dart b/test/codegen/swift_alamofire_codegen_test.dart new file mode 100644 index 00000000..3b122abb --- /dev/null +++ b/test/codegen/swift_alamofire_codegen_test.dart @@ -0,0 +1,334 @@ +import 'package:apidash/codegen/codegen.dart'; +import 'package:apidash/consts.dart'; +import 'package:apidash_core/apidash_core.dart'; +import 'package:test/test.dart'; + +import '../models/request_models.dart'; + +void main() { + final codeGen = Codegen(); + + group( + 'HTTPVerb.get', + () { + test('GET 1', () { + const expectedCode = r""" +import Foundation +import Alamofire +let url = "https://api.apidash.dev" + + +AF.request(url, method: .get) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelGet1, + SupportedUriSchemes.https, + ), + expectedCode); + }); + + test('GET 2', () { + const expectedCode = r""" +import Foundation +import Alamofire +let url = "https://api.apidash.dev/country/data?code=US" + + +AF.request(url, method: .get) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelGet2, + SupportedUriSchemes.https, + ), + expectedCode); + }); + + test('GET 3', () { + const expectedCode = r""" +import Foundation +import Alamofire +let url = "https://api.apidash.dev/country/data?code=IND" + + +AF.request(url, method: .get) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelGet3, + SupportedUriSchemes.https, + ), + expectedCode); + }); + + test('GET 4', () { + const expectedCode = r""" +import Foundation +import Alamofire +let url = "https://api.apidash.dev/humanize/social?num=8700000&digits=3&system=SS&add_space=true&trailing_zeros=true" + + +AF.request(url, method: .get) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelGet4, + SupportedUriSchemes.https, + ), + expectedCode); + }); + + test('GET 5', () { + const expectedCode = r""" +import Foundation +import Alamofire +let url = "https://api.github.com/repos/foss42/apidash" + + +AF.request(url, method: .get, headers: ["User-Agent": "Test Agent"]) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelGet5, + SupportedUriSchemes.https, + ), + expectedCode); + }); + + test('GET 6', () { + const expectedCode = r""" +import Foundation +import Alamofire +let url = "https://api.github.com/repos/foss42/apidash?raw=true" + + +AF.request(url, method: .get, headers: ["User-Agent": "Test Agent"]) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelGet6, + SupportedUriSchemes.https, + ), + expectedCode); + }); + + test('GET 7', () { + const expectedCode = r""" +import Foundation +import Alamofire +let url = "https://api.apidash.dev" + + +AF.request(url, method: .get) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelGet7, + SupportedUriSchemes.https, + ), + expectedCode); + }); + + test('GET 8', () { + const expectedCode = r""" +import Foundation +import Alamofire +let url = "https://api.github.com/repos/foss42/apidash?raw=true" + + +AF.request(url, method: .get, headers: ["User-Agent": "Test Agent"]) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelGet8, + SupportedUriSchemes.https, + ), + expectedCode); + }); + + test('GET 9', () { + const expectedCode = r""" +import Foundation +import Alamofire +let url = "https://api.apidash.dev/humanize/social?num=8700000&add_space=true" + + +AF.request(url, method: .get) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelGet9, + SupportedUriSchemes.https, + ), + expectedCode); + }); + + test('GET 10', () { + const expectedCode = r""" +import Foundation +import Alamofire +let url = "https://api.apidash.dev/humanize/social" + + +AF.request(url, method: .get, headers: ["User-Agent": "Test Agent"]) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelGet10, + SupportedUriSchemes.https, + ), + expectedCode); + } + ); + });} \ No newline at end of file From d08bf8f56470c17564ebd3bb4d71e2a021168b53 Mon Sep 17 00:00:00 2001 From: Nikhil Date: Mon, 14 Apr 2025 03:59:43 +0530 Subject: [PATCH 04/13] tests and changes --- lib/codegen/swift/alamofire.dart | 12 +- .../codegen/swift_alamofire_codegen_test.dart | 512 +++++++++++++++++- 2 files changed, 517 insertions(+), 7 deletions(-) diff --git a/lib/codegen/swift/alamofire.dart b/lib/codegen/swift/alamofire.dart index 8ba1b101..d3923ebc 100644 --- a/lib/codegen/swift/alamofire.dart +++ b/lib/codegen/swift/alamofire.dart @@ -21,13 +21,17 @@ multipartFormData.append(fileURL, withName: "{{param.name}}", fileName: "{{param '''; final String kTemplateJsonData = ''' -let jsonString = """{{jsonData}}""" -let jsonData = jsonString.data(using: .utf8) +let jsonString = """ +{{jsonData}} +""" +let jsonData = jsonString.data(using: .utf8)\n '''; final String kTemplateTextData = ''' -let textString = """{{textData}}""" -let textData = textString.data(using: .utf8) +let textString = """ +{{textData}} +""" +let textData = textString.data(using: .utf8)\n '''; final String kTemplateRequest = """ diff --git a/test/codegen/swift_alamofire_codegen_test.dart b/test/codegen/swift_alamofire_codegen_test.dart index 3b122abb..72d15046 100644 --- a/test/codegen/swift_alamofire_codegen_test.dart +++ b/test/codegen/swift_alamofire_codegen_test.dart @@ -329,6 +329,512 @@ dispatchMain()"""; SupportedUriSchemes.https, ), expectedCode); - } - ); - });} \ No newline at end of file + }); + + test('GET 11', () { + const expectedCode = r""" +import Foundation +import Alamofire +let url = "https://api.apidash.dev/humanize/social?num=8700000&digits=3" + + +AF.request(url, method: .get, headers: ["User-Agent": "Test Agent"]) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelGet11, + SupportedUriSchemes.https, + ), + expectedCode); + }); + + test('GET 12', () { + const expectedCode = r""" +import Foundation +import Alamofire +let url = "https://api.apidash.dev/humanize/social" + + +AF.request(url, method: .get) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelGet12, + SupportedUriSchemes.https, + ), + expectedCode); + }); + }, + + ); + + group( + 'HTTPVerb.head', + () { + test('HEAD 1', () { + const expectedCode = r""" +import Foundation +import Alamofire +let url = "https://api.apidash.dev" + + +AF.request(url, method: .head) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelHead1, + SupportedUriSchemes.https, + ), + expectedCode); + }); + + test('HEAD 2', () { + const expectedCode = r""" +import Foundation +import Alamofire +let url = "https://api.apidash.dev" + + +AF.request(url, method: .head) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelHead2, + SupportedUriSchemes.https, + ), + expectedCode); + }); + }, + + ); + + group( + "HTTPVerb.post", + () { + test('POST 1', () { + const expectedCode = r''' +import Foundation +import Alamofire +let textString = """ +{\n\"text\": \"I LOVE Flutter\"\n} +""" +let textData = textString.data(using: .utf8) +let url = "https://api.apidash.dev/case/lower" + + +AF.upload(textData!, to: url, method: .post, headers: ["Content-Type": "text/plain"]) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()'''; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelPost1, + SupportedUriSchemes.https, + ), + expectedCode); + }); + test('POST 2', () { + const expectedCode = r''' +import Foundation +import Alamofire +let jsonString = """ +{\n\"text\": \"I LOVE Flutter\",\n\"flag\": null,\n\"male\": true,\n\"female\": false,\n\"no\": 1.2,\n\"arr\": [\"null\", \"true\", \"false\", null]\n} +""" +let jsonData = jsonString.data(using: .utf8) +let url = "https://api.apidash.dev/case/lower" + + +AF.upload(jsonData!, to: url, method: .post, headers: ["Content-Type": "application/json"]) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()'''; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelPost2, + SupportedUriSchemes.https, + ), + expectedCode); + }); + + test('POST 3', () { + const expectedCode = r''' +import Foundation +import Alamofire +let jsonString = """ +{\n\"text\": \"I LOVE Flutter\"\n} +""" +let jsonData = jsonString.data(using: .utf8) +let url = "https://api.apidash.dev/case/lower" + + +AF.upload(jsonData!, to: url, method: .post, headers: ["User-Agent": "Test Agent", "Content-Type": "application/json"]) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()'''; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelPost3, + SupportedUriSchemes.https, + ), + expectedCode); + }); + +// test('POST 4', () { +// const expectedCode = r""" + +// """; + +// expect( +// codeGen.getCode( +// CodegenLanguage.swiftAlamofire, +// requestModelPost4, +// SupportedUriSchemes.https, +// ), +// expectedCode); +// }); + +// test('POST 5', () { +// const expectedCode = r""" + +// """; + +// expect( +// codeGen.getCode( +// CodegenLanguage.swiftAlamofire, +// requestModelPost5, +// SupportedUriSchemes.https, +// ), +// expectedCode); +// }); + + +// test('POST 6', () { +// const expectedCode = r""" + +// """; + +// expect( +// codeGen.getCode( +// CodegenLanguage.swiftAlamofire, +// requestModelPost6, +// SupportedUriSchemes.https, +// ), +// expectedCode); +// }); + + + + +// test('POST 7', () { +// const expectedCode = r""" + +// """; + +// expect( +// codeGen.getCode( +// CodegenLanguage.swiftAlamofire, +// requestModelPost7, +// SupportedUriSchemes.https, +// ), +// expectedCode); +// }); + test('POST 8', () { + const expectedCode = r""" + +"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelPost8, + SupportedUriSchemes.https, + ), + expectedCode); + }); +// test('POST 9', () { +// const expectedCode = r""" + +// """; + +// expect( +// codeGen.getCode( +// CodegenLanguage.swiftAlamofire, +// requestModelPost9, +// SupportedUriSchemes.https, +// ), +// expectedCode); +// }); +// test('POST 10', () { +// const expectedCode = r""" + +// """; + +// expect( +// codeGen.getCode( +// CodegenLanguage.swiftAlamofire, +// requestModelPost10, +// SupportedUriSchemes.https, +// ), +// expectedCode); +// }); + }, + + ); + + group( + 'HTTPVerb.put', + () { + test('PUT 1', () { + const expectedCode = r''' +import Foundation +import Alamofire +let jsonString = """ +{\n\"name\": \"morpheus\",\n\"job\": \"zion resident\"\n} +""" +let jsonData = jsonString.data(using: .utf8) +let url = "https://reqres.in/api/users/2" + + +AF.upload(jsonData!, to: url, method: .put, headers: ["Content-Type": "application/json"]) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()'''; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelPut1, + SupportedUriSchemes.https, + ), + expectedCode); + }); + }, + + ); + + group( + 'HTTPVerb.patch', + () { + test('PATCH 1', () { + const expectedCode = r''' +import Foundation +import Alamofire +let jsonString = """ +{\n\"name\": \"marfeus\",\n\"job\": \"accountant\"\n} +""" +let jsonData = jsonString.data(using: .utf8) +let url = "https://reqres.in/api/users/2" + + +AF.upload(jsonData!, to: url, method: .patch, headers: ["Content-Type": "application/json"]) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()'''; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelPatch1, + SupportedUriSchemes.https, + ), + expectedCode); + }); + }, + + ); + + group( + 'HTTPVerb.delete', + () { + test('DELETE 1', () { + const expectedCode = r""" +import Foundation +import Alamofire +let url = "https://reqres.in/api/users/2" + + +AF.request(url, method: .delete) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelDelete1, + SupportedUriSchemes.https, + ), + expectedCode); + }); + + test('DELETE 2', () { + const expectedCode = r''' +import Foundation +import Alamofire +let jsonString = """ +{\n\"name\": \"marfeus\",\n\"job\": \"accountant\"\n} +""" +let jsonData = jsonString.data(using: .utf8) +let url = "https://reqres.in/api/users/2" + + +AF.upload(jsonData!, to: url, method: .delete, headers: ["Content-Type": "application/json"]) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()'''; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelDelete2, + SupportedUriSchemes.https, + ), + expectedCode); + }); + }, + + ); +} From 33cd24f2f34dc120390ae5617263ae5dc68bbaf0 Mon Sep 17 00:00:00 2001 From: Nikhil Date: Mon, 14 Apr 2025 09:20:37 +0530 Subject: [PATCH 05/13] tests --- .../codegen/swift_alamofire_codegen_test.dart | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/test/codegen/swift_alamofire_codegen_test.dart b/test/codegen/swift_alamofire_codegen_test.dart index 72d15046..d5984037 100644 --- a/test/codegen/swift_alamofire_codegen_test.dart +++ b/test/codegen/swift_alamofire_codegen_test.dart @@ -637,19 +637,19 @@ dispatchMain()'''; // ), // expectedCode); // }); - test('POST 8', () { - const expectedCode = r""" +// test('POST 8', () { +// const expectedCode = r""" -"""; +// """; - expect( - codeGen.getCode( - CodegenLanguage.swiftAlamofire, - requestModelPost8, - SupportedUriSchemes.https, - ), - expectedCode); - }); +// expect( +// codeGen.getCode( +// CodegenLanguage.swiftAlamofire, +// requestModelPost8, +// SupportedUriSchemes.https, +// ), +// expectedCode); +// }); // test('POST 9', () { // const expectedCode = r""" From 030ad8c4017afc05fff16764966e307caaf12bce Mon Sep 17 00:00:00 2001 From: Nikhil Date: Sun, 20 Apr 2025 03:56:40 +0530 Subject: [PATCH 06/13] all tests updated --- lib/codegen/swift/alamofire.dart | 7 +- .../codegen/swift_alamofire_codegen_test.dart | 324 +++++++++++++----- 2 files changed, 244 insertions(+), 87 deletions(-) diff --git a/lib/codegen/swift/alamofire.dart b/lib/codegen/swift/alamofire.dart index d3923ebc..c6d72727 100644 --- a/lib/codegen/swift/alamofire.dart +++ b/lib/codegen/swift/alamofire.dart @@ -10,12 +10,9 @@ import Alamofire final String kTemplateFormData = ''' let multipartFormData = MultipartFormData() -{% for param in formData %} - {% if param.type == 'text' %} -multipartFormData.append(Data("{{param.value}}".utf8), withName: "{{param.name}}") - {% elif param.type == 'file' %} +{% for param in formData %} {% if param.type == 'text' %}multipartFormData.append(Data("{{param.value}}".utf8), withName: "{{param.name}}") {% elif param.type == 'file' %} let fileURL = URL(fileURLWithPath: "{{param.filepath}}") -multipartFormData.append(fileURL, withName: "{{param.name}}", fileName: "{{param.filename}}") +multipartFormData.append(fileURL, withName: "{{param.name}}", fileName: "{{param.filename}}", mimeType: "application/octet-stream") {% endif %} {% endfor %} '''; diff --git a/test/codegen/swift_alamofire_codegen_test.dart b/test/codegen/swift_alamofire_codegen_test.dart index d5984037..c5c5f003 100644 --- a/test/codegen/swift_alamofire_codegen_test.dart +++ b/test/codegen/swift_alamofire_codegen_test.dart @@ -578,104 +578,264 @@ dispatchMain()'''; expectedCode); }); -// test('POST 4', () { -// const expectedCode = r""" - -// """; - -// expect( -// codeGen.getCode( -// CodegenLanguage.swiftAlamofire, -// requestModelPost4, -// SupportedUriSchemes.https, -// ), -// expectedCode); -// }); - -// test('POST 5', () { -// const expectedCode = r""" - -// """; - -// expect( -// codeGen.getCode( -// CodegenLanguage.swiftAlamofire, -// requestModelPost5, -// SupportedUriSchemes.https, -// ), -// expectedCode); -// }); + test('POST 4', () { + const expectedCode = r""" +import Foundation +import Alamofire +let multipartFormData = MultipartFormData() + multipartFormData.append(Data("API".utf8), withName: "text") + multipartFormData.append(Data("|".utf8), withName: "sep") + multipartFormData.append(Data("3".utf8), withName: "times") +let url = "https://api.apidash.dev/io/form" -// test('POST 6', () { -// const expectedCode = r""" +AF.upload(multipartFormData: multipartFormData, to: url, method: .post) -// """; +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} -// expect( -// codeGen.getCode( -// CodegenLanguage.swiftAlamofire, -// requestModelPost6, -// SupportedUriSchemes.https, -// ), -// expectedCode); -// }); +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelPost4, + SupportedUriSchemes.https, + ), + expectedCode); + }); + + test('POST 5', () { + const expectedCode = r""" +import Foundation +import Alamofire +let multipartFormData = MultipartFormData() + multipartFormData.append(Data("API".utf8), withName: "text") + multipartFormData.append(Data("|".utf8), withName: "sep") + multipartFormData.append(Data("3".utf8), withName: "times") +let url = "https://api.apidash.dev/io/form" + + +AF.upload(multipartFormData: multipartFormData, to: url, method: .post, headers: ["User-Agent": "Test Agent"]) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelPost5, + SupportedUriSchemes.https, + ), + expectedCode); + }); + + + test('POST 6', () { + const expectedCode = r""" +import Foundation +import Alamofire +let multipartFormData = MultipartFormData() + multipartFormData.append(Data("xyz".utf8), withName: "token") + +let fileURL = URL(fileURLWithPath: "/Documents/up/1.png") +multipartFormData.append(fileURL, withName: "imfile", fileName: "1.png", mimeType: "application/octet-stream") + +let url = "https://api.apidash.dev/io/img" + + +AF.upload(multipartFormData: multipartFormData, to: url, method: .post) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelPost6, + SupportedUriSchemes.https, + ), + expectedCode); + }); -// test('POST 7', () { -// const expectedCode = r""" + test('POST 7', () { + const expectedCode = r""" +import Foundation +import Alamofire +let multipartFormData = MultipartFormData() + multipartFormData.append(Data("xyz".utf8), withName: "token") + +let fileURL = URL(fileURLWithPath: "/Documents/up/1.png") +multipartFormData.append(fileURL, withName: "imfile", fileName: "1.png", mimeType: "application/octet-stream") + +let url = "https://api.apidash.dev/io/img" -// """; -// expect( -// codeGen.getCode( -// CodegenLanguage.swiftAlamofire, -// requestModelPost7, -// SupportedUriSchemes.https, -// ), -// expectedCode); -// }); -// test('POST 8', () { -// const expectedCode = r""" +AF.upload(multipartFormData: multipartFormData, to: url, method: .post) -// """; +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} -// expect( -// codeGen.getCode( -// CodegenLanguage.swiftAlamofire, -// requestModelPost8, -// SupportedUriSchemes.https, -// ), -// expectedCode); -// }); -// test('POST 9', () { -// const expectedCode = r""" +dispatchMain()"""; -// """; + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelPost7, + SupportedUriSchemes.https, + ), + expectedCode); + }); + test('POST 8', () { + const expectedCode = r""" +import Foundation +import Alamofire +let multipartFormData = MultipartFormData() + multipartFormData.append(Data("API".utf8), withName: "text") + multipartFormData.append(Data("|".utf8), withName: "sep") + multipartFormData.append(Data("3".utf8), withName: "times") +let url = "https://api.apidash.dev/io/form?size=2&len=3" -// expect( -// codeGen.getCode( -// CodegenLanguage.swiftAlamofire, -// requestModelPost9, -// SupportedUriSchemes.https, -// ), -// expectedCode); -// }); -// test('POST 10', () { -// const expectedCode = r""" -// """; +AF.upload(multipartFormData: multipartFormData, to: url, method: .post) -// expect( -// codeGen.getCode( -// CodegenLanguage.swiftAlamofire, -// requestModelPost10, -// SupportedUriSchemes.https, -// ), -// expectedCode); -// }); +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelPost8, + SupportedUriSchemes.https, + ), + expectedCode); + }); + test('POST 9', () { + const expectedCode = r""" +import Foundation +import Alamofire +let multipartFormData = MultipartFormData() + multipartFormData.append(Data("xyz".utf8), withName: "token") + +let fileURL = URL(fileURLWithPath: "/Documents/up/1.png") +multipartFormData.append(fileURL, withName: "imfile", fileName: "1.png", mimeType: "application/octet-stream") + +let url = "https://api.apidash.dev/io/img?size=2&len=3" + + +AF.upload(multipartFormData: multipartFormData, to: url, method: .post, headers: ["User-Agent": "Test Agent", "Keep-Alive": "true"]) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()"""; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelPost9, + SupportedUriSchemes.https, + ), + expectedCode); + }); + test('POST 10', () { + const expectedCode = r''' +import Foundation +import Alamofire +let jsonString = """ +{\n\"text\": \"I LOVE Flutter\"\n} +""" +let jsonData = jsonString.data(using: .utf8) +let url = "https://api.apidash.dev/case/lower?size=2&len=3" + + +AF.upload(jsonData!, to: url, method: .post, headers: ["Content-Type": "application/json; charset=utf-8"]) + +.responseData { response in + switch response.result { + case .success(let data): + if let responseString = String(data: data, encoding: .utf8) { + print("Response: \(responseString)") + } + case .failure(let error): + print("Error: \(error)") + } + exit(0) +} + +dispatchMain()'''; + + expect( + codeGen.getCode( + CodegenLanguage.swiftAlamofire, + requestModelPost10, + SupportedUriSchemes.https, + ), + expectedCode); + }); }, ); From ab671d3786283747f7275ccaeeb0317614ea1332 Mon Sep 17 00:00:00 2001 From: Nikhil <72620320+badnikhil@users.noreply.github.com> Date: Sun, 20 Apr 2025 04:22:47 +0530 Subject: [PATCH 07/13] Update instructions_to_run_generated_code.md --- .../instructions_to_run_generated_code.md | 134 +++++++++++++++++- 1 file changed, 131 insertions(+), 3 deletions(-) diff --git a/doc/user_guide/instructions_to_run_generated_code.md b/doc/user_guide/instructions_to_run_generated_code.md index 41085943..76ab1d0f 100644 --- a/doc/user_guide/instructions_to_run_generated_code.md +++ b/doc/user_guide/instructions_to_run_generated_code.md @@ -29,7 +29,8 @@ Choose your programming language/library from the list provided below to learn m - [Rust (reqwest)](#rust-reqwest) - [Rust (ureq)](#rust-ureq) - [Rust (Actix Client)](#rust-actix-client) -- [Swift](#swift) +- [Swift (URLSession)](#swift-urlsession) +- [Swift (Alamofire)](#swift-alamofire) **Please raise a GitHub issue in case any instruction is not clear or if it is not working.** @@ -1073,6 +1074,133 @@ cargo run TODO -## Swift +## Swift (URLSession) + +### Set Up the Environment +#### MacBook (macOS) + +Verify Swift : +``` +swift --version +``` + + +#### Linux + +Download Swift for Linux (e.g., Ubuntu) from Swift.org. + +``` +tar xzf filename +export PATH=$PWD/filename/usr/bin:$PATH + +``` +Verify: +``` +swift --version +``` + + + + + +Install Dependencies: +``` +sudo apt-get update +sudo apt-get install clang libicu-dev libcurl4-openssl-dev +``` + + +### Create a Project: +``` +mkdir URLSessionDemo +cd URLSessionDemo +swift package init --type executable +``` + + + + +### Run the Code +Ensure main.swift is in Sources/URLSessionDemo. + + +Run: +``` +swift run +``` + +## Swift (Alamofire) + +### Set Up the Environment +#### MacBook (macOS) + +Verify Swift : +``` +swift --version +``` + + +#### Linux + +Download Swift for Linux (e.g., Ubuntu) from Swift.org. + +``` +tar xzf filename +export PATH=$PWD/filename/usr/bin:$PATH + +``` +Verify: +``` +swift --version +``` + + + + + + Install Dependencies for swift: +``` +sudo apt-get update +sudo apt-get install clang libicu-dev libcurl4-openssl-dev +``` + + +### Create a Project: +``` +mkdir URLSessionDemo +cd URLSessionDemo +swift package init --type executable +``` + + +### Adding alamofire + open `package.swift` and add following dependencies and target(replace `project-name` with your project name) +``` + dependencies: [ + .package(url: "https://github.com/Alamofire/Alamofire", from: "5.6.4") + ], + targets: [ + .executableTarget( + name: "project-name", + dependencies: [ + "Alamofire" + ] + ) + ] + + +``` + + + +### Run the Code +Ensure main.swift is in Sources/URLSessionDemo. + + +Run: +``` +swift run +``` + + -TODO From 307364b917498df79aab3698e2e065c6c3e087bd Mon Sep 17 00:00:00 2001 From: Nikhil <72620320+badnikhil@users.noreply.github.com> Date: Sun, 20 Apr 2025 04:28:24 +0530 Subject: [PATCH 08/13] Update instructions_to_run_generated_code.md --- doc/user_guide/instructions_to_run_generated_code.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/user_guide/instructions_to_run_generated_code.md b/doc/user_guide/instructions_to_run_generated_code.md index 76ab1d0f..ad6cf915 100644 --- a/doc/user_guide/instructions_to_run_generated_code.md +++ b/doc/user_guide/instructions_to_run_generated_code.md @@ -1085,7 +1085,7 @@ swift --version ``` -#### Linux +#### Linux(Multipartformdata is not supported) Download Swift for Linux (e.g., Ubuntu) from Swift.org. @@ -1140,7 +1140,7 @@ swift --version ``` -#### Linux +#### Linux (Multipartformdata is not supported) Download Swift for Linux (e.g., Ubuntu) from Swift.org. From ec2c2a240703fc5b19a0319768291992b1146479 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Wed, 23 Apr 2025 04:14:20 +0530 Subject: [PATCH 09/13] Update codegen.dart --- lib/codegen/codegen.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/codegen/codegen.dart b/lib/codegen/codegen.dart index f00dcbb1..89557064 100644 --- a/lib/codegen/codegen.dart +++ b/lib/codegen/codegen.dart @@ -1,4 +1,3 @@ -import 'package:apidash/codegen/swift/alamofire.dart'; import 'package:apidash/consts.dart'; import 'package:apidash/models/models.dart'; import 'package:apidash/utils/utils.dart' show getNewUuid; @@ -31,6 +30,7 @@ import 'rust/curl_rust.dart'; import 'rust/hyper.dart'; import 'rust/reqwest.dart'; import 'rust/ureq.dart'; +import 'swift/alamofire.dart'; import 'swift/urlsession.dart'; class Codegen { @@ -116,10 +116,10 @@ class Codegen { return CSharpRestSharp().getCode(rM); case CodegenLanguage.phpHttpPlug: return PhpHttpPlugCodeGen().getCode(rM); - case CodegenLanguage.swiftUrlSession: - return SwiftURLSessionCodeGen().getCode(rM); case CodegenLanguage.swiftAlamofire: return SwiftAlamofireCodeGen().getCode(rM); + case CodegenLanguage.swiftUrlSession: + return SwiftURLSessionCodeGen().getCode(rM); } } } From f25555861e6e8825da469fea763e07e60277d498 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Wed, 23 Apr 2025 04:14:55 +0530 Subject: [PATCH 10/13] Update alamofire.dart --- lib/codegen/swift/alamofire.dart | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/lib/codegen/swift/alamofire.dart b/lib/codegen/swift/alamofire.dart index c6d72727..b128a727 100644 --- a/lib/codegen/swift/alamofire.dart +++ b/lib/codegen/swift/alamofire.dart @@ -16,7 +16,7 @@ multipartFormData.append(fileURL, withName: "{{param.name}}", fileName: "{{param {% endif %} {% endfor %} '''; - + final String kTemplateJsonData = ''' let jsonString = """ {{jsonData}} @@ -60,9 +60,10 @@ dispatchMain() try { String result = kTemplateStart; - var rec = getValidRequestUri(requestModel.url, requestModel.enabledParams); + var rec = + getValidRequestUri(requestModel.url, requestModel.enabledParams); Uri? uri = rec.$1; - + var headers = requestModel.enabledHeadersMap; bool hasBody = false; @@ -91,30 +92,32 @@ dispatchMain() result += templateFormData.render({ "formData": formDataList, }); - + hasBody = true; - } - else if (requestModel.hasJsonData) { + } else if (requestModel.hasJsonData) { var templateJsonData = jj.Template(kTemplateJsonData); result += templateJsonData.render({ - "jsonData": requestModel.body!.replaceAll('"', '\\"').replaceAll('\n', '\\n'), + "jsonData": + requestModel.body!.replaceAll('"', '\\"').replaceAll('\n', '\\n'), }); - + headers.putIfAbsent("Content-Type", () => "application/json"); hasBody = true; hasJsonData = true; - } + } // Handle text data else if (requestModel.hasTextData) { var templateTextData = jj.Template(kTemplateTextData); result += templateTextData.render({ - "textData": requestModel.body!.replaceAll('"', '\\"').replaceAll('\n', '\\n'), + "textData": + requestModel.body!.replaceAll('"', '\\"').replaceAll('\n', '\\n'), }); - - headers.putIfAbsent(kHeaderContentType, () => requestModel.bodyContentType.header); + + headers.putIfAbsent( + kHeaderContentType, () => requestModel.bodyContentType.header); hasBody = true; } - + String headersString = "nil"; bool hasHeaders = false; if (headers.isNotEmpty) { @@ -142,4 +145,4 @@ dispatchMain() return null; } } -} \ No newline at end of file +} From d55c41443813c410ff2efbf614f0ebde6e872421 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Wed, 23 Apr 2025 04:16:14 +0530 Subject: [PATCH 11/13] Update consts.dart --- lib/consts.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/consts.dart b/lib/consts.dart index 1831cbc1..628598e4 100644 --- a/lib/consts.dart +++ b/lib/consts.dart @@ -132,8 +132,8 @@ enum CodegenLanguage { rustReqwest("Rust (reqwest)", "rust", "rs"), rustCurl("Rust (curl-rust)", "rust", "rs"), rustUreq("Rust (ureq)", "rust", "rs"), - swiftUrlSession("Swift (URLSession)", "swift", "swift"), - swiftAlamofire("Swift (Alamofire)", "swift", "swift"); + swiftAlamofire("Swift (Alamofire)", "swift", "swift"), + swiftUrlSession("Swift (URLSession)", "swift", "swift"); const CodegenLanguage(this.label, this.codeHighlightLang, this.ext); final String label; From 99151e6673c97e44e82c8b062c6313c11349c53c Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Wed, 23 Apr 2025 04:25:46 +0530 Subject: [PATCH 12/13] cleanup --- lib/screens/history/history_widgets/his_request_pane.dart | 4 ++-- lib/utils/save_utils.dart | 1 - test/codegen/swift_urlsession_test.dart | 1 - 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/screens/history/history_widgets/his_request_pane.dart b/lib/screens/history/history_widgets/his_request_pane.dart index d4a65110..f1435063 100644 --- a/lib/screens/history/history_widgets/his_request_pane.dart +++ b/lib/screens/history/history_widgets/his_request_pane.dart @@ -136,8 +136,8 @@ class HisRequestBody extends ConsumerWidget { ContentType.formdata => Padding( padding: kPh4, child: RequestFormDataTable( - rows: requestModel?.formData ?? [])), - // TODO: Fix JsonTextFieldEditor & plug it here + rows: requestModel?.formData ?? []), + ), ContentType.json => Padding( padding: kPt5o10, child: JsonTextFieldEditor( diff --git a/lib/utils/save_utils.dart b/lib/utils/save_utils.dart index 9f850789..6370ae62 100644 --- a/lib/utils/save_utils.dart +++ b/lib/utils/save_utils.dart @@ -1,7 +1,6 @@ import 'package:apidash_design_system/apidash_design_system.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; import 'package:apidash/utils/utils.dart'; import 'package:apidash/widgets/widgets.dart'; diff --git a/test/codegen/swift_urlsession_test.dart b/test/codegen/swift_urlsession_test.dart index c7d1bf8c..b5114d5e 100644 --- a/test/codegen/swift_urlsession_test.dart +++ b/test/codegen/swift_urlsession_test.dart @@ -5,7 +5,6 @@ import 'package:test/test.dart'; import '../models/request_models.dart'; -// TODO: Fix tests for URLSession void main() { final codeGen = Codegen(); From b65d23337be1d3ac03c430a649c788f5b5a13b99 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Wed, 23 Apr 2025 04:27:33 +0530 Subject: [PATCH 13/13] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b47acb31..c40fb355 100644 --- a/README.md +++ b/README.md @@ -182,7 +182,8 @@ API Dash currently supports API integration code generation for the following la | Rust | `reqwest` | | | Rust | `ureq` | | | Rust | `Actix Client` | | -| Swift | `URLSession` | Testing Required | +| Swift | `Alamofire` | | +| Swift | `URLSession` | | We welcome contributions to support other programming languages/libraries/frameworks. Please check out more details [here](https://github.com/foss42/apidash/discussions/80).