Write maintainable, production-ready pipelines using Jupyter or your favorite text editor. Develop locally, deploy to the cloud. ☁️

Overview

CI Linux CI macOS CI Windows Documentation Status PyPI Conda (channel only) Conda Coverage Twitter Binder

Join our community | Newsletter | Contact us | Docs | Blog

Notebooks are hard to maintain. Teams often prototype projects in notebooks, but maintaining them is an error-prone process that slows progress down. Ploomber overcomes the challenges of working with .ipynb files allowing teams to develop collaborative, production-ready pipelines using JupyterLab or any text editor.

Main Features

  1. Scripts as notebooks. Open .py files as notebooks, then execute them from the terminal and generate an output notebook to review results.
  2. Dependency resolution. Quickly build a DAG by referring to previous tasks in your code; Ploomber infers execution order and orchestrates execution.
  3. Incremental builds. Speed up iterations by skipping tasks whose source code hasn't changed since the last execution.
  4. Production-ready. Deploy to Kubernetes (via Argo Workflows), Airflow, and AWS Batch without code changes.
  5. Parallelization. Run independent tasks in parallel.
  6. Testing. Import pipelines in any testing frameworks and test them with any CI service (e.g. GitHub Actions).
  7. Flexible. Use Jupyter notebooks, Python scripts, R scripts, SQL scripts, Python functions, or a combination of them as pipeline tasks. Write pipelines using a pipeline.yaml file or with Python.

repo-lab-example

Community

Resources

Installation

Compatible with Python 3.6 and higher.

Install with pip:

pip install ploomber

Or with conda:

conda install ploomber -c conda-forge

Getting started

Use Binder to try out Ploomber without setting up an environment:

image

Or run an example locally:

# ML pipeline example
ploomber examples --name ml-basic
cd ml-basic

# if using pip
pip install -r requirements.txt

# if using conda
conda env create --file environment.yml
conda activate ml-basic

# run pipeline
ploomber build

Pipeline output saved in the output/ folder. Check out the pipeline definition in the pipeline.yaml file.

To get a list of examples, run ploomber examples.

Click here to go to our examples repository.

Comments
  • Make font size dynamic

    Make font size dynamic

    Describe your changes

    make font size dynamic based on width of the the tasks/circles in the dag plot

    Issue ticket number and link

    Closes #903

    Checklist before requesting a review

    • [x] I have performed a self-review of my code
    • [x] I have added thorough tests (when necessary).
    • [x] I have added the right documentation (when needed). Product update? If yes, write one line about this update.
    opened by e1ha 29
  • D3 backend  Error

    D3 backend Error

    ploomber report --> gives me an error , ValueError: Error when using d3 backend: expected a path with extension .html, but got: '/tmp/tmpmojk06x4.png', please change the extension

    bug good first issue med priority 
    opened by falcondatalake 23
  • added and tested did you mean feature to ploomber examples issue #805

    added and tested did you mean feature to ploomber examples issue #805

    Describe your changes

    added and tested did you mean feature to ploomber examples issue #805

    Issue ticket number and link

    Closes #x

    Checklist before requesting a review

    • [x] I have performed a self-review of my code
    • [x] I have added thorough tests (when necessary).
    • [x] I have added the right documentation (when needed). Product update? If yes, write one line about this update.
    opened by qixuan27 21
  • dismiss

    dismiss "Black is not installed, parameters wont be formatted" message

    papermill shows a logging message if black is not installed, which is causing confusion for ploomber users.

    https://github.com/nteract/papermill/blob/aecd0ac16d34dd41a1a8e4ca3351844932af3d94/papermill/translators.py#L195

    we should suppress the message

    enhancement good first issue 
    opened by edublancas 21
  • Partial build fails - TypeError: cannot pickle 'module' object

    Partial build fails - TypeError: cannot pickle 'module' object

    I see the following error when I do ploomber build -p train, but do not get the error when running ploomber build. My guess it that it relates to a joblib.dump. I tried to add custom un/serializers after seeing the error, but that did not fix it. Sorry, the pipeline is a bit complicated at this point and the error is hard to generate a easy to reproduce example for testing.

    Traceback (most recent call last):
      File "/home/hopkir/anaconda3/envs/hydrates/lib/python3.8/site-packages/ploomber/cli/io.py", line 34, in wrapper
        fn(**kwargs)
      File "/home/hopkir/anaconda3/envs/hydrates/lib/python3.8/site-packages/ploomber/cli/build.py", line 49, in main
        report = dag.build_partially(args.partially,
      File "/home/hopkir/anaconda3/envs/hydrates/lib/python3.8/site-packages/ploomber/dag/dag.py", line 667, in build_partially
        dag_copy = deepcopy(self)
      File "/home/hopkir/anaconda3/envs/hydrates/lib/python3.8/copy.py", line 172, in deepcopy
        y = _reconstruct(x, memo, *rv)
      File "/home/hopkir/anaconda3/envs/hydrates/lib/python3.8/copy.py", line 270, in _reconstruct
        state = deepcopy(state, memo)
      File "/home/hopkir/anaconda3/envs/hydrates/lib/python3.8/copy.py", line 146, in deepcopy
        y = copier(x, memo)
      File "/home/hopkir/anaconda3/envs/hydrates/lib/python3.8/copy.py", line 230, in _deepcopy_dict
        y[deepcopy(key, memo)] = deepcopy(value, memo)
      File "/home/hopkir/anaconda3/envs/hydrates/lib/python3.8/copy.py", line 172, in deepcopy
        y = _reconstruct(x, memo, *rv)
      File "/home/hopkir/anaconda3/envs/hydrates/lib/python3.8/copy.py", line 270, in _reconstruct
        state = deepcopy(state, memo)
      File "/home/hopkir/anaconda3/envs/hydrates/lib/python3.8/copy.py", line 146, in deepcopy
        y = copier(x, memo)
      File "/home/hopkir/anaconda3/envs/hydrates/lib/python3.8/copy.py", line 230, in _deepcopy_dict
        y[deepcopy(key, memo)] = deepcopy(value, memo)
      File "/home/hopkir/anaconda3/envs/hydrates/lib/python3.8/copy.py", line 146, in deepcopy
        y = copier(x, memo)
      File "/home/hopkir/anaconda3/envs/hydrates/lib/python3.8/copy.py", line 230, in _deepcopy_dict
        y[deepcopy(key, memo)] = deepcopy(value, memo)
      File "/home/hopkir/anaconda3/envs/hydrates/lib/python3.8/copy.py", line 146, in deepcopy
        y = copier(x, memo)
      File "/home/hopkir/anaconda3/envs/hydrates/lib/python3.8/copy.py", line 230, in _deepcopy_dict
        y[deepcopy(key, memo)] = deepcopy(value, memo)
      File "/home/hopkir/anaconda3/envs/hydrates/lib/python3.8/copy.py", line 172, in deepcopy
        y = _reconstruct(x, memo, *rv)
      File "/home/hopkir/anaconda3/envs/hydrates/lib/python3.8/copy.py", line 270, in _reconstruct
        state = deepcopy(state, memo)
      File "/home/hopkir/anaconda3/envs/hydrates/lib/python3.8/copy.py", line 146, in deepcopy
        y = copier(x, memo)
      File "/home/hopkir/anaconda3/envs/hydrates/lib/python3.8/copy.py", line 230, in _deepcopy_dict
        y[deepcopy(key, memo)] = deepcopy(value, memo)
      File "/home/hopkir/anaconda3/envs/hydrates/lib/python3.8/copy.py", line 172, in deepcopy
        y = _reconstruct(x, memo, *rv)
      File "/home/hopkir/anaconda3/envs/hydrates/lib/python3.8/copy.py", line 270, in _reconstruct
        state = deepcopy(state, memo)
      File "/home/hopkir/anaconda3/envs/hydrates/lib/python3.8/copy.py", line 146, in deepcopy
        y = copier(x, memo)
      File "/home/hopkir/anaconda3/envs/hydrates/lib/python3.8/copy.py", line 230, in _deepcopy_dict
        y[deepcopy(key, memo)] = deepcopy(value, memo)
      File "/home/hopkir/anaconda3/envs/hydrates/lib/python3.8/copy.py", line 172, in deepcopy
        y = _reconstruct(x, memo, *rv)
      File "/home/hopkir/anaconda3/envs/hydrates/lib/python3.8/copy.py", line 270, in _reconstruct
        state = deepcopy(state, memo)
      File "/home/hopkir/anaconda3/envs/hydrates/lib/python3.8/copy.py", line 146, in deepcopy
        y = copier(x, memo)
      File "/home/hopkir/anaconda3/envs/hydrates/lib/python3.8/copy.py", line 230, in _deepcopy_dict
        y[deepcopy(key, memo)] = deepcopy(value, memo)
      File "/home/hopkir/anaconda3/envs/hydrates/lib/python3.8/copy.py", line 172, in deepcopy
        y = _reconstruct(x, memo, *rv)
      File "/home/hopkir/anaconda3/envs/hydrates/lib/python3.8/copy.py", line 270, in _reconstruct
        state = deepcopy(state, memo)
      File "/home/hopkir/anaconda3/envs/hydrates/lib/python3.8/copy.py", line 146, in deepcopy
        y = copier(x, memo)
      File "/home/hopkir/anaconda3/envs/hydrates/lib/python3.8/copy.py", line 230, in _deepcopy_dict
        y[deepcopy(key, memo)] = deepcopy(value, memo)
      File "/home/hopkir/anaconda3/envs/hydrates/lib/python3.8/copy.py", line 172, in deepcopy
        y = _reconstruct(x, memo, *rv)
      File "/home/hopkir/anaconda3/envs/hydrates/lib/python3.8/copy.py", line 270, in _reconstruct
        state = deepcopy(state, memo)
      File "/home/hopkir/anaconda3/envs/hydrates/lib/python3.8/copy.py", line 146, in deepcopy
        y = copier(x, memo)
      File "/home/hopkir/anaconda3/envs/hydrates/lib/python3.8/copy.py", line 230, in _deepcopy_dict
        y[deepcopy(key, memo)] = deepcopy(value, memo)
      File "/home/hopkir/anaconda3/envs/hydrates/lib/python3.8/copy.py", line 161, in deepcopy
        rv = reductor(4)
    TypeError: cannot pickle 'module' object
    
    opened by reesehopkins 18
  • Enable passing .sql task results to a following .sql task as parameters

    Enable passing .sql task results to a following .sql task as parameters

    Documentation page: community/index

    Use case

    I work in a business where we have an abundance of data but not necessarily the best data for data science efforts. In may cases we have millions of time series records for feature building but poor records of the target data we'd like to predict. Further complicating efforts are our many many different database servers of various type (oracle, sql, teradata, aws, azure).

    Because of this I spend a lot of time helping our business become 'data science ready' by developing data pipelines to build useful datasets. I'm currently using python to integrate and transform disparate data sources and outputting to table

    Request

    I would like to be able to pass unique values from one .sql task to another as parameters. Something like this:

    tasks:
      - name: get-data-1
        source: sql/first_data.sql
        product: '{{data}}/raw/first_data.parquet'
        client: src.clients.src1
        chunksize: null
      
      - name: get-data-2
        source: sql/second-data.sql
        product: '{{data}}/raw/second-data.parquet'
        client: src.clients.src2
        params:
          startYear: '{{startYear}}'
          endYear: '{{endYear}}'      
        upstream: get-data-1
        chunksize: null
    

    second-data-2.sql example

    select *
    from schema.table
    where column in (upstream[params])
    and year(date) between {{startYear}} and {{endYear}}
    

    Alternatively, could I output the params via python as an intermediate .yaml and use as inputs like this?

    import pandas as pd
    import yaml
    
    df = pd.read_parquet(upstream['first_data.parquet''])
    vals = df['column'].unique()
    
    d = dict({'val':vals})
    
    with open("sample.yaml", "w") as f:
      yaml.dump(d, f)
      f.close()
    
    opened by rockraptor5 17
  • Cannot load notebooks: ModuleNotFoundError: Error processing dotted path

    Cannot load notebooks: ModuleNotFoundError: Error processing dotted path

    I have a notebook folder in ploomber project and ploomber tries to run something so I can't even load the notebook (which BTW is not referenced in pipeline.yaml in any way)

    What happened? How is it possible that ploomber breaks jupyter?

    Error message

    [I 11:59:22.671 NotebookApp] [Ploomber] Requested model: work/wwf/notebooks/Enrich_Test.ipynb. Looking for DAG with root dir: /home/kuba/Projects                            
    [E 11:59:22.786 NotebookApp] Uncaught exception GET /api/contents/work/wwf/notebooks/Enrich_Test.ipynb?type=notebook&_=1656064762442 (127.0.0.1)                             
        HTTPServerRequest(protocol='http', host='localhost:8888', method='GET', uri='/api/contents/work/wwf/notebooks/Enrich_Test.ipynb?type=notebook&_=1656064762442', version='
    HTTP/1.1', remote_ip='127.0.0.1')                                                                                                                                            
        Traceback (most recent call last):                                                                                                                                       
          File "/home/kuba/.local/lib/python3.8/site-packages/tornado/web.py", line 1704, in _execute                                                                            
            result = await result                                                                                                                                                
          File "/home/kuba/.local/lib/python3.8/site-packages/tornado/gen.py", line 234, in wrapper                                                                              
            yielded = ctx_run(next, result)                                                                                                                                      
          File "/home/kuba/.local/lib/python3.8/site-packages/notebook/services/contents/handlers.py", line 118, in get                                                          
            model = yield maybe_future(self.contents_manager.get(                  
          File "/home/kuba/.local/lib/python3.8/site-packages/ploomber/jupyter/manager.py", line 267, in get                                                                     
            self.load_dag(                                                                                                                                                       
          File "/home/kuba/.local/lib/python3.8/site-packages/ploomber/jupyter/manager.py", line 193, in load_dag                                                                
            pairs = [(resolve_path(                                                       
          File "/home/kuba/.local/lib/python3.8/site-packages/ploomber/jupyter/manager.py", line 196, in <listcomp>                                                                      if t.source.loc is not None]                                                  
          File "/home/kuba/.local/lib/python3.8/site-packages/ploomber/sources/pythoncallablesource.py", line 130, in loc                                                        
            self._loc = self._callable_loader.get_loc()                                                                                                                          
          File "/home/kuba/.local/lib/python3.8/site-packages/ploomber/sources/pythoncallablesource.py", line 58, in get_loc                                                     
            loc, _ = lazily_locate_dotted_path(self._primitive)                                                                                                                        File "/home/kuba/.local/lib/python3.8/site-packages/ploomber/util/dotted_path.py", line 343, in lazily_locate_dotted_path                                              
            raise ModuleNotFoundError('Error processing dotted '
        ModuleNotFoundError: Error processing dotted path 'deepsense_wwf.data_utils.copy_zipped_data': 'deepsense_wwf' appears to be a namespace package, which are not supported
    [W 11:59:22.790 NotebookApp] Unhandled error          
    [E 11:59:22.791 NotebookApp] {                                                                                                                                               
          "Host": "localhost:8888",                                                                                                                                              
          "Accept": "application/json, text/javascript, */*; q=0.01",                                                                                                            
          "Referer": "http://localhost:8888/notebooks/work/wwf/notebooks/Enrich_Test.ipynb",                                                                                     
          "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:101.0) Gecko/20100101 Firefox/101.0"                                                                         
        }                                                          
    
    bug high priority 
    opened by lambdaofgod 16
  • Add links to cookbook examples to the docs

    Add links to cookbook examples to the docs

    We have a new cookbook section: https://github.com/ploomber/projects/tree/master/cookbook

    where we add minimal examples for certain use cases, we should add links to each one on the relevant sections in the docs

    documentation good first issue 
    opened by edublancas 15
  • deprecate python 3.6 (#819)

    deprecate python 3.6 (#819)

    Describe your changes

    updated documentation to reflect python 3.6 not being supported removed workarounds for python 3.6

    Issue ticket number and link

    Closes #819

    Checklist before requesting a review

    • [x] I have performed a self-review of my code
    • [x] I have added thorough tests (when necessary).
    • [x] I have added the right documentation (when needed). Product update? If yes, write one line about this update.
    opened by grnnja 14
  • HTML/CSS - Fix right bar in docs

    HTML/CSS - Fix right bar in docs

    When opening in a large monitor, the docs display a right bar to move between sections (example):

    Screen Shot 2021-10-15 at 12 24 27

    However, on tablets and phones, we remove that bar. It'd be better to add a button to the top bar to toggle it, just like we do with the left bar (see right button):

    Screen Shot 2021-10-15 at 12 25 33

    source code: https://github.com/ploomber/ploomber/blob/76b2abf78092e6696d9e25e47cefdc1e1589529f/doc/_templates/layout.html#L41

    check doc/contributing.md for instructions

    documentation good first issue 
    opened by edublancas 14
  • adding warning on Python 3.6 deprecation

    adding warning on Python 3.6 deprecation

    We won't be supporting Python 3.6 beginning in Ploomber 0.20

    There's a PR that removes everything related to it: https://github.com/ploomber/ploomber/pull/876

    But we haven't sent any warnings to users

    we should add one here: https://github.com/ploomber/ploomber/blob/master/src/ploomber/init.py

    essentially, if we detect they're running 3.6, we should display a message

    that should be released in the next 0.19 release. on 0.20, we merge https://github.com/ploomber/ploomber/pull/876 and remove the warning

    high priority low effort 
    opened by edublancas 13
  • pygments breaking a test

    pygments breaking a test

    pygments 2.14 is breaking our CI. I added a quickfix since I verified that this failure is not affecting anything critical (it's just terminal output formatting). I think this is best than pinning pygments since pining the version is worst as it'll increase the complexity of installing the package.

    This is some ASCII code stuff, and I'm unsure why the pygments update is behaving in this way, here's the error:

    ===================================================================================== FAILURES ======================================================================================
    ________________________________________________________________ test_code_highlight[with markup and code_highlight] ________________________________________________________________
    
    has_markup = True, code_highlight = True, expected = '{kw}assert{hl-reset} {number}0{hl-reset}\n'
    color_mapping = <class 'io_mod.test_terminalwriter.color_mapping.<locals>.ColorMapping'>
    
        @pytest.mark.parametrize(
            ("has_markup", "code_highlight", "expected"),
            [
                pytest.param(
                    True,
                    True,
                    "{kw}assert{hl-reset} {number}0{hl-reset}\n",
                    id="with markup and code_highlight",
                ),
                pytest.param(
                    True,
                    False,
                    "assert 0\n",
                    id="with markup but no code_highlight",
                ),
                pytest.param(
                    False,
                    True,
                    "assert 0\n",
                    id="without markup but with code_highlight",
                ),
                pytest.param(
                    False,
                    False,
                    "assert 0\n",
                    id="neither markup nor code_highlight",
                ),
            ],
        )
        def test_code_highlight(has_markup, code_highlight, expected, color_mapping):
            f = io.StringIO()
            tw = terminalwriter.TerminalWriter(f)
            tw.hasmarkup = has_markup
            tw.code_highlight = code_highlight
            tw._write_source(["assert 0"], lexer='py')
    
    >       assert f.getvalue().splitlines(keepends=True) == color_mapping.format(
                [expected])
    E       AssertionError: assert ['\x1b[94mass...[39;49;00m\n'] == ['\x1b[94mass...[39;49;00m\n']
    E         At index 0 diff: '\x1b[94massert\x1b[39;49;00m \x1b[94m0\x1b[39;49;00m\x1b[90m\x1b[39;49;00m\n' != '\x1b[94massert\x1b[39;49;00m \x1b[94m0\x1b[39;49;00m\n'
    E         Use -v to get more diff
    
    opened by edublancas 0
  • File client user guide

    File client user guide

    Describe your changes

    Issue ticket number and link

    Closes #701

    Checklist before requesting a review

    • [x] I have performed a self-review of my code
    • [x] I have added thorough tests (when necessary).
    • [x] I have added the right documentation (when needed). Product update? If yes, write one line about this update.
    opened by neelasha23 4
  • helping users when setting their key

    helping users when setting their key

    I got a report from a cloud user that they had a "malformed API key error", somewhere in our docs, we have the following instructions:

    ploomber cloud set-key {your-key}
    

    And the user was setting it with the {} characters. We should detect if the passed key begins with { and ends with }. If so, ignore those characters (or maybe show an error telling them to remove them?)

    opened by edublancas 1
  • Populate Slack Welcome message

    Populate Slack Welcome message

    Context: Currently, we will send the user a welcome message when user joins the Ploomber Slack Workspace. We may consider to provide the list of our current links.

    Example - Ideal After: Screenshot 2023-01-02 at 9 26 32 PM

    Example - Currently Implementation: Screenshot 2023-01-02 at 9 30 49 PM

    Action Item:

    • [ ] Discuss if providing those links will help users to find the resource easier
      • What to include in the list? Currently we can have Ploomber.io, Github link, Doc link, Blog link
    • [ ] Modify the bot message with the new adding section
    opened by jinniw43805 0
  • Make `plot` without grid nodes

    Make `plot` without grid nodes

    Hi!

    I am a recent adopter of Ploomber and enjoying it. Thanks a lot for making this framework.

    I am using grid in my pipeline.yaml and it works great. The only downside is that when visualizing the DAG with pipeline plot all nodes are included (and if there are enough nodes the html show nothing).

    However, since nodes made by a grid step are related I would like them to appear as a single node in the DAG. Would it be possible to make an option for pipeline plot such that the user can choose whether or not to collapse grid nodes?

    opened by robertdj 3
Owner
Ploomber
A community dedicated to promote and discuss best practices for Data Science software
Ploomber
A powerful text editor for MATE

Pluma - The MATE text editor General Information Pluma (pluma) is a small and lightweight UTF-8 text editor for the MATE environment. It started as a

MATE Desktop 134 Dec 31, 2022
Encriptificator is a text editor app developed by me as a personal project.

Encriptificator is a text editor app developed by me as a personal project. It provides all basic features of a text editor with the additional feature of encrypting your files. To know more about how to use the encryption features , please read the readme file.

null 1 May 9, 2022
Frappe tinymce - Frappe app to replace default text editor with tinymce

Frappe tinyMCE tinyMCE Text Editor for frappe apps Replace frappe's Quill Text E

Shridhar Patil 23 Nov 16, 2022
A gui-script-editor(Based on pyqt5, pyautogui) to writing your gui script.

gui-script-editor A gui-script-editor(Based on pyqt5, pyautogui) to writing your gui script. ##更新说明 版本号:1.0.0 版本说明:实现了脚本编辑器雏形,未实现执行报告,自动化脚本管理(只支持单个脚本运

null 2 Dec 22, 2021
An experimental code editor for writing algorithms

Algojammer Algojammer is an experimental, proof-of-concept code editor for writing algorithms in Python. It was mainly written to assist with solving

Chris Knott 2.9k Dec 27, 2022
Komodo Edit is a fast and free multi-language code editor. Written in JS, Python, C++ and based on the Mozilla platform.

Komodo Edit This readme explains how to get started building, using and developing with the Komodo Edit source base. Whilst the main Komodo Edit sourc

ActiveState Komodo 2k Dec 28, 2022
Leo is an Outliner, Editor, IDE and PIM written in 100% Python.

Leo 6.3, http://leoeditor.com, is now available on GitHub. Leo is an IDE, outliner and PIM. The highlights of Leo 6.3 leoAst.py: The unification of Py

Leo Editor 1.4k Dec 27, 2022
A small, simple editor for beginner Python programmers. Written in Python and Qt5.

Mu - A Simple Python Code Editor Mu is a simple code editor for beginner programmers based on extensive feedback from teachers and learners. Having sa

Mu 1.2k Jan 3, 2023
ReText: Simple but powerful editor for Markdown and reStructuredText

Welcome to ReText! ReText is a simple but powerful editor for Markdown and reStructuredText markup languages. One can also add support for custom mark

ReText 1.6k Dec 23, 2022
A simple Notepad-like editor written in Python

monkepad A simple Notepad-like editor written in Python Since MonkePad is written in one file, all your customization can be done without much trouble

null 5 Dec 28, 2021
A free Python source code editor and Notepad replacement for Windows

Website Download Features Toolbar Wide array of view options Syntax highlighting support for Python Usable accelerator keys for each function (Ctrl+N,

Mohamed Ahmed 7 Feb 16, 2022
Cameray is a lens editor and simulator for fun.

Cameray is a lens editor and simulator for fun. It's could be used for studying an optics system of DSLR in an interactive way. But the project is in a very early version. The program is still crash-prone and also lack of many realistic camera features now.

Shuoliu Yang 59 Dec 10, 2022
A very simple Editor.js parser written in pure Python

pyEditor.js A very simple Editor.js parser written in pure Python. Soon-to-be published on PyPI. Features: Automatically convert Editor.js's JSON outp

Kevo 7 Nov 1, 2022
cross-editor syntax highlighter for Lua, showing some merit of Typed BNF

Cross-editor contextual syntax highlighter via Typed BNF Do you like "one grammar, syntax highlighters everywhere?" 喜欢我一个文法,到处高亮吗? PS: NOTE that paren

Taine Zhao 14 Feb 9, 2022
Jupyter Interactive Notebook

Jupyter Notebook The Jupyter notebook is a web-based notebook environment for interactive computing. Notice Please note that this repository is curren

Project Jupyter 9.7k Jan 2, 2023
openBrowsser is a Sublime Text plug-in, which allows you to add a keyboard shortcut, to directly access a website from a selection.

openBrowsser is a Sublime Text plug-in, which allows you to add a keyboard shortcut, to directly access a website from a selection. Instal

Florian COLLIN 1 Dec 14, 2021
Using the jedi autocompletion library for VIM.

jedi-vim - awesome Python autocompletion with VIM jedi-vim is a VIM binding to the autocompletion library Jedi. Here are some pictures: Completion for

Dave Halter 5.1k Dec 31, 2022
Develop and deploy applications with the Ionburst Cloud Python SDK.

Ionburst SDK for Python The Ionburst SDK for Python enables developers to easily integrate with Ionburst Cloud, building in ultra-secure and private o

Ionburst Cloud 3 Mar 6, 2022
💻 A fully functional local AWS cloud stack. Develop and test your cloud & Serverless apps offline!

LocalStack - A fully functional local AWS cloud stack LocalStack provides an easy-to-use test/mocking framework for developing Cloud applications. Cur

LocalStack 45.3k Jan 2, 2023