diff --git a/package.json b/package.json index 638ccbb55..b96294034 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "java", "javascript", "jquery", + "kotlin", "objc", "objective-c", "ocaml", diff --git a/src/targets/index.js b/src/targets/index.js index 68f83a6b8..dd90b4874 100644 --- a/src/targets/index.js +++ b/src/targets/index.js @@ -8,6 +8,7 @@ module.exports = { http: require('./http'), java: require('./java'), javascript: require('./javascript'), + kotlin: require('./kotlin'), node: require('./node'), objc: require('./objc'), ocaml: require('./ocaml'), diff --git a/src/targets/kotlin/index.js b/src/targets/kotlin/index.js new file mode 100644 index 000000000..fd9fbd698 --- /dev/null +++ b/src/targets/kotlin/index.js @@ -0,0 +1,12 @@ +'use strict' + +module.exports = { + info: { + key: 'kotlin', + title: 'Kotlin', + extname: '.kt', + default: 'okhttp' + }, + + okhttp: require('./okhttp') +} diff --git a/src/targets/kotlin/okhttp.js b/src/targets/kotlin/okhttp.js new file mode 100644 index 000000000..85391abd8 --- /dev/null +++ b/src/targets/kotlin/okhttp.js @@ -0,0 +1,78 @@ +/** + * @description + * HTTP code snippet generator for Kotlin using OkHttp. + * + * @author + * @seanghay + * + * for any questions or issues regarding the generated code snippet, please open an issue mentioning the author. + */ + +'use strict' + +var CodeBuilder = require('../../helpers/code-builder') + +module.exports = function (source, options) { + var opts = Object.assign({ + indent: ' ' + }, options) + + var code = new CodeBuilder(opts.indent) + + var methods = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD'] + + var methodsWithBody = ['POST', 'PUT', 'DELETE', 'PATCH'] + + code.push('val client = OkHttpClient()') + .blank() + + if (source.postData.text) { + if (source.postData.boundary) { + code.push('val mediaType = MediaType.parse("%s; boundary=%s")', source.postData.mimeType, source.postData.boundary) + } else { + code.push('val mediaType = MediaType.parse("%s")', source.postData.mimeType) + } + code.push('val body = RequestBody.create(mediaType, %s)', JSON.stringify(source.postData.text)) + } + + code.push('val request = Request.Builder()') + code.push(1, '.url("%s")', source.fullUrl) + if (methods.indexOf(source.method.toUpperCase()) === -1) { + if (source.postData.text) { + code.push(1, '.method("%s", body)', source.method.toUpperCase()) + } else { + code.push(1, '.method("%s", null)', source.method.toUpperCase()) + } + } else if (methodsWithBody.indexOf(source.method.toUpperCase()) >= 0) { + if (source.postData.text) { + code.push(1, '.%s(body)', source.method.toLowerCase()) + } else { + code.push(1, '.%s(null)', source.method.toLowerCase()) + } + } else { + code.push(1, '.%s()', source.method.toLowerCase()) + } + + // Add headers, including the cookies + var headers = Object.keys(source.allHeaders) + + // construct headers + if (headers.length) { + headers.forEach(function (key) { + code.push(1, '.addHeader("%s", "%s")', key, source.allHeaders[key]) + }) + } + + code.push(1, '.build()') + .blank() + .push('val response = client.newCall(request).execute()') + + return code.join() +} + +module.exports.info = { + key: 'okhttp', + title: 'OkHttp', + link: 'http://square.github.io/okhttp/', + description: 'An HTTP Request Client Library' +} diff --git a/test/fixtures/available-targets.json b/test/fixtures/available-targets.json index 261c48160..da7e47caf 100644 --- a/test/fixtures/available-targets.json +++ b/test/fixtures/available-targets.json @@ -320,5 +320,19 @@ "title": "HTTP/1.1" } ] + }, + { + "key": "kotlin", + "title": "Kotlin", + "extname": ".kt", + "default": "okhttp", + "clients": [ + { + "key": "okhttp", + "title": "OkHttp", + "link": "http://square.github.io/okhttp/", + "description": "An HTTP Request Client Library" + } + ] } ] diff --git a/test/fixtures/output/.DS_Store b/test/fixtures/output/.DS_Store new file mode 100644 index 000000000..63b728b45 Binary files /dev/null and b/test/fixtures/output/.DS_Store differ diff --git a/test/fixtures/output/kotlin/okhttp/application-form-encoded.kt b/test/fixtures/output/kotlin/okhttp/application-form-encoded.kt new file mode 100644 index 000000000..4cf107205 --- /dev/null +++ b/test/fixtures/output/kotlin/okhttp/application-form-encoded.kt @@ -0,0 +1,11 @@ +val client = OkHttpClient() + +val mediaType = MediaType.parse("application/x-www-form-urlencoded") +val body = RequestBody.create(mediaType, "foo=bar&hello=world") +val request = Request.Builder() + .url("http://mockbin.com/har") + .post(body) + .addHeader("content-type", "application/x-www-form-urlencoded") + .build() + +val response = client.newCall(request).execute() diff --git a/test/fixtures/output/kotlin/okhttp/application-json.kt b/test/fixtures/output/kotlin/okhttp/application-json.kt new file mode 100644 index 000000000..3775021f2 --- /dev/null +++ b/test/fixtures/output/kotlin/okhttp/application-json.kt @@ -0,0 +1,11 @@ +val client = OkHttpClient() + +val mediaType = MediaType.parse("application/json") +val body = RequestBody.create(mediaType, "{\"number\":1,\"string\":\"f\\\"oo\",\"arr\":[1,2,3],\"nested\":{\"a\":\"b\"},\"arr_mix\":[1,\"a\",{\"arr_mix_nested\":{}}],\"boolean\":false}") +val request = Request.Builder() + .url("http://mockbin.com/har") + .post(body) + .addHeader("content-type", "application/json") + .build() + +val response = client.newCall(request).execute() diff --git a/test/fixtures/output/kotlin/okhttp/cookies.kt b/test/fixtures/output/kotlin/okhttp/cookies.kt new file mode 100644 index 000000000..b20ba0c16 --- /dev/null +++ b/test/fixtures/output/kotlin/okhttp/cookies.kt @@ -0,0 +1,9 @@ +val client = OkHttpClient() + +val request = Request.Builder() + .url("http://mockbin.com/har") + .post(null) + .addHeader("cookie", "foo=bar; bar=baz") + .build() + +val response = client.newCall(request).execute() diff --git a/test/fixtures/output/kotlin/okhttp/custom-method.kt b/test/fixtures/output/kotlin/okhttp/custom-method.kt new file mode 100644 index 000000000..662995244 --- /dev/null +++ b/test/fixtures/output/kotlin/okhttp/custom-method.kt @@ -0,0 +1,8 @@ +val client = OkHttpClient() + +val request = Request.Builder() + .url("http://mockbin.com/har") + .method("PROPFIND", null) + .build() + +val response = client.newCall(request).execute() diff --git a/test/fixtures/output/kotlin/okhttp/full.kt b/test/fixtures/output/kotlin/okhttp/full.kt new file mode 100644 index 000000000..ad7e8bd5e --- /dev/null +++ b/test/fixtures/output/kotlin/okhttp/full.kt @@ -0,0 +1,13 @@ +val client = OkHttpClient() + +val mediaType = MediaType.parse("application/x-www-form-urlencoded") +val body = RequestBody.create(mediaType, "foo=bar") +val request = Request.Builder() + .url("http://mockbin.com/har?foo=bar&foo=baz&baz=abc&key=value") + .post(body) + .addHeader("cookie", "foo=bar; bar=baz") + .addHeader("accept", "application/json") + .addHeader("content-type", "application/x-www-form-urlencoded") + .build() + +val response = client.newCall(request).execute() diff --git a/test/fixtures/output/kotlin/okhttp/headers.kt b/test/fixtures/output/kotlin/okhttp/headers.kt new file mode 100644 index 000000000..780e5800c --- /dev/null +++ b/test/fixtures/output/kotlin/okhttp/headers.kt @@ -0,0 +1,10 @@ +val client = OkHttpClient() + +val request = Request.Builder() + .url("http://mockbin.com/har") + .get() + .addHeader("accept", "application/json") + .addHeader("x-foo", "Bar") + .build() + +val response = client.newCall(request).execute() diff --git a/test/fixtures/output/kotlin/okhttp/https.kt b/test/fixtures/output/kotlin/okhttp/https.kt new file mode 100644 index 000000000..a2d2244d4 --- /dev/null +++ b/test/fixtures/output/kotlin/okhttp/https.kt @@ -0,0 +1,8 @@ +val client = OkHttpClient() + +val request = Request.Builder() + .url("https://mockbin.com/har") + .get() + .build() + +val response = client.newCall(request).execute() diff --git a/test/fixtures/output/kotlin/okhttp/jsonObj-multiline.kt b/test/fixtures/output/kotlin/okhttp/jsonObj-multiline.kt new file mode 100644 index 000000000..15d47ee1e --- /dev/null +++ b/test/fixtures/output/kotlin/okhttp/jsonObj-multiline.kt @@ -0,0 +1,11 @@ +val client = OkHttpClient() + +val mediaType = MediaType.parse("application/json") +val body = RequestBody.create(mediaType, "{\n \"foo\": \"bar\"\n}") +val request = Request.Builder() + .url("http://mockbin.com/har") + .post(body) + .addHeader("content-type", "application/json") + .build() + +val response = client.newCall(request).execute() diff --git a/test/fixtures/output/kotlin/okhttp/jsonObj-null-value.kt b/test/fixtures/output/kotlin/okhttp/jsonObj-null-value.kt new file mode 100644 index 000000000..b44121533 --- /dev/null +++ b/test/fixtures/output/kotlin/okhttp/jsonObj-null-value.kt @@ -0,0 +1,11 @@ +val client = OkHttpClient() + +val mediaType = MediaType.parse("application/json") +val body = RequestBody.create(mediaType, "{\"foo\":null}") +val request = Request.Builder() + .url("http://mockbin.com/har") + .post(body) + .addHeader("content-type", "application/json") + .build() + +val response = client.newCall(request).execute() diff --git a/test/fixtures/output/kotlin/okhttp/multipart-data.kt b/test/fixtures/output/kotlin/okhttp/multipart-data.kt new file mode 100644 index 000000000..7e742e811 --- /dev/null +++ b/test/fixtures/output/kotlin/okhttp/multipart-data.kt @@ -0,0 +1,11 @@ +val client = OkHttpClient() + +val mediaType = MediaType.parse("multipart/form-data; boundary=---011000010111000001101001") +val body = RequestBody.create(mediaType, "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"foo\"; filename=\"hello.txt\"\r\nContent-Type: text/plain\r\n\r\nHello World\r\n-----011000010111000001101001--\r\n") +val request = Request.Builder() + .url("http://mockbin.com/har") + .post(body) + .addHeader("content-type", "multipart/form-data; boundary=---011000010111000001101001") + .build() + +val response = client.newCall(request).execute() diff --git a/test/fixtures/output/kotlin/okhttp/multipart-file.kt b/test/fixtures/output/kotlin/okhttp/multipart-file.kt new file mode 100644 index 000000000..0673c9116 --- /dev/null +++ b/test/fixtures/output/kotlin/okhttp/multipart-file.kt @@ -0,0 +1,11 @@ +val client = OkHttpClient() + +val mediaType = MediaType.parse("multipart/form-data; boundary=---011000010111000001101001") +val body = RequestBody.create(mediaType, "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"foo\"; filename=\"hello.txt\"\r\nContent-Type: text/plain\r\n\r\n\r\n-----011000010111000001101001--\r\n") +val request = Request.Builder() + .url("http://mockbin.com/har") + .post(body) + .addHeader("content-type", "multipart/form-data; boundary=---011000010111000001101001") + .build() + +val response = client.newCall(request).execute() diff --git a/test/fixtures/output/kotlin/okhttp/multipart-form-data.kt b/test/fixtures/output/kotlin/okhttp/multipart-form-data.kt new file mode 100644 index 000000000..cde86d9ed --- /dev/null +++ b/test/fixtures/output/kotlin/okhttp/multipart-form-data.kt @@ -0,0 +1,11 @@ +val client = OkHttpClient() + +val mediaType = MediaType.parse("multipart/form-data; boundary=---011000010111000001101001") +val body = RequestBody.create(mediaType, "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"foo\"\r\n\r\nbar\r\n-----011000010111000001101001--\r\n") +val request = Request.Builder() + .url("http://mockbin.com/har") + .post(body) + .addHeader("content-type", "multipart/form-data; boundary=---011000010111000001101001") + .build() + +val response = client.newCall(request).execute() diff --git a/test/fixtures/output/kotlin/okhttp/query.kt b/test/fixtures/output/kotlin/okhttp/query.kt new file mode 100644 index 000000000..798a81017 --- /dev/null +++ b/test/fixtures/output/kotlin/okhttp/query.kt @@ -0,0 +1,8 @@ +val client = OkHttpClient() + +val request = Request.Builder() + .url("http://mockbin.com/har?foo=bar&foo=baz&baz=abc&key=value") + .get() + .build() + +val response = client.newCall(request).execute() diff --git a/test/fixtures/output/kotlin/okhttp/short.kt b/test/fixtures/output/kotlin/okhttp/short.kt new file mode 100644 index 000000000..e728d71a7 --- /dev/null +++ b/test/fixtures/output/kotlin/okhttp/short.kt @@ -0,0 +1,8 @@ +val client = OkHttpClient() + +val request = Request.Builder() + .url("http://mockbin.com/har") + .get() + .build() + +val response = client.newCall(request).execute() diff --git a/test/fixtures/output/kotlin/okhttp/text-plain.kt b/test/fixtures/output/kotlin/okhttp/text-plain.kt new file mode 100644 index 000000000..bf85b0fa6 --- /dev/null +++ b/test/fixtures/output/kotlin/okhttp/text-plain.kt @@ -0,0 +1,11 @@ +val client = OkHttpClient() + +val mediaType = MediaType.parse("text/plain") +val body = RequestBody.create(mediaType, "Hello World") +val request = Request.Builder() + .url("http://mockbin.com/har") + .post(body) + .addHeader("content-type", "text/plain") + .build() + +val response = client.newCall(request).execute() diff --git a/test/targets/kotlin/okhttp.js b/test/targets/kotlin/okhttp.js new file mode 100644 index 000000000..9ad8c1790 --- /dev/null +++ b/test/targets/kotlin/okhttp.js @@ -0,0 +1,5 @@ +'use strict' + +require('should') + +module.exports = function (snippet, fixtures) {}