Name | emcd-appcore JSON |
Version |
1.2
JSON |
| download |
home_page | None |
Summary | Common application configuration management. |
upload_time | 2025-07-16 02:10:40 |
maintainer | None |
docs_url | None |
author | None |
requires_python | >=3.10 |
license | None |
keywords |
application
async
configuration
|
VCS |
 |
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
.. vim: set fileencoding=utf-8:
.. -*- coding: utf-8 -*-
.. +--------------------------------------------------------------------------+
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| |
+--------------------------------------------------------------------------+
*******************************************************************************
emcd-appcore
*******************************************************************************
.. image:: https://img.shields.io/pypi/v/emcd-appcore
:alt: Package Version
:target: https://pypi.org/project/emcd-appcore/
.. image:: https://img.shields.io/pypi/status/emcd-appcore
:alt: PyPI - Status
:target: https://pypi.org/project/emcd-appcore/
.. image:: https://github.com/emcd/python-appcore/actions/workflows/tester.yaml/badge.svg?branch=master&event=push
:alt: Tests Status
:target: https://github.com/emcd/python-appcore/actions/workflows/tester.yaml
.. image:: https://emcd.github.io/python-appcore/coverage.svg
:alt: Code Coverage Percentage
:target: https://github.com/emcd/python-appcore/actions/workflows/tester.yaml
.. image:: https://img.shields.io/github/license/emcd/python-appcore
:alt: Project License
:target: https://github.com/emcd/python-appcore/blob/master/LICENSE.txt
.. image:: https://img.shields.io/pypi/pyversions/emcd-appcore
:alt: Python Versions
:target: https://pypi.org/project/emcd-appcore/
🏗️ A Python library package which provides **application foundation
components** - streamlined async initialization, configuration management,
platform directories, logging setup, and environment handling for Python
applications.
Key Features ⭐
===============================================================================
* 🚀 **Async Application Initialization**: Single ``prepare()`` function that
sets up your entire application foundation with sensible defaults.
* 📁 **Platform Directory Management**: Automatic discovery and creation of
platform-specific directories for configuration, data, and cache.
* ⚙️ **TOML Configuration System**: Hierarchical configuration loading with
includes, template variables, and overrides. Can bring your own configuration
system too.
* 🎯 **Distribution Detection**: Automatic detection of development vs
production deployment modes with package introspection.
* 📝 **Logging Configuration**: Logging setup with plain and rich modes and
environment variable overrides.
* 🔄 **Resource Management**: Integration with ``AsyncExitStack`` for proper
cleanup of async resources.
* 🏷️ **Safety**: Full type annotations with immutable data structures for
thread safety.
Installation 📦
===============================================================================
Method: Install Python Package
-------------------------------------------------------------------------------
Install via `uv <https://github.com/astral-sh/uv/blob/main/README.md>`_ ``pip``
command:
::
uv pip install emcd-appcore
Or, install via ``pip``:
::
pip install emcd-appcore
Examples 💡
===============================================================================
Quick Start 🚀
-------------------------------------------------------------------------------
The simplest way to initialize your application:
>>> import asyncio
>>> import contextlib
>>> import appcore
>>> async def main( ):
... async with contextlib.AsyncExitStack( ) as exits:
... # Initialize application core with auto-detection
... auxdata = await appcore.prepare( exits )
... print( f"App: {auxdata.application.name}" )
... print( f"Mode: {'dev' if auxdata.distribution.editable else 'prod'}" )
... return auxdata.configuration
>>> # asyncio.run( main( ) ) # Returns configuration dictionary
Configuration Access ⚙️
-------------------------------------------------------------------------------
Access your application's TOML configuration:
>>> async def show_config( ):
... async with contextlib.AsyncExitStack( ) as exits:
... auxdata = await appcore.prepare( exits )
... config = auxdata.configuration
... # Configuration loaded from general.toml in user config directory
... print( f"Available sections: {list( config.keys( ) )}" )
... # Access nested configuration values
... if 'app' in config:
... print( f"App name: {config[ 'app' ].get( 'name', 'Unknown' )}" )
... return config
>>> # asyncio.run( show_config( ) )
Platform Directories 📁
-------------------------------------------------------------------------------
Access platform-specific directories for your application:
>>> async def show_directories( ):
... async with contextlib.AsyncExitStack( ) as exits:
... app_info = appcore.ApplicationInformation(
... name = 'my-app', publisher = 'MyCompany' )
... auxdata = await appcore.prepare( exits, application = app_info )
... dirs = auxdata.directories
... print( f"Config: {dirs.user_config_path}" )
... print( f"Data: {dirs.user_data_path}" )
... print( f"Cache: {dirs.user_cache_path}" )
>>> # asyncio.run( show_directories( ) )
Logging Configuration 📝
-------------------------------------------------------------------------------
Configure logging with Rich support and environment overrides:
>>> import appcore
>>> async def setup_logging( ):
... async with contextlib.AsyncExitStack( ) as exits:
... # Rich logging with environment variable support
... inscription = appcore.inscription.Control(
... mode = appcore.inscription.Modes.Rich, level = 'debug' )
... auxdata = await appcore.prepare( exits, inscription = inscription )
... # Logging level can be overridden via MY_APP_INSCRIPTION_LEVEL
... return "Logging configured"
>>> # asyncio.run( setup_logging( ) )
Dependencies & Architecture 🏛️
===============================================================================
Appcore is built on a foundation of proven, lightweight dependencies:
* **Configuration**: Uses standard library ``tomli`` for TOML parsing with
`accretive <https://pypi.org/project/accretive/>`_ data structures that can
grow but never shrink.
* **Platform Integration**: Leverages ``platformdirs`` for cross-platform
directory discovery and ``aiofiles`` for async file operations.
* **Logging Enhancement**: Optional integration with `Rich
<https://github.com/Textualize/rich>`_ for enhanced console output with
graceful fallbacks.
* **Distribution Management**: Uses ``importlib-metadata`` and
``importlib-resources`` for package introspection and resource handling.
The architecture emphasizes:
* **Immutability**: All configuration and state objects are immutable after
creation, preventing accidental modifications.
* **Async-First**: Built from the ground up for async/await patterns with
proper resource management.
* **Dependency Injection**: Configurable components that can be replaced or
extended without modifying core functionality.
* **Type Safety**: Comprehensive type annotations for excellent IDE support
and static analysis.
Contribution 🤝
===============================================================================
Contribution to this project is welcome! However, it must follow the `code of
conduct
<https://emcd.github.io/python-project-common/stable/sphinx-html/common/conduct.html>`_
for the project.
Please file bug reports and feature requests in the `issue tracker
<https://github.com/emcd/python-appcore/issues>`_ or submit `pull
requests <https://github.com/emcd/python-appcore/pulls>`_ to
improve the source code or documentation.
For development guidance and standards, please see the `development guide
<https://emcd.github.io/python-appcore/stable/sphinx-html/contribution.html#development>`_.
`More Flair <https://www.imdb.com/title/tt0151804/characters/nm0431918>`_
===============================================================================
.. image:: https://img.shields.io/github/last-commit/emcd/python-appcore
:alt: GitHub last commit
:target: https://github.com/emcd/python-appcore
.. image:: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/copier-org/copier/master/img/badge/badge-grayscale-inverted-border-orange.json
:alt: Copier
:target: https://github.com/copier-org/copier
.. image:: https://img.shields.io/badge/%F0%9F%A5%9A-Hatch-4051b5.svg
:alt: Hatch
:target: https://github.com/pypa/hatch
.. image:: https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit
:alt: pre-commit
:target: https://github.com/pre-commit/pre-commit
.. image:: https://microsoft.github.io/pyright/img/pyright_badge.svg
:alt: Pyright
:target: https://microsoft.github.io/pyright
.. image:: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json
:alt: Ruff
:target: https://github.com/astral-sh/ruff
.. image:: https://img.shields.io/pypi/implementation/emcd-appcore
:alt: PyPI - Implementation
:target: https://pypi.org/project/emcd-appcore/
.. image:: https://img.shields.io/pypi/wheel/emcd-appcore
:alt: PyPI - Wheel
:target: https://pypi.org/project/emcd-appcore/
Other Projects by This Author 🌟
===============================================================================
* `python-absence <https://github.com/emcd/python-absence>`_ (`absence <https://pypi.org/project/absence/>`_ on PyPI)
🕳️ A Python library package which provides a **sentinel for absent values** - a falsey, immutable singleton that represents the absence of a value in contexts where ``None`` or ``False`` may be valid values.
* `python-accretive <https://github.com/emcd/python-accretive>`_ (`accretive <https://pypi.org/project/accretive/>`_ on PyPI)
🌌 A Python library package which provides **accretive data structures** - collections which can grow but never shrink.
* `python-classcore <https://github.com/emcd/python-classcore>`_ (`classcore <https://pypi.org/project/classcore/>`_ on PyPI)
🏭 A Python library package which provides **foundational class factories and decorators** for providing classes with attributes immutability and concealment and other custom behaviors.
* `python-dynadoc <https://github.com/emcd/python-dynadoc>`_ (`dynadoc <https://pypi.org/project/dynadoc/>`_ on PyPI)
📝 A Python library package which bridges the gap between **rich annotations** and **automatic documentation generation** with configurable renderers and support for reusable fragments.
* `python-falsifier <https://github.com/emcd/python-falsifier>`_ (`falsifier <https://pypi.org/project/falsifier/>`_ on PyPI)
🎭 A very simple Python library package which provides a **base class for falsey objects** - objects that evaluate to ``False`` in boolean contexts.
* `python-frigid <https://github.com/emcd/python-frigid>`_ (`frigid <https://pypi.org/project/frigid/>`_ on PyPI)
🔒 A Python library package which provides **immutable data structures** - collections which cannot be modified after creation.
* `python-icecream-truck <https://github.com/emcd/python-icecream-truck>`_ (`icecream-truck <https://pypi.org/project/icecream-truck/>`_ on PyPI)
🍦 **Flavorful Debugging** - A Python library which enhances the powerful and well-known ``icecream`` package with flavored traces, configuration hierarchies, customized outputs, ready-made recipes, and more.
* `python-mimeogram <https://github.com/emcd/python-mimeogram>`_ (`mimeogram <https://pypi.org/project/mimeogram/>`_ on PyPI)
📨 A command-line tool for **exchanging collections of files with Large Language Models** - bundle multiple files into a single clipboard-ready document while preserving directory structure and metadata... good for code reviews, project sharing, and LLM interactions.
Raw data
{
"_id": null,
"home_page": null,
"name": "emcd-appcore",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.10",
"maintainer_email": null,
"keywords": "application, async, configuration",
"author": null,
"author_email": "Eric McDonald <emcd@users.noreply.github.com>",
"download_url": "https://files.pythonhosted.org/packages/df/97/3b7f6da75ec55dcc165017b35deb821fadc941b84cb5b6044155d2b205b8/emcd_appcore-1.2.tar.gz",
"platform": null,
"description": ".. vim: set fileencoding=utf-8:\n.. -*- coding: utf-8 -*-\n.. +--------------------------------------------------------------------------+\n | |\n | Licensed under the Apache License, Version 2.0 (the \"License\"); |\n | you may not use this file except in compliance with the License. |\n | You may obtain a copy of the License at |\n | |\n | http://www.apache.org/licenses/LICENSE-2.0 |\n | |\n | Unless required by applicable law or agreed to in writing, software |\n | distributed under the License is distributed on an \"AS IS\" BASIS, |\n | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |\n | See the License for the specific language governing permissions and |\n | limitations under the License. |\n | |\n +--------------------------------------------------------------------------+\n\n*******************************************************************************\n emcd-appcore\n*******************************************************************************\n\n.. image:: https://img.shields.io/pypi/v/emcd-appcore\n :alt: Package Version\n :target: https://pypi.org/project/emcd-appcore/\n\n.. image:: https://img.shields.io/pypi/status/emcd-appcore\n :alt: PyPI - Status\n :target: https://pypi.org/project/emcd-appcore/\n\n.. image:: https://github.com/emcd/python-appcore/actions/workflows/tester.yaml/badge.svg?branch=master&event=push\n :alt: Tests Status\n :target: https://github.com/emcd/python-appcore/actions/workflows/tester.yaml\n\n.. image:: https://emcd.github.io/python-appcore/coverage.svg\n :alt: Code Coverage Percentage\n :target: https://github.com/emcd/python-appcore/actions/workflows/tester.yaml\n\n.. image:: https://img.shields.io/github/license/emcd/python-appcore\n :alt: Project License\n :target: https://github.com/emcd/python-appcore/blob/master/LICENSE.txt\n\n.. image:: https://img.shields.io/pypi/pyversions/emcd-appcore\n :alt: Python Versions\n :target: https://pypi.org/project/emcd-appcore/\n\n\n\ud83c\udfd7\ufe0f A Python library package which provides **application foundation\ncomponents** - streamlined async initialization, configuration management,\nplatform directories, logging setup, and environment handling for Python\napplications.\n\n\nKey Features \u2b50\n===============================================================================\n\n* \ud83d\ude80 **Async Application Initialization**: Single ``prepare()`` function that\n sets up your entire application foundation with sensible defaults.\n* \ud83d\udcc1 **Platform Directory Management**: Automatic discovery and creation of\n platform-specific directories for configuration, data, and cache.\n* \u2699\ufe0f **TOML Configuration System**: Hierarchical configuration loading with\n includes, template variables, and overrides. Can bring your own configuration\n system too.\n* \ud83c\udfaf **Distribution Detection**: Automatic detection of development vs\n production deployment modes with package introspection.\n* \ud83d\udcdd **Logging Configuration**: Logging setup with plain and rich modes and\n environment variable overrides.\n* \ud83d\udd04 **Resource Management**: Integration with ``AsyncExitStack`` for proper\n cleanup of async resources.\n* \ud83c\udff7\ufe0f **Safety**: Full type annotations with immutable data structures for\n thread safety.\n\n\nInstallation \ud83d\udce6\n===============================================================================\n\nMethod: Install Python Package\n-------------------------------------------------------------------------------\n\nInstall via `uv <https://github.com/astral-sh/uv/blob/main/README.md>`_ ``pip``\ncommand:\n\n::\n\n uv pip install emcd-appcore\n\nOr, install via ``pip``:\n\n::\n\n pip install emcd-appcore\n\n\nExamples \ud83d\udca1\n===============================================================================\n\n\nQuick Start \ud83d\ude80\n-------------------------------------------------------------------------------\n\nThe simplest way to initialize your application:\n\n>>> import asyncio\n>>> import contextlib\n>>> import appcore\n>>> async def main( ):\n... async with contextlib.AsyncExitStack( ) as exits:\n... # Initialize application core with auto-detection\n... auxdata = await appcore.prepare( exits )\n... print( f\"App: {auxdata.application.name}\" )\n... print( f\"Mode: {'dev' if auxdata.distribution.editable else 'prod'}\" )\n... return auxdata.configuration\n>>> # asyncio.run( main( ) ) # Returns configuration dictionary\n\n\nConfiguration Access \u2699\ufe0f\n-------------------------------------------------------------------------------\n\nAccess your application's TOML configuration:\n\n>>> async def show_config( ):\n... async with contextlib.AsyncExitStack( ) as exits:\n... auxdata = await appcore.prepare( exits )\n... config = auxdata.configuration\n... # Configuration loaded from general.toml in user config directory\n... print( f\"Available sections: {list( config.keys( ) )}\" )\n... # Access nested configuration values\n... if 'app' in config:\n... print( f\"App name: {config[ 'app' ].get( 'name', 'Unknown' )}\" )\n... return config\n>>> # asyncio.run( show_config( ) )\n\n\nPlatform Directories \ud83d\udcc1\n-------------------------------------------------------------------------------\n\nAccess platform-specific directories for your application:\n\n>>> async def show_directories( ):\n... async with contextlib.AsyncExitStack( ) as exits:\n... app_info = appcore.ApplicationInformation(\n... name = 'my-app', publisher = 'MyCompany' )\n... auxdata = await appcore.prepare( exits, application = app_info )\n... dirs = auxdata.directories\n... print( f\"Config: {dirs.user_config_path}\" )\n... print( f\"Data: {dirs.user_data_path}\" )\n... print( f\"Cache: {dirs.user_cache_path}\" )\n>>> # asyncio.run( show_directories( ) )\n\nLogging Configuration \ud83d\udcdd\n-------------------------------------------------------------------------------\n\nConfigure logging with Rich support and environment overrides:\n\n>>> import appcore\n>>> async def setup_logging( ):\n... async with contextlib.AsyncExitStack( ) as exits:\n... # Rich logging with environment variable support\n... inscription = appcore.inscription.Control(\n... mode = appcore.inscription.Modes.Rich, level = 'debug' )\n... auxdata = await appcore.prepare( exits, inscription = inscription )\n... # Logging level can be overridden via MY_APP_INSCRIPTION_LEVEL\n... return \"Logging configured\"\n>>> # asyncio.run( setup_logging( ) )\n\n\nDependencies & Architecture \ud83c\udfdb\ufe0f\n===============================================================================\n\nAppcore is built on a foundation of proven, lightweight dependencies:\n\n* **Configuration**: Uses standard library ``tomli`` for TOML parsing with\n `accretive <https://pypi.org/project/accretive/>`_ data structures that can\n grow but never shrink.\n* **Platform Integration**: Leverages ``platformdirs`` for cross-platform\n directory discovery and ``aiofiles`` for async file operations.\n* **Logging Enhancement**: Optional integration with `Rich\n <https://github.com/Textualize/rich>`_ for enhanced console output with\n graceful fallbacks.\n* **Distribution Management**: Uses ``importlib-metadata`` and\n ``importlib-resources`` for package introspection and resource handling.\n\nThe architecture emphasizes:\n\n* **Immutability**: All configuration and state objects are immutable after\n creation, preventing accidental modifications.\n* **Async-First**: Built from the ground up for async/await patterns with\n proper resource management.\n* **Dependency Injection**: Configurable components that can be replaced or\n extended without modifying core functionality.\n* **Type Safety**: Comprehensive type annotations for excellent IDE support\n and static analysis.\n\n\nContribution \ud83e\udd1d\n===============================================================================\n\nContribution to this project is welcome! However, it must follow the `code of\nconduct\n<https://emcd.github.io/python-project-common/stable/sphinx-html/common/conduct.html>`_\nfor the project.\n\nPlease file bug reports and feature requests in the `issue tracker\n<https://github.com/emcd/python-appcore/issues>`_ or submit `pull\nrequests <https://github.com/emcd/python-appcore/pulls>`_ to\nimprove the source code or documentation.\n\nFor development guidance and standards, please see the `development guide\n<https://emcd.github.io/python-appcore/stable/sphinx-html/contribution.html#development>`_.\n\n\n`More Flair <https://www.imdb.com/title/tt0151804/characters/nm0431918>`_\n===============================================================================\n\n.. image:: https://img.shields.io/github/last-commit/emcd/python-appcore\n :alt: GitHub last commit\n :target: https://github.com/emcd/python-appcore\n\n.. image:: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/copier-org/copier/master/img/badge/badge-grayscale-inverted-border-orange.json\n :alt: Copier\n :target: https://github.com/copier-org/copier\n\n.. image:: https://img.shields.io/badge/%F0%9F%A5%9A-Hatch-4051b5.svg\n :alt: Hatch\n :target: https://github.com/pypa/hatch\n\n.. image:: https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit\n :alt: pre-commit\n :target: https://github.com/pre-commit/pre-commit\n\n.. image:: https://microsoft.github.io/pyright/img/pyright_badge.svg\n :alt: Pyright\n :target: https://microsoft.github.io/pyright\n\n.. image:: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json\n :alt: Ruff\n :target: https://github.com/astral-sh/ruff\n\n.. image:: https://img.shields.io/pypi/implementation/emcd-appcore\n :alt: PyPI - Implementation\n :target: https://pypi.org/project/emcd-appcore/\n\n.. image:: https://img.shields.io/pypi/wheel/emcd-appcore\n :alt: PyPI - Wheel\n :target: https://pypi.org/project/emcd-appcore/\n\n\nOther Projects by This Author \ud83c\udf1f\n===============================================================================\n\n* `python-absence <https://github.com/emcd/python-absence>`_ (`absence <https://pypi.org/project/absence/>`_ on PyPI)\n\n \ud83d\udd73\ufe0f A Python library package which provides a **sentinel for absent values** - a falsey, immutable singleton that represents the absence of a value in contexts where ``None`` or ``False`` may be valid values.\n\n* `python-accretive <https://github.com/emcd/python-accretive>`_ (`accretive <https://pypi.org/project/accretive/>`_ on PyPI)\n\n \ud83c\udf0c A Python library package which provides **accretive data structures** - collections which can grow but never shrink.\n\n* `python-classcore <https://github.com/emcd/python-classcore>`_ (`classcore <https://pypi.org/project/classcore/>`_ on PyPI)\n\n \ud83c\udfed A Python library package which provides **foundational class factories and decorators** for providing classes with attributes immutability and concealment and other custom behaviors.\n\n* `python-dynadoc <https://github.com/emcd/python-dynadoc>`_ (`dynadoc <https://pypi.org/project/dynadoc/>`_ on PyPI)\n\n \ud83d\udcdd A Python library package which bridges the gap between **rich annotations** and **automatic documentation generation** with configurable renderers and support for reusable fragments.\n\n* `python-falsifier <https://github.com/emcd/python-falsifier>`_ (`falsifier <https://pypi.org/project/falsifier/>`_ on PyPI)\n\n \ud83c\udfad A very simple Python library package which provides a **base class for falsey objects** - objects that evaluate to ``False`` in boolean contexts.\n\n* `python-frigid <https://github.com/emcd/python-frigid>`_ (`frigid <https://pypi.org/project/frigid/>`_ on PyPI)\n\n \ud83d\udd12 A Python library package which provides **immutable data structures** - collections which cannot be modified after creation.\n\n* `python-icecream-truck <https://github.com/emcd/python-icecream-truck>`_ (`icecream-truck <https://pypi.org/project/icecream-truck/>`_ on PyPI)\n\n \ud83c\udf66 **Flavorful Debugging** - A Python library which enhances the powerful and well-known ``icecream`` package with flavored traces, configuration hierarchies, customized outputs, ready-made recipes, and more.\n\n* `python-mimeogram <https://github.com/emcd/python-mimeogram>`_ (`mimeogram <https://pypi.org/project/mimeogram/>`_ on PyPI)\n\n \ud83d\udce8 A command-line tool for **exchanging collections of files with Large Language Models** - bundle multiple files into a single clipboard-ready document while preserving directory structure and metadata... good for code reviews, project sharing, and LLM interactions.\n",
"bugtrack_url": null,
"license": null,
"summary": "Common application configuration management.",
"version": "1.2",
"project_urls": {
"Documentation": "https://emcd.github.io/python-appcore",
"Download": "https://pypi.org/project/emcd-appcore/#files",
"Homepage": "https://github.com/emcd/python-appcore",
"Issue Tracker": "https://github.com/emcd/python-appcore/issues",
"Source Code": "https://github.com/emcd/python-appcore"
},
"split_keywords": [
"application",
" async",
" configuration"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "7871503ff5c74c1cc40f04ccb506fe475e0d252b29d3aa6c4614fa253d600955",
"md5": "53013ea9fdea4f576840b14ce8fb2235",
"sha256": "d1e45605f5b0fcc6103a192f85faf3041176ae4e191b8a410c3bc9869fcd91df"
},
"downloads": -1,
"filename": "emcd_appcore-1.2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "53013ea9fdea4f576840b14ce8fb2235",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10",
"size": 30552,
"upload_time": "2025-07-16T02:10:38",
"upload_time_iso_8601": "2025-07-16T02:10:38.763172Z",
"url": "https://files.pythonhosted.org/packages/78/71/503ff5c74c1cc40f04ccb506fe475e0d252b29d3aa6c4614fa253d600955/emcd_appcore-1.2-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "df973b7f6da75ec55dcc165017b35deb821fadc941b84cb5b6044155d2b205b8",
"md5": "f715806429723fd7950acd288e92f68a",
"sha256": "7fe2b85f85cd36c407dbd6735ba6ba6a0735c39ebeb389d821916a0538b29560"
},
"downloads": -1,
"filename": "emcd_appcore-1.2.tar.gz",
"has_sig": false,
"md5_digest": "f715806429723fd7950acd288e92f68a",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.10",
"size": 21591,
"upload_time": "2025-07-16T02:10:40",
"upload_time_iso_8601": "2025-07-16T02:10:40.372211Z",
"url": "https://files.pythonhosted.org/packages/df/97/3b7f6da75ec55dcc165017b35deb821fadc941b84cb5b6044155d2b205b8/emcd_appcore-1.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-16 02:10:40",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "emcd",
"github_project": "python-appcore",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "emcd-appcore"
}