{ "info": { "author": "Yukihiko Shinoda", "author_email": "yuk.hik.future@gmail.com", "bugtrack_url": null, "classifiers": [], "description": "# YAML Data Class Config\n\nThis project helps you to import config file writen by YAML to\nPython [Data Classes](https://docs.python.org/3/library/dataclasses.html).\n\n## Advantage\n\n1. Type safe import from YAML to Data Classes\n2. Global access and easy unit testing\n\n### 1. Type safe import from YAML to Data classes\n\nWhen using pyyaml to import YAML, values be dict and list objects.\nUsing dict or list object will cause such confuses:\n\n- Reference non exist properties for unexpected instance type\n- Typo of index or key name\n\nTo prevent these confuse, one of good way is to use object as model,\nand python has a good module\n[Data Classes](https://docs.python.org/3/library/dataclasses.html) for this purpose.\n\n### 2. Global access and easy unit testing\n\nYou will want to refer config as global\nbecause it's troublesome to pass config value as argument over and over like a bucket brigade.\n\nHowever, when unit testing,\nif YAML file was loaded automatically on importing global definition,\nyou will face problem that\nyou can't replace config YAML file with the one for unit testing.\nYAML Data Class Config can divide timings between definition global instance and\nloading YAML file so you can replace YAML file for unit testing.\n\n## Quickstart\n\n#### 1. Install\n`pip install yamldataclassconfig`\n\n#### 2. Prepare config YAML file.\n\nPut `config.yml`\nYAML Data class Config loads `config.yml` on Python execution directory by default.\n\n```yaml\nproperty_a: 1\nproperty_b: '2'\npart_config:\n property_c: '2019-06-25 13:33:30'\n```\n\n#### 3. Create config class\n\nAnywhere is OK, for example, I prefer to place on `myproduct/config.py`\n\n```python\nfrom dataclasses import dataclass, field\nfrom datetime import datetime\nfrom dataclasses_json import DataClassJsonMixin\nfrom marshmallow import fields\nfrom yamldataclassconfig.config import YamlDataClassConfig\n\n\n@dataclass\nclass PartConfig(DataClassJsonMixin):\n property_c: datetime = field(metadata={'dataclasses_json': {\n 'encoder': datetime.isoformat,\n 'decoder': datetime.fromisoformat,\n 'mm_field': fields.DateTime(format='iso')\n }})\n\n\n@dataclass\nclass Config(YamlDataClassConfig):\n property_a: int = None\n property_b: str = None\n part_config: PartConfig = field(\n default=None,\n metadata={'dataclasses_json': {'mm_field': PartConfig}}\n )\n```\n\n### 4. Define as global\n\nAlso, anywhere is OK, for example, I prefer to place on `myproduct/__init__.py`\n\n```python\nfrom myproduct.config import Config\n\nCONFIG: Config = Config()\n```\n\n### 5. Call load before reference config value\n\n```python\nfrom myproduct import CONFIG\n\n\ndef main():\n CONFIG.load()\n print(CONFIG.property_a)\n print(CONFIG.property_b)\n print(CONFIG.part_config.property_c)\n\n\nif __name__ == '__main__':\n main()\n```\n\n## How do I...\n\n### Fix path to yaml file independent on the Python execution directory?\n\noverride `FILE_PATH` property.\n\nEx:\n\n```python\nfrom dataclasses import dataclass\nfrom pathlib import Path\n\nfrom yamldataclassconfig import create_file_path_field\nfrom yamldataclassconfig.config import YamlDataClassConfig\n\n\n@dataclass\nclass Config(YamlDataClassConfig):\n some_property: str = None\n # ...\n\n FILE_PATH: Path = create_file_path_field(Path(__file__).parent.parent / 'config.yml')\n```\n\n\n### Switch target YAML config file to the one for unit testing?\n\nWhen setup on unit testing, you can call `Config.load()` with argument.\n\nCase when unittest:\n\n```python\nfrom pathlib import Path\nimport unittest\n\nfrom yourproduct import CONFIG\n\nclass ConfigurableTestCase(unittest.TestCase):\n def setUp(self):\n CONFIG.load(Path('path/to/yaml'))\n``` \n\nCase when pytest:\n\n```python\nfrom pathlib import Path\nimport pytest\n\nfrom yourproduct import CONFIG\n\n@pytest.fixture\ndef yaml_config():\n CONFIG.load(Path('path/to/yaml'))\n yield\n\ndef test_something(yaml_config):\n \"\"\"test something\"\"\"\n```\n\n\n### Use path to YAML config file as same as production when test?\n\n[fixturefilehandler](https://pypi.org/project/fixturefilehandler/)\ncan replace config.yml with tests/config.yml.dist easily.\nPlease call all `DeployerFactory.create` with `YamlConfigFilePathBuilder` instance argument\nto create ConfigDeployer.\nThen, set target directory which config.yml should be placed into `path_target_directory`. \n\nCase when unittest:\n\n```python\nfrom pathlib import Path\nimport unittest\nfrom fixturefilehandler.factories import DeployerFactory\nfrom fixturefilehandler.file_paths import YamlConfigFilePathBuilder\n\nfrom yourproduct import CONFIG\n\n\nConfigDeployer = DeployerFactory.create(YamlConfigFilePathBuilder(path_target_directory=Path(__file__).parent.parent))\n\n\nclass ConfigurableTestCase(unittest.TestCase):\n def setUp(self):\n ConfigDeployer.setup()\n CONFIG.load()\n\n def doCleanups(self):\n ConfigDeployer.teardown()\n```\n\nCase when pytest:\n\n```python\nfrom pathlib import Path\nimport pytest\nfrom fixturefilehandler.factories import DeployerFactory\nfrom fixturefilehandler.file_paths import YamlConfigFilePathBuilder\n\nfrom yourproduct import CONFIG\n\n\nConfigDeployer = DeployerFactory.create(YamlConfigFilePathBuilder(path_target_directory=Path(__file__).parent.parent))\n\n\n@pytest.fixture\ndef yaml_config():\n ConfigDeployer.setup()\n CONFIG.load()\n yield\n ConfigDeployer.teardown()\n\n\ndef test_something(yaml_config):\n \"\"\"test something\"\"\"\n```\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/yukihiko-shinoda/yaml-dataclass-config", "keywords": "yaml dataclass dataclasses config", "license": "", "maintainer": "", "maintainer_email": "", "name": "yamldataclassconfig", "package_url": "https://pypi.org/project/yamldataclassconfig/", "platform": "", "project_url": "https://pypi.org/project/yamldataclassconfig/", "project_urls": { "Homepage": "https://github.com/yukihiko-shinoda/yaml-dataclass-config" }, "release_url": "https://pypi.org/project/yamldataclassconfig/1.3.2/", "requires_dist": [ "dataclasses-json", "pyyaml" ], "requires_python": "", "summary": "This project helps you to import config file writen by YAML to Python data class.", "version": "1.3.2" }, "last_serial": 5788038, "releases": { "0.0a1": [ { "comment_text": "", "digests": { "md5": "cbadf6e1fc08746915213e5b34c2490f", "sha256": "793813b67079afd561898631d010230028e4abfa56c3c7c21f3b4a7bc62217e6" }, "downloads": -1, "filename": "yamldataclassconfig-0.0a1-py3-none-any.whl", "has_sig": false, "md5_digest": "cbadf6e1fc08746915213e5b34c2490f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 2998, "upload_time": "2019-06-29T20:45:10", "url": "https://files.pythonhosted.org/packages/da/b2/0d6f94a6fc651df65ade6274e99d7e90bee5a14c43bec616b34d076349fc/yamldataclassconfig-0.0a1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "99f9d845878d746f3df189e0aa50ddd6", "sha256": "49fc6e0cd783598f1aa2031c39b8bf162f8bf411856db6af5b42b2db80a38daa" }, "downloads": -1, "filename": "yamldataclassconfig-0.0a1.tar.gz", "has_sig": false, "md5_digest": "99f9d845878d746f3df189e0aa50ddd6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2060, "upload_time": "2019-06-29T20:45:12", "url": "https://files.pythonhosted.org/packages/c9/5d/200be1fe069ccf0f84007066fdcf20b1c7fb27117ff62969614c4a40091c/yamldataclassconfig-0.0a1.tar.gz" } ], "0.0a2": [ { "comment_text": "", "digests": { "md5": "94fe6fee55bcf00cd768a275896a5cd0", "sha256": "b4053d0261e4b4f2f1c4b4e85c9adaa4c1c9616057b847d1ec5263872f2c537a" }, "downloads": -1, "filename": "yamldataclassconfig-0.0a2-py3-none-any.whl", "has_sig": false, "md5_digest": "94fe6fee55bcf00cd768a275896a5cd0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 3035, "upload_time": "2019-07-01T18:02:38", "url": "https://files.pythonhosted.org/packages/11/50/4eb390e448ed888d165b901c5938f390bad41e15cf6cfaf686fac7027d25/yamldataclassconfig-0.0a2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fb9e30314c35c2414612b1d882ab4be6", "sha256": "b4ba136ca43552c9f542312fe9cad596f995348ab3d158cbec428efcba33bd7e" }, "downloads": -1, "filename": "yamldataclassconfig-0.0a2.tar.gz", "has_sig": false, "md5_digest": "fb9e30314c35c2414612b1d882ab4be6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2093, "upload_time": "2019-07-01T18:02:40", "url": "https://files.pythonhosted.org/packages/e3/d0/eb76ec5cbc4dc91a2f47bcf6bc8a226a6f49280a79f349c2f97eaa69c044/yamldataclassconfig-0.0a2.tar.gz" } ], "0.0a3": [ { "comment_text": "", "digests": { "md5": "b7224db8ecdb4fcabea9f8a5a8aaab27", "sha256": "849f20bb597f59f003548cc2f6d1a6b7756ceb8527b9293ca2dfb2447b68b8fe" }, "downloads": -1, "filename": "yamldataclassconfig-0.0a3-py3-none-any.whl", "has_sig": false, "md5_digest": "b7224db8ecdb4fcabea9f8a5a8aaab27", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 3159, "upload_time": "2019-07-03T03:10:53", "url": "https://files.pythonhosted.org/packages/fb/99/46dd2ff33836b8b833da9b98b2811ef765b84ee43ce0d92f700c1a64ba30/yamldataclassconfig-0.0a3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2f012ade275439be8a5f3efff1a22dc0", "sha256": "8a46056ee07d25a73b53b129668bb72ba31fc5fb9cc9652f3da39e0a9e69df01" }, "downloads": -1, "filename": "yamldataclassconfig-0.0a3.tar.gz", "has_sig": false, "md5_digest": "2f012ade275439be8a5f3efff1a22dc0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2200, "upload_time": "2019-07-03T03:10:55", "url": "https://files.pythonhosted.org/packages/21/0a/2a0240a91c52f2693a1dced089a9512bc41663b59f7f827cd62a0520f09e/yamldataclassconfig-0.0a3.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "a9802839187255a46075d86b04aa970f", "sha256": "665e69679863c9e9f596c29a7085074222bca1cbd8b69897bf29d8524bddfe2e" }, "downloads": -1, "filename": "yamldataclassconfig-1.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "a9802839187255a46075d86b04aa970f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5273, "upload_time": "2019-07-05T04:30:34", "url": "https://files.pythonhosted.org/packages/14/21/40a48035909feef158960af40fd1c9961cd5ebe245e0971d4f33120fae71/yamldataclassconfig-1.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c96945100a78c35075e7f83ea7bb541f", "sha256": "e6cf5a510b4362e07114ece53b944ff06efbbb22999d876aaa2ef39f41c6b229" }, "downloads": -1, "filename": "yamldataclassconfig-1.0.0.tar.gz", "has_sig": false, "md5_digest": "c96945100a78c35075e7f83ea7bb541f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4620, "upload_time": "2019-07-05T04:30:35", "url": "https://files.pythonhosted.org/packages/15/29/1d2d9bc092a91c7b706fcbf42ad676fc447c7b01cd7fb068fb9da8a88a74/yamldataclassconfig-1.0.0.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "454d39a377e70655eb8eb5bfc5f24ee6", "sha256": "ec1223e63cdfd5b1f4838a3a7f8af6bbfd8e8420142764bcd2b9366011ae96e6" }, "downloads": -1, "filename": "yamldataclassconfig-1.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "454d39a377e70655eb8eb5bfc5f24ee6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5339, "upload_time": "2019-07-09T18:04:43", "url": "https://files.pythonhosted.org/packages/da/0c/27e0595631ee6a5ff21614a3a22191b9f4ff7ba6c4ae7f986c4877a1f799/yamldataclassconfig-1.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f18e4ac818fe2e805fd6f6b85ac38901", "sha256": "91f66d2d64c2b781ff0a02c74adcc5b67490d04e56c0e860f651ae75c87a7c41" }, "downloads": -1, "filename": "yamldataclassconfig-1.1.0.tar.gz", "has_sig": false, "md5_digest": "f18e4ac818fe2e805fd6f6b85ac38901", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4701, "upload_time": "2019-07-09T18:04:45", "url": "https://files.pythonhosted.org/packages/53/0b/620a21139852cef5f6811c96f4a015b2c9f1903dd16b892265615bb2ffd5/yamldataclassconfig-1.1.0.tar.gz" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "e54fefb76c2a53b48a7131011bbb8b87", "sha256": "debe3c9d9cc79347f22a19328002b0a7e00b6005e60e5e7b36c6edef07404593" }, "downloads": -1, "filename": "yamldataclassconfig-1.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "e54fefb76c2a53b48a7131011bbb8b87", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 4581, "upload_time": "2019-07-16T10:09:39", "url": "https://files.pythonhosted.org/packages/77/47/e80f41df1fcbceabf2917a5268bb6a7d623590afb813462ea48818b50450/yamldataclassconfig-1.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4d4e4ffc1523cbde31f76dc603ca45e9", "sha256": "416b4af6588efb3bd22135dc60a57b3c0f3c9e2408fb42d1e6d0940860a76c51" }, "downloads": -1, "filename": "yamldataclassconfig-1.2.0.tar.gz", "has_sig": false, "md5_digest": "4d4e4ffc1523cbde31f76dc603ca45e9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4221, "upload_time": "2019-07-16T10:09:41", "url": "https://files.pythonhosted.org/packages/41/a7/0af247ed571d8a962cd33eb1ffcc66823900dd30d94ab0ca1b3c307155fe/yamldataclassconfig-1.2.0.tar.gz" } ], "1.3.0": [ { "comment_text": "", "digests": { "md5": "de62d977a7977f079effce9dc1329573", "sha256": "05d4a4a2f02c64ec58be5e131f2f42b83772719d3ea92605b20080024e7bc4d6" }, "downloads": -1, "filename": "yamldataclassconfig-1.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "de62d977a7977f079effce9dc1329573", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 4749, "upload_time": "2019-07-24T15:08:45", "url": "https://files.pythonhosted.org/packages/83/bd/726118ed572ce65c4009279ec5ab5ee6730a319c5bc8c44760e3745afb53/yamldataclassconfig-1.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "13acb584601ce32ca043f3baf0cdbc6b", "sha256": "586232c223b51902ad5c276282baae7f7ac476a499d315e766d80fa3e331c760" }, "downloads": -1, "filename": "yamldataclassconfig-1.3.0.tar.gz", "has_sig": false, "md5_digest": "13acb584601ce32ca043f3baf0cdbc6b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4397, "upload_time": "2019-07-24T15:08:46", "url": "https://files.pythonhosted.org/packages/33/79/62f58dadcaf6429b0e212c990b624b4fe79c6b0d349338d54269e2207e12/yamldataclassconfig-1.3.0.tar.gz" } ], "1.3.1": [ { "comment_text": "", "digests": { "md5": "e8716a0e30283b3ca3b946e9cfb6f268", "sha256": "be600590b288e10d5c4501ce7584cbe45f3dc1bb28d0c5b0e685ad1da67fba07" }, "downloads": -1, "filename": "yamldataclassconfig-1.3.1-py3-none-any.whl", "has_sig": false, "md5_digest": "e8716a0e30283b3ca3b946e9cfb6f268", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 4739, "upload_time": "2019-08-13T18:36:01", "url": "https://files.pythonhosted.org/packages/e2/ae/71a4c82154315cfebf3678e33c5ad86a1ba8e17a3cb92db6d52831a93179/yamldataclassconfig-1.3.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3806fa83b73f2edaff50006138c93389", "sha256": "4efefbd9c225e091ebcb9b7a52892910ca068ec0b314a2112579a4baeed71c99" }, "downloads": -1, "filename": "yamldataclassconfig-1.3.1.tar.gz", "has_sig": false, "md5_digest": "3806fa83b73f2edaff50006138c93389", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4392, "upload_time": "2019-08-13T18:36:03", "url": "https://files.pythonhosted.org/packages/a8/e9/292b6af3f9bf61880b12a3b089b0fd53c072f1f539a3c5a3ba3bd8c45f6e/yamldataclassconfig-1.3.1.tar.gz" } ], "1.3.2": [ { "comment_text": "", "digests": { "md5": "0efc23bf6f9f3e416d5c002f80a85d92", "sha256": "74333c52ea1f3adb978eef7ff77c79142cba1f226e4a528dd10409a57a8ee795" }, "downloads": -1, "filename": "yamldataclassconfig-1.3.2-py3-none-any.whl", "has_sig": false, "md5_digest": "0efc23bf6f9f3e416d5c002f80a85d92", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 4601, "upload_time": "2019-09-05T19:34:51", "url": "https://files.pythonhosted.org/packages/e9/b6/2be43e1e14dea60f98e3a072de84b596aa76d19b79a5e804736f0c37379d/yamldataclassconfig-1.3.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cd68563110eea3bdca99a085463bedaa", "sha256": "693d5d2c961a1bf552e5bec4a45108a81a69c6dc78879d3905e57a752881dd89" }, "downloads": -1, "filename": "yamldataclassconfig-1.3.2.tar.gz", "has_sig": false, "md5_digest": "cd68563110eea3bdca99a085463bedaa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4232, "upload_time": "2019-09-05T19:34:53", "url": "https://files.pythonhosted.org/packages/33/b3/0c617181850cddcaaea3db65c698c43f1aa45edcec336082409f733fca2b/yamldataclassconfig-1.3.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "0efc23bf6f9f3e416d5c002f80a85d92", "sha256": "74333c52ea1f3adb978eef7ff77c79142cba1f226e4a528dd10409a57a8ee795" }, "downloads": -1, "filename": "yamldataclassconfig-1.3.2-py3-none-any.whl", "has_sig": false, "md5_digest": "0efc23bf6f9f3e416d5c002f80a85d92", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 4601, "upload_time": "2019-09-05T19:34:51", "url": "https://files.pythonhosted.org/packages/e9/b6/2be43e1e14dea60f98e3a072de84b596aa76d19b79a5e804736f0c37379d/yamldataclassconfig-1.3.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cd68563110eea3bdca99a085463bedaa", "sha256": "693d5d2c961a1bf552e5bec4a45108a81a69c6dc78879d3905e57a752881dd89" }, "downloads": -1, "filename": "yamldataclassconfig-1.3.2.tar.gz", "has_sig": false, "md5_digest": "cd68563110eea3bdca99a085463bedaa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4232, "upload_time": "2019-09-05T19:34:53", "url": "https://files.pythonhosted.org/packages/33/b3/0c617181850cddcaaea3db65c698c43f1aa45edcec336082409f733fca2b/yamldataclassconfig-1.3.2.tar.gz" } ] }