..  # This file is part of py-serializable
    #
    # 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.
    #
    # SPDX-License-Identifier: Apache-2.0
    # Copyright (c) Paul Horton. All Rights Reserved.

Property Name Formatting
====================================================

By default, ``py-serializable`` uses it's :class:`py_serializable.formatters.CamelCasePropertyNameFormatter` formatter for
translating actual Python property names to element names in either JSON or XML.

``py-serializable`` includes a number of name formatters out of the box, but you can also create your own if required.

Included Formatters
----------------------------------------------------

``py-serializable`` includes three common formatters out of the box.

1. Camel Case Formatter: :class:`py_serializable.formatters.CamelCasePropertyNameFormatter` (the default)
2. Kebab Case Formatter: :class:`py_serializable.formatters.KebabCasePropertyNameFormatter`
3. Snake Case Formatter: :class:`py_serializable.formatters.SnakeCasePropertyNameFormatter`

A summary of how these differ is included in the below table.

+----------------------------+---------------+----------------+-----------------+
| Python Property Name       | Camel Case    | Kebab Case     | Snake Case      |
+============================+===============+================+=================+
| books                      | books         | books          | books           |
+----------------------------+---------------+----------------+-----------------+
| big_book                   | bigBook       | big-book       | big_book        |
+----------------------------+---------------+----------------+-----------------+
| a_very_big_book            | aVeryBigBook  | a-very-big-book| a_very_big_book |
+----------------------------+---------------+----------------+-----------------+

Changing the Formatter
----------------------

You can change the formatter being used by easily. The example below changes the formatter to be Snake Case.

.. code-block:: python

    from py_serializable.formatters import CurrentFormatter, SnakeCasePropertyNameFormatter

    CurrentFormatter.formatter = SnakeCasePropertyNameFormatter

Custom Formatters
-----------------

If none of the included formatters work for you, why not write your own?

The only requirement is that it extends :class:`py_serializable.formatters.BaseNameFormatter`!
