Redashで使われているPythonモジュールメモ

Redashのコードを追うときに知っておくとよさそうなモジュールを個人的にメモ。

コミットIDは以下のもので調べたので。バージョン違いなどで差異があると思う。

github.com

依存関係を調べる

requirements.txt を読んでいってもいいけど、 pipdeptree が便利そうだったので使った。

github.com

$ pipdeptree
celery==3.1.23
  - billiard [required: >=3.3.0.23,<3.4, installed: 3.3.0.23]
  - kombu [required: <3.1,>=3.0.34, installed: 3.0.37]
    - amqp [required: >=1.4.9,<2.0, installed: 1.4.9]
    - anyjson [required: >=0.3.3, installed: 0.3.3]
  - pytz [required: >dev, installed: 2016.7]
Flask-Admin==1.4.2
  - Flask [required: >=0.7, installed: 0.11.1]
    - click [required: >=2.0, installed: 6.6]
    - itsdangerous [required: >=0.21, installed: 0.24]
    - Jinja2 [required: >=2.4, installed: 2.8]
      - MarkupSafe [required: Any, installed: 0.23]
    - Werkzeug [required: >=0.7, installed: 0.11.11]
  - wtforms [required: Any, installed: 2.1]
Flask-Limiter==0.9.3
  - Flask [required: >=0.8, installed: 0.11.1]
    - click [required: >=2.0, installed: 6.6]
    - itsdangerous [required: >=0.21, installed: 0.24]
    - Jinja2 [required: >=2.4, installed: 2.8]
      - MarkupSafe [required: Any, installed: 0.23]
    - Werkzeug [required: >=0.7, installed: 0.11.11]
  - limits [required: Any, installed: 1.2.1]
    - six [required: >=1.4.1, installed: 1.10.0]
  - six [required: >=1.4.1, installed: 1.10.0]
Flask-Login==0.4.0
  - Flask [required: Any, installed: 0.11.1]
    - click [required: >=2.0, installed: 6.6]
    - itsdangerous [required: >=0.21, installed: 0.24]
    - Jinja2 [required: >=2.4, installed: 2.8]
      - MarkupSafe [required: Any, installed: 0.23]
    - Werkzeug [required: >=0.7, installed: 0.11.11]
Flask-Mail==0.9.1
  - blinker [required: Any, installed: 1.3]
  - Flask [required: Any, installed: 0.11.1]
    - click [required: >=2.0, installed: 6.6]
    - itsdangerous [required: >=0.21, installed: 0.24]
    - Jinja2 [required: >=2.4, installed: 2.8]
      - MarkupSafe [required: Any, installed: 0.23]
    - Werkzeug [required: >=0.7, installed: 0.11.11]
Flask-Migrate==2.0.1
  - alembic [required: >=0.6, installed: 0.9.6]
    - Mako [required: Any, installed: 1.0.7]
      - MarkupSafe [required: >=0.9.2, installed: 0.23]
    - python-dateutil [required: Any, installed: 2.4.2]
      - six [required: >=1.5, installed: 1.10.0]
    - python-editor [required: >=0.3, installed: 1.0.3]
    - SQLAlchemy [required: >=0.7.6, installed: 1.1.4]
  - Flask [required: >=0.9, installed: 0.11.1]
    - click [required: >=2.0, installed: 6.6]
    - itsdangerous [required: >=0.21, installed: 0.24]
    - Jinja2 [required: >=2.4, installed: 2.8]
      - MarkupSafe [required: Any, installed: 0.23]
    - Werkzeug [required: >=0.7, installed: 0.11.11]
  - Flask-Script [required: >=0.6, installed: 2.0.6]
    - Flask [required: Any, installed: 0.11.1]
      - click [required: >=2.0, installed: 6.6]
      - itsdangerous [required: >=0.21, installed: 0.24]
      - Jinja2 [required: >=2.4, installed: 2.8]
        - MarkupSafe [required: Any, installed: 0.23]
      - Werkzeug [required: >=0.7, installed: 0.11.11]
  - Flask-SQLAlchemy [required: >=1.0, installed: 2.1]
    - Flask [required: >=0.10, installed: 0.11.1]
      - click [required: >=2.0, installed: 6.6]
      - itsdangerous [required: >=0.21, installed: 0.24]
      - Jinja2 [required: >=2.4, installed: 2.8]
        - MarkupSafe [required: Any, installed: 0.23]
      - Werkzeug [required: >=0.7, installed: 0.11.11]
    - SQLAlchemy [required: >=0.7, installed: 1.1.4]
Flask-OAuthlib==0.9.3
  - Flask [required: Any, installed: 0.11.1]
    - click [required: >=2.0, installed: 6.6]
    - itsdangerous [required: >=0.21, installed: 0.24]
    - Jinja2 [required: >=2.4, installed: 2.8]
      - MarkupSafe [required: Any, installed: 0.23]
    - Werkzeug [required: >=0.7, installed: 0.11.11]
  - oauthlib [required: >=0.6.2, installed: 2.0.6]
  - requests-oauthlib [required: >=0.5.0, installed: 0.8.0]
    - oauthlib [required: >=0.6.2, installed: 2.0.6]
    - requests [required: >=2.0.0, installed: 2.11.1]
Flask-RESTful==0.3.5
  - aniso8601 [required: >=0.82, installed: 1.1.0]
    - python-dateutil [required: Any, installed: 2.4.2]
      - six [required: >=1.5, installed: 1.10.0]
  - Flask [required: >=0.8, installed: 0.11.1]
    - click [required: >=2.0, installed: 6.6]
    - itsdangerous [required: >=0.21, installed: 0.24]
    - Jinja2 [required: >=2.4, installed: 2.8]
      - MarkupSafe [required: Any, installed: 0.23]
    - Werkzeug [required: >=0.7, installed: 0.11.11]
  - pytz [required: Any, installed: 2016.7]
  - six [required: >=1.3.0, installed: 1.10.0]
Flask-SSLify==0.1.5
  - Flask [required: Any, installed: 0.11.1]
    - click [required: >=2.0, installed: 6.6]
    - itsdangerous [required: >=0.21, installed: 0.24]
    - Jinja2 [required: >=2.4, installed: 2.8]
      - MarkupSafe [required: Any, installed: 0.23]
    - Werkzeug [required: >=0.7, installed: 0.11.11]
funcy==1.7.1
gunicorn==19.7.1
honcho==0.5.0
httplib2==0.10.3
jsonschema==2.4.0
parsedatetime==2.1
passlib==1.6.2
pipdeptree==0.10.1
  - pip [required: >=6.0.0, installed: 9.0.1]
psycopg2==2.7.3.2
pysaml2==2.4.0
  - argparse [required: Any, installed: 1.1]
  - decorator [required: Any, installed: 4.1.2]
  - paste [required: Any, installed: 2.0.3]
    - six [required: >=1.4.0, installed: 1.10.0]
  - pycrypto [required: >=2.2, installed: 2.6.1]
  - pyOpenSSL [required: Any, installed: 16.2.0]
    - cryptography [required: >=1.3.4, installed: 2.0.2]
      - asn1crypto [required: >=0.21.0, installed: 0.24.0]
      - cffi [required: >=1.7, installed: 1.11.2]
        - pycparser [required: Any, installed: 2.18]
      - enum34 [required: Any, installed: 1.1.6]
      - idna [required: >=2.1, installed: 2.6]
      - ipaddress [required: Any, installed: 1.0.19]
      - six [required: >=1.4.1, installed: 1.10.0]
    - six [required: >=1.5.2, installed: 1.10.0]
  - python-dateutil [required: Any, installed: 2.4.2]
    - six [required: >=1.5, installed: 1.10.0]
  - pytz [required: Any, installed: 2016.7]
  - repoze.who [required: Any, installed: 2.3]
    - setuptools [required: Any, installed: 38.2.5]
    - WebOb [required: Any, installed: 1.7.4]
    - zope.interface [required: Any, installed: 4.4.3]
      - setuptools [required: Any, installed: 38.2.5]
  - requests [required: >=1.0.0, installed: 2.11.1]
  - zope.interface [required: Any, installed: 4.4.3]
    - setuptools [required: Any, installed: 38.2.5]
pystache==0.5.4
raven==6.0.0
  - contextlib2 [required: Any, installed: 0.5.5]
redis==2.10.5
RestrictedPython==3.6.0
  - setuptools [required: Any, installed: 38.2.5]
semver==2.2.1
simplejson==3.10.0
sqlparse==0.1.8
statsd==2.1.2
wheel==0.24.0
XlsxWriter==0.9.3

(自分にとって)重要そうなモジュール

Flask

github.com

WebアプリケーションフレームワークDjangoと並んで有名なのでよく使われている印象。

Redashのサーバーサイドで使われている。

Jinja2

github.com

Redashのサーバーサイドのテンプレートエンジン。

Click

github.com

CLI作成ツール。RedashのCLIでも使われている。

Flaskと同じ作者だったはず。

SQLAlchemy

github.com

DB周りのいろいろ+ORM。Redashでは以前Peeweeが使われていたけど今はこっち。

Alembic

bitbucket.org

DBマイグレーションツール。SQLAlchemyと作者が同じっぽい。

Gunicorn

github.com

WSGIに対応したアプリケーションサーバー。Flaskはこの上で動いている。

Celery

github.com

タスクキュー。RedashのクエリはすべてCelery上で動く。

pystache

github.com

MustacheのPython実装。Redashではクエリにパラメータを埋め込むときに使われている。

RestrictedPython

github.com

制限付きのPythonを実行するためのモジュール。Pythonデータソースで使われている。

まとめ

データソースに関わるもの以外では、だいたいこなれたモジュールが使われていて、コードを読もうとしたらそれなりに読めるしわかる。というのもRedashの良さの一つかもしれない。

Python ライブラリ厳選レシピ

Python ライブラリ厳選レシピ