{"id":21962425,"url":"https://github.com/megafetis/conveyr_py","last_synced_at":"2025-03-22T20:41:40.687Z","repository":{"id":52934284,"uuid":"271276183","full_name":"megafetis/conveyr_py","owner":"megafetis","description":"Conveyor pipline handling library for python 3.5 and later","archived":false,"fork":false,"pushed_at":"2021-04-13T09:27:18.000Z","size":73,"stargazers_count":3,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-01-28T00:35:15.346Z","etag":null,"topics":["architecture","chain","chaining","conveyor","handler","python"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/megafetis.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.APACHE2","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-06-10T12:52:34.000Z","updated_at":"2023-02-15T10:21:02.000Z","dependencies_parsed_at":"2022-08-24T13:50:55.940Z","dependency_job_id":null,"html_url":"https://github.com/megafetis/conveyr_py","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/megafetis%2Fconveyr_py","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/megafetis%2Fconveyr_py/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/megafetis%2Fconveyr_py/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/megafetis%2Fconveyr_py/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/megafetis","download_url":"https://codeload.github.com/megafetis/conveyr_py/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245020314,"owners_count":20548156,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["architecture","chain","chaining","conveyor","handler","python"],"created_at":"2024-11-29T10:39:58.852Z","updated_at":"2025-03-22T20:41:40.629Z","avatar_url":"https://github.com/megafetis.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# conveyr_py\n\n[![PyPI](https://img.shields.io/pypi/v/conveyr)](https://pypi.org/project/mediatr)\n[![Python](https://img.shields.io/pypi/pyversions/conveyr)](https://pypi.org/project/mediatr) \n[![Downloads](https://img.shields.io/pypi/dm/conveyr)](https://pypi.org/project/mediatr) \n\nConveyor pipline handling library for python 3.5 and later\n\n## Automatic implementation of pattern \"Builder\"\n\nRequirements:\n* Python \u003e= 3.5\n\n## Usage:\ninstall [conveyr](https://pypi.org/project/conveyr/):\n\n`pip install conveyr`\n\n### Define common interfaces:\n\n```py\nfrom conveyr import Conveyor\n\n\n#### define interfaces\n\n```py\nclass IEntity():\n    id=None\n\nclass IHasNameEntity():\n    name = None\n\nclass IHasSurnameEntity():\n    surname = None\n\nclass IHasDesctiptionEntity():\n    description = None\n\nclass IHasAgeEntity():\n    age=0\n```\n\n### Define payloads:\n\n```py\nclass INamePayload:\n    pass\n\nclass ISurnamePayload:\n    pass\n\nclass IDescriptionPayload:\n    pass\n\nclass IHasAgePayload():\n    age=0\n```\n\n### Define concrete entity class an dpayload class:\n```py\nclass Entity(IEntity,IHasNameEntity,IHasSurnameEntity,IHasDesctiptionEntity,IHasAgeEntity):\n   pass\n\nclass Payload(INamePayload,ISurnamePayload,IDescriptionPayload,IHasAgePayload):\n    def __init__(self,name,surname,description,age=0):\n        self.name = name\n        self.surname = surname\n        self.description = description\n        self.age = age\n        \n```\n### Define handlers per interface:\n\n```py\n@Conveyor.handler(order=5)\nasync def entity_name_handler(entity:IHasNameEntity,payload:INamePayload):\n    entity.name = payload.name\n\n@Conveyor.handler(order=4)\ndef entity_surname_handler(entity:IHasSurnameEntity,payload:ISurnamePayload):\n    entity.surname = payload.surname\n\n@Conveyor.handler(order=3)\ndef entity_id_handler(entity:IEntity):\n    entity.id = uuid.uuid4().hex\n\n@Conveyor.handler(order=2)\ndef entity_description_handler(entity:IHasDesctiptionEntity,payload:IDescriptionPayload):\n    entity.description = payload.description\n\n#you can define class handler, wich contains `process` method\n@Conveyor.handler(order=1)\nclass PersonAgeHandler:\n    def process(self,entity:IHasAgeEntity,payload:IHasAgePayload):\n        entity.age = payload.age\n\n```\n#### Run conveyor\n\nsimple mode:\n\n```py \n\nconveyor = Conveyor()\nentity = Entity()\npayload = Payload('evgeniy','fetisov','some description',30)\nresults = conveyor.process(entity,payload)\n\n```\n\n\u003e  `Conveyor.process_async` method supports to define `async` `await` handlers. In async mode you can define simple synchronous handlers too.\n\nasync mode:\n\n```py \nimport asyncio\n\nconveyor = Conveyor()\nloop = asyncio.get_event_loop()\n\nentity = Entity()\n\npayload = Payload('evgeniy','fetisov','some description',30)\n\nresults = loop.run_until_complete(conveyor.process_async(entity,payload)) \nloop.close()\n\n#in python 3.6 and later: results = asyncio.run(conveyor.process_async(entity,payload))\n\n```\n\n```py\nprint(results) # dict of results if handlers returns anything\nprint(entity.id) # some guid id\nprint(entity.name) # 'evgeniy'\nprint(entity.surname) # 'fetisov'\nprint(entity.description) #'some description'\nprint(entity.age) # 30\n```\n\n### Static usage without Conveyor instance:\n\n```py \n\nfrom conveyr import Conveyor\n\nentity = Entity()\npayload = Payload('evgeniy','fetisov','some description',30)\nresults = Conveyor.process(entity,payload)\n\n```\n\n### Advanced:\n\nYou can group handlers to several 'layers'\n\nand manage handling orders\n```py\n@Conveyor.handler(order=5,group=\"aftercommit\")\nasync def some_handler(entity:IHasNameEntity,payload:INamePayload):\n    entity.name = payload.name\n#...\nresults = loop.run_until_complete(conveyor.process(entity,payload,\"aftercommit\")) # handlers with such group only executed\n\n```\nIf you are using class handlers, its possible to set custom class handler initializer (or dependency injector)\n\n```py\ndef some_class_handler_manager(cls):\n  return cls()\n\nconveyr = Conveyor(class_handler_manager = some_class_handler_manager)\n\n#...\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmegafetis%2Fconveyr_py","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmegafetis%2Fconveyr_py","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmegafetis%2Fconveyr_py/lists"}