├── 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 |
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 |
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 |
51 |
52 |
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 | 
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 | 
31 | 
32 | 
33 | 
34 | 
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 |
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 |
181 |
299 |
300 |
301 |
302 |
303 | submit
304 |
305 |
306 |
307 |
308 |
309 |
310 |
315 |
316 |
317 |
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 |
--------------------------------------------------------------------------------