{"id":23293044,"url":"https://github.com/wwtg99/hsettings","last_synced_at":"2026-05-10T19:03:26.801Z","repository":{"id":62569525,"uuid":"150371070","full_name":"wwtg99/hsettings","owner":"wwtg99","description":"Python hybrid settings from multiple sources.","archived":false,"fork":false,"pushed_at":"2019-05-29T13:48:37.000Z","size":12,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-02-13T00:44:40.429Z","etag":null,"topics":["configuration","json","python","settings","yaml"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"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/wwtg99.png","metadata":{"files":{"readme":"README.rst","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}},"created_at":"2018-09-26T05:02:37.000Z","updated_at":"2020-07-16T19:23:54.000Z","dependencies_parsed_at":"2022-11-03T16:47:10.401Z","dependency_job_id":null,"html_url":"https://github.com/wwtg99/hsettings","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wwtg99%2Fhsettings","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wwtg99%2Fhsettings/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wwtg99%2Fhsettings/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wwtg99%2Fhsettings/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wwtg99","download_url":"https://codeload.github.com/wwtg99/hsettings/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247535266,"owners_count":20954572,"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":["configuration","json","python","settings","yaml"],"created_at":"2024-12-20T06:13:37.254Z","updated_at":"2026-05-10T19:03:26.716Z","avatar_url":"https://github.com/wwtg99.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"Hybrid Settings\n---------------\n\nDescription\n===========\n\nThis package can load settings from multiple sources and hybrid them into one dict-like object.\n\nInstallation\n============\n\nFor Python 3.5+\n\n.. code-block:: shell\n\n    pip install hsettings\n\n\nUsage\n=====\n\nLoad settings\n~~~~~~~~~~~~~\n\nLoad settings from dict.\n\n.. code-block:: python\n\n    from hsettings.loaders import DictLoader\n    data1 = {\n        'k1': 'v1',\n        'k2': 'v2',\n        'k3': 1,\n        'k4': '1'\n    }\n    settings = DictLoader.load(data1)\n\n    // type casts\n    settings = DictLoader.load(data1, casts={\n        'k3': str, 'k4': int\n    })\n    assert settings.get('k3') == '1'\n    assert settings.get('k4') == 1\n    // keys includes\n    settings = DictLoader.load(data1, includes=['k1', 'k2'])\n    assert settings.as_dict() == {'k1': 'v1', 'k2': 'v2'}\n    // keys excludes\n    settings = DictLoader.load(data1, excludes=['k3', 'k4'])\n    assert settings.as_dict() == {'k1': 'v1', 'k2': 'v2'}\n    // keys includes and excludes\n    settings = DictLoader.load(\n        data1, \n        includes=['k1', 'k2'], \n        excludes=['k2', 'k3']\n    )\n    assert settings.as_dict() == {'k1': 'v1'}\n    // map keys to inner keys\n    settings = DictLoader.load(data1, key_mappings={\n        'k2': 'k2.k2-1',\n        'k3': 'k2.k2-2'\n    })\n    assert settings.as_dict() == {\n        'k1': 'v1',\n        'k2': {\n            'k2-1': 'v2',\n            'k2-2': 1\n        },\n        'k4': '1'\n    }\n    // map keys to inner keys and only contains these keys\n    // this is useful to load use defined envs\n    settings = DictLoader.load(data1, key_mappings={\n        'k2': 'k2.k2-1',\n        'k3': 'k2.k2-2'\n    }, only_key_mappings_includes=True)\n    assert settings.as_dict() == {\n        'k2': {\n            'k2-1': 'v2',\n            'k2-2': 1\n        }\n    }\n\n\nLoad settings from json file.\n\n.. code-block:: python\n\n    from hsettings.loaders import JsonLoader\n    settings = JsonLoader.load(json_file)\n\n\nLoad settings from yaml file.\n\n.. code-block:: python\n\n    from hsettings.loaders import YamlLoader\n    settings = YamlLoader.load(yaml_file)\n\n\nLoad settings from environment and/or env file.\nSupport casts, env_to_key_mapping, includes, excludes and only_key_mappings_includes as DictLoader.\nUse env_to_key_mapping and only_key_mappings_includes parameters to only get specific env settings.\n\n.. code-block:: python\n\n    // load from environment\n    from hsettings.loaders import EnvLoader\n    settings = EnvLoader.load()\n\n    // load from environment and env file\n    from hsettings.loaders import EnvLoader\n    settings = EnvLoader.load(env_file) \n\n\nUse settings\n~~~~~~~~~~~~\n\n.. code-block:: python\n\n    data1 = {\n        'k1': 'v1',\n        'k2': {\n            'k2-1': 'v2-1',\n            'k2-2': 'v2-2'\n        },\n        'k3': ['v3-1', 'v3-2'],\n        'k4': 1,\n        'k5': [0, 1, 2],\n        'k6': {\n            'k6-1': '',\n            'k6-2': None,\n            'k6-3': 1.2\n        },\n        'k7': {\n            'k7-1': {\n                'k7-1-1': 7\n            }\n        }\n    }\n    settings = Settings(data1)\n\n    // get settings by get method or []\n    print(settings.get('k1'))\n    // output v1\n    print(settings['k1'])\n    // output v1\n    // use dot(.) to get inner value\n    print(settings.get('k2.k2-1'))\n    // output v2-1\n    print(settings['k2.k2-1'])\n    // output v2-1\n    // set default value if not set\n    // note None is not equal to not set\n    print(settings.get('not_set', 'yes'))\n    // output yes\n    // get whole settings as dict\n    print(settings.as_dict())\n    // clone a new settings\n    settings2 = settings.clone()\n    print(settings2 == settings)\n    // output True\n    print(settings2 is settings)\n    // output False\n\n    // set settings by set method or []\n    settings.set('k3', 'v3')\n    print(settings['k3])\n    // output v3\n    settings['k3'] = 'vv3'\n    print(settings['k3'])\n    // output vv3\n\n    // merge settings, keys conflict will be overrided\n    data2 = {\n        'k1': 'kk1',\n        'k2': {\n            'k2-1': 'kk2-1'\n        },\n        'k5': [3, 4],\n        'k6': {\n            'k6-2': 'kk6-2',\n            'k6-4': 2.4\n        }\n    }\n    settings3 = settings.clone()\n    settings3.merge(data2)\n    print(settings3['k2.k2-1'])\n    print(settings3['k2.k2-1'])\n    // output kk2-1\n    // output v2-1\n\n\nMore examples are in tests.\n\n\nTest\n====\n\nRun unit test\n\n.. code-block:: shell\n\n    pytest\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwwtg99%2Fhsettings","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwwtg99%2Fhsettings","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwwtg99%2Fhsettings/lists"}