From 1f49c40183606a1314aafffb477ccacf7122afc7 Mon Sep 17 00:00:00 2001 From: Rohan Mukherjee Date: Thu, 1 Oct 2020 14:33:20 +0530 Subject: [PATCH 01/11] fix: -f flag added to npm clean script, prevents failure if ./dist does not exist --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5afe04f..0d70c02 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "scripts": { "build": "npm run clean && tsc && npm run build:dockerfiles", "build:dockerfiles": "shx cp -r src/langs dist/src/langs", - "clean": "shx rm -r ./dist", + "clean": "shx rm -rf ./dist", "test": "mocha --config test/.mocharc.json test/**/*.ts", "lint": "eslint \"src/**/*.{ts,js,jsx}\" \"test/**/*.ts\" \"examples/**/*.{ts,js}\"", "lint:fix": "eslint --fix \"src/**/*.{ts,js,jsx}\" \"test/**/*.ts\" \"examples/**/*.{ts,js}\"", From 9b0a8a5eebdf9f1e5ba23cdb8bd7741bc448d338 Mon Sep 17 00:00:00 2001 From: Rohan Mukherjee Date: Thu, 1 Oct 2020 14:33:48 +0530 Subject: [PATCH 02/11] feat: v0.1.8 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0d70c02..42a97b0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "code-executor", - "version": "0.1.7", + "version": "0.1.8", "description": "A CLI/library to execute code against test cases in various languages and obtain relevant results.", "main": "dist/src/CodeExecutor.js", "keywords": [ From 43f7cc95972f36c022d32e26acfd6d0f11d014d9 Mon Sep 17 00:00:00 2001 From: Rahil Kabani Date: Fri, 2 Oct 2020 02:18:14 +0530 Subject: [PATCH 03/11] WIP: added dockerfiles for the remaining langs (#32) * feat: accepting only suported languages * feat: added dockerfiles for the remaining langs * fix: trimming outputs before comparing * fix: error handling got worker.build() * feat: better error handling, closes #18 and #14 * feat: added log for error --- examples/master.ts | 15 ++++++--------- examples/worker.ts | 23 ++--------------------- src/Builder.ts | 22 +++++++++++++++++----- src/CodeExecutor.ts | 28 +++++++--------------------- src/Runner.ts | 9 +++++++-- src/Worker.ts | 21 +++++++++++++++------ src/langs/Bash/Dockerfile | 1 + src/langs/Brainfuck/Dockerfile | 4 ++++ src/langs/Brainfuck/start.sh | 5 +++++ src/langs/C/Dockerfile | 1 + src/langs/Golfscript/Dockerfile | 4 ++++ src/langs/Golfscript/start.sh | 5 +++++ src/langs/Java/Dockerfile | 1 + src/langs/Javascript/Dockerfile | 1 + src/langs/O5AB1E/Dockerfile | 4 ++++ src/langs/O5AB1E/start.sh | 5 +++++ src/langs/Perl/Dockerfile | 1 + src/langs/Python/Dockerfile | 1 + src/langs/Ruby/Dockerfile | 1 + src/langs/Rust/Dockerfile | 1 + src/langs/Swift/Dockerfile | 3 ++- src/utils/findExtension.ts | 2 +- 22 files changed, 92 insertions(+), 66 deletions(-) diff --git a/examples/master.ts b/examples/master.ts index 795b396..4a862f7 100644 --- a/examples/master.ts +++ b/examples/master.ts @@ -1,21 +1,18 @@ -/* eslint-disable no-console */ import CodeExecutor from '../src/CodeExecutor'; import logger from '../src/utils/logger'; const codeExecutor = new CodeExecutor('myExecutor', 'redis://127.0.0.1:6379'); -/** - * base64: true is also an option if input, - * output and code are encoded in base64, - * default is false -* */ - const pythonCode = ` import time time.sleep(1) print('hello') `; +const bashCode = ` +echo hello +`; + const inputs = [{ language: 'Python', code: pythonCode, @@ -29,7 +26,7 @@ const inputs = [{ }, { language: 'Bash', - code: 'echo hello', + code: bashCode, testCases: [ { input: '', @@ -43,7 +40,7 @@ async function main() { const results = await Promise.all( inputs.map((input) => codeExecutor.runCode(input)), ); - logger.info(results); + logger.info(JSON.stringify(results)); codeExecutor.stop(); } diff --git a/examples/worker.ts b/examples/worker.ts index da096f4..416927c 100644 --- a/examples/worker.ts +++ b/examples/worker.ts @@ -1,30 +1,11 @@ -import { Worker, languages } from '../src/CodeExecutor'; -import logger from '../src/utils/logger'; +import { Worker } from '../src/CodeExecutor'; -/** - * name, redis, options - * - * Options: - * - * folderPath ( path to mount, default /tmp/code-exec ), - * memory (in MB, default 0, ie no limit), - * CPUs (no. of CPUs, default 0.5), -*/ const worker = new Worker('myExecutor', 'redis://127.0.0.1:6379'); async function main() { - logger.info(languages); - - /* array of languages is optional argument */ - await worker.build(['Python', 'Bash']); + await worker.build(); worker.start(); - - worker.pause(); - - worker.resume(); - - // worker.stop(); } main(); diff --git a/src/Builder.ts b/src/Builder.ts index 0386a59..1306901 100644 --- a/src/Builder.ts +++ b/src/Builder.ts @@ -26,13 +26,20 @@ export default class Builder { t: `${lang.toLowerCase()}-runner`, })); } else { - logger.error(`${lang} is not supported`); + streams.push(Promise.reject(new Error(`${lang} is not supported`))); } }); - const progress: Promise[] = []; + let resolvedStreams; + try { + resolvedStreams = await Promise.all(streams); + } catch (e) { + logger.error(e); + return Promise.reject(e); + } - (await Promise.all(streams)).forEach((stream) => { + const progress: Promise[] = []; + (resolvedStreams).forEach((stream) => { stream.on('data', (chunk) => { logger.debug(chunk); }); @@ -50,8 +57,13 @@ export default class Builder { }); })); }); - - await Promise.all(progress); + try { + await Promise.all(progress); + } catch (e) { + logger.error(e); + return Promise.reject(e); + } logger.info('Built containers successfully'); + return null; } } diff --git a/src/CodeExecutor.ts b/src/CodeExecutor.ts index 0934290..c6badb2 100644 --- a/src/CodeExecutor.ts +++ b/src/CodeExecutor.ts @@ -1,7 +1,7 @@ import Bull from 'bull'; import { v4 as uuid } from 'uuid'; -import { CodeParams, Result } from './models/models'; +import { CodeParams } from './models/models'; import logger from './utils/logger'; import { extension } from './utils/findExtension'; @@ -10,35 +10,21 @@ const languages = Object.keys(extension); export default class CodeExecutor { private queue: Bull.Queue; - private jobs: Map; - constructor(name: string, redis: string) { this.queue = new Bull(name, redis); - - this.jobs = new Map(); - - this.queue.on('global:completed', (_job: Bull.Job, result: string) => { - const { id } = JSON.parse(result); - - logger.debug(`Running on complete for id: ${id}`); - - const currentJob = this.jobs.get(id); - if (currentJob) { - currentJob.resolve(result); - this.jobs.delete(id); - } - }); } async runCode(codeOptions: CodeParams): Promise { + if (!languages.includes(codeOptions.language)) { + return Promise.reject(new Error('Language not supported!')); + } const id = uuid(); const codeObject = { ...codeOptions, id }; logger.info(`Running code with id: ${id}`); - return new Promise((resolve, reject) => { - this.jobs.set(id, { resolve, reject }); - this.queue.add(codeObject); - }); + const job = await this.queue.add(codeObject); + + return job.finished(); } stop() { diff --git a/src/Runner.ts b/src/Runner.ts index 49af71e..8ba42ac 100644 --- a/src/Runner.ts +++ b/src/Runner.ts @@ -48,6 +48,7 @@ export default class Runner { const promisesToKeep: Array>> = []; for (let i = 0; i < Paths.length; i += 1) { promisesToKeep.push(this.docker.run(tag, ['bash', '/start.sh', `${i}`, `${timeout}`], null, { + User: 'runner', HostConfig: { CpuPeriod: 100000, CpuQuota: CPUs * 1000000, @@ -64,7 +65,11 @@ export default class Runner { } logger.info(`Starting process ${id}`); const t0 = performance.now(); - await Promise.all(promisesToKeep); + try { + await Promise.all(promisesToKeep); + } catch (e) { + return Promise.reject(e); + } const t1 = performance.now(); logger.info(`Process ${id} completed in ${(t1 - t0) / 1000} seconds`); @@ -88,7 +93,7 @@ export default class Runner { if (exitCode === 124) { remarks = 'Time limit exceeded'; } else if (exitCode === 0) { - remarks = expectedOutput === obtainedOutput ? 'Pass' : 'Fail'; + remarks = expectedOutput.trim() === obtainedOutput.trim() ? 'Pass' : 'Fail'; } else { remarks = 'Error'; } diff --git a/src/Worker.ts b/src/Worker.ts index d05a808..1c06332 100644 --- a/src/Worker.ts +++ b/src/Worker.ts @@ -55,17 +55,26 @@ export default class Worker { return result; } - async build(langs?: Array) { - await this.builder.build(langs); + async build(langs?: Array): Promise { + try { + await this.builder.build(langs); + return null; + } catch (e) { + return Promise.reject(e); + } } start() { this.queue.process(async (job, done) => { logger.info(`Received: ${job.data.id}`); - const result = await this.work(job.data); - - logger.debug(JSON.stringify(result)); - done(null, result); + try { + const result = await this.work(job.data); + done(null, result); + logger.debug(JSON.stringify(result)); + } catch (e) { + done(e); + logger.error(e); + } }); } diff --git a/src/langs/Bash/Dockerfile b/src/langs/Bash/Dockerfile index ed404f9..b725c79 100644 --- a/src/langs/Bash/Dockerfile +++ b/src/langs/Bash/Dockerfile @@ -1,3 +1,4 @@ FROM bash:5.0.18 +RUN adduser --disabled-password --gecos "" runner COPY start.sh start.sh WORKDIR /app \ No newline at end of file diff --git a/src/langs/Brainfuck/Dockerfile b/src/langs/Brainfuck/Dockerfile index e69de29..814add3 100644 --- a/src/langs/Brainfuck/Dockerfile +++ b/src/langs/Brainfuck/Dockerfile @@ -0,0 +1,4 @@ +FROM esolang/brainfuck-esotope:latest +RUN adduser --disabled-password --gecos "" runner +COPY start.sh start.sh +WORKDIR /app \ No newline at end of file diff --git a/src/langs/Brainfuck/start.sh b/src/langs/Brainfuck/start.sh index e69de29..a04350d 100644 --- a/src/langs/Brainfuck/start.sh +++ b/src/langs/Brainfuck/start.sh @@ -0,0 +1,5 @@ +i=$1 +date +%s%N > /app/time$i.txt +timeout $2 bash -c "(cat /app/in$i.txt | brainfuck-esotope /app/Main.bf) 2> /app/error$i.txt 1> /app/output$i.txt" +echo $? > /app/exitCode$i.txt +date +%s%N >> /app/time$i.txt \ No newline at end of file diff --git a/src/langs/C/Dockerfile b/src/langs/C/Dockerfile index b0dd126..29a2a9a 100644 --- a/src/langs/C/Dockerfile +++ b/src/langs/C/Dockerfile @@ -1,3 +1,4 @@ FROM gcc:4.9 +RUN adduser --disabled-password --gecos "" runner COPY start.sh start.sh WORKDIR /app \ No newline at end of file diff --git a/src/langs/Golfscript/Dockerfile b/src/langs/Golfscript/Dockerfile index e69de29..010efc4 100644 --- a/src/langs/Golfscript/Dockerfile +++ b/src/langs/Golfscript/Dockerfile @@ -0,0 +1,4 @@ +FROM esolang/golfscript:latest +RUN adduser --disabled-password --gecos "" runner +COPY start.sh start.sh +WORKDIR /app \ No newline at end of file diff --git a/src/langs/Golfscript/start.sh b/src/langs/Golfscript/start.sh index e69de29..4714ad9 100644 --- a/src/langs/Golfscript/start.sh +++ b/src/langs/Golfscript/start.sh @@ -0,0 +1,5 @@ +i=$1 +date +%s%N > /app/time$i.txt +timeout $2 bash -c "(cat /app/in$i.txt | golfscript /app/Main.gs) 2> /app/error$i.txt 1> /app/output$i.txt" +echo $? > /app/exitCode$i.txt +date +%s%N >> /app/time$i.txt \ No newline at end of file diff --git a/src/langs/Java/Dockerfile b/src/langs/Java/Dockerfile index 1ea4c74..5abeb26 100644 --- a/src/langs/Java/Dockerfile +++ b/src/langs/Java/Dockerfile @@ -1,3 +1,4 @@ FROM java:8 +RUN adduser --disabled-password --gecos "" runner COPY start.sh start.sh WORKDIR /app \ No newline at end of file diff --git a/src/langs/Javascript/Dockerfile b/src/langs/Javascript/Dockerfile index 8ef9f63..586a048 100644 --- a/src/langs/Javascript/Dockerfile +++ b/src/langs/Javascript/Dockerfile @@ -1,3 +1,4 @@ FROM node:10-alpine +RUN adduser --disabled-password --gecos "" runner COPY start.sh start.sh WORKDIR /app \ No newline at end of file diff --git a/src/langs/O5AB1E/Dockerfile b/src/langs/O5AB1E/Dockerfile index e69de29..15252bb 100644 --- a/src/langs/O5AB1E/Dockerfile +++ b/src/langs/O5AB1E/Dockerfile @@ -0,0 +1,4 @@ +FROM esolang/05ab1e:latest +RUN adduser --disabled-password --gecos "" runner +COPY start.sh start.sh +WORKDIR /app \ No newline at end of file diff --git a/src/langs/O5AB1E/start.sh b/src/langs/O5AB1E/start.sh index e69de29..34cecac 100644 --- a/src/langs/O5AB1E/start.sh +++ b/src/langs/O5AB1E/start.sh @@ -0,0 +1,5 @@ +i=$1 +date +%s%N > /app/time$i.txt +timeout $2 bash -c "(cat /app/in$i.txt | 05ab1e /app/Main.abe) 2> /app/error$i.txt 1> /app/output$i.txt" +echo $? > /app/exitCode$i.txt +date +%s%N >> /app/time$i.txt \ No newline at end of file diff --git a/src/langs/Perl/Dockerfile b/src/langs/Perl/Dockerfile index 8101614..60ab6dd 100644 --- a/src/langs/Perl/Dockerfile +++ b/src/langs/Perl/Dockerfile @@ -1,3 +1,4 @@ FROM perl:5.20 +RUN adduser --disabled-password --gecos "" runner COPY start.sh start.sh WORKDIR /app \ No newline at end of file diff --git a/src/langs/Python/Dockerfile b/src/langs/Python/Dockerfile index 2ee4990..a76aa9e 100644 --- a/src/langs/Python/Dockerfile +++ b/src/langs/Python/Dockerfile @@ -1,3 +1,4 @@ FROM python:3.8-slim +RUN adduser --disabled-password --gecos "" runner COPY start.sh start.sh WORKDIR /app \ No newline at end of file diff --git a/src/langs/Ruby/Dockerfile b/src/langs/Ruby/Dockerfile index 0768287..da3894f 100644 --- a/src/langs/Ruby/Dockerfile +++ b/src/langs/Ruby/Dockerfile @@ -1,3 +1,4 @@ FROM ruby:2 +RUN adduser --disabled-password --gecos "" runner COPY start.sh start.sh WORKDIR /app \ No newline at end of file diff --git a/src/langs/Rust/Dockerfile b/src/langs/Rust/Dockerfile index d2bd1ad..653e7ba 100644 --- a/src/langs/Rust/Dockerfile +++ b/src/langs/Rust/Dockerfile @@ -1,3 +1,4 @@ FROM rust:1.31 +RUN adduser --disabled-password --gecos "" runner COPY start.sh start.sh WORKDIR /app \ No newline at end of file diff --git a/src/langs/Swift/Dockerfile b/src/langs/Swift/Dockerfile index d35f90f..a8ded81 100644 --- a/src/langs/Swift/Dockerfile +++ b/src/langs/Swift/Dockerfile @@ -1,3 +1,4 @@ -FROM swift +FROM swift:latest +RUN adduser --disabled-password --gecos "" runner COPY start.sh start.sh WORKDIR /app \ No newline at end of file diff --git a/src/utils/findExtension.ts b/src/utils/findExtension.ts index 4562eee..c7a873e 100644 --- a/src/utils/findExtension.ts +++ b/src/utils/findExtension.ts @@ -5,7 +5,7 @@ export default function findExtension(language: string) { let fileExtension = ''; Object.entries(extension).forEach((entry) => { const [key, value] = entry; - if (key.toLowerCase() === language.toLowerCase()) { + if (key === language) { fileExtension = value; } }); From 33277b0ec7f6b124f112f7105a1631418a60508e Mon Sep 17 00:00:00 2001 From: Rohan Mukherjee Date: Fri, 2 Oct 2020 02:33:17 +0530 Subject: [PATCH 04/11] feat: v0.1.9 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 42a97b0..c8dc768 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "code-executor", - "version": "0.1.8", + "version": "0.1.9", "description": "A CLI/library to execute code against test cases in various languages and obtain relevant results.", "main": "dist/src/CodeExecutor.js", "keywords": [ From 11cd1e2c830120f54b16a47c5c69c867ae4bcc67 Mon Sep 17 00:00:00 2001 From: Rohan Mukherjee Date: Fri, 2 Oct 2020 03:23:12 +0530 Subject: [PATCH 05/11] refactor: [BREAKING CHANGE] changed default import to { CodeExecutor } --- examples/master.ts | 2 +- examples/worker.ts | 2 +- src/CodeExecutor.ts | 4 +--- src/Runner.ts | 2 +- src/Worker.ts | 2 +- src/index.ts | 3 +++ src/models/{models.ts => index.ts} | 0 src/utils/saveCode.ts | 2 +- 8 files changed, 9 insertions(+), 8 deletions(-) create mode 100644 src/index.ts rename src/models/{models.ts => index.ts} (100%) diff --git a/examples/master.ts b/examples/master.ts index 4a862f7..6e60c47 100644 --- a/examples/master.ts +++ b/examples/master.ts @@ -1,4 +1,4 @@ -import CodeExecutor from '../src/CodeExecutor'; +import { CodeExecutor } from '../src'; import logger from '../src/utils/logger'; const codeExecutor = new CodeExecutor('myExecutor', 'redis://127.0.0.1:6379'); diff --git a/examples/worker.ts b/examples/worker.ts index 416927c..02c541a 100644 --- a/examples/worker.ts +++ b/examples/worker.ts @@ -1,4 +1,4 @@ -import { Worker } from '../src/CodeExecutor'; +import { Worker } from '../src'; const worker = new Worker('myExecutor', 'redis://127.0.0.1:6379'); diff --git a/src/CodeExecutor.ts b/src/CodeExecutor.ts index c6badb2..44393de 100644 --- a/src/CodeExecutor.ts +++ b/src/CodeExecutor.ts @@ -1,7 +1,7 @@ import Bull from 'bull'; import { v4 as uuid } from 'uuid'; -import { CodeParams } from './models/models'; +import { CodeParams } from './models'; import logger from './utils/logger'; import { extension } from './utils/findExtension'; @@ -32,6 +32,4 @@ export default class CodeExecutor { } } -export { default as Worker } from './Worker'; - export { languages }; diff --git a/src/Runner.ts b/src/Runner.ts index 8ba42ac..7ad7c1f 100644 --- a/src/Runner.ts +++ b/src/Runner.ts @@ -9,7 +9,7 @@ import { TestCase, Result, Tests, -} from './models/models'; +} from './models'; import getOutput from './utils/getOutput'; import saveCode from './utils/saveCode'; diff --git a/src/Worker.ts b/src/Worker.ts index 1c06332..c855780 100644 --- a/src/Worker.ts +++ b/src/Worker.ts @@ -4,7 +4,7 @@ import Bull from 'bull'; import Runner from './Runner'; import Builder from './Builder'; -import { Code, Result, WorkerOptions } from './models/models'; +import { Code, Result, WorkerOptions } from './models'; import logger from './utils/logger'; export default class Worker { diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..7bcac45 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,3 @@ +export { default as CodeExecutor, languages } from './CodeExecutor'; + +export { default as Worker } from './Worker'; diff --git a/src/models/models.ts b/src/models/index.ts similarity index 100% rename from src/models/models.ts rename to src/models/index.ts diff --git a/src/utils/saveCode.ts b/src/utils/saveCode.ts index e13fa95..3fd5299 100644 --- a/src/utils/saveCode.ts +++ b/src/utils/saveCode.ts @@ -3,7 +3,7 @@ import writeToFile from './writeToFile'; import generateFolder from './generateFolder'; import findExtension from './findExtension'; import decodeBase64 from './decodeBase64'; -import { TestCase } from '../models/models'; +import { TestCase } from '../models'; export default async function saveCode( folderPath: string, From 1a00e9319b0b0cc4a677ce5a3d2c3e7bc8412c5b Mon Sep 17 00:00:00 2001 From: Rohan Mukherjee Date: Fri, 2 Oct 2020 03:23:39 +0530 Subject: [PATCH 06/11] docs: [BREAKING CHANGE] default import to { CodeExecutor } --- README.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c21163e..30d5a01 100644 --- a/README.md +++ b/README.md @@ -138,7 +138,14 @@ You can create a `CodeExecutor` object in the following manner. You must pass th ```js -import CodeExecutor from 'code-executor'; +import { CodeExecutor } from 'code-executor'; +const codeExecutor = new CodeExecutor('myExecutor', 'redis://127.0.0.1:6379'); +``` + +**OR** + +```js +const { CodeExecutor } = require('code-executor'); const codeExecutor = new CodeExecutor('myExecutor', 'redis://127.0.0.1:6379'); ``` @@ -182,6 +189,13 @@ import { Worker } from 'code-executor'; const worker = new Worker('myExecutor', 'redis://127.0.0.1:6379'); ``` +**OR** + +```js +const { Worker } = require('code-executor'); +const worker = new Worker('myExecutor', 'redis://127.0.0.1:6379'); +``` + You can create a new `Worker` object and listen with the same `name` and `redis` string you passed to the master class. There is another optional parameter called `options`, which is an object that may consist of the following parameters: - `folderPath`, _string_: Will be discussed later. From a23f066bfc6fc126724dde63dba17d2289cf858f Mon Sep 17 00:00:00 2001 From: Rohan Mukherjee Date: Fri, 2 Oct 2020 03:28:05 +0530 Subject: [PATCH 07/11] fix: Build only python and bash --- examples/worker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/worker.ts b/examples/worker.ts index 02c541a..d8ba956 100644 --- a/examples/worker.ts +++ b/examples/worker.ts @@ -3,7 +3,7 @@ import { Worker } from '../src'; const worker = new Worker('myExecutor', 'redis://127.0.0.1:6379'); async function main() { - await worker.build(); + await worker.build(['Python', 'Bash']); worker.start(); } From 7380127b162339a589ce3789c638038625f6af4f Mon Sep 17 00:00:00 2001 From: Rohan Mukherjee Date: Fri, 2 Oct 2020 03:29:23 +0530 Subject: [PATCH 08/11] docs: worker.build builds all languages by default --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 30d5a01..ac886bb 100644 --- a/README.md +++ b/README.md @@ -224,6 +224,8 @@ An object of the `Worker` class has the following important functions: `worker.build()` is responsible for building docker images on the system. You can pass a list of languages to the function so that it builds images for just the specified languages. +- You can also call `worker.build()` without an argument to build all languages supported by `code-executor`. + ```js async function build() { await worker.build(['Python', 'Bash']); From c90722c86dd0008220e5259ada4bb670a22627af Mon Sep 17 00:00:00 2001 From: Rohan Mukherjee Date: Fri, 2 Oct 2020 03:31:15 +0530 Subject: [PATCH 09/11] feat: v0.2.0 [BREAKING CHANGE] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c8dc768..9dc8665 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "code-executor", - "version": "0.1.9", + "version": "0.2.0", "description": "A CLI/library to execute code against test cases in various languages and obtain relevant results.", "main": "dist/src/CodeExecutor.js", "keywords": [ From e7bd2b9aae4ed33ad90d14ed0fc31cf3f816d25b Mon Sep 17 00:00:00 2001 From: Rohan Mukherjee Date: Fri, 2 Oct 2020 03:38:05 +0530 Subject: [PATCH 10/11] feat: v0.2.0 [BREAKING CHANGE] (#34) * refactor: [BREAKING CHANGE] changed default import to { CodeExecutor } * docs: [BREAKING CHANGE] default import to { CodeExecutor } * fix: Build only python and bash * docs: worker.build builds all languages by default * feat: v0.2.0 [BREAKING CHANGE] --- README.md | 18 +++++++++++++++++- examples/master.ts | 2 +- examples/worker.ts | 4 ++-- package.json | 2 +- src/CodeExecutor.ts | 4 +--- src/Runner.ts | 2 +- src/Worker.ts | 2 +- src/index.ts | 3 +++ src/models/{models.ts => index.ts} | 0 src/utils/saveCode.ts | 2 +- 10 files changed, 28 insertions(+), 11 deletions(-) create mode 100644 src/index.ts rename src/models/{models.ts => index.ts} (100%) diff --git a/README.md b/README.md index c21163e..ac886bb 100644 --- a/README.md +++ b/README.md @@ -138,7 +138,14 @@ You can create a `CodeExecutor` object in the following manner. You must pass th ```js -import CodeExecutor from 'code-executor'; +import { CodeExecutor } from 'code-executor'; +const codeExecutor = new CodeExecutor('myExecutor', 'redis://127.0.0.1:6379'); +``` + +**OR** + +```js +const { CodeExecutor } = require('code-executor'); const codeExecutor = new CodeExecutor('myExecutor', 'redis://127.0.0.1:6379'); ``` @@ -182,6 +189,13 @@ import { Worker } from 'code-executor'; const worker = new Worker('myExecutor', 'redis://127.0.0.1:6379'); ``` +**OR** + +```js +const { Worker } = require('code-executor'); +const worker = new Worker('myExecutor', 'redis://127.0.0.1:6379'); +``` + You can create a new `Worker` object and listen with the same `name` and `redis` string you passed to the master class. There is another optional parameter called `options`, which is an object that may consist of the following parameters: - `folderPath`, _string_: Will be discussed later. @@ -210,6 +224,8 @@ An object of the `Worker` class has the following important functions: `worker.build()` is responsible for building docker images on the system. You can pass a list of languages to the function so that it builds images for just the specified languages. +- You can also call `worker.build()` without an argument to build all languages supported by `code-executor`. + ```js async function build() { await worker.build(['Python', 'Bash']); diff --git a/examples/master.ts b/examples/master.ts index 4a862f7..6e60c47 100644 --- a/examples/master.ts +++ b/examples/master.ts @@ -1,4 +1,4 @@ -import CodeExecutor from '../src/CodeExecutor'; +import { CodeExecutor } from '../src'; import logger from '../src/utils/logger'; const codeExecutor = new CodeExecutor('myExecutor', 'redis://127.0.0.1:6379'); diff --git a/examples/worker.ts b/examples/worker.ts index 416927c..d8ba956 100644 --- a/examples/worker.ts +++ b/examples/worker.ts @@ -1,9 +1,9 @@ -import { Worker } from '../src/CodeExecutor'; +import { Worker } from '../src'; const worker = new Worker('myExecutor', 'redis://127.0.0.1:6379'); async function main() { - await worker.build(); + await worker.build(['Python', 'Bash']); worker.start(); } diff --git a/package.json b/package.json index c8dc768..9dc8665 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "code-executor", - "version": "0.1.9", + "version": "0.2.0", "description": "A CLI/library to execute code against test cases in various languages and obtain relevant results.", "main": "dist/src/CodeExecutor.js", "keywords": [ diff --git a/src/CodeExecutor.ts b/src/CodeExecutor.ts index c6badb2..44393de 100644 --- a/src/CodeExecutor.ts +++ b/src/CodeExecutor.ts @@ -1,7 +1,7 @@ import Bull from 'bull'; import { v4 as uuid } from 'uuid'; -import { CodeParams } from './models/models'; +import { CodeParams } from './models'; import logger from './utils/logger'; import { extension } from './utils/findExtension'; @@ -32,6 +32,4 @@ export default class CodeExecutor { } } -export { default as Worker } from './Worker'; - export { languages }; diff --git a/src/Runner.ts b/src/Runner.ts index 8ba42ac..7ad7c1f 100644 --- a/src/Runner.ts +++ b/src/Runner.ts @@ -9,7 +9,7 @@ import { TestCase, Result, Tests, -} from './models/models'; +} from './models'; import getOutput from './utils/getOutput'; import saveCode from './utils/saveCode'; diff --git a/src/Worker.ts b/src/Worker.ts index 1c06332..c855780 100644 --- a/src/Worker.ts +++ b/src/Worker.ts @@ -4,7 +4,7 @@ import Bull from 'bull'; import Runner from './Runner'; import Builder from './Builder'; -import { Code, Result, WorkerOptions } from './models/models'; +import { Code, Result, WorkerOptions } from './models'; import logger from './utils/logger'; export default class Worker { diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..7bcac45 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,3 @@ +export { default as CodeExecutor, languages } from './CodeExecutor'; + +export { default as Worker } from './Worker'; diff --git a/src/models/models.ts b/src/models/index.ts similarity index 100% rename from src/models/models.ts rename to src/models/index.ts diff --git a/src/utils/saveCode.ts b/src/utils/saveCode.ts index e13fa95..3fd5299 100644 --- a/src/utils/saveCode.ts +++ b/src/utils/saveCode.ts @@ -3,7 +3,7 @@ import writeToFile from './writeToFile'; import generateFolder from './generateFolder'; import findExtension from './findExtension'; import decodeBase64 from './decodeBase64'; -import { TestCase } from '../models/models'; +import { TestCase } from '../models'; export default async function saveCode( folderPath: string, From 8800cba796c660b081709a4ef66e5a5c7aeb3cec Mon Sep 17 00:00:00 2001 From: Rohan Mukherjee Date: Fri, 2 Oct 2020 04:16:16 +0530 Subject: [PATCH 11/11] feat: v0.2.1 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 9dc8665..6586c61 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "code-executor", - "version": "0.2.0", + "version": "0.2.1", "description": "A CLI/library to execute code against test cases in various languages and obtain relevant results.", - "main": "dist/src/CodeExecutor.js", + "main": "dist/src/index.js", "keywords": [ "code-executor", "executor",