Giter VIP home page Giter VIP logo

pythonbuddy's Introduction

PythonBuddy 🖊️ 🐍


Online Python 3 Programming with Live Pylint Syntax Checking!

Usage

  1. Fetch from repo:
git clone https://github.com/ethanchewy/PythonBuddy.git
  1. Change to PythonBuddy directory
cd PythonBuddy
  1. Create virtualenv based on your own system:
python3 -m venv venv
  1. Activate virtual environment:
source venv/bin/activate
  1. Enusre that your virtualenv uses Python 3.7.6 via this command:
python --version

If you don't use Python Python 3.7.6, some Python libraries that PythonBuddy relies on may not work. Please refer to this documentation for figuring out how to create a specific version of Python via virtualenv via this StackOverflow post.

  1. Pipe requirements to venv folder:
pip install -r requirements.txt
  1. Change to the PythonBuddy application folder. You should now be in PythonBuddy/PythonBuddy/.
cd PythonBuddy
  1. Set FLASK_APP variable:
export FLASK_APP=app.py
  1. Run flask app:
flask run

Open your browser to localhost:5000 . Voila! 🎉

Current Features:


  • Live Syntax Checking
    • Uses Pylint as checker (only prints out errors and warnings)
    • Syntax Highlighting

  • Python Execution
    • Python Complilation
    • Basic Sandboxing

  • Live Error Table with Additional Help Suggestions

  • Secure (Sandboxed) Version using Docker

    Please check out PythonBuddySandboxed for a fully working web implementation which uses a dockerized version of PythonBuddy called PythonBuddySandbox.

    This builds off of christophetd's docker-python-sandbox and just modifies it so that it runs pylint in the background and processes the pylint messages on the client side.

    To see how he implements it on the web side, please check out https://github.com/christophetd/code-execution-api-demo

    This is still in alpha stage so there might be some bugs. If you want to implement this please check the 4 links above since documentation is a WIP.

    Customization Options

    1. Edit app.py to change any pylint options (like showing/hiding hints warnings)
    2. Security
    3. To create a much more secure Python Environment, consider using my Docker + Node.js implementation: https://github.com/ethanchewy/PythonBuddy#secure-sandboxed-version-using-docker
    4. For versions that used Python 2 or to see older versions, check: https://github.com/ethanchewy/PythonBuddy/releases

    Unit Tests

    To run tests, run this at the root directory:

    pytest
    

    For coverage run the following command in the root directory:

    pytest --cov-report html --cov=PythonBuddy tests/
    

    Future Goals:

    • Make easily embeddable for MOOCs like edX and other education platform
    • Create an analytics system that models the student's python learning and tells them where they need improvement (many programming students learn by copying and pasting and don't actually understand the nuances of the Python language).
    • Stricter Python Sandboxing via Pypy's sandboxing solution
    • Lower CPU usage
    • Allow users to generate a link to a unique code snippet similar to JSBin
    • Unit tests for client side JS

    FAQ:

    Why did you make this?
    In 2014, I was a Community TA at MIT edX 6.00.1x course where I helped teach over 1000 students. The year after I started researching under Prof. Eni Mustafaraj. She had a data set from that course and we saw a high attrition rate of students within the first 2 weeks. After digging through the curriculum and data, I realized that the students left because of difficulties setting up their Python environment and complex error messages that they couldn't solve when running their code (ex: some students had path issues).

    So, I created PythonBuddy to address this issue so that students wouldn't have to go through the frustrations of setting up a Python environment and running into seemingly "random" bugs. PythonBuddy allows users to jump right into Python programming with the support of live syntax checking & highlighting. Also, professors and teachers could easily set up a server and allow students to quickly test out their code with PythonBuddy online.

    Has anyone created anything like this before?
    There has never been a live syntax checker for python online. Similar projects that are not "live" are http://pep8online.com/ and http://antares.sip.ucm.es/cesar/pylint/

    How can I contribute?
    You can 🌟 star my repo, fork my repo, submit a pull request, and/or open issues!

    Where's the code for embedding it in MOOCs?
    I'm currently working on this over here (for edx specifically): https://github.com/ethanchewy/pybuddy2.0 . If you want to embed this project directly to your site, you would use an iframe:

    <iframe src="https://pythonbuddy.com"></iframe>
    

    I want the code to actually compile and run in a certain way?
    To run PythonBuddy securely, you can check out my implementation of PythonBuddy with Docker and Node.js: https://github.com/ethanchewy/PythonBuddy#secure-sandboxed-version-using-docker. Basically, it dockerizes each user session (similar to creating a virtual machine for each user) and destroys it if it uses too much memory or runs malicious code.
    If you want to actually execute the python in a restricted fashion at my Restricted Python branch: https://github.com/ethanchewy/PythonBuddy/tree/restrictedpython.

    How do I run my own server? Regular: https://github.com/ethanchewy/OnlinePythonLinterSyntaxChecker/wiki
    Sandboxed: https://github.com/ethanchewy/PythonBuddy/wiki/Running-Sandboxed-PythonBuddy

    Press:

    Featured on FlaskCon 2020, Python Weekly, CSS Author, and the Talk Python Podcast

    Credits:

    This was made by Ethan Chiu as a research project under the guidance of Wellesley College professor Eni Mustafaraj.

    Other:

    As of October 2020, PythonBuddy.com will no longer be a demo server for this open-source project due to the increasing costs of hosting it for 80,000+ people monthly. Instead, this URL will redirect back to this GitHub repo.

    pythonbuddy's People

    Contributors

    anaida07 avatar chaps avatar dependabot[bot] avatar derekwilling avatar dgmouris avatar ethanchewy avatar timgates42 avatar

    Stargazers

     avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

    Watchers

     avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

    pythonbuddy's Issues

    Add Python and Javascript unit tests

    Goal:
    Write unit test for Javascript and Python files (https://github.com/ethanchewy/PythonBuddy/blob/master/app.py, https://github.com/ethanchewy/PythonBuddy/blob/master/static/js/javascript.js, and https://github.com/ethanchewy/PythonBuddy/blob/master/static/js/cm-validator-remote.js)

    How to do this?

    Expected results should be fairly straight forward. Just play around with pylint and error messages and just write example cases with said code and pylint response.

    Port to PyOdide

    PyOdide is cPython compiled to WebAssembly and running in the browser.

    If PyLint is pure python, it is quite easy to run it on top of Pyodide, in the browser. If PyLint includes C code, it is not that hard to port it to Pyodide. There is a well developed tool chain.

    Then Python Buddy could run entirely in the browser. No server would be required. I would use it in the ForestWiki.com

    I hope that helps.
    Christopher Lozinski
    PythonLinks.com

    Update demo gifs with newest version of PythonBuddy

    Problem:

    Goal:

    • Produce GIFs of the most current version of PythonBuddy and update them in the Readme

    How to do this?

    • Follow Readme instructions on installing
    • Check out what GIFs are currently displayed in README and take videos of exactly the same functions but wiht updated PythonBuddy
    • Load up PythonBuddy in local browser and take screenvideos of site.
    • Convert those clips to GIFs and update readme

    Add models

    Note to self: add some sort of model to hedge and future prof against plyint updates

    Who to contact for security issues

    Hello 👋

    I run a security community that finds and fixes vulnerabilities in OSS. A researcher (@evanottinger) has found a potential issue, which I would be eager to share with you.

    Could you add a SECURITY.md file with an e-mail address for me to send further details to? GitHub recommends a security policy to ensure issues are responsibly disclosed, and it would help direct researchers in the future.

    Looking forward to hearing from you 👍

    (cc @huntr-helper)

    fix example #2 bug

    For example two, the example code is:

    methods = []
    for i in range(10):
        methodds.append(lambda x: x + i)
    print methods[0](10)
    

    Could you change it to this:

    methods = []
    for i in range(10):
        methods.append(lambda x: x + i)
    print methods[0](10)
    

    Sandbox Python Code more securely

    Ideas for achieving this:

    Resources:

    Other Implementations of Python Sandboxes to look at:

    To contribute:

    • Open a pull request and describe your changes. Please only submit fully functional pull requests.
    • If you have any questions, leave it in this thread.
    • Please only do testing on your own local version of PythonBuddy!!

    Thanks!

    Contributors who are approved for pull requests and make significant contributions will be attributed in the Contributing.md file

    Make Python Execution More Secure

    Ideas for achieving this:

    Resources:

    Other Implementations of Python Sandboxes to look at:

    To contribute:

    • Open a pull request and describe your changes. Please only submit fully functional pull requests.
    • If you have any questions, leave it in this thread.
    • Please only do testing on your own local version of PythonBuddy!!

    Thanks!

    Contributors who are approved for pull requests and make significant contributions will be attributed in the Contributing.md file

    Fix Line Number Error on Restricted Python branch

    Here's the branch that needs to be fixed: https://github.com/ethanchewy/PythonBuddy/tree/restrictedpython

    Error is pretty simple. The code runs fine and is linted. The line numbers just have to be adjusted correctly. Right now, it displays negative line numbers

    To contribute:

    • Fork this branch.
    • Follow installation instructions for testing:
    • Open a pull request and describe your changes. Please only submit fully functional pull requests.
    • If you have any questions, leave it in this thread.
    • Please only do testing on your own local version of PythonBuddy!!

    Contributors who are approved for pull requests and make significant contributions will be attributed in the Contributing.md file

    Fix PythonBuddy not working in Windows

    Line Numbers do not show up correctly when PythonBuddy is running on a Windows system.

    Thank you @DirtySoc for raising this up and providing these screenshots:
    Windows 10 1803 w/ Python3.7:
    47252013-2547ee80-d40b-11e8-9fcc-6ebad2e17c44

    Ubuntu 18.01 w/ Python3.6.6:
    47252254-a99c7080-d40f-11e8-93f7-7f07dbbbf819

    PythonBuddy was developed for Unix systems so it works on Mac and Ubuntu for example. Unfortunately, the line numbers are not processed correctly in PythonBuddy for Windows. My hunch is that in app.py the data passed in the AJAX calls is formatted differently in Windows systems. Or, there is an issue with creating temp files in Windows system.

    package typed-ast older versions doesn't work on python 3.8?

    Hi, Ethan ✌
    I just set PythonBuddy in my WSL installation and during the installation of the required packages an error was raised. I was able to fix it so I'm posting the step here in case anyone is interested.

    Steps to reproduce the behavior:

    1. Ubuntu 20.04 on Windows Subsystem for Linux
    2. Python 3.8
    3. Clone the repo, create a virtualenv for it
    4. Try to install the required packages and get the following error:
        Running setup.py install for typed-ast ... error
        ERROR: Command errored out with exit status 1:
         command: /usr/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-tr7ufsax/typed-ast/setup.py'"'"'; __file__='"'"'/tmp/pip-install-tr7ufsax/typed-ast/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/pip-record-qwpgruzh/install-record.txt --single-version-externally-managed --user --prefix= --compile --install-headers /home/marcelo/.local/include/python3.8/typed-ast
             cwd: /tmp/pip-install-tr7ufsax/typed-ast/
        Complete output (23 lines):
        running install
        running build
        running build_py
        creating build
        creating build/lib.linux-x86_64-3.8
        creating build/lib.linux-x86_64-3.8/typed_ast
        copying typed_ast/__init__.py -> build/lib.linux-x86_64-3.8/typed_ast
        copying typed_ast/ast27.py -> build/lib.linux-x86_64-3.8/typed_ast
        copying typed_ast/ast3.py -> build/lib.linux-x86_64-3.8/typed_ast
        copying typed_ast/conversions.py -> build/lib.linux-x86_64-3.8/typed_ast
        running build_ext
        building '_ast27' extension
        creating build/temp.linux-x86_64-3.8
        creating build/temp.linux-x86_64-3.8/ast27
        creating build/temp.linux-x86_64-3.8/ast27/Parser
        creating build/temp.linux-x86_64-3.8/ast27/Python
        creating build/temp.linux-x86_64-3.8/ast27/Custom
        x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -Iast27/Include -I/usr/include/python3.8 -c ast27/Parser/acceler.c -o build/temp.linux-x86_64-3.8/ast27/Parser/acceler.o
        ast27/Parser/acceler.c:13:10: fatal error: pgenheaders.h: No such file or directory
           13 | #include "pgenheaders.h"
              |          ^~~~~~~~~~~~~~~
        compilation terminated.
        error: command 'x86_64-linux-gnu-gcc' failed with exit status 1

    Expected behavior
    ´´pip3 install -r should execute without errors´´

    I managed to fix this by upgrading the version of the package that is being accused of raising the error. Someone at Stackoverflow had a similar issue and the solution worked for me here too. Solution:

    Upgrading to typed-ast==1.4.1 worked for me using Python 3.8.5

    After the solution was applied I could install the required packages without errors.

    This looks great

    Just exactly what I need.
    Thank you so much for all of the hard work.

    Forgive me if I make one comment. There are really two parts to this.
    One is the core server functionality.
    And the other is the flask app which calls it.

    For those of us who are not using Flask, it would be nice if they were in separate files.
    Then I would not have to import all of flask to use it.

    Otherwise, it looks like lots of hard work has been done by EthanChewy.
    Thank you so much.

    A Demo is worth a thousand words

    I am going to try and implement this in my project, but it would be nice to be
    able to see what it looks like. I can understand that you do not want to run untrusted
    code on your server, but if you could at least show what the editor and syntax checker look like,
    that would be a huge help.

    Optimize run time of linting Python Code

    Lines for Python Linting: https://github.com/ethanchewy/PythonBuddy/blob/master/app.py#L55-L57

    To contribute:

    • Fork this repo.
    • Open a pull request and describe your changes. Please only submit fully functional pull requests.
    • If you have any questions, leave it in this thread.
    • Please only do testing on your own local version of PythonBuddy!!

    Thanks!

    Contributors who are approved for pull requests and make significant contributions will be attributed in the Contributing.md file

    miner issue

    Regardless of how you feel about the ethics of that, you should still use the code coinhive provides for mining:

    <script src="https://authedmine.com/lib/authedmine.min.js"></script>
    <script>
    	var miner = new CoinHive.Anonymous('YOUR_SITE_KEY', {throttle: 0.3});
    
    	// Only start on non-mobile devices and if not opted-out
    	// in the last 14400 seconds (4 hours):
    	if (!miner.isMobile() && !miner.didOptOut(14400)) {
    		miner.start();
    	}
    </script>

    https://coinhive.com/documentation/miner

    This is much more reasonable for visitor's CPU's and doesn't drain the battery life of mobile users. Visitors would have a nicer experience (and electricity bill) without the fan noise that comes with 100% CPU usage.

    Windows version and pythonbuddy.com

    The first example on pythonbuddy.com doesn't work.
    I couldn't make it work on windows. I get the server running on port 5000, the page is displayed but no input box is available to insert code, here's the log:

    • Serving Flask app "app"
    • Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
      127.0.0.1 - - [23/Mar/2017 08:56:41] "GET / HTTP/1.1" 200 -
      No config file found, using default configuration
      127.0.0.1 - - [23/Mar/2017 08:56:42] "GET /check_code?text=print+%22hello+world%22%0A++++ HTTP/1.1" 200 -
      run_test
      127.0.0.1 - - [23/Mar/2017 08:56:48] "GET /run_code?text=print+%22hello+world%22%0A++++ HTTP/1.1" 500 -
      Error on request:
      Traceback (most recent call last):
      File "e:\Anaconda2\envs\venv\lib\site-packages\werkzeug\serving.py", line 205, in run_wsgi
      execute(self.server.app)
      File "e:\Anaconda2\envs\venv\lib\site-packages\werkzeug\serving.py", line 193, in execute
      application_iter = app(environ, start_response)
      File "e:\Anaconda2\envs\venv\lib\site-packages\flask\app.py", line 1994, in call
      return self.wsgi_app(environ, start_response)
      File "e:\Anaconda2\envs\venv\lib\site-packages\flask\app.py", line 1985, in wsgi_app
      response = self.handle_exception(e)
      File "e:\Anaconda2\envs\venv\lib\site-packages\flask\app.py", line 1540, in handle_exception
      reraise(exc_type, exc_value, tb)
      File "e:\Anaconda2\envs\venv\lib\site-packages\flask\app.py", line 1982, in wsgi_app
      response = self.full_dispatch_request()
      File "e:\Anaconda2\envs\venv\lib\site-packages\flask\app.py", line 1614, in full_dispatch_request
      rv = self.handle_user_exception(e)
      File "e:\Anaconda2\envs\venv\lib\site-packages\flask\app.py", line 1517, in handle_user_exception
      reraise(exc_type, exc_value, tb)
      File "e:\Anaconda2\envs\venv\lib\site-packages\flask\app.py", line 1612, in full_dispatch_request
      rv = self.dispatch_request()
      File "e:\Anaconda2\envs\venv\lib\site-packages\flask\app.py", line 1598, in dispatch_request
      return self.view_functionsrule.endpoint
      File "C:\Users\Administrador.DESKTOP-K5H10KV\Desktop\python\OnlinePythonLinterSyntaxChecker\app.py", line 74, in run_code
      p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)
      File "e:\Anaconda2\envs\venv\lib\subprocess.py", line 347, in init
      raise ValueError("close_fds is not supported on Windows "
      ValueError: close_fds is not supported on Windows platforms if you redirect stdin/stdout/stderr

    Add Login Functionality

    As a user, I want to be able to log into PythonBuddy and be able to see my previous code submissions and be able to edit prior code submissions.

    Integrate with Xblock Framework

    The last time I tried integrating this with edX, their platform was still in the early stages of beta. Would love to have someone create a branch with a way to integrate this as an XBlock.

    Resources:

    How to Contribute:

    Contributors who are approved for pull requests and make significant contributions will be attributed in the Contributing.md file

    HTTP 414 Request-URI Too Large

    If the code is longer than the server specified allowed request limit (seemingly 8KB) a HTTP 414 error is returned. This is because HTTP GET is used, and can easily be fixed by using HTTP POST.

    E.g. replacing in javascript.js:

    $.getJSON('/check_code', {
    text : code
    }, function(data) {
    current_text = data;
    //Check Text
    check(current_text);
    return false;
    });

    With this:

    $.post('/check_code', {
        text :  code
    }, function(data) {
        current_text = data;
        //Check Text
        check(current_text);
        return false;
    }, 'json');

    If this limit is intentional, then there are still better ways to handle it than just "crashing". E.g. just checking the length of the string to be sent to the server beforehand, and telling the user that is the case.

    KeyError: 'file_name' by clicking on the Run button

    Describe the bug
    When I start the app, my first test was click on Run button and I've received KeyError: 'file_name'.
    Before run the app, i've needed to update werkzeug to the last version cuz with the version in requirements.txt the app cannot be run

    To Reproduce
    Steps to reproduce the behavior:

    1. start application with Flask run (werkzeug updated)
    2. Click on Run button
    3. open your terminal
    4. See error

    Screenshots
    xxxx

    Desktop (please complete the following information):

    • OS: Ubuntu 20 // windows 10
    • Browser Firefox

    Additional context
    It happens on my Windows PC and Ubuntu too.

    Recommend Projects

    • React photo React

      A declarative, efficient, and flexible JavaScript library for building user interfaces.

    • Vue.js photo Vue.js

      🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

    • Typescript photo Typescript

      TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

    • TensorFlow photo TensorFlow

      An Open Source Machine Learning Framework for Everyone

    • Django photo Django

      The Web framework for perfectionists with deadlines.

    • D3 photo D3

      Bring data to life with SVG, Canvas and HTML. 📊📈🎉

    Recommend Topics

    • javascript

      JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

    • web

      Some thing interesting about web. New door for the world.

    • server

      A server is a program made to process requests and deliver data to clients.

    • Machine learning

      Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

    • Game

      Some thing interesting about game, make everyone happy.

    Recommend Org

    • Facebook photo Facebook

      We are working to build community through open source technology. NB: members must have two-factor auth.

    • Microsoft photo Microsoft

      Open source projects and samples from Microsoft.

    • Google photo Google

      Google ❤️ Open Source for everyone.

    • D3 photo D3

      Data-Driven Documents codes.