# Airflow Code Editor Plugin
A plugin for [Apache Airflow](https://github.com/apache/airflow) that allows you to edit DAGs in browser.
It provides a file managing interface within specified directories and it can be used to edit, upload, and download your files.
If git support is enabled, the DAGs are stored in a Git repository. You may use it to view Git history, review local changes and commit.
[![Build Status](https://github.com/andreax79/airflow-code-editor/workflows/Tests/badge.svg)](https://github.com/andreax79/airflow-code-editor/actions)
[![PyPI version](https://badge.fury.io/py/airflow-code-editor.svg)](https://badge.fury.io/py/airflow-code-editor)
[![PyPI](https://img.shields.io/pypi/pyversions/airflow-code-editor.svg)](https://pypi.org/project/airflow-code-editor)
[![Downloads](https://static.pepy.tech/badge/airflow-code-editor/month)](https://pepy.tech/project/airflow-code-editor)
[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
### System Requirements
* Airflow Versions
* 1.10.3 or newer
* git Versions (git is not required if git support is disabled)
* 2.0 or newer
### Screenshots
#### File Manager
![File Manager](https://github.com/andreax79/airflow-code-editor/assets/1288154/6d9b09df-4503-45d9-94d4-ff013a86985a)
#### Editor
![Editor](https://github.com/andreax79/airflow-code-editor/assets/1288154/4ffaed29-390f-4134-bcb4-0b8fb8c59060)
#### Search
![Search](https://github.com/andreax79/airflow-code-editor/assets/1288154/9ba81166-3823-40ae-8820-116e4e5d2588)
#### Git History
![Git History](https://github.com/andreax79/airflow-code-editor/assets/1288154/2d6ec31f-3c1c-4d38-8fc6-99d18096cc64)
#### Git Workspace
![Git Workspace](https://github.com/andreax79/airflow-code-editor/assets/1288154/eb041a02-3f1e-47a1-b179-072d66e4662d)
### Install Instructions
#### Docker Images
For the ease of deployment, use the production-ready reference container image.
The image is based on the reference images for Apache Airflow.
You can find the following images there:
* andreax79/airflow-code-editor:**latest** - the latest released Airflow Code Editor image with the latest Apache Airflow version
* andreax79/airflow-code-editor:**2.7.0** - the latest released Airflow Code Editor with specific Airflow version
* andreax79/airflow-code-editor:**2.7.0-7.5.0** - specific version of Airflow and Airflow Code Editor
#### Installing from PyPI
1. Install the plugin
```bash
pip install airflow-code-editor
```
2. Install optional dependencies
* black - Black Python code formatter
* fs-s3fs - S3FS Amazon S3 Filesystem
* fs-gcsfs - Google Cloud Storage Filesystem
* ... other filesystems supported by PyFilesystem - see https://www.pyfilesystem.org/page/index-of-filesystems/
```bash
pip install black fs-s3fs fs-gcsfs
```
3. Restart the Airflow Web Server
4. Open Admin - DAGs Code Editor
### Config Options
You can set options editing the Airflow's configuration file or setting environment variables.
You can edit your *airflow.cfg* adding any of the following settings in the \[code_editor\] section.
All the settings are optional.
* **enabled** enable this plugin (default: True).
* **git_enabled** enable git support (default: True). If git is not installed, disable this option.
* **git_cmd** git command (path)
* **git_default_args** git arguments added to each call (default: -c color.ui=true)
* **git_author_name** human-readable name in the author/committer (default logged user first and last names)
* **git_author_email** email for the author/committer (default: logged user email)
* **git_init_repo** initialize a git repo in DAGs folder (default: True)
* **root_directory** root folder (default: Airflow DAGs folder)
* **line_length** Python code formatter - max line length (default: 88)
* **string_normalization** Python code formatter - if true normalize string quotes and prefixes (default: False)
* **mount**, **mount1**, ... configure additional folder (mount point) - format: name=xxx,path=yyy
* **ignored_entries** comma-separated list of entries to be excluded from file/directory list (default: .\*,\_\_pycache\_\_)
```
[code_editor]
enabled = True
git_enabled = True
git_cmd = /usr/bin/git
git_default_args = -c color.ui=true
git_init_repo = False
root_directory = /home/airflow/dags
line_length = 88
string_normalization = False
mount = name=data,path=/home/airflow/data
mount1 = name=logs,path=/home/airflow/logs
mount2 = name=data,path=s3://example
```
Mount Options:
* **name**: mount name (destination)
* **path**: local path or PyFilesystem FS URLs - see https://docs.pyfilesystem.org/en/latest/openers.html
Example:
* name=ftp_server,path=ftp://user:pass@ftp.example.org/private
* name=data,path=s3://example
* name=tmp,path=/tmp
You can also set options with the following environment variables:
* AIRFLOW__CODE_EDITOR__ENABLED
* AIRFLOW__CODE_EDITOR__GIT_ENABLED
* AIRFLOW__CODE_EDITOR__GIT_CMD
* AIRFLOW__CODE_EDITOR__GIT_DEFAULT_ARGS
* AIRFLOW__CODE_EDITOR__GIT_AUTHOR_NAME
* AIRFLOW__CODE_EDITOR__GIT_AUTHOR_EMAIL
* AIRFLOW__CODE_EDITOR__GIT_INIT_REPO
* AIRFLOW__CODE_EDITOR__ROOT_DIRECTORY
* AIRFLOW__CODE_EDITOR__LINE_LENGTH
* AIRFLOW__CODE_EDITOR__STRING_NORMALIZATION
* AIRFLOW__CODE_EDITOR__MOUNT, AIRFLOW__CODE_EDITOR__MOUNT1, AIRFLOW__CODE_EDITOR__MOUNT2, ...
* AIRFLOW__CODE_EDITOR__IGNORED_ENTRIES
Example:
```
export AIRFLOW__CODE_EDITOR__STRING_NORMALIZATION=True
export AIRFLOW__CODE_EDITOR__MOUNT='name=data,path=/home/airflow/data'
export AIRFLOW__CODE_EDITOR__MOUNT1='name=logs,path=/home/airflow/logs'
export AIRFLOW__CODE_EDITOR__MOUNT2='name=tmp,path=/tmp'
```
### Development Instructions
1. Fork the repo
2. Clone it on the local machine
```bash
git clone https://github.com/andreax79/airflow-code-editor.git
cd airflow-code-editor
```
3. Create dev image
```bash
make dev-image
```
4. Switch node version
```bash
nvm use
```
5. Make changes you need. Build npm package with:
```bash
make npm-build
```
6. You can start Airflow webserver with:
```bash
make webserver
```
7. Run tests
```bash
make test
```
8. Commit and push changes
9. Create [pull request](https://github.com/andreax79/airflow-code-editor/compare) to the original repo
### Links
* [Apache Airflow](https://github.com/apache/airflow)
* [Codemirror, In-browser code editor](https://github.com/codemirror/codemirror)
* [Git WebUI, A standalone local web based user interface for git repositories](https://github.com/alberthier/git-webui)
* [Black, The Uncompromising Code Formatter](https://github.com/psf/black)
* [pss, power-tool for searching source files](https://github.com/eliben/pss)
* [Vue.js](https://github.com/vuejs/vue)
* [Vue-good-table, data table for VueJS](https://github.com/xaksis/vue-good-table)
* [Vue-tree, TreeView control for VueJS](https://github.com/grapoza/vue-tree)
* [Vue-universal-modal Universal modal plugin for Vue@3](https://github.com/hoiheart/vue-universal-modal)
* [Vue-simple-context-menu](https://github.com/johndatserakis/vue-simple-context-menu)
* [Splitpanes](https://github.com/antoniandre/splitpanes)
* [Axios, Promise based HTTP client for the browser and node.js](https://github.com/axios/axios)
* [PyFilesystem2, Python's Filesystem abstraction layer](https://github.com/PyFilesystem/pyfilesystem2)
* [Amazon S3 PyFilesystem](https://github.com/PyFilesystem/s3fs)
* [Google Cloud Storage PyFilesystem](https://github.com/Othoz/gcsfs)
Raw data
{
"_id": null,
"home_page": "https://github.com/andreax79/airflow-code-editor",
"name": "airflow-code-editor",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.6",
"maintainer_email": "",
"keywords": "airflow,airflow-plugin,apache-airflow,editor",
"author": "Andrea Bonomi",
"author_email": "andrea.bonomi@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/e2/c6/0a379ff9cfc50021258ced05245199366405c2816853205d514c88b92310/airflow_code_editor-7.5.0.tar.gz",
"platform": "any",
"description": "# Airflow Code Editor Plugin\nA plugin for [Apache Airflow](https://github.com/apache/airflow) that allows you to edit DAGs in browser.\nIt provides a file managing interface within specified directories and it can be used to edit, upload, and download your files.\nIf git support is enabled, the DAGs are stored in a Git repository. You may use it to view Git history, review local changes and commit.\n\n[![Build Status](https://github.com/andreax79/airflow-code-editor/workflows/Tests/badge.svg)](https://github.com/andreax79/airflow-code-editor/actions)\n[![PyPI version](https://badge.fury.io/py/airflow-code-editor.svg)](https://badge.fury.io/py/airflow-code-editor)\n[![PyPI](https://img.shields.io/pypi/pyversions/airflow-code-editor.svg)](https://pypi.org/project/airflow-code-editor)\n[![Downloads](https://static.pepy.tech/badge/airflow-code-editor/month)](https://pepy.tech/project/airflow-code-editor)\n[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)\n\n### System Requirements\n\n* Airflow Versions\n * 1.10.3 or newer\n* git Versions (git is not required if git support is disabled)\n * 2.0 or newer\n\n### Screenshots\n\n#### File Manager\n\n![File Manager](https://github.com/andreax79/airflow-code-editor/assets/1288154/6d9b09df-4503-45d9-94d4-ff013a86985a)\n\n#### Editor\n\n![Editor](https://github.com/andreax79/airflow-code-editor/assets/1288154/4ffaed29-390f-4134-bcb4-0b8fb8c59060)\n\n#### Search\n\n![Search](https://github.com/andreax79/airflow-code-editor/assets/1288154/9ba81166-3823-40ae-8820-116e4e5d2588)\n\n#### Git History\n\n![Git History](https://github.com/andreax79/airflow-code-editor/assets/1288154/2d6ec31f-3c1c-4d38-8fc6-99d18096cc64)\n\n#### Git Workspace\n\n![Git Workspace](https://github.com/andreax79/airflow-code-editor/assets/1288154/eb041a02-3f1e-47a1-b179-072d66e4662d)\n\n\n### Install Instructions\n\n#### Docker Images\n\nFor the ease of deployment, use the production-ready reference container image.\nThe image is based on the reference images for Apache Airflow.\n\nYou can find the following images there:\n* andreax79/airflow-code-editor:**latest** - the latest released Airflow Code Editor image with the latest Apache Airflow version\n* andreax79/airflow-code-editor:**2.7.0** - the latest released Airflow Code Editor with specific Airflow version\n* andreax79/airflow-code-editor:**2.7.0-7.5.0** - specific version of Airflow and Airflow Code Editor\n\n#### Installing from PyPI\n\n1. Install the plugin\n\n ```bash\n pip install airflow-code-editor\n ```\n\n2. Install optional dependencies\n\n* black - Black Python code formatter\n* fs-s3fs - S3FS Amazon S3 Filesystem\n* fs-gcsfs - Google Cloud Storage Filesystem\n* ... other filesystems supported by PyFilesystem - see https://www.pyfilesystem.org/page/index-of-filesystems/\n\n ```bash\n pip install black fs-s3fs fs-gcsfs\n ```\n\n3. Restart the Airflow Web Server\n\n4. Open Admin - DAGs Code Editor\n\n\n### Config Options\n\nYou can set options editing the Airflow's configuration file or setting environment variables.\nYou can edit your *airflow.cfg* adding any of the following settings in the \\[code_editor\\] section.\nAll the settings are optional.\n\n* **enabled** enable this plugin (default: True).\n* **git_enabled** enable git support (default: True). If git is not installed, disable this option.\n* **git_cmd** git command (path)\n* **git_default_args** git arguments added to each call (default: -c color.ui=true)\n* **git_author_name** human-readable name in the author/committer (default logged user first and last names)\n* **git_author_email** email for the author/committer (default: logged user email)\n* **git_init_repo** initialize a git repo in DAGs folder (default: True)\n* **root_directory** root folder (default: Airflow DAGs folder)\n* **line_length** Python code formatter - max line length (default: 88)\n* **string_normalization** Python code formatter - if true normalize string quotes and prefixes (default: False)\n* **mount**, **mount1**, ... configure additional folder (mount point) - format: name=xxx,path=yyy\n* **ignored_entries** comma-separated list of entries to be excluded from file/directory list (default: .\\*,\\_\\_pycache\\_\\_)\n\n```\n [code_editor]\n enabled = True\n git_enabled = True\n git_cmd = /usr/bin/git\n git_default_args = -c color.ui=true\n git_init_repo = False\n root_directory = /home/airflow/dags\n line_length = 88\n string_normalization = False\n mount = name=data,path=/home/airflow/data\n mount1 = name=logs,path=/home/airflow/logs\n mount2 = name=data,path=s3://example\n```\n\nMount Options:\n\n* **name**: mount name (destination)\n* **path**: local path or PyFilesystem FS URLs - see https://docs.pyfilesystem.org/en/latest/openers.html\n\nExample:\n* name=ftp_server,path=ftp://user:pass@ftp.example.org/private\n* name=data,path=s3://example\n* name=tmp,path=/tmp\n\nYou can also set options with the following environment variables:\n\n* AIRFLOW__CODE_EDITOR__ENABLED\n* AIRFLOW__CODE_EDITOR__GIT_ENABLED\n* AIRFLOW__CODE_EDITOR__GIT_CMD\n* AIRFLOW__CODE_EDITOR__GIT_DEFAULT_ARGS\n* AIRFLOW__CODE_EDITOR__GIT_AUTHOR_NAME\n* AIRFLOW__CODE_EDITOR__GIT_AUTHOR_EMAIL\n* AIRFLOW__CODE_EDITOR__GIT_INIT_REPO\n* AIRFLOW__CODE_EDITOR__ROOT_DIRECTORY\n* AIRFLOW__CODE_EDITOR__LINE_LENGTH\n* AIRFLOW__CODE_EDITOR__STRING_NORMALIZATION\n* AIRFLOW__CODE_EDITOR__MOUNT, AIRFLOW__CODE_EDITOR__MOUNT1, AIRFLOW__CODE_EDITOR__MOUNT2, ...\n* AIRFLOW__CODE_EDITOR__IGNORED_ENTRIES\n\nExample:\n```\n export AIRFLOW__CODE_EDITOR__STRING_NORMALIZATION=True\n export AIRFLOW__CODE_EDITOR__MOUNT='name=data,path=/home/airflow/data'\n export AIRFLOW__CODE_EDITOR__MOUNT1='name=logs,path=/home/airflow/logs'\n export AIRFLOW__CODE_EDITOR__MOUNT2='name=tmp,path=/tmp'\n```\n\n### Development Instructions\n\n1. Fork the repo\n\n2. Clone it on the local machine\n\n ```bash\n git clone https://github.com/andreax79/airflow-code-editor.git\n cd airflow-code-editor\n ```\n\n3. Create dev image\n\n ```bash\n make dev-image\n ```\n\n4. Switch node version\n\n ```bash\n nvm use\n ```\n\n5. Make changes you need. Build npm package with:\n\n ```bash\n make npm-build\n ```\n\n6. You can start Airflow webserver with:\n\n ```bash\n make webserver\n ```\n\n7. Run tests\n\n ```bash\n make test\n ```\n\n8. Commit and push changes\n\n9. Create [pull request](https://github.com/andreax79/airflow-code-editor/compare) to the original repo\n\n### Links\n\n* [Apache Airflow](https://github.com/apache/airflow)\n* [Codemirror, In-browser code editor](https://github.com/codemirror/codemirror)\n* [Git WebUI, A standalone local web based user interface for git repositories](https://github.com/alberthier/git-webui)\n* [Black, The Uncompromising Code Formatter](https://github.com/psf/black)\n* [pss, power-tool for searching source files](https://github.com/eliben/pss)\n* [Vue.js](https://github.com/vuejs/vue)\n* [Vue-good-table, data table for VueJS](https://github.com/xaksis/vue-good-table)\n* [Vue-tree, TreeView control for VueJS](https://github.com/grapoza/vue-tree)\n* [Vue-universal-modal Universal modal plugin for Vue@3](https://github.com/hoiheart/vue-universal-modal)\n* [Vue-simple-context-menu](https://github.com/johndatserakis/vue-simple-context-menu)\n* [Splitpanes](https://github.com/antoniandre/splitpanes)\n* [Axios, Promise based HTTP client for the browser and node.js](https://github.com/axios/axios)\n* [PyFilesystem2, Python's Filesystem abstraction layer](https://github.com/PyFilesystem/pyfilesystem2)\n* [Amazon S3 PyFilesystem](https://github.com/PyFilesystem/s3fs)\n* [Google Cloud Storage PyFilesystem](https://github.com/Othoz/gcsfs)\n",
"bugtrack_url": null,
"license": "Apache License 2.0",
"summary": "Apache Airflow code editor and file manager",
"version": "7.5.0",
"project_urls": {
"Bug Tracker": "http://github.com/andreax79/airflow-code-editor/issues",
"Homepage": "https://github.com/andreax79/airflow-code-editor",
"Source Code": "http://github.com/andreax79/airflow-code-editor"
},
"split_keywords": [
"airflow",
"airflow-plugin",
"apache-airflow",
"editor"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "cbd536eeb5fe462bd67dac1101529f50d9663e35df298dc45a30209e71c8d05d",
"md5": "0a7f9d653c95840c143e360b551b1120",
"sha256": "d05771ddc2743163b4a013c48c964faaed54389c8db66a3d46879417e948227c"
},
"downloads": -1,
"filename": "airflow_code_editor-7.5.0-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "0a7f9d653c95840c143e360b551b1120",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": ">=3.6",
"size": 1797556,
"upload_time": "2023-10-25T21:23:30",
"upload_time_iso_8601": "2023-10-25T21:23:30.301823Z",
"url": "https://files.pythonhosted.org/packages/cb/d5/36eeb5fe462bd67dac1101529f50d9663e35df298dc45a30209e71c8d05d/airflow_code_editor-7.5.0-py2.py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "e2c60a379ff9cfc50021258ced05245199366405c2816853205d514c88b92310",
"md5": "00296324de94235520bc676669bca312",
"sha256": "4652d2c3ef475ed42a078bc8d222707c1deb77e314c268d3f08774bc283f3ea1"
},
"downloads": -1,
"filename": "airflow_code_editor-7.5.0.tar.gz",
"has_sig": false,
"md5_digest": "00296324de94235520bc676669bca312",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.6",
"size": 1558059,
"upload_time": "2023-10-25T21:23:31",
"upload_time_iso_8601": "2023-10-25T21:23:31.987738Z",
"url": "https://files.pythonhosted.org/packages/e2/c6/0a379ff9cfc50021258ced05245199366405c2816853205d514c88b92310/airflow_code_editor-7.5.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-10-25 21:23:31",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "andreax79",
"github_project": "airflow-code-editor",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [],
"lcname": "airflow-code-editor"
}