Metadata-Version: 2.1
Name: papfa
Version: 0.1.0
Summary: High level pub/sub package
Home-page: https://github.com/kamyab98/papfa
Author: Kamyab Zareh
Author-email: kamyab.zareh@gmail.com
License: MIT license
Keywords: papfa
Platform: UNKNOWN
Classifier: Development Status :: 2 - Pre-Alpha
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Natural Language :: English
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Requires-Python: >=3.7
License-File: LICENSE
Requires-Dist: confluent-kafka (~=1.8.2)
Requires-Dist: dataclasses-avroschema (~=0.29.2)
Requires-Dist: click (~=8.1.3)

=====
Papfa
=====


.. image:: https://img.shields.io/pypi/v/papfa.svg
        :target: https://pypi.python.org/pypi/papfa

.. image:: https://circleci.com/github/kamyab98/papfa.svg/?style=svg
        :target: https://circleci.com/github/kamyab98/papfa
        :alt: Pipeline Status

.. image:: https://readthedocs.org/projects/papfa/badge/?version=latest
        :target: https://papfa.readthedocs.io/en/latest/?version=latest
        :alt: Documentation Status


.. image:: https://pyup.io/repos/github/kamyab98/papfa/shield.svg
     :target: https://pyup.io/repos/github/kamyab98/papfa/
     :alt: Updates



Papfa is a high level pub/sub pattern Python library.



Quick Start for Django
-----------------------
Install Papfa::

    $ pip install papfa

Add Papfa to your settings:

.. code-block:: python

    PAPFA = {
        'BROKER': 'KAFKA',
        'KAFKA_BOOTSTRAP_SERVERS': ...,
        'KAFKA_SASL_PASSWORD': ...,
        'KAFKA_SASL_USERNAME': ...,
        'KAFKA_SASL_MECHANISM': ...,
        'KAFKA_SECURITY_PROTOCOL': ...,
        'GROUP_ID_PREFIX': ...,
        'SCHEMA_REGISTRY_URL': ...,
        'SCHEMA_REGISTRY_BASIC_AUTH': ...,
        'CONSUMER_MIDDLEWARES': [
            ...
        ]

    }

Add consumer in ``<app>/consumers.py``:

.. code-block:: python

    from papfa.consumers import consumer
    from papfa.dtos import Record

    @consumer(topic='topic_name')
    def my_consumer(messages: List[Record]):
        print(messages)


Produce Message:

.. code-block:: python

    from dataclasses import dataclass

    from dataclasses_avroschema import AvroModel
    from papfa.producer import get_message_producer
    from papfa.dtos import Record

    @dataclass
    class User(AvroModel):
        name: str
        age: int

    r1 = Record(value=User(name='thom', age=53))
    r1 = Record(value=User(name='jonny', age=50))

    message_producer = get_message_producer(topic='topic_name', User)

    message_producer.produce(messages=[r1, r2])


Middleware
-----------
Papfa provides middlewares for both consumers and producers. You can implement your own middleware by extending the
``papfa.middlewares.consumer.ConsumerMiddleware`` and ``papfa.middlwares.producer.ProducerMiddleware`` class.

**Default Middlewares**

* ``papfa.middlewares.consumer.ConsumedMessageStatsMiddleware`` - Logs the last message consumed by each topic - consumer group


Serialization
---------------
For Now Papfa only support confluent avro serialization with schema registry.

Broker
-----------
For Now Papfa only support Apache Kafka.


Features
------------
* Batch Processing (Commit per batch)
* Consumed Messages Stats


Todos
------------
* Handle Idempotency
* Add Other Brokers & Serializers
* Handle Multiple Broker Cluster


Credits
--------

This package was created with Cookiecutter_ and the `audreyr/cookiecutter-pypackage`_ project template.

.. _Cookiecutter: https://github.com/audreyr/cookiecutter
.. _`audreyr/cookiecutter-pypackage`: https://github.com/audreyr/cookiecutter-pypackage


=======
History
=======

0.1.0 (2022-05-11)
------------------

* First release on PyPI.


