Metadata-Version: 2.1
Name: notoma
Version: 0.2
Summary: Write your blog articles in Notion. Notoma converts your Notion database pages to Markdown files.
Home-page: https://github.com/xnutsive/notoma/
Author: Nate Gadzhibalaev
Author-email: nate@respawn.io
License: Apache Software License 2.0
Project-URL: Documentation, https://xnutsive.github.io/notoma/
Project-URL: Source Code, https://github.com/xnutsive/notoma/
Platform: UNKNOWN
Classifier: Development Status :: 4 - Beta
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Typing :: Typed
Requires-Python: >=3.6
Description-Content-Type: text/markdown
Requires-Dist: beautifulsoup4 (==4.9.1)
Requires-Dist: bs4 (==0.0.1)
Requires-Dist: cached-property (==1.5.1)
Requires-Dist: certifi (==2020.4.5.1)
Requires-Dist: chardet (==3.0.4)
Requires-Dist: click (==7.1.2)
Requires-Dist: commonmark (==0.9.1)
Requires-Dist: dictdiffer (==0.8.1)
Requires-Dist: idna (==2.9)
Requires-Dist: jinja2 (==3.0.0a1)
Requires-Dist: markupsafe (==2.0.0a1)
Requires-Dist: notion (==0.0.25)
Requires-Dist: python-dotenv (==0.13.0)
Requires-Dist: python-slugify (==4.0.0)
Requires-Dist: pytz (==2020.1)
Requires-Dist: requests (==2.23.0)
Requires-Dist: soupsieve (==2.0.1)
Requires-Dist: text-unidecode (==1.3)
Requires-Dist: tzlocal (==2.1)
Requires-Dist: urllib3 (==1.25.9)
Provides-Extra: dev
Requires-Dist: appdirs (==1.4.4) ; extra == 'dev'
Requires-Dist: async-generator (==1.10) ; extra == 'dev'
Requires-Dist: attrs (==19.3.0) ; extra == 'dev'
Requires-Dist: backcall (==0.1.0) ; extra == 'dev'
Requires-Dist: black (==19.10b0) ; extra == 'dev'
Requires-Dist: bleach (==3.1.5) ; extra == 'dev'
Requires-Dist: certifi (==2020.4.5.1) ; extra == 'dev'
Requires-Dist: cfgv (==3.1.0) ; extra == 'dev'
Requires-Dist: chardet (==3.0.4) ; extra == 'dev'
Requires-Dist: click (==7.1.2) ; extra == 'dev'
Requires-Dist: decorator (==4.4.2) ; extra == 'dev'
Requires-Dist: defusedxml (==0.7.0rc1) ; extra == 'dev'
Requires-Dist: distlib (==0.3.0) ; extra == 'dev'
Requires-Dist: docutils (==0.16) ; extra == 'dev'
Requires-Dist: entrypoints (==0.3) ; extra == 'dev'
Requires-Dist: filelock (==3.0.12) ; extra == 'dev'
Requires-Dist: flake8 (==3.8.1) ; extra == 'dev'
Requires-Dist: identify (==1.4.15) ; extra == 'dev'
Requires-Dist: idna (==2.9) ; extra == 'dev'
Requires-Dist: ipykernel (==5.3.0) ; extra == 'dev'
Requires-Dist: ipython-genutils (==0.2.0) ; extra == 'dev'
Requires-Dist: ipython (==7.14.0) ; extra == 'dev'
Requires-Dist: ipywidgets (==8.0.0a0) ; extra == 'dev'
Requires-Dist: jedi (==0.17.0) ; extra == 'dev'
Requires-Dist: jinja2 (==3.0.0a1) ; extra == 'dev'
Requires-Dist: jsonschema (==3.2.0) ; extra == 'dev'
Requires-Dist: jupyter-client (==6.1.3) ; extra == 'dev'
Requires-Dist: jupyter-console (==6.1.0) ; extra == 'dev'
Requires-Dist: jupyter-contrib-core (==0.3.3) ; extra == 'dev'
Requires-Dist: jupyter-contrib-nbextensions (==0.5.1) ; extra == 'dev'
Requires-Dist: jupyter-core (==4.6.3) ; extra == 'dev'
Requires-Dist: jupyter-highlight-selected-word (==0.2.0) ; extra == 'dev'
Requires-Dist: jupyter-latex-envs (==1.4.6) ; extra == 'dev'
Requires-Dist: jupyter-nbextensions-configurator (==0.4.1) ; extra == 'dev'
Requires-Dist: jupyter (==1.0.0) ; extra == 'dev'
Requires-Dist: jupyterlab-pygments (==0.1.1) ; extra == 'dev'
Requires-Dist: keyring (==21.2.1) ; extra == 'dev'
Requires-Dist: lxml (==4.5.1) ; extra == 'dev'
Requires-Dist: markupsafe (==2.0.0a1) ; extra == 'dev'
Requires-Dist: mccabe (==0.6.1) ; extra == 'dev'
Requires-Dist: mistune (==0.8.4) ; extra == 'dev'
Requires-Dist: nbclient (==0.3.1) ; extra == 'dev'
Requires-Dist: nbconvert (==6.0.0a1) ; extra == 'dev'
Requires-Dist: nbexec (==0.1.0) ; extra == 'dev'
Requires-Dist: nbformat (==5.0.6) ; extra == 'dev'
Requires-Dist: nest-asyncio (==1.3.3) ; extra == 'dev'
Requires-Dist: nodeenv (==1.3.5) ; extra == 'dev'
Requires-Dist: notebook (==6.0.3) ; extra == 'dev'
Requires-Dist: packaging (==20.4) ; extra == 'dev'
Requires-Dist: pandocfilters (==1.4.2) ; extra == 'dev'
Requires-Dist: parso (==0.7.0) ; extra == 'dev'
Requires-Dist: pathspec (==0.8.0) ; extra == 'dev'
Requires-Dist: pickleshare (==0.7.5) ; extra == 'dev'
Requires-Dist: pkginfo (==1.5.0.1) ; extra == 'dev'
Requires-Dist: pre-commit (==2.4.0) ; extra == 'dev'
Requires-Dist: prometheus-client (==0.7.1) ; extra == 'dev'
Requires-Dist: prompt-toolkit (==3.0.5) ; extra == 'dev'
Requires-Dist: pycodestyle (==2.6.0) ; extra == 'dev'
Requires-Dist: pyflakes (==2.2.0) ; extra == 'dev'
Requires-Dist: pygments (==2.6.1) ; extra == 'dev'
Requires-Dist: pyparsing (==3.0.0a1) ; extra == 'dev'
Requires-Dist: pyrsistent (==0.16.0) ; extra == 'dev'
Requires-Dist: python-dateutil (==2.8.1) ; extra == 'dev'
Requires-Dist: pyyaml (==5.3.1) ; extra == 'dev'
Requires-Dist: pyzmq (==19.0.1) ; extra == 'dev'
Requires-Dist: qtconsole (==4.7.4) ; extra == 'dev'
Requires-Dist: qtpy (==1.9.0) ; extra == 'dev'
Requires-Dist: readme-renderer (==26.0) ; extra == 'dev'
Requires-Dist: regex (==2020.5.14) ; extra == 'dev'
Requires-Dist: requests-toolbelt (==0.9.1) ; extra == 'dev'
Requires-Dist: requests (==2.23.0) ; extra == 'dev'
Requires-Dist: send2trash (==1.5.0) ; extra == 'dev'
Requires-Dist: six (==1.14.0) ; extra == 'dev'
Requires-Dist: terminado (==0.8.3) ; extra == 'dev'
Requires-Dist: testpath (==0.4.4) ; extra == 'dev'
Requires-Dist: toml (==0.10.1) ; extra == 'dev'
Requires-Dist: tornado (==6.0.4) ; extra == 'dev'
Requires-Dist: tqdm (==4.46.0) ; extra == 'dev'
Requires-Dist: traitlets (==4.3.3) ; extra == 'dev'
Requires-Dist: twine (==3.1.1) ; extra == 'dev'
Requires-Dist: typed-ast (==1.4.1) ; extra == 'dev'
Requires-Dist: urllib3 (==1.25.9) ; extra == 'dev'
Requires-Dist: virtualenv (==20.0.21) ; extra == 'dev'
Requires-Dist: wcwidth (==0.1.9) ; extra == 'dev'
Requires-Dist: webencodings (==0.5.1) ; extra == 'dev'
Requires-Dist: widgetsnbextension (==4.0.0a0) ; extra == 'dev'
Requires-Dist: zipp (==3.1.0) ; extra == 'dev'
Requires-Dist: ptyprocess (==0.6.0) ; (os_name != "nt") and extra == 'dev'
Requires-Dist: importlib-metadata (==1.6.0) ; (python_version < "3.8") and extra == 'dev'
Requires-Dist: pexpect (==4.8.0) ; (sys_platform != "win32") and extra == 'dev'
Requires-Dist: appnope (==0.1.0) ; (sys_platform == "darwin") and extra == 'dev'

<!--
THIS FILE IS AUTOGENERATED, DON'T EDIT.
File to edit instead: notebooks/index.ipynb
-->

# Notoma

Write articles for your static gen blog in Notion.



<a href="https://codeclimate.com/github/xnutsive/notoma/maintainability"><img src="https://api.codeclimate.com/v1/badges/70943357e5d2c54c153a/maintainability" /></a>
<a href="https://pypi.org/project/notoma/"><img src="https://img.shields.io/pypi/v/notoma" alt="pypi" /></a>
![Linters](https://github.com/xnutsive/notoma/workflows/Linters/badge.svg)

- [Documentation website](https://xnutsive.github.io/notoma/)
    - [Using the CLI](https://xnutsive.github.io/notoma/using-the-cli)
    - [Contributing](https://xnutsive.github.io/notoma/contributing)
    - [Supported Markdown Tags](https://xnutsive.github.io/notoma/supported-markdown-tags) 

---
## Install

Notoma is available via Pip ~~and Homebrew~~: 

```bash
# Installing with pip, use this if you plan using Notoma as a python library.
pip install notoma
```

---
## What can you do with Notoma
Notoma provides commands to: 
- Convert contents of your Notion Blog database to a bunch of Markdown files.
- *Coming soon*: Watch Notion Blog database for updates and regenerate Markdown files on any updates.
- *Coming soon*: Create a new Notion database for your Blog with all required fields.

Basic usage example: this command will convert only published posts from a Notion blog database to the `./posts/ directory`.

```bash
notoma convert --dest ./posts/
```

This example assumes that you have a `.env` config file with authentication and blog url parameters in it.

#### Authenticating in Notion

Notoma uses an internal Notion API, and that, unfortunately, requires you to provide an authentication token `token_v2` that you can find in your notion.so cookes.

You can provide `token_v2` option to every command line call, or store it in your environment, or [`.env` config file](.env.sample).

---
## Notion database structure
Notoma has very few expectations about how your Notion is structured. Here's a [public example database](https://www.notion.so/respawn/7b46cea379bd4d45b68860c2fa35a2d4?v=b4609f6aae0d4fc1adc65a73f72d0e21).

Notoma requires that your Notion blog database has the following **properties**:
- **Published**: whether the article is published, or is still a draft
- **Title**: Will be used to create a file name for that article's Markdown equivalent file. *Won't be used in the article itself.*

Notoma tries to parse other properties and add them as front matter into the resulting Markdown articles: 
- **Published at** will be used as publicataion date for the article, if present.
- **Categories** will be used as `categories` front matter key, so it's expected to be a **multiple choice** propery.



