Skip to content

Commit

Permalink
We should open source aiodynamo (#5)
Browse files Browse the repository at this point in the history
Add some documentation, move to poetry for build system.
  • Loading branch information
ojii authored Mar 4, 2019
1 parent 04a62c1 commit 81b6f98
Show file tree
Hide file tree
Showing 19 changed files with 460 additions and 46 deletions.
10 changes: 5 additions & 5 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,15 @@ jobs:
DYNAMODB_URL: http://localhost:8000
AWS_ACCESS_KEY_ID: dummy
AWS_SECRET_ACCESS_KEY: dummy
- image: ojii/dynamodb-local:latest
- image: dimaqq/dynalite:latest
working_directory: /home/ubuntu/aiodynamo
steps:
- checkout
- run: pip install -e .
- run: pip install -r tests/requirements.txt
- run: pip install poetry
- run: poetry install
- run: find . -regex '.*__pycache__.*' -delete
- run: pytest --verbose --cov=aiodynamo --cov-report html:reports/coverage/ --junitxml=reports/results/junit.xml
- run: black --check src/ tests/ setup.py
- run: poetry run pytest --verbose --cov=aiodynamo --cov-report html:reports/coverage/ --junitxml=reports/results/junit.xml
- run: poetry run black --check src/ tests/
- store_artifacts:
path: reports/coverage/
destination: reports
Expand Down
8 changes: 0 additions & 8 deletions .circleci/dockerfiles/dynamodb-local/Dockerfile

This file was deleted.

13 changes: 13 additions & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
Copyright 2019 HENNGE K.K.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
19 changes: 19 additions & 0 deletions docs/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Minimal makefile for Sphinx documentation
#

# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = sphinx-build
SOURCEDIR = .
BUILDDIR = _build

# Put it first so that "make" without argument is like "make help".
help:
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

.PHONY: help Makefile

# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
9 changes: 9 additions & 0 deletions docs/changelog.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
Changelog
=========

19.2
----

Release Date: Not Released Yet

* Initial public release
76 changes: 76 additions & 0 deletions docs/concepts.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
Concepts
========

Main differences to aiobotocore
-------------------------------

Pythonic Argument Names
~~~~~~~~~~~~~~~~~~~~~~~

In aiobotocore, all parameters names are camel cased, in aiodynamo they follow the standard Python practice of lowercased
names with underscores.

Autopagination
~~~~~~~~~~~~~~

DynamoDB APIs that return a paginated result, such as ``scan``, ``query`` or ``count`` are automatically paginated in
aiodynamo and return asynchronous iterators over the whole result set instead.

Empty String Safe
~~~~~~~~~~~~~~~~~

DynamoDB APIs will return an error if an item contains an empty string as a value anywhere. aiodynamo removes these
values automatically.

Optional Arguments Allowed
~~~~~~~~~~~~~~~~~~~~~~~~~~

aiobotocore does not allow you to specify empty optional keyword arguments, any keyword argument given must contain a
value, not ``None``. This is not how Python usually works so aiodynamo allows you to call APIs with optional keyword
arguments set to ``None`` or other empty values.

Example, ``get_item(key, projection=None)`` is allowed in aiodynamo, but would raise an error in aiobotocore.

Typed Objects instead of Dictionaries
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Almost every argument to aiobotocore DynamoDB APIs are dictionaries which often require very specific keys and values.
In aiodynamo, you create instances of objects and pass those to the APIs.

Compare the following two calls::

# aiobotocore
create_table(
TableName="name",
KeySchema=[
{
"AttributeName": "key",
"AttributeType": "HASH"
}
],
AttributeDefinitions=[
{
"AttributeName": "key",
"AttributeType": "S"
}
],
ProvisionedThroughput={
"ReadCapacityUnits": 1,
"WriteCapacityUnits": 2
}
)

# aiodynamo
create_table(
name="name",
keys=KeySchema(
hash_key=KeySpec(
name="key",
type=KeyType.string
)
),
throughput=Throughput(
read=1,
write=2
)
)
171 changes: 171 additions & 0 deletions docs/conf.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
# -*- coding: utf-8 -*-
#
# Configuration file for the Sphinx documentation builder.
#
# This file does only contain a selection of the most common options. For a
# full list see the documentation:
# http://www.sphinx-doc.org/en/master/config

# -- Path setup --------------------------------------------------------------

# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#
# import os
# import sys
# sys.path.insert(0, os.path.abspath('.'))


# -- Project information -----------------------------------------------------

project = "aiodynamo"
copyright = "2019, HENNGE K.K"
author = "HENNGE K.K"

# The short X.Y version
version = ""
# The full version, including alpha/beta/rc tags
release = "19.2"


# -- General configuration ---------------------------------------------------

# If your documentation needs a minimal Sphinx version, state it here.
#
# needs_sphinx = '1.0'

# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = []

# Add any paths that contain templates here, relative to this directory.
templates_path = ["_templates"]

# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
#
# source_suffix = ['.rst', '.md']
source_suffix = ".rst"

# The master toctree document.
master_doc = "index"

# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = None

# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# This pattern also affects html_static_path and html_extra_path.
exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"]

# The name of the Pygments (syntax highlighting) style to use.
pygments_style = None


# -- Options for HTML output -------------------------------------------------

# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
#
html_theme = "alabaster"

# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#
# html_theme_options = {}

# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ["_static"]

# Custom sidebar templates, must be a dictionary that maps document names
# to template names.
#
# The default sidebars (for documents that don't match any pattern) are
# defined by theme itself. Builtin themes are using these templates by
# default: ``['localtoc.html', 'relations.html', 'sourcelink.html',
# 'searchbox.html']``.
#
# html_sidebars = {}


# -- Options for HTMLHelp output ---------------------------------------------

# Output file base name for HTML help builder.
htmlhelp_basename = "aiodynamodoc"


# -- Options for LaTeX output ------------------------------------------------

latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
#
# 'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
#
# 'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
#
# 'preamble': '',
# Latex figure (float) alignment
#
# 'figure_align': 'htbp',
}

# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
(master_doc, "aiodynamo.tex", "aiodynamo Documentation", "HENNGE K.K", "manual")
]


# -- Options for manual page output ------------------------------------------

# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [(master_doc, "aiodynamo", "aiodynamo Documentation", [author], 1)]


# -- Options for Texinfo output ----------------------------------------------

# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
(
master_doc,
"aiodynamo",
"aiodynamo Documentation",
author,
"aiodynamo",
"One line description of project.",
"Miscellaneous",
)
]


# -- Options for Epub output -------------------------------------------------

# Bibliographic Dublin Core info.
epub_title = project

# The unique identifier of the text. This can be a ISBN number
# or the project homepage.
#
# epub_identifier = ''

# A unique identification for the text.
#
# epub_uid = ''

# A list of files that should not be packed into the epub file.
epub_exclude_files = ["search.html"]
21 changes: 21 additions & 0 deletions docs/development.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
Development
===========

aiodynamo uses `poetry`_ to manage dependencies, make sure you have it installed.

After a git clone, run ``poetry install`` to install the dependencies, including the development dependencies.

To run the tests run ``poetry run pytests``. To also run the integration tests, set ``DYNAMODB_URL`` to the endpoint
of your DynamoDB instance. We recommend you use `dynalite`_ for local testing. You also need to set ``AWS_ACCESS_KEY_ID``
and ``AWS_SECRET_ACCESS_KEY``.

To build the documentation, enter the ``docs/`` directory and run ``poetry run make html``.


Releasing
---------

Run `poetry build -fwheel` to create a wheel, then `twine upload dist/aiodynamo-<version>-py3-none-any.whl`.

.. _poetry: https://poetry.eustace.io/
.. _dynalite: https://github.com/mhart/dynalite
24 changes: 24 additions & 0 deletions docs/index.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
.. aiodynamo documentation master file, created by
sphinx-quickstart on Thu Feb 28 12:18:09 2019.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
Welcome to aiodynamo's documentation!
=====================================

.. toctree::
:maxdepth: 2

quickstart
concepts
development
changelog



Indices and tables
==================

* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`
Loading

0 comments on commit 81b6f98

Please sign in to comment.