actingweb


Nameactingweb JSON
Version 3.2.1 PyPI version JSON
download
home_pagehttp://actingweb.org
SummaryThe official ActingWeb library
upload_time2025-08-09 11:54:00
maintainerGreger Wedel
docs_urlNone
authorGreger Wedel
requires_python<4.0,>=3.11
licenseBSD
keywords actingweb distributed microservices rest api
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            ======================================================
README - actingweb - an ActingWeb Library
======================================================
This is a python library implementation showcasing the REST-based `ActingWeb <http://actingweb.org>`_
distributed micro-services model. A typical use case is bot to bot communication on a peer to peer level.
It serves as the reference implementation for the `ActingWeb REST protocol
specification <http://actingweb.readthedocs.io/en/release/>`_ for
how such micro-services interact.

Repository and documentation
----------------------------

The library is available as a PYPI library and installed with `pip install actingweb`. Project home is at
`https://pypi.org/project/actingweb/ <https://pypi.org/project/actingweb/>`_.

The git repository for this library can be found at
`https://github.com/gregertw/actingweb <https://github.com/gregertw/actingweb>`_.

The latest documentation for the released version (release branch) of this library can be found at 
`http://actingweb.readthedocs.io/ <http://actingweb.readthedocs.io/>`_.

The master branch of the library has the latest features and bug fixes and the updated documentation can be found at
`http://actingweb.readthedocs.io/en/master <http://actingweb.readthedocs.io/en/master>`_.


Why use actingweb?
---------------------
ActingWeb is well suited for applications where each individual user's data and functionality both needs high degree
of security and privacy AND high degree of interactions with the outside world. Typical use cases are Internet of Things
where each user's "Thing" becomes a bot that interacts with the outside world, as well as bot to bot
communication where each user can get a dedicated, controllable bot talking to other user's bots.

As a developer, you get a set of out of the box functionality from the ActingWeb library:

- an out-of-the-box REST bot representing each user's thing, service, or functionality (your choice)
- a way to store and expose data over REST in a very granular way using properties
- a trust system that allows creation of relationships the user's bot on the user level
- a subscription system that allows one bot (user) to subscribe to another bot's (user's) changes
- an oauth framework to tie the bot to any other API service and thus allow user to user communication using
    individual user's data from the API service

There is a high degree of configurability in what to expose, and although the ActingWeb specification specifies
a protocol set to allow bots from different developers to talk to each other, not all functionality needs to be
exposed.`

Each user's indvidual bot is called an ``actor`` and this actor has its own root URL where its data and services are
exposed. See below for further details.

Features of actingweb library
----------------------------------
The latest code in master is at all times deployed to
`https://actingwebdemo.greger.io/ <https://actingwebdemo.greger.io/>`_
It has implemented a simple sign-up page as a front-end to a REST-based factory URL that will instantiate a
new actor with a guid to identify the actor. The guid is then embedded in the actor's root URL, e.g.
``https://actingwebdemo.greger.io/9f1c331a3e3b5cf38d4c3600a2ab5d54``.

**Modern Interface (v3.2+)**

The library now provides a modern fluent API interface that simplifies application development:

::

    from actingweb.interface import ActingWebApp, ActorInterface

    # Modern fluent configuration API
    app = (
        ActingWebApp(
            aw_type="urn:actingweb:example.com:myapp",
            database="dynamodb",
            fqdn="myapp.example.com"
        )
        .with_oauth(
            client_id="your-oauth-client-id",
            client_secret="your-oauth-client-secret"
        )
        .with_web_ui(enable=True)
        .with_mcp(enable=True)  # Enable Model Context Protocol
    )

    # Decorator-based hooks instead of classes
    @app.actor_factory
    def create_actor(creator: str, **kwargs) -> ActorInterface:
        actor = ActorInterface.create(creator=creator, config=app.get_config())
        actor.properties.email = creator
        return actor

    @app.property_hook("email")
    def handle_email_property(actor, operation, value, path):
        if operation == "get":
            return None  # Hide email from external access
        return value

    # Automatic Flask/FastAPI integration
    from flask import Flask
    flask_app = Flask(__name__)
    app.integrate_flask(flask_app)  # Auto-generates all routes

**Key Modern Features:**
- **OAuth2 Authentication**: Modern OAuth2 with Google/GitHub support, email validation, and CSRF protection
- **Flask/FastAPI Integration**: Automatic route generation with async support for FastAPI
- **MCP Support**: Model Context Protocol integration for AI language model interactions
- **Content Negotiation**: Automatic JSON/HTML responses based on client preferences
- **Type Safety**: Comprehensive type hints and mypy support
- **90% Less Boilerplate**: Fluent API eliminates repetitive configuration code

If you try to create an actor, you will get to a simple web front-end where you can set the actor's data
(properties) and delete the actor. You can later access the actor (both /www and REST) by using the Creator
you set as username and the passphrase you get when creating the actor and log in.

**acting-web-gae-library** is a close to complete implementation of the full ActingWeb specification where all
functionality can be accessed through the actor's root URL (e.g.
``https://actingwebdemo.greger.io/9f1c331a3e3b5cf38d4c3600a2ab5d54``):

- ``/properties``: attributed/value pairs as flat or nested json can be set, accessed, and deleted to store this actor's data
- ``/meta``: a publicly available json structure allowing actor's to discover each other's capabilities
- ``/trust``: access to requesting, approving, and managing trust relationships with other actors of either the same type or any other actor "talking actingweb"
- ``/subscriptions``: once a trust relationship is set up, this path allows access to establishing, retrieving, and managing subscriptions that are based on paths and identified with target, sub-target, and resource, e.g. ``/resources/folders/12345``
- ``/callbacks``: used for verification when establishing trust/subscriptions, to receive callbacks on subscriptions, as well as a programming hook to process webhooks from 3rd party services
- ``/resources``: a skeleton to simplify exposure of any type of resource (where /properties is not suited)
- ``/oauth``: used to initiate a www-based oauth flow to tie the actor to a specific OAuth user and service. Available if OAuth is turned on and a 3rd party OAuth service has been configured. The modern interface supports both legacy OAuth and OAuth2 with enhanced security features including email validation and CSRF protection

**Sidenote**: The **actingweb  library** also implements a simple mechanism for protecting the /www path with oauth
(not in the specification). On successful OAuth authorisation, it will set a browser cookie to the oauth
token. This is not used in the inline demo and requires also that the identity of the user authorising OAuth
access is the same user already tied to the instantiated actor. There is a programming hook that allows such
verification as part of the OAuth flow, but it is not enabled in the actingwebdemo mini-application.

Other applications using the actingweb library
---------------------------------------------------
There is also another demo application available for `Cisco Webex Teams <http://https://www.webex.com/products/teams>`_
. It uses the actingweb library to implement a Webex Teams bot and integration. If you have signed up as a
Cisco Webex Teams user, you can try it out by sending a message to armyknife@webex.bot.

More details about the Army Knife can be found on `this blog <http://stuff.ttwedel.no/tag/spark>`_
.

The ActingWeb Model
-------------------
The ActingWeb micro-services model and protocol defines a bot-to-bot and micro-service-to-micro-service
communication that allows extreme distribution of data and functionality. This makes it very suitable for
holding small pieces of sensitive data on behalf of a user or "things" (as in Internet of Things).
These sensitive data can then be used and shared in a very granular and controlled way through the secure
and distributed ActingWeb REST protocol. This allows you to expose e.g. your location data from your phone
directly on the Internet (protected by a security framework) and to be used by other services **on your choosing**.
You can at any time revoke access to your data for one particular service without influencing anything else.

The ActingWeb Micro-Services Model
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The programming model in ActingWeb is based on an extreme focus on only representing one small set of functionality
and for only one user or entity. This is achieved by not allowing any other way of calling the service
(in ActingWeb called a "mini-application") than through a user and the mini-app's REST interface (a user's
instance of a mini-application is called an *actor* in ActingWeb). From a practical point of view, getting xyz's
location through the REST protocol is as simple as doing a GET ``http://mini-app-url/xyz/properties/location``.

There is absolutely no way of getting xyz's and yyz's location information in one request, and the security model
enforces access based on user (i.e. actor), so even if you have access to
``http://mini-app-url/xyz/properties/location``, you may not have access to
``http://mini-app-url/yyz/properties/location``.

Any functionality desired across actors, for example xyz sharing location information with yyz
**MUST** be done through the ActingWeb REST protocol. However, since the ActingWeb service-to-service
REST protocol is standardised, **any** service implementing the protocol can easily share data with other services.

The ActingWeb REST Protocol
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The ActingWeb REST protocol specifies a set of default endpoints (like ``/properties``, ``/trust``,
``/subscriptions`` etc) that are used to implement the service-to-service communication, as well as a set of
suggested endpoints (like ``/resources``, ``/actions`` etc) where the mini-applications can expose their own
functionality. All exchanges are based on REST principles and a set of flows are built into the protocol that
support exchanging data, establishing trust between actors (per actor, not per mini-application), as well as
subscribing to changes.

The ActingWeb Security Model
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The security model is based on trust between actors, not mini-applications. This means that each instance of the
mini-application holding the sensitive data for one particular person or thing **must** be connected through a trust
relationship to another ActingWeb actor, but it doesn't have to be a mini-application of the same type (like location
sharing), but could be a location sharing actor establishing a trust relationship with 911 authorities to
allow emergency services to always be able to look you up.

There are currently two ways of establishing trust between actors: either through an explicit OAuth flow where an
actor is tied to somebody's account somewhere else (like Google, GitHub, Box.com, etc) or through a flow where one actor
requests a trust relationship with another, which then needs to be approved either interactively by a user or
programatically through the REST interface.

**Enhanced OAuth2 Security (v3.2+):**
The modern interface includes an enhanced OAuth2 system with additional security measures:

- **Email Validation**: Prevents identity confusion attacks by validating that the OAuth2 email matches the form input
- **State Parameter Encryption**: CSRF protection through encrypted state parameters
- **Login Hint Support**: Improved user experience by pre-selecting the correct account during OAuth2 flow
- **Provider Auto-detection**: Supports Google and GitHub with automatic configuration

See `http://actingweb.org/ <http://actingweb.org/>`_ for more information.

Requirements
------------

**Python 3.11+**

The actingweb library requires Python 3.11 or higher and uses modern Python features including:

- Type hints with union syntax (``str | None``)
- F-string formatting
- Modern enum classes for constants
- Enhanced error handling with custom exception hierarchies

Dependencies:

- ``pynamodb`` - DynamoDB ORM for AWS DynamoDB backend
- ``boto3`` - AWS SDK for Python (DynamoDB support)
- ``urlfetch`` - HTTP client library

Development dependencies:

- ``pytest`` - Testing framework
- ``mypy`` - Static type checker
- ``black`` - Code formatter
- ``ruff`` - Fast Python linter

Building and installing
------------------------

::

    # Install from PyPI:
    pip install actingweb

    # For development with Poetry:
    poetry install
    poetry install --with dev,docs

    # Build source and binary distributions:
    poetry build

    # Upload to test server:
    poetry publish --repository pypitest

    # Upload to production server:
    poetry publish

Development
-----------

The library uses modern Python development practices with Poetry:

::

    # Install development dependencies:
    poetry install --with dev,docs

    # Run tests:
    poetry run pytest

    # Type checking:
    poetry run mypy actingweb

    # Code formatting:
    poetry run black actingweb tests

    # Linting:
    poetry run ruff check actingweb tests

    # Activate virtual environment:
    poetry shell

            

Raw data

            {
    "_id": null,
    "home_page": "http://actingweb.org",
    "name": "actingweb",
    "maintainer": "Greger Wedel",
    "docs_url": null,
    "requires_python": "<4.0,>=3.11",
    "maintainer_email": "support@greger.io",
    "keywords": "actingweb, distributed, microservices, rest, api",
    "author": "Greger Wedel",
    "author_email": "support@greger.io",
    "download_url": "https://files.pythonhosted.org/packages/73/60/4907b7922589a72c7de7ec83570879b4f4fd3721f57ae7def10e366d9309/actingweb-3.2.1.tar.gz",
    "platform": null,
    "description": "======================================================\nREADME - actingweb - an ActingWeb Library\n======================================================\nThis is a python library implementation showcasing the REST-based `ActingWeb <http://actingweb.org>`_\ndistributed micro-services model. A typical use case is bot to bot communication on a peer to peer level.\nIt serves as the reference implementation for the `ActingWeb REST protocol\nspecification <http://actingweb.readthedocs.io/en/release/>`_ for\nhow such micro-services interact.\n\nRepository and documentation\n----------------------------\n\nThe library is available as a PYPI library and installed with `pip install actingweb`. Project home is at\n`https://pypi.org/project/actingweb/ <https://pypi.org/project/actingweb/>`_.\n\nThe git repository for this library can be found at\n`https://github.com/gregertw/actingweb <https://github.com/gregertw/actingweb>`_.\n\nThe latest documentation for the released version (release branch) of this library can be found at \n`http://actingweb.readthedocs.io/ <http://actingweb.readthedocs.io/>`_.\n\nThe master branch of the library has the latest features and bug fixes and the updated documentation can be found at\n`http://actingweb.readthedocs.io/en/master <http://actingweb.readthedocs.io/en/master>`_.\n\n\nWhy use actingweb?\n---------------------\nActingWeb is well suited for applications where each individual user's data and functionality both needs high degree\nof security and privacy AND high degree of interactions with the outside world. Typical use cases are Internet of Things\nwhere each user's \"Thing\" becomes a bot that interacts with the outside world, as well as bot to bot\ncommunication where each user can get a dedicated, controllable bot talking to other user's bots.\n\nAs a developer, you get a set of out of the box functionality from the ActingWeb library:\n\n- an out-of-the-box REST bot representing each user's thing, service, or functionality (your choice)\n- a way to store and expose data over REST in a very granular way using properties\n- a trust system that allows creation of relationships the user's bot on the user level\n- a subscription system that allows one bot (user) to subscribe to another bot's (user's) changes\n- an oauth framework to tie the bot to any other API service and thus allow user to user communication using\n    individual user's data from the API service\n\nThere is a high degree of configurability in what to expose, and although the ActingWeb specification specifies\na protocol set to allow bots from different developers to talk to each other, not all functionality needs to be\nexposed.`\n\nEach user's indvidual bot is called an ``actor`` and this actor has its own root URL where its data and services are\nexposed. See below for further details.\n\nFeatures of actingweb library\n----------------------------------\nThe latest code in master is at all times deployed to\n`https://actingwebdemo.greger.io/ <https://actingwebdemo.greger.io/>`_\nIt has implemented a simple sign-up page as a front-end to a REST-based factory URL that will instantiate a\nnew actor with a guid to identify the actor. The guid is then embedded in the actor's root URL, e.g.\n``https://actingwebdemo.greger.io/9f1c331a3e3b5cf38d4c3600a2ab5d54``.\n\n**Modern Interface (v3.2+)**\n\nThe library now provides a modern fluent API interface that simplifies application development:\n\n::\n\n    from actingweb.interface import ActingWebApp, ActorInterface\n\n    # Modern fluent configuration API\n    app = (\n        ActingWebApp(\n            aw_type=\"urn:actingweb:example.com:myapp\",\n            database=\"dynamodb\",\n            fqdn=\"myapp.example.com\"\n        )\n        .with_oauth(\n            client_id=\"your-oauth-client-id\",\n            client_secret=\"your-oauth-client-secret\"\n        )\n        .with_web_ui(enable=True)\n        .with_mcp(enable=True)  # Enable Model Context Protocol\n    )\n\n    # Decorator-based hooks instead of classes\n    @app.actor_factory\n    def create_actor(creator: str, **kwargs) -> ActorInterface:\n        actor = ActorInterface.create(creator=creator, config=app.get_config())\n        actor.properties.email = creator\n        return actor\n\n    @app.property_hook(\"email\")\n    def handle_email_property(actor, operation, value, path):\n        if operation == \"get\":\n            return None  # Hide email from external access\n        return value\n\n    # Automatic Flask/FastAPI integration\n    from flask import Flask\n    flask_app = Flask(__name__)\n    app.integrate_flask(flask_app)  # Auto-generates all routes\n\n**Key Modern Features:**\n- **OAuth2 Authentication**: Modern OAuth2 with Google/GitHub support, email validation, and CSRF protection\n- **Flask/FastAPI Integration**: Automatic route generation with async support for FastAPI\n- **MCP Support**: Model Context Protocol integration for AI language model interactions\n- **Content Negotiation**: Automatic JSON/HTML responses based on client preferences\n- **Type Safety**: Comprehensive type hints and mypy support\n- **90% Less Boilerplate**: Fluent API eliminates repetitive configuration code\n\nIf you try to create an actor, you will get to a simple web front-end where you can set the actor's data\n(properties) and delete the actor. You can later access the actor (both /www and REST) by using the Creator\nyou set as username and the passphrase you get when creating the actor and log in.\n\n**acting-web-gae-library** is a close to complete implementation of the full ActingWeb specification where all\nfunctionality can be accessed through the actor's root URL (e.g.\n``https://actingwebdemo.greger.io/9f1c331a3e3b5cf38d4c3600a2ab5d54``):\n\n- ``/properties``: attributed/value pairs as flat or nested json can be set, accessed, and deleted to store this actor's data\n- ``/meta``: a publicly available json structure allowing actor's to discover each other's capabilities\n- ``/trust``: access to requesting, approving, and managing trust relationships with other actors of either the same type or any other actor \"talking actingweb\"\n- ``/subscriptions``: once a trust relationship is set up, this path allows access to establishing, retrieving, and managing subscriptions that are based on paths and identified with target, sub-target, and resource, e.g. ``/resources/folders/12345``\n- ``/callbacks``: used for verification when establishing trust/subscriptions, to receive callbacks on subscriptions, as well as a programming hook to process webhooks from 3rd party services\n- ``/resources``: a skeleton to simplify exposure of any type of resource (where /properties is not suited)\n- ``/oauth``: used to initiate a www-based oauth flow to tie the actor to a specific OAuth user and service. Available if OAuth is turned on and a 3rd party OAuth service has been configured. The modern interface supports both legacy OAuth and OAuth2 with enhanced security features including email validation and CSRF protection\n\n**Sidenote**: The **actingweb  library** also implements a simple mechanism for protecting the /www path with oauth\n(not in the specification). On successful OAuth authorisation, it will set a browser cookie to the oauth\ntoken. This is not used in the inline demo and requires also that the identity of the user authorising OAuth\naccess is the same user already tied to the instantiated actor. There is a programming hook that allows such\nverification as part of the OAuth flow, but it is not enabled in the actingwebdemo mini-application.\n\nOther applications using the actingweb library\n---------------------------------------------------\nThere is also another demo application available for `Cisco Webex Teams <http://https://www.webex.com/products/teams>`_\n. It uses the actingweb library to implement a Webex Teams bot and integration. If you have signed up as a\nCisco Webex Teams user, you can try it out by sending a message to armyknife@webex.bot.\n\nMore details about the Army Knife can be found on `this blog <http://stuff.ttwedel.no/tag/spark>`_\n.\n\nThe ActingWeb Model\n-------------------\nThe ActingWeb micro-services model and protocol defines a bot-to-bot and micro-service-to-micro-service\ncommunication that allows extreme distribution of data and functionality. This makes it very suitable for\nholding small pieces of sensitive data on behalf of a user or \"things\" (as in Internet of Things).\nThese sensitive data can then be used and shared in a very granular and controlled way through the secure\nand distributed ActingWeb REST protocol. This allows you to expose e.g. your location data from your phone\ndirectly on the Internet (protected by a security framework) and to be used by other services **on your choosing**.\nYou can at any time revoke access to your data for one particular service without influencing anything else.\n\nThe ActingWeb Micro-Services Model\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nThe programming model in ActingWeb is based on an extreme focus on only representing one small set of functionality\nand for only one user or entity. This is achieved by not allowing any other way of calling the service\n(in ActingWeb called a \"mini-application\") than through a user and the mini-app's REST interface (a user's\ninstance of a mini-application is called an *actor* in ActingWeb). From a practical point of view, getting xyz's\nlocation through the REST protocol is as simple as doing a GET ``http://mini-app-url/xyz/properties/location``.\n\nThere is absolutely no way of getting xyz's and yyz's location information in one request, and the security model\nenforces access based on user (i.e. actor), so even if you have access to\n``http://mini-app-url/xyz/properties/location``, you may not have access to\n``http://mini-app-url/yyz/properties/location``.\n\nAny functionality desired across actors, for example xyz sharing location information with yyz\n**MUST** be done through the ActingWeb REST protocol. However, since the ActingWeb service-to-service\nREST protocol is standardised, **any** service implementing the protocol can easily share data with other services.\n\nThe ActingWeb REST Protocol\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nThe ActingWeb REST protocol specifies a set of default endpoints (like ``/properties``, ``/trust``,\n``/subscriptions`` etc) that are used to implement the service-to-service communication, as well as a set of\nsuggested endpoints (like ``/resources``, ``/actions`` etc) where the mini-applications can expose their own\nfunctionality. All exchanges are based on REST principles and a set of flows are built into the protocol that\nsupport exchanging data, establishing trust between actors (per actor, not per mini-application), as well as\nsubscribing to changes.\n\nThe ActingWeb Security Model\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nThe security model is based on trust between actors, not mini-applications. This means that each instance of the\nmini-application holding the sensitive data for one particular person or thing **must** be connected through a trust\nrelationship to another ActingWeb actor, but it doesn't have to be a mini-application of the same type (like location\nsharing), but could be a location sharing actor establishing a trust relationship with 911 authorities to\nallow emergency services to always be able to look you up.\n\nThere are currently two ways of establishing trust between actors: either through an explicit OAuth flow where an\nactor is tied to somebody's account somewhere else (like Google, GitHub, Box.com, etc) or through a flow where one actor\nrequests a trust relationship with another, which then needs to be approved either interactively by a user or\nprogramatically through the REST interface.\n\n**Enhanced OAuth2 Security (v3.2+):**\nThe modern interface includes an enhanced OAuth2 system with additional security measures:\n\n- **Email Validation**: Prevents identity confusion attacks by validating that the OAuth2 email matches the form input\n- **State Parameter Encryption**: CSRF protection through encrypted state parameters\n- **Login Hint Support**: Improved user experience by pre-selecting the correct account during OAuth2 flow\n- **Provider Auto-detection**: Supports Google and GitHub with automatic configuration\n\nSee `http://actingweb.org/ <http://actingweb.org/>`_ for more information.\n\nRequirements\n------------\n\n**Python 3.11+**\n\nThe actingweb library requires Python 3.11 or higher and uses modern Python features including:\n\n- Type hints with union syntax (``str | None``)\n- F-string formatting\n- Modern enum classes for constants\n- Enhanced error handling with custom exception hierarchies\n\nDependencies:\n\n- ``pynamodb`` - DynamoDB ORM for AWS DynamoDB backend\n- ``boto3`` - AWS SDK for Python (DynamoDB support)\n- ``urlfetch`` - HTTP client library\n\nDevelopment dependencies:\n\n- ``pytest`` - Testing framework\n- ``mypy`` - Static type checker\n- ``black`` - Code formatter\n- ``ruff`` - Fast Python linter\n\nBuilding and installing\n------------------------\n\n::\n\n    # Install from PyPI:\n    pip install actingweb\n\n    # For development with Poetry:\n    poetry install\n    poetry install --with dev,docs\n\n    # Build source and binary distributions:\n    poetry build\n\n    # Upload to test server:\n    poetry publish --repository pypitest\n\n    # Upload to production server:\n    poetry publish\n\nDevelopment\n-----------\n\nThe library uses modern Python development practices with Poetry:\n\n::\n\n    # Install development dependencies:\n    poetry install --with dev,docs\n\n    # Run tests:\n    poetry run pytest\n\n    # Type checking:\n    poetry run mypy actingweb\n\n    # Code formatting:\n    poetry run black actingweb tests\n\n    # Linting:\n    poetry run ruff check actingweb tests\n\n    # Activate virtual environment:\n    poetry shell\n",
    "bugtrack_url": null,
    "license": "BSD",
    "summary": "The official ActingWeb library",
    "version": "3.2.1",
    "project_urls": {
        "Documentation": "http://actingweb.readthedocs.io",
        "Homepage": "http://actingweb.org",
        "Repository": "https://github.com/actingweb/actingweb"
    },
    "split_keywords": [
        "actingweb",
        " distributed",
        " microservices",
        " rest",
        " api"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "c88172eaad5a450074c49af0918a4608d7659901d2fc219a3106c8f844094cdb",
                "md5": "fc0f257dd558ffcc3da193e9c347e87d",
                "sha256": "1dfa2f09b4199d8d44acf289cf5195b4908600d03aeb3796b6040e197b08441a"
            },
            "downloads": -1,
            "filename": "actingweb-3.2.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "fc0f257dd558ffcc3da193e9c347e87d",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": "<4.0,>=3.11",
            "size": 149637,
            "upload_time": "2025-08-09T11:53:58",
            "upload_time_iso_8601": "2025-08-09T11:53:58.944374Z",
            "url": "https://files.pythonhosted.org/packages/c8/81/72eaad5a450074c49af0918a4608d7659901d2fc219a3106c8f844094cdb/actingweb-3.2.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "73604907b7922589a72c7de7ec83570879b4f4fd3721f57ae7def10e366d9309",
                "md5": "6188046c6284c86a8403d9dc3cace12d",
                "sha256": "fa65b634a345d82980e082818cb9d544414adc6aaab2c6067afe790f39c0cbc6"
            },
            "downloads": -1,
            "filename": "actingweb-3.2.1.tar.gz",
            "has_sig": false,
            "md5_digest": "6188046c6284c86a8403d9dc3cace12d",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": "<4.0,>=3.11",
            "size": 121726,
            "upload_time": "2025-08-09T11:54:00",
            "upload_time_iso_8601": "2025-08-09T11:54:00.481976Z",
            "url": "https://files.pythonhosted.org/packages/73/60/4907b7922589a72c7de7ec83570879b4f4fd3721f57ae7def10e366d9309/actingweb-3.2.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-09 11:54:00",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "actingweb",
    "github_project": "actingweb",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "actingweb"
}
        
Elapsed time: 1.08851s