Skip to content

Commit

Permalink
documentation added
Browse files Browse the repository at this point in the history
  • Loading branch information
dapper91 committed Aug 23, 2019
1 parent a966181 commit 6fb319c
Show file tree
Hide file tree
Showing 17 changed files with 1,217 additions and 39 deletions.
87 changes: 52 additions & 35 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ paxb


Python Architecture for XML Binding
===================================
-----------------------------------

paxb is a library that provides an API for mapping between XML documents and Python objects.

Expand All @@ -33,7 +33,7 @@ API can be mixed together.


Installation
============
------------

You can install paxb with pip:

Expand All @@ -43,22 +43,28 @@ You can install paxb with pip:
Requirements
============
------------

- `attrs <https://www.attrs.org/en/stable/index.html>`_


Documentation
-------------

Documentation is available at `Read the Docs <https://paxb.readthedocs.io/en/latest/>`_.


Quick start
===========

user.xml:
Suppose you have an xml document ``user.xml``:

.. code-block:: xml
<?xml version="1.0" encoding="utf-8"?>
<doc:envelope xmlns="http://www.test.org"
xmlns:doc="http://www.test1.org">
<doc:user name="Alexey" surname="Ivanov" age="26">
<doc:user name="Alex" surname="Ivanov" age="26">
<doc:birthdate year="1992" month="06" day="14"/>
Expand Down Expand Up @@ -87,13 +93,16 @@ user.xml:
</doc:envelope>
main.py:
To deserialize the document you could use `XML Processing Modules <https://docs.python.org/3/library/xml.html>`_
python standard libraryr api to parse the document and then set the corresponding class fields. Such an imperative
code has a lot of boilerplate manipulations. Instead you can use paxb api to write declarative style code. All you
need to describe field mappings and types, paxb will serialize and deserialize data for you:

.. code-block:: python
import json
import re
from datetime import date
from pprint import pprint
import attr
import paxb as pb
Expand All @@ -112,19 +121,19 @@ main.py:
surname = pb.attr()
age = pb.attr(converter=int)
birth_year = pb.wrap('birthdate', pb.attr('year', converter=int))
birth_month = pb.wrap('birthdate', pb.attr('month', converter=int))
birth_day = pb.wrap('birthdate', pb.attr('day', converter=int))
_birth_year = pb.wrap('birthdate', pb.attr('year', converter=int))
_birth_month = pb.wrap('birthdate', pb.attr('month', converter=int))
_birth_day = pb.wrap('birthdate', pb.attr('day', converter=int))
@property
def birthdate(self):
return date(year=self.birth_year, month=self.birth_month, day=self.birth_day)
return date(year=self._birth_year, month=self._birth_month, day=self._birth_day)
@birthdate.setter
def birthdate(self, value):
self.birth_year = value.year
self.birth_month = value.month
self.birth_day = value.day
self._birth_year = value.year
self._birth_month = value.month
self._birth_day = value.day
phone = pb.wrap('contacts', pb.field())
emails = pb.wrap('contacts', pb.as_list(pb.field(name='email')))
Expand All @@ -143,44 +152,52 @@ main.py:
if not re.match(r'\+\d{11,13}', value):
raise ValueError("phone number is incorrect")
with open('user.xml') as file:
xml = file.read()
Then the deserialized object can be modified and serialized back to xml document or converted to json format:

.. code-block:: python
try:
user = pb.from_xml(User, xml, envelope='doc:envelope', ns_map={'doc': 'http://www.test1.org'})
user.birthdate = user.birthdate.replace(year=1993)
pprint(attr.asdict(user))
with open('user.json') as file:
json.dump(attr.asdict(user), file)
except (pb.exc.DeserializationError, ValueError) as e:
print(f"deserialization error: {e}")
output:
``user.json``:

.. code-block:: python
.. code-block:: json
{
'age': 26,
'birth_day': 14,
'birth_month': 6,
'birth_year': 1993,
'citizenship': 'RU',
'emails': ['alex@gmail.com', 'alex@mail.ru'],
'name': 'Alexey',
'occupations': [
"age": 26,
"birth_day": 14,
"birth_month": 6,
"birth_year": 1993,
"citizenship": "RU",
"emails": ["alex@gmail.com", "alex@mail.ru"],
"name": "Alexey",
"occupations": [
{
'address': 'Moscow',
'employees': 8854,
'title': 'yandex'
"address": "Moscow",
"employees": 8854,
"title": "yandex"
},
{
'address': 'Yekaterinburg',
'employees': 7742,
'title': 'skbkontur'
"address": "Yekaterinburg",
"employees": 7742,
"title": "skbkontur"
}
],
'passport_number': '836815',
'passport_series': '3127',
'phone': '+79204563539',
'surname': 'Ivanov'
"passport_number": "836815",
"passport_series": "3127",
"phone": "+79204563539",
"surname": "Ivanov"
}
20 changes: 20 additions & 0 deletions docs/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Minimal makefile for Sphinx documentation
#

# You can set these variables from the command line, and also
# from the environment for the first two.
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)
60 changes: 60 additions & 0 deletions docs/conf.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
# Configuration file for the Sphinx documentation builder.
#
# This file only contains 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 = 'paxb'
copyright = '2019, Dmitry Pershin'
author = 'Dmitry Pershin'

# The full version, including alpha/beta/rc tags
release = '0.1.0'


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

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

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

# 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']


# -- 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'

# 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']


# The master toctree document.
master_doc = 'index'
64 changes: 64 additions & 0 deletions docs/index.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
.. paxb documentation master file, created by
sphinx-quickstart on Wed Aug 14 22:29:04 2019.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
paxb: Python Architecture for XML Binding
=========================================

.. image:: https://travis-ci.org/dapper91/paxb.svg?branch=master
:target: https://travis-ci.org/dapper91/paxb
:alt: Build status
.. image:: https://img.shields.io/pypi/l/paxb.svg
:target: https://pypi.org/project/paxb
:alt: License
.. image:: https://img.shields.io/pypi/pyversions/paxb.svg
:target: https://pypi.org/project/paxb
:alt: Supported Python versions


paxb is a library that provides an API for mapping between XML documents and Python objects.

paxb library implements the following functionality:

- :doc:`Deserialize <paxb/deserialization>` XML documents to Python objects
- Validate deserialized fields
- Access and update Python object fields
- :doc:`Serialize <paxb/serialization>` Python objects to XML documents

paxb provides an efficient way of mapping between an XML document and a Python object. Using paxb
developers can write less boilerplate code emphasizing on application domain logic.

As soon as paxb is based on `attrs <https://www.attrs.org/en/stable/index.html>`_ library paxb and attrs
API can be :doc:`mixed <paxb/attrs>` together.


Requirements
------------

- `attrs <https://www.attrs.org/en/stable/index.html>`_


The User Guide
--------------

.. toctree::
:maxdepth: 2

paxb/installation
paxb/quickstart
paxb/binding
paxb/serialization
paxb/deserialization
paxb/namespaces
paxb/errors
paxb/attrs


The API Documentation
---------------------

.. toctree::
:maxdepth: 2

paxb/api
35 changes: 35 additions & 0 deletions docs/make.bat
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
@ECHO OFF

pushd %~dp0

REM Command file for Sphinx documentation

if "%SPHINXBUILD%" == "" (
set SPHINXBUILD=sphinx-build
)
set SOURCEDIR=.
set BUILDDIR=_build

if "%1" == "" goto help

%SPHINXBUILD% >NUL 2>NUL
if errorlevel 9009 (
echo.
echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
echo.installed, then set the SPHINXBUILD environment variable to point
echo.to the full path of the 'sphinx-build' executable. Alternatively you
echo.may add the Sphinx directory to PATH.
echo.
echo.If you don't have Sphinx installed, grab it from
echo.http://sphinx-doc.org/
exit /b 1
)

%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
goto end

:help
%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%

:end
popd
34 changes: 34 additions & 0 deletions docs/paxb/api.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
.. _api:

Developer Interface
===================

.. currentmodule:: paxb


.. automodule:: paxb


Binding
-------

.. autodecorator:: model
.. autofunction:: attribute
.. autofunction:: field
.. autofunction:: nested
.. autofunction:: as_list
.. autofunction:: wrapper


Serialization/Deserialization
-----------------------------

.. autofunction:: from_xml
.. autofunction:: to_xml


Exceptions
----------

.. automodule:: paxb.exceptions
:members:

0 comments on commit 6fb319c

Please sign in to comment.