{ "info": { "author": "Dmitry Abramov", "author_email": "diabramo@yandex.ru", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.5", "Topic :: Software Development :: Libraries" ], "description": "# str-macros\n\nA minimalistic python package allowing to define macros on string based class attributes\n\n## Installation\n\nThis package does not have any dependencies and works just fine with\nPython 2.7 and Python 3.5+.\n\nTo install it via **pip** just run the following command:\n\n```\npip install str-macros\n```\n\n## Slow start\n\nThe basic idea of this project is to provide a tool for simple macros execution.\n\nFor better understanding, let's start with an example.\n\nLet's imagine that you are a developer who creates a tool for\na convenient work with Google AdWords. \n\nLet's define two classes AdBanner and AdCampaign:\n\n```python\n\nclass AdCampaign(object):\n def __init__(self, campaign_id, name):\n self.campaign_id = campaign_id\n self.name = name\n\nclass AdBanner(object):\n def __init__(self, ad_id, name, url, campaign):\n self.ad_id = ad_id\n self.name = name\n self.url = url\n self.campaign = campaign\n```\n\nBut one important condition is that we want to have some analytics\nabout user clicks on our banners. To achieve this, we use utm labels and we want banner\nurls to be in the following format: \n\n```http://test.com/?utm_ad_name=test_ad&utm_campaign=test_campaign```\n\nSo, when we create an ad we specify not real url, but an url with some\nmacros like this:\n\n\n```python\ncampaign = AdCampaign(1, 'test campaign')\nbanner = AdBanner(\n id=1,\n name='banner [banner_id] for campaign [campaign_name] [random]',\n url='http://test.ru/?utm_name=[banner_name]',\n campaign=campaign\n)\n```\nSo, we have four macros here:\n```[banner_id], [campaign_name], [banner_name], [random]``` and we\nwant to enable them when we create it and send info to Google.\n\n## Usage\n\nLet's see how to deal with it:\n\n```python\nimport random\n\nfrom str_macros import MacrosMixin\n\n\nclass AdBanner(MacrosMixin):\n MACRO_FIELDS = (\n 'name', 'url'\n )\n\n MACRO_MAP = {\n 'banner_id': lambda self: str(self.ad_id),\n 'campaign_name': lambda self: self.campaign.name,\n 'banner_name': lambda self: self.name,\n 'random': lambda self: str(random.randint(1, 100)),\n }\n\n def __init__(self, ad_id, name, url, campaign):\n self.ad_id = ad_id\n self.name = name\n self.url = url\n self.campaign = campaign\n```\n\nOK, now we have for variables which can be used in fields (attributes) which\nare defined in MACRO_FIELDS and MACRO_MAP: macros that should be executed\nfor each of the variables.\n\n#### Important params:\n- MACRO_FIELDS: tuple or list of attributes in which to look\nfor patterns\n- MACRO_MAP: dict {'pattern': func}: what function to run when a pattern found.\nShould take only one argument - current object (self).\n In this dictionary, keys are patterns, but without [].\n\nWhen you assign some initial values to str fields - pattern shoud\nbe inside of **[]**.\n\n\nAttention: if in MACRO_MAP you specify a function which uses a\nfield which is specified in MACRO_FIELDS you are going to end up\nin an infinite recursion, so - don't make such mistakes. Example of such mistage:\n\n```python\n MACRO_FIELDS = (\n 'name', 'url'\n )\n MACRO_MAP = {\n 'banner_name': lambda self: self.name\n # Danger!\n # if you have pattern [banner_name] in name - infinite recursion\n }\n ```\n\n### Basic usage\n\nBy default, macros are disables. So:\n\n```python\ncampaign = AdCampaign(1, 'test campaign')\nbanner = AdBanner(\n id=1,\n name='banner [banner_id] for campaign [campaign_name] [random]',\n url='http://test.ru/?utm_name=[banner_name]',\n campaign=campaign\n)\n\nprint(banner.name)\n# Macros disabled now\n# banner [banner_id] for campaign [campaign_name] [random]'\nAdBanner.start_macros()\n\n# Macros enabled now\nprint(AdBanner.is_macros_enabled()) # True\nprint(banner.name)\n# banner 1 for campaign test campaign 5\n\nAdBanner.stop_macros()\nprint(banner.name)\n# And disabled again\n# banner [banner_id] for campaign [campaign_name] [random]'\nprint(AdBanner.is_macros_enabled()) # False\n```\n\n### Using context manager\n```python\nfrom str_macros import enabled_macros\nAdBanner.is_macros_enabled() # False\nwith enabled_macros(AdBanner):\n # macros are enabled here\n AdBanner.is_macros_enabled() # True\n# and here they are already disabled\n```\n\n### Using decorator\n```python\nfrom str_macros import enable_macros\n\n@enable_macros(AdBanner)\ndef send_data():\n # macros are enabled here\n pass\n\n```\n\n## Django\n\nThis package works just fine with Django models CharFields and has been\ndeveloped mostly for it.\n\n## Author\n\nDmitry Abramov ©\n\n", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/abramovd/str-macros", "keywords": "python django str macros", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "str-macros", "package_url": "https://pypi.org/project/str-macros/", "platform": "", "project_url": "https://pypi.org/project/str-macros/", "project_urls": { "Homepage": "https://github.com/abramovd/str-macros" }, "release_url": "https://pypi.org/project/str-macros/0.1/", "requires_dist": null, "requires_python": "", "summary": "Macros (variables) for str class attributes", "version": "0.1" }, "last_serial": 2718427, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "d6f59d9ba6339d4a34c7b7dabda2ae92", "sha256": "5876f4a1df6e673ca64679a6cfa911c1938611ccfaa9caece7158602b2ceab6b" }, "downloads": -1, "filename": "str_macros-0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d6f59d9ba6339d4a34c7b7dabda2ae92", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 8483, "upload_time": "2017-03-20T18:22:48", "url": "https://files.pythonhosted.org/packages/b3/58/abf7e9bfc5269f92debe5d40d3022f1ce5b007821fbcdb6ffdd7072d2a17/str_macros-0.1-py2.py3-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "d6f59d9ba6339d4a34c7b7dabda2ae92", "sha256": "5876f4a1df6e673ca64679a6cfa911c1938611ccfaa9caece7158602b2ceab6b" }, "downloads": -1, "filename": "str_macros-0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d6f59d9ba6339d4a34c7b7dabda2ae92", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 8483, "upload_time": "2017-03-20T18:22:48", "url": "https://files.pythonhosted.org/packages/b3/58/abf7e9bfc5269f92debe5d40d3022f1ce5b007821fbcdb6ffdd7072d2a17/str_macros-0.1-py2.py3-none-any.whl" } ] }