├── backend ├── app │ ├── __init__.py │ ├── models │ │ └── test.py │ ├── services │ │ ├── flowchart.py │ │ ├── translate.py │ │ ├── hackerearth_compile.py │ │ ├── pylint.py │ │ └── pseudo_code.py │ ├── routes │ │ ├── convertPseudo.py │ │ ├── compile.py │ │ ├── translatePseudo.py │ │ ├── warnings.py │ │ ├── flowchart.py │ │ └── shareCode.py │ └── app.py ├── Procfile ├── main.py ├── .vscode │ └── settings.json ├── Pipfile ├── README.md ├── LICENSE ├── .gitignore └── Pipfile.lock ├── _config.yml ├── website ├── .env ├── public │ ├── favicon.ico │ ├── logo192.png │ ├── logo512.png │ ├── robots.txt │ ├── manifest.json │ └── index.html ├── README.md ├── craco.config.js ├── src │ ├── setupTests.js │ ├── reportWebVitals.js │ ├── components │ │ ├── Editor.js │ │ ├── Warnings.js │ │ ├── Navbar.js │ │ ├── Compile.js │ │ └── PseudoCode.js │ ├── index.js │ ├── App.js │ ├── index.css │ └── share.js ├── tailwind.config.js ├── .gitignore └── package.json ├── mockups ├── ss1.png ├── ss2.png ├── ss3.png ├── ss4.png ├── ss5.png ├── ss6.png └── codex_architecture.png └── Readme.md /backend/app/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/app/models/test.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-hacker -------------------------------------------------------------------------------- /website/.env: -------------------------------------------------------------------------------- 1 | SKIP_PREFLIGHT_CHECK=true -------------------------------------------------------------------------------- /backend/Procfile: -------------------------------------------------------------------------------- 1 | web: uvicorn app.app:app --host 0.0.0.0 --port=$PORT -------------------------------------------------------------------------------- /mockups/ss1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ankithans/codeX/HEAD/mockups/ss1.png -------------------------------------------------------------------------------- /mockups/ss2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ankithans/codeX/HEAD/mockups/ss2.png -------------------------------------------------------------------------------- /mockups/ss3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ankithans/codeX/HEAD/mockups/ss3.png -------------------------------------------------------------------------------- /mockups/ss4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ankithans/codeX/HEAD/mockups/ss4.png -------------------------------------------------------------------------------- /mockups/ss5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ankithans/codeX/HEAD/mockups/ss5.png -------------------------------------------------------------------------------- /mockups/ss6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ankithans/codeX/HEAD/mockups/ss6.png -------------------------------------------------------------------------------- /website/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ankithans/codeX/HEAD/website/public/favicon.ico -------------------------------------------------------------------------------- /website/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ankithans/codeX/HEAD/website/public/logo192.png -------------------------------------------------------------------------------- /website/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ankithans/codeX/HEAD/website/public/logo512.png -------------------------------------------------------------------------------- /website/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /mockups/codex_architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ankithans/codeX/HEAD/mockups/codex_architecture.png -------------------------------------------------------------------------------- /website/README.md: -------------------------------------------------------------------------------- 1 | # CodeX 2 | 3 | ### Link to deployed URL 4 | http://rackathon-project-codex.surge.sh/ 5 | 6 | -------------------------------------------------------------------------------- /backend/main.py: -------------------------------------------------------------------------------- 1 | import uvicorn 2 | 3 | if __name__ == "__main__": 4 | uvicorn.run("app.app:app", host="0.0.0.0", port=8000, reload=True) -------------------------------------------------------------------------------- /website/craco.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | style: { 3 | postcss: { 4 | plugins: [require("tailwindcss"), require("autoprefixer")], 5 | }, 6 | }, 7 | }; 8 | -------------------------------------------------------------------------------- /backend/app/services/flowchart.py: -------------------------------------------------------------------------------- 1 | from pyflowchart import Flowchart 2 | 3 | 4 | def generateFlowChartData(source): 5 | fc = Flowchart.from_code(source) 6 | return fc.flowchart() -------------------------------------------------------------------------------- /backend/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "python.pythonPath": "C:\\Users\\ankithans\\.virtualenvs\\codeX-backend-KRhgRdts\\Scripts\\python.exe", 3 | "python.formatting.provider": "black" 4 | } -------------------------------------------------------------------------------- /website/src/setupTests.js: -------------------------------------------------------------------------------- 1 | // jest-dom adds custom jest matchers for asserting on DOM nodes. 2 | // allows you to do things like: 3 | // expect(element).toHaveTextContent(/react/i) 4 | // learn more: https://github.com/testing-library/jest-dom 5 | import '@testing-library/jest-dom'; 6 | -------------------------------------------------------------------------------- /website/tailwind.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | purge: ["./src/**/*.{js,jsx,ts,tsx}", "./public/index.html"], 3 | darkMode: false, // or 'media' or 'class' 4 | theme: { 5 | extend: {}, 6 | }, 7 | variants: { 8 | extend: {}, 9 | }, 10 | plugins: [], 11 | }; 12 | -------------------------------------------------------------------------------- /backend/app/services/translate.py: -------------------------------------------------------------------------------- 1 | 2 | from translate import Translator 3 | 4 | 5 | def translateText(text_to_translate, target_language): 6 | text_to_translate = text_to_translate 7 | strTolang = target_language 8 | translator = Translator(to_lang=strTolang) 9 | translate = translator.translate(text_to_translate) 10 | return (str(translate)) -------------------------------------------------------------------------------- /website/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | -------------------------------------------------------------------------------- /backend/Pipfile: -------------------------------------------------------------------------------- 1 | [[source]] 2 | url = "https://pypi.org/simple" 3 | verify_ssl = true 4 | name = "pypi" 5 | 6 | [packages] 7 | uvicorn = "*" 8 | fastapi = "*" 9 | python-decouple = "*" 10 | requests = "*" 11 | python-multipart = "*" 12 | pylint = "*" 13 | google-trans-new = "*" 14 | databases = "*" 15 | sqlalchemy = "*" 16 | aiosqlite = "*" 17 | pyflowchart = "*" 18 | 19 | [dev-packages] 20 | 21 | [requires] 22 | python_version = "3.9" 23 | -------------------------------------------------------------------------------- /backend/app/routes/convertPseudo.py: -------------------------------------------------------------------------------- 1 | from fastapi import APIRouter, Body, Body 2 | from fastapi.encoders import jsonable_encoder 3 | 4 | from ..services.pseudo_code import convertCodeIntoPseudoCode 5 | 6 | router = APIRouter() 7 | 8 | 9 | @router.post("/", response_description="Convert Python Code into Pseudo Code") 10 | async def compile(source: str = Body(...), test: str = Body(...)): 11 | return convertCodeIntoPseudoCode(source) 12 | -------------------------------------------------------------------------------- /website/src/reportWebVitals.js: -------------------------------------------------------------------------------- 1 | const reportWebVitals = onPerfEntry => { 2 | if (onPerfEntry && onPerfEntry instanceof Function) { 3 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { 4 | getCLS(onPerfEntry); 5 | getFID(onPerfEntry); 6 | getFCP(onPerfEntry); 7 | getLCP(onPerfEntry); 8 | getTTFB(onPerfEntry); 9 | }); 10 | } 11 | }; 12 | 13 | export default reportWebVitals; 14 | -------------------------------------------------------------------------------- /backend/app/routes/compile.py: -------------------------------------------------------------------------------- 1 | from fastapi import APIRouter, Form, Body 2 | from fastapi.encoders import jsonable_encoder 3 | from decouple import config 4 | 5 | from ..services.hackerearth_compile import run_code 6 | 7 | router = APIRouter() 8 | 9 | @router.post("/", response_description="Compile python code with hackerearth api") 10 | async def compile(source: str = Body(...), input: str = Body(...)): 11 | return run_code(source, input) 12 | -------------------------------------------------------------------------------- /backend/app/routes/translatePseudo.py: -------------------------------------------------------------------------------- 1 | from fastapi import Body,APIRouter 2 | from google_trans_new import google_translator 3 | 4 | router = APIRouter() 5 | translator = google_translator() 6 | 7 | 8 | 9 | @router.post("/", response_description="Translate Pseudo Code into multiple languages") 10 | async def translate(text: str= Body(...),dest_lang:str=Body(...)): 11 | translation = translator.translate(text,dest_lang) 12 | return translation -------------------------------------------------------------------------------- /backend/app/routes/warnings.py: -------------------------------------------------------------------------------- 1 | from fastapi import APIRouter, Body 2 | from fastapi.encoders import jsonable_encoder 3 | 4 | from ..services.pylint import generate_warnings 5 | 6 | router = APIRouter() 7 | 8 | @router.post("/", response_description="Generate warnings and suggestions in the code") 9 | async def compile(source: str = Body(...), test: str = Body(...)): 10 | warns = generate_warnings(source) 11 | return jsonable_encoder(warns.splitlines()) -------------------------------------------------------------------------------- /backend/app/routes/flowchart.py: -------------------------------------------------------------------------------- 1 | from fastapi import APIRouter, Body 2 | from fastapi.encoders import jsonable_encoder 3 | from decouple import config 4 | 5 | from ..services.flowchart import generateFlowChartData 6 | 7 | router = APIRouter() 8 | 9 | @router.post("/", response_description="Generate flowchart from py code") 10 | async def flowchart(source: str = Body(...), test: str = Body(...)): 11 | flows = generateFlowChartData(source) 12 | return jsonable_encoder(flows) 13 | -------------------------------------------------------------------------------- /website/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /backend/README.md: -------------------------------------------------------------------------------- 1 | # codeX-backend 2 | 3 | ### Steps to run 4 | 5 | 1. Run `pipenv shell` in root dir 6 | 2. Do `pipenv install` in root dir 7 | 3. Run `python main.py` in root dir 8 | 9 | ### Tasks 10 | 11 | Design API's for the following: 12 | 13 | 1. ~~Convert Python code into pseudo code // input as file but we require i/p as text~~ 14 | 2. ~~Run code give output give time space // hackerearth api~~ 15 | 3. ~~Give code suggestions/warnings/errors using pylint // we can run pylint from terminal, how will we do it from code~~ 16 | 4. ~~Translate pseudo code in multiple languages // copy paste~~ 17 | 5. ~~Code sharing with link // after frontend~~ 18 | -------------------------------------------------------------------------------- /website/src/components/Editor.js: -------------------------------------------------------------------------------- 1 | import Editor from "@monaco-editor/react"; 2 | import React from "react"; 3 | 4 | export default function CodeEditor() { 5 | const options = { 6 | selectOnLineNumbers: true, 7 | fontSize: 15, 8 | formatOnType: true, 9 | tabSize: 4, 10 | }; 11 | 12 | const initialCode = "// Add Some Python Code"; 13 | return ( 14 |
15 | 23 |
24 | ); 25 | } 26 | -------------------------------------------------------------------------------- /backend/app/services/hackerearth_compile.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import json 3 | from decouple import config 4 | 5 | def run_code(source, input): 6 | RUN_URL = u'https://api.hackerearth.com/v3/code/run/' 7 | CLIENT_SECRET = config("CLIENT_SECRET") 8 | 9 | data = { 10 | 'client_secret': CLIENT_SECRET, 11 | 'async': 0, 12 | 'source': source, 13 | 'input': input, 14 | 'lang': "PYTHON", 15 | 'time_limit': 5, 16 | 'memory_limit': 262144, 17 | } 18 | 19 | r = requests.post(RUN_URL, data=data) 20 | json_formatted_str = json.dumps(r.json(), indent=4) 21 | 22 | # print(json_formatted_str) 23 | return r.json() 24 | -------------------------------------------------------------------------------- /backend/app/services/pylint.py: -------------------------------------------------------------------------------- 1 | # from pylint import lint 2 | from pylint import epylint as lint 3 | import tempfile 4 | import os 5 | import string 6 | import random 7 | 8 | def createFile(source): 9 | res = ''.join(random.choices(string.ascii_lowercase, k = 5)) + ".py" 10 | f = open(res , "a") 11 | f.write(source) 12 | 13 | ROOT_DIR = os.path.abspath(os.curdir) 14 | path = ROOT_DIR + '/' + f.name 15 | return path 16 | 17 | def deleteFile(name): 18 | os.remove(name) 19 | 20 | def generate_warnings(source): 21 | path = createFile(source) 22 | 23 | (pylint_stdout, pylint_stderr) = lint.py_run(path, return_std=True) 24 | 25 | # print(pylint_stdout.read()) 26 | deleteFile(path) 27 | return pylint_stdout.read() -------------------------------------------------------------------------------- /website/src/index.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ReactDOM from "react-dom"; 3 | import "./index.css"; 4 | import App from "./App"; 5 | import Share from "./share"; 6 | import reportWebVitals from "./reportWebVitals"; 7 | import { BrowserRouter, Route, Link, Switch } from "react-router-dom"; 8 | 9 | ReactDOM.render( 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | , 19 | document.getElementById("root") 20 | ); 21 | 22 | // If you want to start measuring performance in your app, pass a function 23 | // to log results (for example: reportWebVitals(console.log)) 24 | // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals 25 | reportWebVitals(); 26 | -------------------------------------------------------------------------------- /backend/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Ankit Hans 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /backend/app/app.py: -------------------------------------------------------------------------------- 1 | from fastapi import FastAPI 2 | from fastapi.middleware.cors import CORSMiddleware 3 | 4 | from .routes.compile import router as CodeCompileRouter 5 | from .routes.convertPseudo import router as ConvertCodeIntoPseudoRouter 6 | from .routes.warnings import router as WarningsRouter 7 | from .routes.translatePseudo import router as TranslateRouter 8 | from .routes.shareCode import router as ShareCodeRouter 9 | from .routes.flowchart import router as FlowchartRouter 10 | 11 | app = FastAPI() 12 | 13 | app.add_middleware( 14 | CORSMiddleware, 15 | allow_origins=["*"], 16 | allow_credentials=True, 17 | allow_methods=["*"], 18 | allow_headers=["*"], 19 | ) 20 | 21 | app.include_router(CodeCompileRouter, tags=["Code Compile"], prefix="/api/v1/compile") 22 | app.include_router(ConvertCodeIntoPseudoRouter, tags=["Convert Code into Pseudo Code"], prefix="/api/v1/convert") 23 | app.include_router(WarningsRouter, tags=["Generate Warnings from the code"], prefix="/api/v1/warnings") 24 | app.include_router(TranslateRouter, tags=["Translate Pseudo Code"], prefix="/api/v1/translate") 25 | app.include_router(ShareCodeRouter, tags=["Share Code"], prefix="/api/v1/share") 26 | app.include_router(FlowchartRouter, tags=["Create FlowChart"], prefix="/api/v1/flow") 27 | 28 | @app.get("/", tags=["Root"]) 29 | async def read_root(): 30 | return {"message": "Welcome to CodeX"} -------------------------------------------------------------------------------- /website/src/App.js: -------------------------------------------------------------------------------- 1 | import SplitterLayout from "react-splitter-layout"; 2 | import Compile from "./components/Compile"; 3 | import Editor from "@monaco-editor/react"; 4 | import Navbar from "./components/Navbar"; 5 | import PseudoCode from "./components/PseudoCode"; 6 | import Warnings from "./components/Warnings"; 7 | import { useState } from "react"; 8 | 9 | function App() { 10 | const options = { 11 | selectOnLineNumbers: true, 12 | fontSize: 15, 13 | formatOnType: true, 14 | tabSize: 4, 15 | }; 16 | 17 | const initialCode = "# Add Some Python Code"; 18 | 19 | const [code, setCode] = useState(initialCode); 20 | 21 | function handleEditorChange(value, event) { 22 | setCode(value); 23 | console.log("here is the current model value:", value); 24 | } 25 | 26 | return ( 27 |
28 | 29 | 30 |
31 | 32 | 33 | 34 |
35 | 36 |
37 | 46 | 47 | 48 |
49 |
50 |
51 | ); 52 | } 53 | 54 | export default App; 55 | -------------------------------------------------------------------------------- /backend/app/routes/shareCode.py: -------------------------------------------------------------------------------- 1 | from fastapi import APIRouter, Body 2 | from fastapi.encoders import jsonable_encoder 3 | from decouple import config 4 | import databases 5 | import sqlalchemy 6 | from pydantic import BaseModel 7 | 8 | router = APIRouter() 9 | 10 | 11 | 12 | DATABASE_URL="sqlite:///./test.db" 13 | database=databases.Database(DATABASE_URL) 14 | metadata=sqlalchemy.MetaData() 15 | 16 | codes=sqlalchemy.Table( 17 | "py_codes", 18 | metadata, 19 | sqlalchemy.Column("id",sqlalchemy.Integer,primary_key=True, autoincrement=True), 20 | sqlalchemy.Column("codes",sqlalchemy.String) 21 | 22 | ) 23 | 24 | engine = sqlalchemy.create_engine( 25 | DATABASE_URL, connect_args={"check_same_thread": False} 26 | ) 27 | metadata.create_all(engine) 28 | 29 | class CodeX(BaseModel): 30 | id:int 31 | codes:str 32 | 33 | @router.on_event("startup") 34 | async def startup(): 35 | await database.connect() 36 | 37 | @router.on_event("shutdown") 38 | async def shutdown(): 39 | await database.disconnect() 40 | 41 | 42 | @router.post("/", response_description="Share Code by saving in DB") 43 | async def create_code(code: CodeX): 44 | query = codes.insert().values(codes=code.codes) 45 | last_record_id = await database.execute(query) 46 | return {**code.dict(), "id": last_record_id} 47 | 48 | 49 | @router.get("/{code_id}", response_description="Get code by id") 50 | async def read_notes(code_id: int): 51 | query = codes.select().where(codes.c.id == code_id) 52 | return await database.fetch_one(query) -------------------------------------------------------------------------------- /website/src/index.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | :focus { 6 | outline: none; 7 | } 8 | 9 | .splitter-layout { 10 | position: absolute; 11 | display: flex; 12 | flex-direction: row; 13 | width: 100%; 14 | height: 91%; 15 | overflow: hidden; 16 | } 17 | 18 | .splitter-layout .layout-pane { 19 | position: relative; 20 | flex: 0 0 auto; 21 | overflow: auto; 22 | } 23 | 24 | .splitter-layout .layout-pane.layout-pane-primary { 25 | flex: 1 1 auto; 26 | } 27 | 28 | .splitter-layout > .layout-splitter { 29 | flex: 0 0 auto; 30 | width: 4px; 31 | height: 100%; 32 | cursor: col-resize; 33 | background-color: #ccc; 34 | } 35 | 36 | .splitter-layout .layout-splitter:hover { 37 | background-color: #bbb; 38 | } 39 | 40 | .splitter-layout.layout-changing { 41 | cursor: col-resize; 42 | } 43 | 44 | .splitter-layout.layout-changing > .layout-splitter { 45 | background-color: #aaa; 46 | } 47 | 48 | .splitter-layout.splitter-layout-vertical { 49 | flex-direction: column; 50 | } 51 | 52 | .splitter-layout.splitter-layout-vertical.layout-changing { 53 | cursor: row-resize; 54 | } 55 | 56 | .splitter-layout.splitter-layout-vertical > .layout-splitter { 57 | width: 100%; 58 | height: 4px; 59 | cursor: row-resize; 60 | } 61 | 62 | .splitter-layout.splitter-layout-vertical { 63 | flex-direction: column; 64 | } 65 | 66 | .splitter-layout.splitter-layout-vertical.layout-changing { 67 | cursor: row-resize; 68 | } 69 | 70 | .splitter-layout.splitter-layout-vertical > .layout-splitter { 71 | width: 100%; 72 | height: 4px; 73 | cursor: row-resize; 74 | } 75 | 76 | .ql-container { 77 | font-size: inherit !important 78 | } 79 | 80 | 81 | .ql-container { 82 | font-size: 20px; 83 | } 84 | -------------------------------------------------------------------------------- /website/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "codex_frontend", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@ckeditor/ckeditor5-build-classic": "^27.0.0", 7 | "@ckeditor/ckeditor5-react": "^3.0.2", 8 | "@craco/craco": "^6.1.1", 9 | "@monaco-editor/react": "^4.1.1", 10 | "@testing-library/jest-dom": "^5.11.4", 11 | "@testing-library/react": "^11.1.0", 12 | "@testing-library/user-event": "^12.1.10", 13 | "@tinymce/tinymce-react": "^3.12.2", 14 | "ace-builds": "^1.4.12", 15 | "axios": "^0.21.1", 16 | "bootstrap": "^4.6.0", 17 | "craco": "^0.0.3", 18 | "draft-js": "^0.11.7", 19 | "jodit-react": "^1.0.74", 20 | "react": "^17.0.2", 21 | "react-ace": "^9.4.0", 22 | "react-dom": "^17.0.2", 23 | "react-dropdown": "^1.9.2", 24 | "react-icons": "^4.2.0", 25 | "react-quill": "^1.3.5", 26 | "react-router-dom": "^5.2.0", 27 | "react-rte": "^0.16.3", 28 | "react-scripts": "4.0.3", 29 | "react-simple-flowchart": "^1.2.2", 30 | "react-splitter-layout": "^4.0.0", 31 | "react-summernote": "^2.0.2", 32 | "web-vitals": "^1.0.1" 33 | }, 34 | "scripts": { 35 | "start": "craco start", 36 | "build": "craco build", 37 | "test": "craco test", 38 | "eject": "react-scripts eject" 39 | }, 40 | "eslintConfig": { 41 | "extends": [ 42 | "react-app", 43 | "react-app/jest" 44 | ] 45 | }, 46 | "browserslist": { 47 | "production": [ 48 | ">0.2%", 49 | "not dead", 50 | "not op_mini all" 51 | ], 52 | "development": [ 53 | "last 1 chrome version", 54 | "last 1 firefox version", 55 | "last 1 safari version" 56 | ] 57 | }, 58 | "devDependencies": { 59 | "@tailwindcss/postcss7-compat": "^2.0.4", 60 | "autoprefixer": "^9", 61 | "postcss": "^7", 62 | "tailwindcss": "npm:@tailwindcss/postcss7-compat" 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /backend/app/services/pseudo_code.py: -------------------------------------------------------------------------------- 1 | import re 2 | 3 | 4 | def convertCodeIntoPseudoCode(source): 5 | work_file = None 6 | 7 | basic_conversion_rules = {"for": "FOR", "=": "TO", "if": "IF", "==": "EQUALS", "while": "WHILE", "until": "UNTIL", "import": "IMPORT", 8 | "class": "DEFINE CLASS", "def": "DEFINE FUNCTION", "else:": "ELSE:", "elif": "ELSEIF", "except:": "EXCEPT:", "try:": "TRY:", "pass": "PASS", "in": "IN"} 9 | prefix_conversion_rules = {"=": "SET ", "#F": "CALL "} 10 | advanced_conversion_rules = {"print": "OUTPUT", 11 | "return": "RETURN", "input": "INPUT"} 12 | 13 | 14 | def l2pseudo(to_pseudo): 15 | for line in to_pseudo: 16 | line_index = to_pseudo.index(line) 17 | line = str(line) 18 | line = re.split(r'(\s+)', line) 19 | for key, value in prefix_conversion_rules.items(): 20 | if key in line: 21 | if not str(line[0]) == '': 22 | line[0] = value + line[0] 23 | else: 24 | line[2] = value + line[2] 25 | for key, value in basic_conversion_rules.items(): 26 | for word in line: 27 | if key == str(word): 28 | line[line.index(word)] = value 29 | for key, value in advanced_conversion_rules.items(): 30 | for word in line: 31 | line[line.index(word)] = word.replace(key, value) 32 | for key, value in prefix_conversion_rules.items(): 33 | for word in line: 34 | if word == key: 35 | del line[line.index(word)] 36 | to_pseudo[line_index] = "".join(line) 37 | return(to_pseudo) 38 | 39 | 40 | def p2file(to_file): 41 | file = open(python_file + '_pseudo.txt', 'w') 42 | for line in to_file: 43 | print(line, file=file) 44 | 45 | 46 | work_file = l2pseudo(source.splitlines()) 47 | return work_file 48 | 49 | -------------------------------------------------------------------------------- /website/src/share.js: -------------------------------------------------------------------------------- 1 | import SplitterLayout from "react-splitter-layout"; 2 | import Compile from "./components/Compile"; 3 | import Editor from "@monaco-editor/react"; 4 | import Navbar from "./components/Navbar"; 5 | import PseudoCode from "./components/PseudoCode"; 6 | import Warnings from "./components/Warnings"; 7 | import { useState, useEffect } from "react"; 8 | import axios from "axios"; 9 | 10 | function Share({ match }) { 11 | const options = { 12 | selectOnLineNumbers: true, 13 | fontSize: 15, 14 | formatOnType: true, 15 | tabSize: 4, 16 | }; 17 | 18 | const initialCode = "# Add Some Python Code"; 19 | 20 | const [isLoading, setLoading] = useState(false); 21 | const [code, setCode] = useState(initialCode); 22 | 23 | function handleEditorChange(value, event) { 24 | setCode(value); 25 | console.log("here is the current model value:", value); 26 | } 27 | 28 | const gettCode = async (e) => {}; 29 | 30 | useEffect(async () => { 31 | // const { id } = URLSearchParams(); 32 | const id = match.params.id; 33 | console.log(id); 34 | try { 35 | console.log("chala..."); 36 | setLoading(true); 37 | const res = await axios.get( 38 | `https://pseudo-x.herokuapp.com/api/v1/share/${id}` 39 | ); 40 | setLoading(false); 41 | setCode(res.data.codes); 42 | console.log(res.data); 43 | } catch (err) { 44 | setLoading(false); 45 | console.log(err); 46 | } 47 | }, []); 48 | 49 | if (isLoading) return
loading...
; 50 | 51 | return ( 52 |
53 | 54 | 55 |
56 | 57 | 58 | 59 |
60 | 61 |
62 | 71 | 72 | 73 |
74 |
75 |
76 | ); 77 | } 78 | 79 | export default Share; 80 | -------------------------------------------------------------------------------- /website/src/components/Warnings.js: -------------------------------------------------------------------------------- 1 | import React, { useState } from "react"; 2 | import axios from "axios"; 3 | import { VscRunAll } from "react-icons/vsc"; 4 | 5 | export default function Warnings({ code }) { 6 | const [warnings, setWarnings] = useState("Click on Show Warnings Button"); 7 | const [isLoading, setLoading] = useState(false); 8 | 9 | const onSubmitCode = async (e) => { 10 | try { 11 | e.preventDefault(); 12 | setLoading(true); 13 | 14 | const res = await axios.post( 15 | "https://pseudo-x.herokuapp.com/api/v1/warnings/", 16 | { 17 | source: code, 18 | test: "", 19 | } 20 | ); 21 | 22 | setLoading(false); 23 | 24 | var war; 25 | 26 | for (var i = 0; i < res.data.length; i++) { 27 | war += res.data[i] + "\n"; 28 | } 29 | 30 | console.log(war); 31 | 32 | setWarnings(war); 33 | 34 | // console.log(res.data.run_status); 35 | } catch (err) { 36 | setLoading(false); 37 | console.log(err); 38 | } 39 | }; 40 | 41 | return ( 42 |
43 |
44 |
45 |
Code Suggestions
46 |
47 |
48 | 49 |
50 |
51 |
52 |
53 |
{warnings}
54 |
55 |
56 | 57 | {isLoading ? ( 58 |
loading...
59 | ) : ( 60 | // 65 | // Show Warnings 66 | // 67 |
68 | )} 69 |
70 | ); 71 | } 72 | -------------------------------------------------------------------------------- /website/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 34 | CodeX - understand your code 35 | 36 | 37 | 38 |
39 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /website/src/components/Navbar.js: -------------------------------------------------------------------------------- 1 | import { useState } from "react"; 2 | import { BsCodeSlash } from "react-icons/bs"; 3 | import axios from "axios"; 4 | 5 | export default function Navbar({ code }) { 6 | const [isLoading, setLoading] = useState(false); 7 | const [url, setUrl] = useState(""); 8 | 9 | const shareCode = async (e) => { 10 | try { 11 | e.preventDefault(); 12 | setLoading(true); 13 | 14 | const res = await axios.post( 15 | "https://pseudo-x.herokuapp.com/api/v1/share/", 16 | { 17 | codes: code, 18 | id: 0, 19 | } 20 | ); 21 | 22 | setLoading(false); 23 | setUrl("https://coderx.surge.sh/" + res.data.id); 24 | 25 | console.log(res.data); 26 | } catch (err) { 27 | setLoading(false); 28 | console.log(err); 29 | } 30 | }; 31 | 32 | return ( 33 | 71 | ); 72 | } 73 | -------------------------------------------------------------------------------- /backend/.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | test.db 10 | 11 | # Distribution / packaging 12 | .Python 13 | build/ 14 | develop-eggs/ 15 | dist/ 16 | downloads/ 17 | eggs/ 18 | .eggs/ 19 | lib/ 20 | lib64/ 21 | parts/ 22 | sdist/ 23 | var/ 24 | wheels/ 25 | pip-wheel-metadata/ 26 | share/python-wheels/ 27 | *.egg-info/ 28 | .installed.cfg 29 | *.egg 30 | MANIFEST 31 | 32 | # PyInstaller 33 | # Usually these files are written by a python script from a template 34 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 35 | *.manifest 36 | *.spec 37 | 38 | # Installer logs 39 | pip-log.txt 40 | pip-delete-this-directory.txt 41 | 42 | # Unit test / coverage reports 43 | htmlcov/ 44 | .tox/ 45 | .nox/ 46 | .coverage 47 | .coverage.* 48 | .cache 49 | nosetests.xml 50 | coverage.xml 51 | *.cover 52 | *.py,cover 53 | .hypothesis/ 54 | .pytest_cache/ 55 | 56 | # Translations 57 | *.mo 58 | *.pot 59 | 60 | # Django stuff: 61 | *.log 62 | local_settings.py 63 | db.sqlite3 64 | db.sqlite3-journal 65 | 66 | # Flask stuff: 67 | instance/ 68 | .webassets-cache 69 | 70 | # Scrapy stuff: 71 | .scrapy 72 | 73 | # Sphinx documentation 74 | docs/_build/ 75 | 76 | # PyBuilder 77 | target/ 78 | 79 | # Jupyter Notebook 80 | .ipynb_checkpoints 81 | 82 | # IPython 83 | profile_default/ 84 | ipython_config.py 85 | 86 | # pyenv 87 | .python-version 88 | 89 | # pipenv 90 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 91 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 92 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 93 | # install all needed dependencies. 94 | #Pipfile.lock 95 | 96 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 97 | __pypackages__/ 98 | 99 | # Celery stuff 100 | celerybeat-schedule 101 | celerybeat.pid 102 | 103 | # SageMath parsed files 104 | *.sage.py 105 | 106 | # Environments 107 | .env 108 | .venv 109 | env/ 110 | venv/ 111 | ENV/ 112 | env.bak/ 113 | venv.bak/ 114 | 115 | # Spyder project settings 116 | .spyderproject 117 | .spyproject 118 | 119 | # Rope project settings 120 | .ropeproject 121 | 122 | # mkdocs documentation 123 | /site 124 | 125 | # mypy 126 | .mypy_cache/ 127 | .dmypy.json 128 | dmypy.json 129 | 130 | # Pyre type checker 131 | .pyre/ 132 | -------------------------------------------------------------------------------- /Readme.md: -------------------------------------------------------------------------------- 1 | # CodeX 2 | 3 | Link to deployed URL - [CodeX](http://coderx.surge.sh) & [Backend API](https://pseudo-x.herokuapp.com/redoc) 4 | 5 | [CodeX](http://coderx.surge.sh) is a platform which converts code into easy to understand language. 6 | 7 | ![codeX architecture](mockups/codex_architecture.png) 8 | 9 | ## Achievements🏆 10 | Team Uhtred won the Runner's Up Prize at Rakathon 2021 organized by Rakuten India 11 | 12 | ## Project Description 13 | 14 | Sometimes we write some code or we copy the code from some resource but we can’t interpret the working/logic behind the code. While writing the code when we get stuck in some problem, we directly redirect to StackOverflow or GitHub but from there we don’t get in-depth knowledge about the code. 15 | 16 | To solve the particular problem we have to build a website to interpret the complex code easily. Through this website, we are targeting to deliver a comprehensive analysis of the code with the help of machine learning. With the help of machine learning, we are planning to add automatic generation of pseudocode based on the user's input. 17 | 18 | While writing code you will also get real-time recommendations to improve your code quality as per industry standards. 19 | 20 | We are also providing the translation of pseudocode in 118 global languages because people from non-English speaking countries find it difficult to understand the pseudocode in English, So we decided to extend our helping hand to them. 21 | 22 | The automatically generated pseudo code will act as a blueprint and will help our users to understand the code better. Apart from this, we have given flow chart generation which will help the user to comprehend the code better because visual things have a much greater impact on the human brain as compared to textual format. 23 | 24 | You can share your code by clicking just a button. It will give a unique URL to your code to share with your friends, colleagues, or teachers. 25 | 26 | Test and Compile feature is also available on this website so that users can cross-check his / her output based on the input. 27 | 28 | ## Mockups 29 | 30 | ![ss1](mockups/ss1.png) 31 | ![ss1](mockups/ss3.png) 32 | ![ss1](mockups/ss4.png) 33 | ![ss1](mockups/ss5.png) 34 | ![ss1](mockups/ss6.png) 35 | 36 | ## Presentation 37 | [PPT](https://docs.google.com/presentation/d/1R767ack-2fZx-W1FVFHRi0XrrJph0PCmLfz5FjJ0Zzk/edit?usp=sharing) 38 | 39 | ## Video 40 | [Video Presentation](https://vimeo.com/535169076) 41 | 42 | ## Instructions 43 | 44 | 1. Clone the repository into your local system 45 | 2. For running backend, `cd backend` and then run `pipenv shell`. 46 | 3. For installing the packages do `pipenv install`. Then run `python main.py` 47 | 4. For running the website `cd website` . 48 | 5. Installation of node modules to be done by `yarn` or `npm install` 49 | 6. Run the website by `yarn start` or `npm start` 50 | 51 | ## Tech Stack 52 | 53 | Python, ReactJS, TailwindCSS, Pylint, FastAPI, GoogleTranslator, Hackerearth API, FlowChartJS, Sqlite3. 54 | 55 | ## Contributors 56 | 57 | - [Aryamaan Pandey](https://github.com/Aryamaan23) 58 | - [Ankit Hans](https://github.com/ankithans) 59 | -------------------------------------------------------------------------------- /website/src/components/Compile.js: -------------------------------------------------------------------------------- 1 | import { useState } from "react"; 2 | import axios from "axios"; 3 | 4 | export default function Compile({ code }) { 5 | const [isLoading, setLoading] = useState(false); 6 | const [inp, setInput] = useState(""); 7 | const [output, setOutput] = useState(""); 8 | 9 | const onSubmitCode = async (e) => { 10 | try { 11 | e.preventDefault(); 12 | setLoading(true); 13 | 14 | const res = await axios.post( 15 | "https://pseudo-x.herokuapp.com/api/v1/compile/", 16 | { 17 | source: code, 18 | input: inp, 19 | } 20 | ); 21 | 22 | console.log(res.data); 23 | 24 | setLoading(false); 25 | console.log(res.data.run_status.status); 26 | if ( 27 | res.data.run_status.stderr !== undefined && 28 | res.data.run_status.stderr === "" && 29 | res.data.compile_status === "OK" 30 | ) 31 | setOutput(res.data.run_status.output); 32 | else if (res.data.compile_status !== "OK") 33 | setOutput(res.data.compile_status); 34 | else setOutput(res.data.run_status.stderr); 35 | // console.log(res.data.run_status.stderr); 36 | 37 | // console.log(res.data.run_status); 38 | } catch (err) { 39 | setLoading(false); 40 | console.log(err); 41 | } 42 | }; 43 | 44 | return ( 45 |
46 |
47 |
48 |
49 |
50 |
51 |

52 | Enter Custom Input 53 |

54 |
55 | 61 |
62 |
63 | 64 |
65 |
66 |
67 |

68 | Output 69 |

70 |
71 | 78 |
79 |
80 |
81 |
82 | 83 |
84 | {isLoading ? ( 85 |
loading...
86 | ) : ( 87 | 94 | )} 95 |
96 |
97 | ); 98 | } 99 | -------------------------------------------------------------------------------- /website/src/components/PseudoCode.js: -------------------------------------------------------------------------------- 1 | import { VscRunAll } from "react-icons/vsc"; 2 | import React, { useState } from "react"; 3 | import axios from "axios"; 4 | import Flowchart from "react-simple-flowchart"; 5 | 6 | export default function CodeEditor({ code }) { 7 | const [pseudo, setPseudo] = useState("Click on Show Pseudocode Button"); 8 | const [isLoading, setLoading] = useState(false); 9 | 10 | const [flow, setFlow] = useState(""); 11 | 12 | const [lang, setLang] = useState(""); 13 | 14 | const generateFlow = async (e) => { 15 | try { 16 | e.preventDefault(); 17 | setLoading(true); 18 | 19 | const res = await axios.post( 20 | "https://pseudo-x.herokuapp.com/api/v1/flow/", 21 | { 22 | source: code, 23 | test: "", 24 | } 25 | ); 26 | 27 | setLoading(false); 28 | setFlow(res.data); 29 | 30 | console.log(res.data); 31 | } catch (err) { 32 | setLoading(false); 33 | console.log(err); 34 | } 35 | }; 36 | 37 | const translate = async (e) => { 38 | try { 39 | e.preventDefault(); 40 | setLoading(true); 41 | 42 | const res = await axios.post( 43 | "https://pseudo-x.herokuapp.com/api/v1/translate/", 44 | { 45 | text: pseudo, 46 | dest_lang: lang, 47 | } 48 | ); 49 | 50 | setLoading(false); 51 | setPseudo(res.data); 52 | 53 | console.log(res.data); 54 | } catch (err) { 55 | setLoading(false); 56 | console.log(err); 57 | } 58 | }; 59 | 60 | const codee = flow; 61 | 62 | const opt = { 63 | x: 0, 64 | y: 0, 65 | "line-width": 3, 66 | "line-length": 50, 67 | "text-margin": 10, 68 | "font-size": 11, 69 | "font-color": "black", 70 | "line-color": "black", 71 | "element-color": "black", 72 | fill: "white", 73 | "yes-text": "yes", 74 | "no-text": "no", 75 | "arrow-end": "block", 76 | scale: 1, 77 | symbols: { 78 | start: { 79 | "font-color": "red", 80 | "element-color": "green", 81 | "font-weight": "bold", 82 | }, 83 | end: { 84 | "font-color": "red", 85 | "element-color": "green", 86 | "font-weight": "bold", 87 | }, 88 | }, 89 | flowstate: { 90 | department1: { fill: "pink" }, 91 | department2: { fill: "yellow" }, 92 | external: { fill: "green" }, 93 | }, 94 | }; 95 | 96 | const onSubmitCode = async (e) => { 97 | try { 98 | e.preventDefault(); 99 | setLoading(true); 100 | 101 | const res = await axios.post( 102 | "https://pseudo-x.herokuapp.com/api/v1/convert/", 103 | { 104 | source: code, 105 | test: "", 106 | } 107 | ); 108 | 109 | var ps; 110 | 111 | for (var i = 0; i < res.data.length; i++) { 112 | ps += res.data[i] + "\n"; 113 | } 114 | 115 | setLoading(false); 116 | ps = ps.substr(9); 117 | setPseudo(ps); 118 | 119 | console.log(res.data); 120 | } catch (err) { 121 | setLoading(false); 122 | console.log(err); 123 | } 124 | }; 125 | 126 | const options = { 127 | selectOnLineNumbers: true, 128 | fontSize: 15, 129 | formatOnType: true, 130 | tabSize: 4, 131 | }; 132 | 133 | return ( 134 |
135 |
136 |
137 |
Generate Flowchart
138 |
139 |
140 | 141 |
142 |
143 |
144 |
145 | {flow == "" ? ( 146 |
Click on Generate Flowchart Button
147 | ) : ( 148 | {}} 153 | /> 154 | )} 155 |
156 |
157 | {/* */} 164 | 165 |
166 |
167 |
Generate PseudoCode
168 | 169 |
170 | 175 | 180 | 181 | 299 |
300 | 301 |
302 |
303 | submit 304 |
305 |
306 | 307 |
308 |
309 | 310 |
311 |
312 | 313 |
314 |
315 |
316 | 317 |
318 |
{pseudo}
319 |
320 |
321 | {isLoading ? ( 322 |
loading...
323 | ) : ( 324 | // 331 |
332 | )} 333 |
334 | ); 335 | } 336 | -------------------------------------------------------------------------------- /backend/Pipfile.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_meta": { 3 | "hash": { 4 | "sha256": "fecc25faaa92020521a45f816d0e0fdd3e79477071cff8e616f54c2525a1598d" 5 | }, 6 | "pipfile-spec": 6, 7 | "requires": { 8 | "python_version": "3.9" 9 | }, 10 | "sources": [ 11 | { 12 | "name": "pypi", 13 | "url": "https://pypi.org/simple", 14 | "verify_ssl": true 15 | } 16 | ] 17 | }, 18 | "default": { 19 | "aiosqlite": { 20 | "hashes": [ 21 | "sha256:6c49dc6d3405929b1d08eeccc72306d3677503cc5e5e43771efc1e00232e8231", 22 | "sha256:f0e6acc24bc4864149267ac82fb46dfb3be4455f99fe21df82609cc6e6baee51" 23 | ], 24 | "index": "pypi", 25 | "version": "==0.17.0" 26 | }, 27 | "astroid": { 28 | "hashes": [ 29 | "sha256:6b0ed1af831570e500e2437625979eaa3b36011f66ddfc4ce930128610258ca9", 30 | "sha256:cd80bf957c49765dce6d92c43163ff9d2abc43132ce64d4b1b47717c6d2522df" 31 | ], 32 | "markers": "python_version >= '3.6'", 33 | "version": "==2.5.2" 34 | }, 35 | "astunparse": { 36 | "hashes": [ 37 | "sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872", 38 | "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8" 39 | ], 40 | "version": "==1.6.3" 41 | }, 42 | "certifi": { 43 | "hashes": [ 44 | "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c", 45 | "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830" 46 | ], 47 | "version": "==2020.12.5" 48 | }, 49 | "chardet": { 50 | "hashes": [ 51 | "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa", 52 | "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5" 53 | ], 54 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", 55 | "version": "==4.0.0" 56 | }, 57 | "click": { 58 | "hashes": [ 59 | "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a", 60 | "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc" 61 | ], 62 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", 63 | "version": "==7.1.2" 64 | }, 65 | "colorama": { 66 | "hashes": [ 67 | "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b", 68 | "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2" 69 | ], 70 | "markers": "sys_platform == 'win32'", 71 | "version": "==0.4.4" 72 | }, 73 | "databases": { 74 | "hashes": [ 75 | "sha256:1521db7f6d3c581ff81b3552e130b27a13aefea2a57295e65738081831137afc", 76 | "sha256:f82b02c28fdddf7ffe7ee1945f5abef44d687ba97b9a1c81492c7f035d4c90e6" 77 | ], 78 | "index": "pypi", 79 | "version": "==0.4.3" 80 | }, 81 | "fastapi": { 82 | "hashes": [ 83 | "sha256:63c4592f5ef3edf30afa9a44fa7c6b7ccb20e0d3f68cd9eba07b44d552058dcb", 84 | "sha256:98d8ea9591d8512fdadf255d2a8fa56515cdd8624dca4af369da73727409508e" 85 | ], 86 | "index": "pypi", 87 | "version": "==0.63.0" 88 | }, 89 | "google-trans-new": { 90 | "hashes": [ 91 | "sha256:796c20c73ad5f473f126f3b8cbdcaf3fa96e7eabef18e73aac9e4ccc68bb72ed", 92 | "sha256:9f6643420334cc1b94ebd84e03774736e76c0564208efb1bc9c5019b9820e19b" 93 | ], 94 | "index": "pypi", 95 | "version": "==1.1.9" 96 | }, 97 | "h11": { 98 | "hashes": [ 99 | "sha256:36a3cb8c0a032f56e2da7084577878a035d3b61d104230d4bd49c0c6b555a9c6", 100 | "sha256:47222cb6067e4a307d535814917cd98fd0a57b6788ce715755fa2b6c28b56042" 101 | ], 102 | "markers": "python_version >= '3.6'", 103 | "version": "==0.12.0" 104 | }, 105 | "idna": { 106 | "hashes": [ 107 | "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6", 108 | "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0" 109 | ], 110 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 111 | "version": "==2.10" 112 | }, 113 | "isort": { 114 | "hashes": [ 115 | "sha256:0a943902919f65c5684ac4e0154b1ad4fac6dcaa5d9f3426b732f1c8b5419be6", 116 | "sha256:2bb1680aad211e3c9944dbce1d4ba09a989f04e238296c87fe2139faa26d655d" 117 | ], 118 | "markers": "python_version >= '3.6' and python_version < '4.0'", 119 | "version": "==5.8.0" 120 | }, 121 | "lazy-object-proxy": { 122 | "hashes": [ 123 | "sha256:17e0967ba374fc24141738c69736da90e94419338fd4c7c7bef01ee26b339653", 124 | "sha256:1fee665d2638491f4d6e55bd483e15ef21f6c8c2095f235fef72601021e64f61", 125 | "sha256:22ddd618cefe54305df49e4c069fa65715be4ad0e78e8d252a33debf00f6ede2", 126 | "sha256:24a5045889cc2729033b3e604d496c2b6f588c754f7a62027ad4437a7ecc4837", 127 | "sha256:410283732af311b51b837894fa2f24f2c0039aa7f220135192b38fcc42bd43d3", 128 | "sha256:4732c765372bd78a2d6b2150a6e99d00a78ec963375f236979c0626b97ed8e43", 129 | "sha256:489000d368377571c6f982fba6497f2aa13c6d1facc40660963da62f5c379726", 130 | "sha256:4f60460e9f1eb632584c9685bccea152f4ac2130e299784dbaf9fae9f49891b3", 131 | "sha256:5743a5ab42ae40caa8421b320ebf3a998f89c85cdc8376d6b2e00bd12bd1b587", 132 | "sha256:85fb7608121fd5621cc4377a8961d0b32ccf84a7285b4f1d21988b2eae2868e8", 133 | "sha256:9698110e36e2df951c7c36b6729e96429c9c32b3331989ef19976592c5f3c77a", 134 | "sha256:9d397bf41caad3f489e10774667310d73cb9c4258e9aed94b9ec734b34b495fd", 135 | "sha256:b579f8acbf2bdd9ea200b1d5dea36abd93cabf56cf626ab9c744a432e15c815f", 136 | "sha256:b865b01a2e7f96db0c5d12cfea590f98d8c5ba64ad222300d93ce6ff9138bcad", 137 | "sha256:bf34e368e8dd976423396555078def5cfc3039ebc6fc06d1ae2c5a65eebbcde4", 138 | "sha256:c6938967f8528b3668622a9ed3b31d145fab161a32f5891ea7b84f6b790be05b", 139 | "sha256:d1c2676e3d840852a2de7c7d5d76407c772927addff8d742b9808fe0afccebdf", 140 | "sha256:d7124f52f3bd259f510651450e18e0fd081ed82f3c08541dffc7b94b883aa981", 141 | "sha256:d900d949b707778696fdf01036f58c9876a0d8bfe116e8d220cfd4b15f14e741", 142 | "sha256:ebfd274dcd5133e0afae738e6d9da4323c3eb021b3e13052d8cbd0e457b1256e", 143 | "sha256:ed361bb83436f117f9917d282a456f9e5009ea12fd6de8742d1a4752c3017e93", 144 | "sha256:f5144c75445ae3ca2057faac03fda5a902eff196702b0a24daf1d6ce0650514b" 145 | ], 146 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", 147 | "version": "==1.6.0" 148 | }, 149 | "mccabe": { 150 | "hashes": [ 151 | "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", 152 | "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f" 153 | ], 154 | "version": "==0.6.1" 155 | }, 156 | "pydantic": { 157 | "hashes": [ 158 | "sha256:0c40162796fc8d0aa744875b60e4dc36834db9f2a25dbf9ba9664b1915a23850", 159 | "sha256:20d42f1be7c7acc352b3d09b0cf505a9fab9deb93125061b376fbe1f06a5459f", 160 | "sha256:2287ebff0018eec3cc69b1d09d4b7cebf277726fa1bd96b45806283c1d808683", 161 | "sha256:258576f2d997ee4573469633592e8b99aa13bda182fcc28e875f866016c8e07e", 162 | "sha256:26cf3cb2e68ec6c0cfcb6293e69fb3450c5fd1ace87f46b64f678b0d29eac4c3", 163 | "sha256:2f2736d9a996b976cfdfe52455ad27462308c9d3d0ae21a2aa8b4cd1a78f47b9", 164 | "sha256:3114d74329873af0a0e8004627f5389f3bb27f956b965ddd3e355fe984a1789c", 165 | "sha256:3bbd023c981cbe26e6e21c8d2ce78485f85c2e77f7bab5ec15b7d2a1f491918f", 166 | "sha256:3bcb9d7e1f9849a6bdbd027aabb3a06414abd6068cb3b21c49427956cce5038a", 167 | "sha256:4bbc47cf7925c86a345d03b07086696ed916c7663cb76aa409edaa54546e53e2", 168 | "sha256:6388ef4ef1435364c8cc9a8192238aed030595e873d8462447ccef2e17387125", 169 | "sha256:830ef1a148012b640186bf4d9789a206c56071ff38f2460a32ae67ca21880eb8", 170 | "sha256:8fbb677e4e89c8ab3d450df7b1d9caed23f254072e8597c33279460eeae59b99", 171 | "sha256:c17a0b35c854049e67c68b48d55e026c84f35593c66d69b278b8b49e2484346f", 172 | "sha256:dd4888b300769ecec194ca8f2699415f5f7760365ddbe243d4fd6581485fa5f0", 173 | "sha256:dde4ca368e82791de97c2ec019681ffb437728090c0ff0c3852708cf923e0c7d", 174 | "sha256:e3f8790c47ac42549dc8b045a67b0ca371c7f66e73040d0197ce6172b385e520", 175 | "sha256:e8bc082afef97c5fd3903d05c6f7bb3a6af9fc18631b4cc9fedeb4720efb0c58", 176 | "sha256:eb8ccf12295113ce0de38f80b25f736d62f0a8d87c6b88aca645f168f9c78771", 177 | "sha256:fb77f7a7e111db1832ae3f8f44203691e15b1fa7e5a1cb9691d4e2659aee41c4", 178 | "sha256:fbfb608febde1afd4743c6822c19060a8dbdd3eb30f98e36061ba4973308059e", 179 | "sha256:fff29fe54ec419338c522b908154a2efabeee4f483e48990f87e189661f31ce3" 180 | ], 181 | "markers": "python_full_version >= '3.6.1'", 182 | "version": "==1.8.1" 183 | }, 184 | "pyflowchart": { 185 | "hashes": [ 186 | "sha256:9bd5a2ae5fd8bbf670231c4f1ff40412aa622cf84691f43d72720fba975b764e", 187 | "sha256:ad22173bfe9d98d3c5b5c83e036649ac99a9a102b206511d1753ce5cf051aae1" 188 | ], 189 | "index": "pypi", 190 | "version": "==0.1.3" 191 | }, 192 | "pylint": { 193 | "hashes": [ 194 | "sha256:209d712ec870a0182df034ae19f347e725c1e615b2269519ab58a35b3fcbbe7a", 195 | "sha256:bd38914c7731cdc518634a8d3c5585951302b6e2b6de60fbb3f7a0220e21eeee" 196 | ], 197 | "index": "pypi", 198 | "version": "==2.7.4" 199 | }, 200 | "python-decouple": { 201 | "hashes": [ 202 | "sha256:2e5adb0263a4f963b58d7407c4760a2465d464ee212d733e2a2c179e54c08d8f", 203 | "sha256:a8268466e6389a639a20deab9d880faee186eb1eb6a05e54375bdf158d691981" 204 | ], 205 | "index": "pypi", 206 | "version": "==3.4" 207 | }, 208 | "python-multipart": { 209 | "hashes": [ 210 | "sha256:f7bb5f611fc600d15fa47b3974c8aa16e93724513b49b5f95c81e6624c83fa43" 211 | ], 212 | "index": "pypi", 213 | "version": "==0.0.5" 214 | }, 215 | "requests": { 216 | "hashes": [ 217 | "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804", 218 | "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e" 219 | ], 220 | "index": "pypi", 221 | "version": "==2.25.1" 222 | }, 223 | "six": { 224 | "hashes": [ 225 | "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259", 226 | "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced" 227 | ], 228 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 229 | "version": "==1.15.0" 230 | }, 231 | "sqlalchemy": { 232 | "hashes": [ 233 | "sha256:014ea143572fee1c18322b7908140ad23b3994036ef4c0d630110faf942652f8", 234 | "sha256:0172423a27fbcae3751ef016663b72e1a516777de324a76e30efa170dbd3dd2d", 235 | "sha256:01aa5f803db724447c1d423ed583e42bf5264c597fd55e4add4301f163b0be48", 236 | "sha256:0352db1befcbed2f9282e72843f1963860bf0e0472a4fa5cf8ee084318e0e6ab", 237 | "sha256:09083c2487ca3c0865dc588e07aeaa25416da3d95f7482c07e92f47e080aa17b", 238 | "sha256:0d5d862b1cfbec5028ce1ecac06a3b42bc7703eb80e4b53fceb2738724311443", 239 | "sha256:14f0eb5db872c231b20c18b1e5806352723a3a89fb4254af3b3e14f22eaaec75", 240 | "sha256:1e2f89d2e5e3c7a88e25a3b0e43626dba8db2aa700253023b82e630d12b37109", 241 | "sha256:26155ea7a243cbf23287f390dba13d7927ffa1586d3208e0e8d615d0c506f996", 242 | "sha256:2ed6343b625b16bcb63c5b10523fd15ed8934e1ed0f772c534985e9f5e73d894", 243 | "sha256:34fcec18f6e4b24b4a5f6185205a04f1eab1e56f8f1d028a2a03694ebcc2ddd4", 244 | "sha256:4d0e3515ef98aa4f0dc289ff2eebb0ece6260bbf37c2ea2022aad63797eacf60", 245 | "sha256:5de2464c254380d8a6c20a2746614d5a436260be1507491442cf1088e59430d2", 246 | "sha256:6607ae6cd3a07f8a4c3198ffbf256c261661965742e2b5265a77cd5c679c9bba", 247 | "sha256:8110e6c414d3efc574543109ee618fe2c1f96fa31833a1ff36cc34e968c4f233", 248 | "sha256:816de75418ea0953b5eb7b8a74933ee5a46719491cd2b16f718afc4b291a9658", 249 | "sha256:861e459b0e97673af6cc5e7f597035c2e3acdfb2608132665406cded25ba64c7", 250 | "sha256:87a2725ad7d41cd7376373c15fd8bf674e9c33ca56d0b8036add2d634dba372e", 251 | "sha256:a006d05d9aa052657ee3e4dc92544faae5fcbaafc6128217310945610d862d39", 252 | "sha256:bce28277f308db43a6b4965734366f533b3ff009571ec7ffa583cb77539b84d6", 253 | "sha256:c10ff6112d119f82b1618b6dc28126798481b9355d8748b64b9b55051eb4f01b", 254 | "sha256:d375d8ccd3cebae8d90270f7aa8532fe05908f79e78ae489068f3b4eee5994e8", 255 | "sha256:d37843fb8df90376e9e91336724d78a32b988d3d20ab6656da4eb8ee3a45b63c", 256 | "sha256:e47e257ba5934550d7235665eee6c911dc7178419b614ba9e1fbb1ce6325b14f", 257 | "sha256:e98d09f487267f1e8d1179bf3b9d7709b30a916491997137dd24d6ae44d18d79", 258 | "sha256:ebbb777cbf9312359b897bf81ba00dae0f5cb69fba2a18265dcc18a6f5ef7519", 259 | "sha256:ee5f5188edb20a29c1cc4a039b074fdc5575337c9a68f3063449ab47757bb064", 260 | "sha256:f03bd97650d2e42710fbe4cf8a59fae657f191df851fc9fc683ecef10746a375", 261 | "sha256:f1149d6e5c49d069163e58a3196865e4321bad1803d7886e07d8710de392c548", 262 | "sha256:f3c5c52f7cb8b84bfaaf22d82cb9e6e9a8297f7c2ed14d806a0f5e4d22e83fb7", 263 | "sha256:f597a243b8550a3a0b15122b14e49d8a7e622ba1c9d29776af741f1845478d79", 264 | "sha256:fc1f2a5a5963e2e73bac4926bdaf7790c4d7d77e8fc0590817880e22dd9d0b8b", 265 | "sha256:fc4cddb0b474b12ed7bdce6be1b9edc65352e8ce66bc10ff8cbbfb3d4047dbf4", 266 | "sha256:fcb251305fa24a490b6a9ee2180e5f8252915fb778d3dafc70f9cc3f863827b9" 267 | ], 268 | "index": "pypi", 269 | "version": "==1.3.24" 270 | }, 271 | "starlette": { 272 | "hashes": [ 273 | "sha256:bd2ffe5e37fb75d014728511f8e68ebf2c80b0fa3d04ca1479f4dc752ae31ac9", 274 | "sha256:ebe8ee08d9be96a3c9f31b2cb2a24dbdf845247b745664bd8a3f9bd0c977fdbc" 275 | ], 276 | "markers": "python_version >= '3.6'", 277 | "version": "==0.13.6" 278 | }, 279 | "toml": { 280 | "hashes": [ 281 | "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", 282 | "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" 283 | ], 284 | "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", 285 | "version": "==0.10.2" 286 | }, 287 | "typing-extensions": { 288 | "hashes": [ 289 | "sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918", 290 | "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c", 291 | "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f" 292 | ], 293 | "version": "==3.7.4.3" 294 | }, 295 | "urllib3": { 296 | "hashes": [ 297 | "sha256:2f4da4594db7e1e110a944bb1b551fdf4e6c136ad42e4234131391e21eb5b0df", 298 | "sha256:e7b021f7241115872f92f43c6508082facffbd1c048e3c6e2bb9c2a157e28937" 299 | ], 300 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4.0'", 301 | "version": "==1.26.4" 302 | }, 303 | "uvicorn": { 304 | "hashes": [ 305 | "sha256:3292251b3c7978e8e4a7868f4baf7f7f7bb7e40c759ecc125c37e99cdea34202", 306 | "sha256:7587f7b08bd1efd2b9bad809a3d333e972f1d11af8a5e52a9371ee3a5de71524" 307 | ], 308 | "index": "pypi", 309 | "version": "==0.13.4" 310 | }, 311 | "wheel": { 312 | "hashes": [ 313 | "sha256:78b5b185f0e5763c26ca1e324373aadd49182ca90e825f7853f4b2509215dc0e", 314 | "sha256:e11eefd162658ea59a60a0f6c7d493a7190ea4b9a85e335b33489d9f17e0245e" 315 | ], 316 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", 317 | "version": "==0.36.2" 318 | }, 319 | "wrapt": { 320 | "hashes": [ 321 | "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7" 322 | ], 323 | "version": "==1.12.1" 324 | } 325 | }, 326 | "develop": {} 327 | } 328 | --------------------------------------------------------------------------------