{"id":13486421,"url":"https://github.com/orsinium-labs/aop","last_synced_at":"2025-04-15T21:25:43.294Z","repository":{"id":101905668,"uuid":"144863398","full_name":"orsinium-labs/aop","owner":"orsinium-labs","description":"Aspect oriented programming for Python. Patch everything!","archived":false,"fork":false,"pushed_at":"2019-01-07T08:53:26.000Z","size":74,"stargazers_count":13,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-29T01:34:13.850Z","etag":null,"topics":["advice","aop","aspectj","aspects","import","python","python3"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/orsinium-labs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2018-08-15T14:27:42.000Z","updated_at":"2023-05-24T05:41:16.000Z","dependencies_parsed_at":"2024-01-16T09:00:45.603Z","dependency_job_id":"0d0b005d-4ad2-42a7-84b6-afa165bc60a2","html_url":"https://github.com/orsinium-labs/aop","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/orsinium-labs%2Faop","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/orsinium-labs%2Faop/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/orsinium-labs%2Faop/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/orsinium-labs%2Faop/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/orsinium-labs","download_url":"https://codeload.github.com/orsinium-labs/aop/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249155809,"owners_count":21221664,"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":["advice","aop","aspectj","aspects","import","python","python3"],"created_at":"2024-07-31T18:00:45.500Z","updated_at":"2025-04-15T21:25:43.273Z","avatar_url":"https://github.com/orsinium-labs.png","language":"Python","funding_links":[],"categories":["Python"],"sub_categories":[],"readme":"# ![AOP](./assets/logo.png)\n\n\u003e Badges? We ain’t got no badges! We don’t need no badges! I don’t have to show you any stinking badges!\n\u003e - [The Treasure of the Sierra Madre](https://www.youtube.com/watch?v=wHxgQopPMRE)\n\n[Aspect-oriented programming](https://en.wikipedia.org/wiki/Aspect-oriented_programming)\n\nFeatures:\n\n1. Patch any module: your project, stdlib, built-ins.\n1. Patch any object: functions, class instances.\n1. Pure Python implementation: run it on CPython or PyPy.\n\nTODO:\n\n1. Patch already imported objects\n1. Patch `__init__` and `__new__`.\n1. Test PyPy\n\n\n## Example\n\n```python\nimport aop\n\ndef multiply(context):\n    print(context.aspect, context.args, context.kwargs)\n    yield\n    context.result *= 100\n\naop.register(\n    handler=multiply,\n    modules=aop.match(equals='math'),\n    targets=aop.match(regexp='(sin|cos)')\n)\n```\n\nOk, let's check:\n\n```python\nimport math\nmath.cos(0)\n# prints: cos (0,) {}\n# returns: 100.0\n```\n\n\n## Usage\n\n### Register\n\nRegister new advice:\n\n```python\naop.register(\n    handler=some_handler,\n    modules=aop.match(equals='math'),\n    targets=aop.match(regexp='(sin|cos)')\n)\n```\n\nParameters for `aop.register`:\n\n* `handler` -- advice for joinpoint processing.\n* `paths` -- expression for path to module.\n* `modules` -- expression for module name.\n* `targets` -- expression for object name.\n* `methods` -- expression for called object's method. It's `__call__` for functions.\n\n### Match\n\nAvailable kwargs for `aop.match`:\n\n* `regexp` -- object name fully match to regular expression.\n* `startswith` -- object name starts with specified string.\n* `endswith` -- object name ends with specified string.\n* `contains` -- object contains specified string.\n* `equals` -- object name equal to specified string.\n\n### Handler and context\n\nHandler looks like:\n\n```python\ndef multiply(context):\n    ...  # before aspect call\n    yield\n    ...  # after aspect call\n```\n\nContext's properties:\n* `aspect` -- name of target.\n* `method` -- name of called method or `__call__` for functions.\n* `module` -- name of module where aspect defined.\n* `path` --   path to module where aspect defined.\n* `args` --   tuple of passed positional args\n* `kwargs` -- dict of passed keyword args\n* `result` -- target's method response\n\n### Enable and disable\n\nRegister all advices or just enable patching before all other imports in project:\n\n```python\nimport aop\naop.enable()\n...  # all other imports\n```\n\nAlso it's recommend finally enable patching after register last advice:\n\n```python\naop.register(...)\naop.register(...)\naop.enable(final=True)\n```\n\nIf you want to disable patching:\n```python\naop.disable()\n```\n\n### Inspect\n\nInspect object:\n\n```python\naop.inspect(math.isclose, print=True)\n```\n\n\n## Patch import system automatically\n\nNow this package can't patch modules that imported before `aop.enable()` or `aop.register(...)`:\n\n```bash\n$ python3 special_cases/2_after.py\n...\nAssertionError: not patched\n```\n\nAlthough you can run your script via aop runner:\n\n```bash\n$ python3 -m aop special_cases/2_after.py\ncos (0,) {}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Forsinium-labs%2Faop","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Forsinium-labs%2Faop","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Forsinium-labs%2Faop/lists"}