my-magento


Namemy-magento JSON
Version 2.2.0 PyPI version JSON
download
home_pagehttps://www.github.com/TDKorn/my-magento
SummaryPython Magento 2 REST API Wrapper
upload_time2024-01-09 05:48:47
maintainer
docs_urlNone
authorAdam Korn
requires_python
licenseMIT
keywords magento magento-api python-magento python python3 magento-python pymagento py-magento magento2 magento-2 magento2-api
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            .. |.~.ACCESS_TOKEN| replace:: ACCESS_TOKEN
.. _.~.ACCESS_TOKEN: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client.ACCESS_TOKEN
.. |.~.APIResponse| replace:: APIResponse
.. _.~.APIResponse: https://my-magento.readthedocs.io/en/latest/model.html#magento.models.model.APIResponse
.. |.~.Category| replace:: Category
.. _.~.Category: https://my-magento.readthedocs.io/en/latest/category.html#magento.models.category.Category
.. |.~.CategorySearch| replace:: CategorySearch
.. _.~.CategorySearch: https://my-magento.readthedocs.io/en/latest/search_module.html#magento.search.CategorySearch
.. |.~.Client| replace:: Client
.. _.~.Client: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client
.. |..Client.categories| replace:: Client.categories
.. _..Client.categories: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client.categories
.. |..Client.customers| replace:: Client.customers
.. _..Client.customers: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client.customers
.. |..Client.invoices| replace:: Client.invoices
.. _..Client.invoices: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client.invoices
.. |..Client.order_items| replace:: Client.order_items
.. _..Client.order_items: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client.order_items
.. |..Client.orders| replace:: Client.orders
.. _..Client.orders: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client.orders
.. |..Client.product_attributes| replace:: Client.product_attributes
.. _..Client.product_attributes: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client.product_attributes
.. |..Client.products| replace:: Client.products
.. _..Client.products: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client.products
.. |..Client.scope| replace:: Client.scope
.. _..Client.scope: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client.scope
.. |..Client.search| replace:: Client.search()
.. _..Client.search: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client.search
.. |..Client.url_for| replace:: Client.url_for()
.. _..Client.url_for: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client.url_for
.. |.~.Customer| replace:: Customer
.. _.~.Customer: https://my-magento.readthedocs.io/en/latest/customer.html#magento.models.customer.Customer
.. |.~.CustomerSearch| replace:: CustomerSearch
.. _.~.CustomerSearch: https://my-magento.readthedocs.io/en/latest/search_module.html#magento.search.CustomerSearch
.. |.~.Invoice| replace:: Invoice
.. _.~.Invoice: https://my-magento.readthedocs.io/en/latest/invoice.html#magento.models.invoice.Invoice
.. |.~.InvoiceSearch| replace:: InvoiceSearch
.. _.~.InvoiceSearch: https://my-magento.readthedocs.io/en/latest/search_module.html#magento.search.InvoiceSearch
.. |.~.MediaEntry| replace:: MediaEntry
.. _.~.MediaEntry: https://my-magento.readthedocs.io/en/latest/product.html#magento.models.product.MediaEntry
.. |.~.Model| replace:: Model
.. _.~.Model: https://my-magento.readthedocs.io/en/latest/model.html#magento.models.model.Model
.. |..Model.refresh| replace:: Model.refresh()
.. _..Model.refresh: https://my-magento.readthedocs.io/en/latest/model.html#magento.models.model.Model.refresh
.. |.~.Order| replace:: Order
.. _.~.Order: https://my-magento.readthedocs.io/en/latest/order.html#magento.models.order.Order
.. |.~.OrderItem| replace:: OrderItem
.. _.~.OrderItem: https://my-magento.readthedocs.io/en/latest/order.html#magento.models.order.OrderItem
.. |.~.OrderItemSearch| replace:: OrderItemSearch
.. _.~.OrderItemSearch: https://my-magento.readthedocs.io/en/latest/search_module.html#magento.search.OrderItemSearch
.. |.~.OrderSearch| replace:: OrderSearch
.. _.~.OrderSearch: https://my-magento.readthedocs.io/en/latest/search_module.html#magento.search.OrderSearch
.. |.~.Product| replace:: Product
.. _.~.Product: https://my-magento.readthedocs.io/en/latest/product.html#magento.models.product.Product
.. |.~.ProductAttribute| replace:: ProductAttribute
.. _.~.ProductAttribute: https://my-magento.readthedocs.io/en/latest/product.html#magento.models.product.ProductAttribute
.. |.~.ProductAttributeSearch| replace:: ProductAttributeSearch
.. _.~.ProductAttributeSearch: https://my-magento.readthedocs.io/en/latest/search_module.html#magento.search.ProductAttributeSearch
.. |.~.ProductSearch| replace:: ProductSearch
.. _.~.ProductSearch: https://my-magento.readthedocs.io/en/latest/search_module.html#magento.search.ProductSearch
.. |.~.ProductSearch.by_sku| replace:: by_sku()
.. _.~.ProductSearch.by_sku: https://my-magento.readthedocs.io/en/latest/search_module.html#magento.search.ProductSearch.by_sku
.. |.~.SearchQuery| replace:: SearchQuery
.. _.~.SearchQuery: https://my-magento.readthedocs.io/en/latest/search_module.html#magento.search.SearchQuery
.. |.~.SearchQuery.by_id| replace:: by_id()
.. _.~.SearchQuery.by_id: https://my-magento.readthedocs.io/en/latest/search_module.html#magento.search.SearchQuery.by_id
.. |.~.SearchQuery.by_list| replace:: by_list()
.. _.~.SearchQuery.by_list: https://my-magento.readthedocs.io/en/latest/search_module.html#magento.search.SearchQuery.by_list
.. |.~.SearchQuery.result| replace:: result
.. _.~.SearchQuery.result: https://my-magento.readthedocs.io/en/latest/search_module.html#magento.search.SearchQuery.result
.. |.~.USER_CREDENTIALS| replace:: USER_CREDENTIALS
.. _.~.USER_CREDENTIALS: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client.USER_CREDENTIALS
.. |.~.add_criteria| replace:: add_criteria()
.. _.~.add_criteria: https://my-magento.readthedocs.io/en/latest/search_module.html#magento.search.SearchQuery.add_criteria
.. |.~.authenticate| replace:: authenticate()
.. _.~.authenticate: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client.authenticate
.. |.~.by_id| replace:: by_id()
.. _.~.by_id: https://my-magento.readthedocs.io/en/latest/search_module.html#magento.search.SearchQuery.by_id
.. |.~.by_list| replace:: by_list()
.. _.~.by_list: https://my-magento.readthedocs.io/en/latest/search_module.html#magento.search.SearchQuery.by_list
.. |.~.delete| replace:: delete()
.. _.~.delete: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client.delete
.. |.~.execute| replace:: execute()
.. _.~.execute: https://my-magento.readthedocs.io/en/latest/search_module.html#magento.search.SearchQuery.execute
.. |.~.get| replace:: get()
.. _.~.get: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client.get
.. |..get_api| replace:: get_api()
.. _..get_api: https://my-magento.readthedocs.io/en/latest/modules.html#magento.get_api
.. |.~.get_api| replace:: get_api()
.. _.~.get_api: https://my-magento.readthedocs.io/en/latest/modules.html#magento.get_api
.. |.~.post| replace:: post()
.. _.~.post: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client.post
.. |.~.put| replace:: put()
.. _.~.put: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client.put
.. |.~.restrict_fields| replace:: restrict_fields()
.. _.~.restrict_fields: https://my-magento.readthedocs.io/en/latest/search_module.html#magento.search.SearchQuery.restrict_fields
.. |.~.scope| replace:: scope
.. _.~.scope: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client.scope
.. |.~.search| replace:: search()
.. _.~.search: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client.search
.. |.~.since| replace:: since()
.. _.~.since: https://my-magento.readthedocs.io/en/latest/search_module.html#magento.search.SearchQuery.since
.. |.~.until| replace:: until()
.. _.~.until: https://my-magento.readthedocs.io/en/latest/search_module.html#magento.search.SearchQuery.until
.. |.~.url_for| replace:: url_for()
.. _.~.url_for: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client.url_for
.. |.~.views| replace:: views
.. _.~.views: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Store.views

..  Title: MyMagento
..  Description: A Python package that wraps and extends the Magento 2 REST API
..  Author: TDKorn

.. meta::
   :title: MyMagento
   :description: A Python package that wraps and extends the Magento 2 REST API

.. |RTD| replace:: **Explore the docs Β»**
.. _RTD: https://my-magento.readthedocs.io/en/latest/
.. |api_endpoint| replace:: API endpoint
.. _api_endpoint: https://adobe-commerce.redoc.ly/2.3.7-admin/


MyMagentoπŸ›’
---------------

.. image:: https://i.imgur.com/dkCWWYn.png
   :alt: Logo for MyMagento: Python Magento 2 REST API Wrapper
   :align: center
   :width: 200
   :height: 175










A Python package that wraps and extends the Magento 2 REST API


|RTD|_

|

.. image:: https://img.shields.io/pypi/v/my-magento?color=eb5202
   :target: https://pypi.org/project/my-magento/
   :alt: PyPI Version

.. image:: https://img.shields.io/badge/GitHub-my--magento-4f1abc
   :target: https://github.com/tdkorn/my-magento
   :alt: GitHub Repository

.. image:: https://static.pepy.tech/personalized-badge/my-magento?period=total&units=none&left_color=grey&right_color=blue&left_text=Downloads
    :target: https://pepy.tech/project/my-magento

.. image:: https://readthedocs.org/projects/my-magento/badge/?version=latest
    :target: https://my-magento.readthedocs.io/en/latest/?badge=latest
    :alt: Documentation Status



|

About MyMagento
~~~~~~~~~~~~~~~~~~~~


.. list-table::
   :header-rows: 1
   
   * - πŸ“ What's MyMagento?
   * - ``MyMagento`` is a highly interconnected package that wraps and extends the Magento 2 REST API,
       providing a more intuitive and user-friendly interface to access and update your store.



MyMagento simplifies interaction with the Magento 2 REST API
============================================================

If you've worked with the Magento 2 API, you'll know that not all endpoints are created equally.

``MyMagento`` aims to streamline your workflow by simplifying a
variety of commonly needed API operations.



Main Components
==================================


.. list-table::
   :header-rows: 1
   
   * - πŸ’» The |.~.Client|_
   * - * Handles all API interactions
       * Supports multiple store views
       * Provides access to all other package components



.. list-table::
   :header-rows: 1
   
   * - πŸ” The |.~.SearchQuery|_ and Subclasses
   * - * |.~.execute|_ a search query on any endpoint
       * Intuitive interface for `Building Custom Search Queries <https://my-magento.readthedocs.io/en/latest/interact-with-api.html#custom-queries>`_
       * All predefined methods retrieve data using only 1-2 API requests



.. list-table::
   :header-rows: 1
   
   * - 🧠 The |.~.Model|_ Subclasses
   * - * Wrap all API responses in the package
       * Provide additional endpoint-specific methods to retrieve and update data




Available Endpoints
======================

``MyMagento`` is compatible with every |api_endpoint|_

Endpoints are wrapped with a |.~.Model|_ and |.~.SearchQuery|_ subclass as follows:


.. csv-table::
   :header: "**Endpoint**", "**Client Shortcut**", "|.~.SearchQuery|_ **Subclass**", "|.~.Model|_ **Subclass**"

   "``orders``", "|..Client.orders|_", "|.~.OrderSearch|_", "|.~.Order|_"
   "``orders/items``", "|..Client.order_items|_", "|.~.OrderItemSearch|_", "|.~.OrderItem|_"
   "``invoices``", "|..Client.invoices|_", "|.~.InvoiceSearch|_", "|.~.Invoice|_"
   "``products``", "|..Client.products|_", "|.~.ProductSearch|_", "|.~.Product|_"
   "``products/attributes``", "|..Client.product_attributes|_", "|.~.ProductAttributeSearch|_", "|.~.ProductAttribute|_"
   "``categories``", "|..Client.categories|_", "|.~.CategorySearch|_", "|.~.Category|_"
   "``customers``", "|..Client.customers|_", "|.~.CustomerSearch|_", "|.~.Customer|_"
   "``endpoint``", "``Client.search('endpoint')``", "|.~.SearchQuery|_", "|.~.APIResponse|_"



...

βš™ Installing MyMagento
~~~~~~~~~~~~~~~~~~~~~~~~~~


To install using ``pip``::

   pip install my-magento

Please note that ``MyMagento`` requires ``Python >= 3.10``

...

πŸ“š Documentation
~~~~~~~~~~~~~~~~~~

Full documentation can be found on `ReadTheDocs <https://my-magento.readthedocs.io/en/latest/>`_

|

QuickStart: Login with MyMagento
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

``MyMagento`` uses the |.~.Client|_ class to handle all interactions with the API.


.. list-table::
   :header-rows: 1
   
   * - πŸ’‘ Tip
   * - See `Get a Magento 2 REST API Token With MyMagento <https://my-magento.readthedocs.io/en/latest/examples/logging-in.html#logging-in>`_ for full details on generating an access token



Setting the Login Credentials
===================================

To generate an |.~.ACCESS_TOKEN|_ you'll need to |.~.authenticate|_ your |.~.USER_CREDENTIALS|_.

Creating a |.~.Client|_ requires a ``domain``, ``username``, and ``password`` at minimum.


.. code-block:: python

   >>> domain = 'website.com'
   >>> username ='username'
   >>> password = 'password'


If you're using a local installation of Magento you'll need to set ``local=True``. Your domain should look like this:

.. code-block:: python

   >>> domain = '127.0.0.1/path/to/magento'


...

Getting a |.~.Client|_
=================================

Option 1: Initialize a |.~.Client|_ Directly
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. code-block:: python

      from magento import Client

      >>> api = Client(domain, username, password, **kwargs)


Option 2: Call |.~.get_api|_
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. code-block:: python


      import magento

      >>> api = magento.get_api(**kwargs)

|..get_api|_ takes the same keyword arguments as the |.~.Client|_

* If the ``domain``, ``username``, or ``password`` are missing,
  it will attempt to use the following environment variables:


.. code-block:: python

   import os

   os.environ['MAGENTO_DOMAIN'] = domain
   os.environ['MAGENTO_USERNAME']= username
   os.environ['MAGENTO_PASSWORD']= password

...

Getting an |.~.ACCESS_TOKEN|_
=======================================

Unless you specify ``login=False``, the |.~.Client|_ will automatically call |.~.authenticate|_ once initialized:


.. code-block:: python

   >> api.authenticate()

   |[ MyMagento | website_username ]|:  Authenticating username on website.com...
   |[ MyMagento | website_username ]|:  Logged in to username


|


Performing a |.~.search|_
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. |api_endpoints| replace:: API endpoint
.. _api_endpoints: https://adobe-commerce.redoc.ly/2.3.7-admin/


The |..Client.search|_ method lets you |.~.execute|_ a query on
any |api_endpoints|_

It creates a |.~.SearchQuery|_ for the endpoint,
allowing you to retrieve data about

* An individual item (ex. |.~.SearchQuery.by_id|_)
* A list of items (ex. |.~.SearchQuery.by_list|_)
* Any search criteria you desire (see `Building Custom Search Queries <https://my-magento.readthedocs.io/en/latest/interact-with-api.html#custom-queries>`_)




...

Example: |.~.search|_ an endpoint |.~.by_id|_
=====================================================

.. code-block:: python

    # Query the "invoices" endpoint (also: api.invoices)
    >>> api.search("invoices").by_id(1)

    <Magento Invoice: "#000000001"> for <Magento Order: "#000000001" placed on 2022-11-01 03:27:33>



Example: |.~.search|_ an endpoint |.~.by_list|_
=======================================================

.. code-block:: python

    # Retrieve invoices from a list of invoice ids
    >>> ids = list(range(1,101))
    >>> api.invoices.by_list("entity_id", ids)

    [<Magento Invoice: "#000000001"> for <Magento Order: "#000000001" placed on 2022-11-01 03:27:33>, ...]

...

Search Results: The |.~.Model|_ Classes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. |the_models| replace:: the ``magento.models`` subpackage
.. _the_models: models.html

The |.~.SearchQuery.result|_ of any |.~.SearchQuery|_ will be parsed and wrapped by a
|.~.Model|_ class in |the_models|_.

These classes make the API response data easier to work with.

They also provide endpoint-specific methods to update store data and search for related items.

Example: Retrieving every |.~.Order|_ containing a |.~.Product|_
==========================================================================

Let's retrieve a |.~.Product|_ using |.~.ProductSearch.by_sku|_

.. code-block:: python

   >>> product = api.products.by_sku("24-MB01")

We can search for orders containing this product in multiple ways:

.. code-block:: python

    # Using the Product itself
    >>> product.get_orders()

    [<Magento Order: "#000000003" placed on 2022-12-21 08:09:33>, ... ]

    # Using an OrderSearch
    >>> api.orders.by_product(product)
    >>> api.orders.by_product_id(product.id)
    >>> api.orders.by_sku(product.sku)

    [<Magento Order: "#000000003" placed on 2022-12-21 08:09:33>, ... ]



Example: Retrieving all |.~.Product|_\s and |.~.Invoice|_\s for a |.~.Category|_
===============================================================================================

.. code-block:: python

    >>> category = api.categories.by_name("Watches")
    >>> category.get_products()
    >>> category.get_invoices()

    [<Magento Product: 24-MG04>, <Magento Product: 24-MG01>, <Magento Product: 24-MG03>, ... ]
    [<Magento Invoice: "#000000004"> for <Magento Order: "#000000004" placed on 2022-11-14 03:27:33>, ... ]



Example: Updating the Thumbnail |.~.MediaEntry|_ of a |.~.Product|_
=============================================================================

.. code-block:: python

    # Update product thumbnail label on specific store view
   >>> product.thumbnail.set_alt_text("bonjour", scope="FR")
   >>> print(product.thumbnail)

    <MediaEntry 3417 for <Magento Product: 24-MB01>: bonjour>


...



.. list-table::
   :header-rows: 1
   
   * - πŸ’‘ Tip: Set the Store Scope
   * - If you have multiple store views, a ``store_code`` can be specified when
       retrieving/updating data
    
       * The |..Client.scope|_ is used by default - simply change it to switch store |.~.views|_
       * Passing the ``scope`` keyword argument to |..Client.url_for|_, |..Model.refresh|_,
         and some Model update methods will temporarily override the Client scope


...



.. _Custom Queries:

Building Custom Search Queries
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

In addition to the predefined methods, you can also build your own queries

* Simply |.~.add_criteria|_, |.~.restrict_fields|_, and |.~.execute|_ the search
* The |.~.since|_ and |.~.until|_ methods allow you to further filter your query by date




.. list-table::
   :header-rows: 1
   
   * - πŸ“‹ Example: Retrieve Orders Over $50 Placed Since the Start of 2023
   * - .. code-block:: python
    
        >>> api.orders.add_criteria(
        ...    field="grand_total",
        ...    value="50",
        ...    condition="gt"
        ... ).since("2023-01-01").execute()
    
        [<Magento Order: "#000000012" placed on 2023-01-02 05:19:55>, ...]



.. list-table::
   :header-rows: 1

   * - πŸ“‹ Example: Retrieve Orders Over $50 Placed Since the Start of 2023
   * - .. code-block:: python

          >>> api.orders.add_criteria(
          ...    field="grand_total",
          ...    value="50",
          ...    condition="gt"
          ... ).since("2023-01-01").execute()

          [<Magento Order: "#000000012" placed on 2023-01-02 05:19:55>, ...]

...


Making Authorized Requests
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The |.~.Client|_ can be used to generate the |.~.url_for|_ any API endpoint,
including a store |.~.scope|_.

You can use this URL to make an authorized
|.~.get|_, |.~.post|_, |.~.put|_, or |.~.delete|_ request.


Example: Making a |.~.get|_ Request
=============================================

.. code-block:: python

 # Request the data for credit memo with id 7
 >>> url = api.url_for('creditmemo/7')
 >>> response = api.get(url)
 >>> print(response.json())

 {'adjustment': 1.5, 'adjustment_negative': 0, 'adjustment_positive': 1.5, 'base_adjustment': 1.5,  ... }



.. list-table::
   :header-rows: 1
   
   * - πŸ“ Note
   * - A |.~.search|_ is simpler than making |.~.get|_ requests, as the result will
       be wrapped by  |.~.APIResponse|_ or other |.~.Model|_
    
       .. code-block:: python
    
            # Retrieve credit memo with id 7 using a search
            >>> memo = api.search("creditmemo").by_id(7)
            >>> print(memo.data)
            >>> print(memo)
    
            {'adjustment': 1.5, 'adjustment_negative': 0, 'adjustment_positive': 1.5, 'base_adjustment': 1.5,  ... }
            <magento.models.model.APIResponse object at 0x000001BA42FD0FD1>






            

Raw data

            {
    "_id": null,
    "home_page": "https://www.github.com/TDKorn/my-magento",
    "name": "my-magento",
    "maintainer": "",
    "docs_url": null,
    "requires_python": "",
    "maintainer_email": "",
    "keywords": "magento,magento-api,python-magento,python,python3,magento-python,pymagento,py-magento,magento2,magento-2,magento2-api",
    "author": "Adam Korn",
    "author_email": "hello@dailykitten.net",
    "download_url": "https://files.pythonhosted.org/packages/8c/a0/26f55a697790174454e70ff262b698bec2797eee896e7babc7cc965660b1/my-magento-2.2.0.tar.gz",
    "platform": null,
    "description": ".. |.~.ACCESS_TOKEN| replace:: ACCESS_TOKEN\n.. _.~.ACCESS_TOKEN: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client.ACCESS_TOKEN\n.. |.~.APIResponse| replace:: APIResponse\n.. _.~.APIResponse: https://my-magento.readthedocs.io/en/latest/model.html#magento.models.model.APIResponse\n.. |.~.Category| replace:: Category\n.. _.~.Category: https://my-magento.readthedocs.io/en/latest/category.html#magento.models.category.Category\n.. |.~.CategorySearch| replace:: CategorySearch\n.. _.~.CategorySearch: https://my-magento.readthedocs.io/en/latest/search_module.html#magento.search.CategorySearch\n.. |.~.Client| replace:: Client\n.. _.~.Client: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client\n.. |..Client.categories| replace:: Client.categories\n.. _..Client.categories: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client.categories\n.. |..Client.customers| replace:: Client.customers\n.. _..Client.customers: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client.customers\n.. |..Client.invoices| replace:: Client.invoices\n.. _..Client.invoices: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client.invoices\n.. |..Client.order_items| replace:: Client.order_items\n.. _..Client.order_items: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client.order_items\n.. |..Client.orders| replace:: Client.orders\n.. _..Client.orders: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client.orders\n.. |..Client.product_attributes| replace:: Client.product_attributes\n.. _..Client.product_attributes: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client.product_attributes\n.. |..Client.products| replace:: Client.products\n.. _..Client.products: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client.products\n.. |..Client.scope| replace:: Client.scope\n.. _..Client.scope: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client.scope\n.. |..Client.search| replace:: Client.search()\n.. _..Client.search: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client.search\n.. |..Client.url_for| replace:: Client.url_for()\n.. _..Client.url_for: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client.url_for\n.. |.~.Customer| replace:: Customer\n.. _.~.Customer: https://my-magento.readthedocs.io/en/latest/customer.html#magento.models.customer.Customer\n.. |.~.CustomerSearch| replace:: CustomerSearch\n.. _.~.CustomerSearch: https://my-magento.readthedocs.io/en/latest/search_module.html#magento.search.CustomerSearch\n.. |.~.Invoice| replace:: Invoice\n.. _.~.Invoice: https://my-magento.readthedocs.io/en/latest/invoice.html#magento.models.invoice.Invoice\n.. |.~.InvoiceSearch| replace:: InvoiceSearch\n.. _.~.InvoiceSearch: https://my-magento.readthedocs.io/en/latest/search_module.html#magento.search.InvoiceSearch\n.. |.~.MediaEntry| replace:: MediaEntry\n.. _.~.MediaEntry: https://my-magento.readthedocs.io/en/latest/product.html#magento.models.product.MediaEntry\n.. |.~.Model| replace:: Model\n.. _.~.Model: https://my-magento.readthedocs.io/en/latest/model.html#magento.models.model.Model\n.. |..Model.refresh| replace:: Model.refresh()\n.. _..Model.refresh: https://my-magento.readthedocs.io/en/latest/model.html#magento.models.model.Model.refresh\n.. |.~.Order| replace:: Order\n.. _.~.Order: https://my-magento.readthedocs.io/en/latest/order.html#magento.models.order.Order\n.. |.~.OrderItem| replace:: OrderItem\n.. _.~.OrderItem: https://my-magento.readthedocs.io/en/latest/order.html#magento.models.order.OrderItem\n.. |.~.OrderItemSearch| replace:: OrderItemSearch\n.. _.~.OrderItemSearch: https://my-magento.readthedocs.io/en/latest/search_module.html#magento.search.OrderItemSearch\n.. |.~.OrderSearch| replace:: OrderSearch\n.. _.~.OrderSearch: https://my-magento.readthedocs.io/en/latest/search_module.html#magento.search.OrderSearch\n.. |.~.Product| replace:: Product\n.. _.~.Product: https://my-magento.readthedocs.io/en/latest/product.html#magento.models.product.Product\n.. |.~.ProductAttribute| replace:: ProductAttribute\n.. _.~.ProductAttribute: https://my-magento.readthedocs.io/en/latest/product.html#magento.models.product.ProductAttribute\n.. |.~.ProductAttributeSearch| replace:: ProductAttributeSearch\n.. _.~.ProductAttributeSearch: https://my-magento.readthedocs.io/en/latest/search_module.html#magento.search.ProductAttributeSearch\n.. |.~.ProductSearch| replace:: ProductSearch\n.. _.~.ProductSearch: https://my-magento.readthedocs.io/en/latest/search_module.html#magento.search.ProductSearch\n.. |.~.ProductSearch.by_sku| replace:: by_sku()\n.. _.~.ProductSearch.by_sku: https://my-magento.readthedocs.io/en/latest/search_module.html#magento.search.ProductSearch.by_sku\n.. |.~.SearchQuery| replace:: SearchQuery\n.. _.~.SearchQuery: https://my-magento.readthedocs.io/en/latest/search_module.html#magento.search.SearchQuery\n.. |.~.SearchQuery.by_id| replace:: by_id()\n.. _.~.SearchQuery.by_id: https://my-magento.readthedocs.io/en/latest/search_module.html#magento.search.SearchQuery.by_id\n.. |.~.SearchQuery.by_list| replace:: by_list()\n.. _.~.SearchQuery.by_list: https://my-magento.readthedocs.io/en/latest/search_module.html#magento.search.SearchQuery.by_list\n.. |.~.SearchQuery.result| replace:: result\n.. _.~.SearchQuery.result: https://my-magento.readthedocs.io/en/latest/search_module.html#magento.search.SearchQuery.result\n.. |.~.USER_CREDENTIALS| replace:: USER_CREDENTIALS\n.. _.~.USER_CREDENTIALS: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client.USER_CREDENTIALS\n.. |.~.add_criteria| replace:: add_criteria()\n.. _.~.add_criteria: https://my-magento.readthedocs.io/en/latest/search_module.html#magento.search.SearchQuery.add_criteria\n.. |.~.authenticate| replace:: authenticate()\n.. _.~.authenticate: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client.authenticate\n.. |.~.by_id| replace:: by_id()\n.. _.~.by_id: https://my-magento.readthedocs.io/en/latest/search_module.html#magento.search.SearchQuery.by_id\n.. |.~.by_list| replace:: by_list()\n.. _.~.by_list: https://my-magento.readthedocs.io/en/latest/search_module.html#magento.search.SearchQuery.by_list\n.. |.~.delete| replace:: delete()\n.. _.~.delete: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client.delete\n.. |.~.execute| replace:: execute()\n.. _.~.execute: https://my-magento.readthedocs.io/en/latest/search_module.html#magento.search.SearchQuery.execute\n.. |.~.get| replace:: get()\n.. _.~.get: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client.get\n.. |..get_api| replace:: get_api()\n.. _..get_api: https://my-magento.readthedocs.io/en/latest/modules.html#magento.get_api\n.. |.~.get_api| replace:: get_api()\n.. _.~.get_api: https://my-magento.readthedocs.io/en/latest/modules.html#magento.get_api\n.. |.~.post| replace:: post()\n.. _.~.post: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client.post\n.. |.~.put| replace:: put()\n.. _.~.put: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client.put\n.. |.~.restrict_fields| replace:: restrict_fields()\n.. _.~.restrict_fields: https://my-magento.readthedocs.io/en/latest/search_module.html#magento.search.SearchQuery.restrict_fields\n.. |.~.scope| replace:: scope\n.. _.~.scope: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client.scope\n.. |.~.search| replace:: search()\n.. _.~.search: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client.search\n.. |.~.since| replace:: since()\n.. _.~.since: https://my-magento.readthedocs.io/en/latest/search_module.html#magento.search.SearchQuery.since\n.. |.~.until| replace:: until()\n.. _.~.until: https://my-magento.readthedocs.io/en/latest/search_module.html#magento.search.SearchQuery.until\n.. |.~.url_for| replace:: url_for()\n.. _.~.url_for: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Client.url_for\n.. |.~.views| replace:: views\n.. _.~.views: https://my-magento.readthedocs.io/en/latest/clients.html#magento.clients.Store.views\n\n..  Title: MyMagento\n..  Description: A Python package that wraps and extends the Magento 2 REST API\n..  Author: TDKorn\n\n.. meta::\n   :title: MyMagento\n   :description: A Python package that wraps and extends the Magento 2 REST API\n\n.. |RTD| replace:: **Explore the docs \u00bb**\n.. _RTD: https://my-magento.readthedocs.io/en/latest/\n.. |api_endpoint| replace:: API endpoint\n.. _api_endpoint: https://adobe-commerce.redoc.ly/2.3.7-admin/\n\n\nMyMagento\ud83d\uded2\n---------------\n\n.. image:: https://i.imgur.com/dkCWWYn.png\n   :alt: Logo for MyMagento: Python Magento 2 REST API Wrapper\n   :align: center\n   :width: 200\n   :height: 175\n\n\n\n\n\n\n\n\n\n\nA Python package that wraps and extends the Magento 2 REST API\n\n\n|RTD|_\n\n|\n\n.. image:: https://img.shields.io/pypi/v/my-magento?color=eb5202\n   :target: https://pypi.org/project/my-magento/\n   :alt: PyPI Version\n\n.. image:: https://img.shields.io/badge/GitHub-my--magento-4f1abc\n   :target: https://github.com/tdkorn/my-magento\n   :alt: GitHub Repository\n\n.. image:: https://static.pepy.tech/personalized-badge/my-magento?period=total&units=none&left_color=grey&right_color=blue&left_text=Downloads\n    :target: https://pepy.tech/project/my-magento\n\n.. image:: https://readthedocs.org/projects/my-magento/badge/?version=latest\n    :target: https://my-magento.readthedocs.io/en/latest/?badge=latest\n    :alt: Documentation Status\n\n\n\n|\n\nAbout MyMagento\n~~~~~~~~~~~~~~~~~~~~\n\n\n.. list-table::\n   :header-rows: 1\n   \n   * - \ud83d\udcdd What's MyMagento?\n   * - ``MyMagento`` is a highly interconnected package that wraps and extends the Magento 2 REST API,\n       providing a more intuitive and user-friendly interface to access and update your store.\n\n\n\nMyMagento simplifies interaction with the Magento 2 REST API\n============================================================\n\nIf you've worked with the Magento 2 API, you'll know that not all endpoints are created equally.\n\n``MyMagento`` aims to streamline your workflow by simplifying a\nvariety of commonly needed API operations.\n\n\n\nMain Components\n==================================\n\n\n.. list-table::\n   :header-rows: 1\n   \n   * - \ud83d\udcbb The |.~.Client|_\n   * - * Handles all API interactions\n       * Supports multiple store views\n       * Provides access to all other package components\n\n\n\n.. list-table::\n   :header-rows: 1\n   \n   * - \ud83d\udd0d The |.~.SearchQuery|_ and Subclasses\n   * - * |.~.execute|_ a search query on any endpoint\n       * Intuitive interface for `Building Custom Search Queries <https://my-magento.readthedocs.io/en/latest/interact-with-api.html#custom-queries>`_\n       * All predefined methods retrieve data using only 1-2 API requests\n\n\n\n.. list-table::\n   :header-rows: 1\n   \n   * - \ud83e\udde0 The |.~.Model|_ Subclasses\n   * - * Wrap all API responses in the package\n       * Provide additional endpoint-specific methods to retrieve and update data\n\n\n\n\nAvailable Endpoints\n======================\n\n``MyMagento`` is compatible with every |api_endpoint|_\n\nEndpoints are wrapped with a |.~.Model|_ and |.~.SearchQuery|_ subclass as follows:\n\n\n.. csv-table::\n   :header: \"**Endpoint**\", \"**Client Shortcut**\", \"|.~.SearchQuery|_ **Subclass**\", \"|.~.Model|_ **Subclass**\"\n\n   \"``orders``\", \"|..Client.orders|_\", \"|.~.OrderSearch|_\", \"|.~.Order|_\"\n   \"``orders/items``\", \"|..Client.order_items|_\", \"|.~.OrderItemSearch|_\", \"|.~.OrderItem|_\"\n   \"``invoices``\", \"|..Client.invoices|_\", \"|.~.InvoiceSearch|_\", \"|.~.Invoice|_\"\n   \"``products``\", \"|..Client.products|_\", \"|.~.ProductSearch|_\", \"|.~.Product|_\"\n   \"``products/attributes``\", \"|..Client.product_attributes|_\", \"|.~.ProductAttributeSearch|_\", \"|.~.ProductAttribute|_\"\n   \"``categories``\", \"|..Client.categories|_\", \"|.~.CategorySearch|_\", \"|.~.Category|_\"\n   \"``customers``\", \"|..Client.customers|_\", \"|.~.CustomerSearch|_\", \"|.~.Customer|_\"\n   \"``endpoint``\", \"``Client.search('endpoint')``\", \"|.~.SearchQuery|_\", \"|.~.APIResponse|_\"\n\n\n\n...\n\n\u2699 Installing MyMagento\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n\nTo install using ``pip``::\n\n   pip install my-magento\n\nPlease note that ``MyMagento`` requires ``Python >= 3.10``\n\n...\n\n\ud83d\udcda Documentation\n~~~~~~~~~~~~~~~~~~\n\nFull documentation can be found on `ReadTheDocs <https://my-magento.readthedocs.io/en/latest/>`_\n\n|\n\nQuickStart: Login with MyMagento\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n``MyMagento`` uses the |.~.Client|_ class to handle all interactions with the API.\n\n\n.. list-table::\n   :header-rows: 1\n   \n   * - \ud83d\udca1 Tip\n   * - See `Get a Magento 2 REST API Token With MyMagento <https://my-magento.readthedocs.io/en/latest/examples/logging-in.html#logging-in>`_ for full details on generating an access token\n\n\n\nSetting the Login Credentials\n===================================\n\nTo generate an |.~.ACCESS_TOKEN|_ you'll need to |.~.authenticate|_ your |.~.USER_CREDENTIALS|_.\n\nCreating a |.~.Client|_ requires a ``domain``, ``username``, and ``password`` at minimum.\n\n\n.. code-block:: python\n\n   >>> domain = 'website.com'\n   >>> username ='username'\n   >>> password = 'password'\n\n\nIf you're using a local installation of Magento you'll need to set ``local=True``. Your domain should look like this:\n\n.. code-block:: python\n\n   >>> domain = '127.0.0.1/path/to/magento'\n\n\n...\n\nGetting a |.~.Client|_\n=================================\n\nOption 1: Initialize a |.~.Client|_ Directly\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n.. code-block:: python\n\n      from magento import Client\n\n      >>> api = Client(domain, username, password, **kwargs)\n\n\nOption 2: Call |.~.get_api|_\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n.. code-block:: python\n\n\n      import magento\n\n      >>> api = magento.get_api(**kwargs)\n\n|..get_api|_ takes the same keyword arguments as the |.~.Client|_\n\n* If the ``domain``, ``username``, or ``password`` are missing,\n  it will attempt to use the following environment variables:\n\n\n.. code-block:: python\n\n   import os\n\n   os.environ['MAGENTO_DOMAIN'] = domain\n   os.environ['MAGENTO_USERNAME']= username\n   os.environ['MAGENTO_PASSWORD']= password\n\n...\n\nGetting an |.~.ACCESS_TOKEN|_\n=======================================\n\nUnless you specify ``login=False``, the |.~.Client|_ will automatically call |.~.authenticate|_ once initialized:\n\n\n.. code-block:: python\n\n   >> api.authenticate()\n\n   |[ MyMagento | website_username ]|:  Authenticating username on website.com...\n   |[ MyMagento | website_username ]|:  Logged in to username\n\n\n|\n\n\nPerforming a |.~.search|_\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. |api_endpoints| replace:: API endpoint\n.. _api_endpoints: https://adobe-commerce.redoc.ly/2.3.7-admin/\n\n\nThe |..Client.search|_ method lets you |.~.execute|_ a query on\nany |api_endpoints|_\n\nIt creates a |.~.SearchQuery|_ for the endpoint,\nallowing you to retrieve data about\n\n* An individual item (ex. |.~.SearchQuery.by_id|_)\n* A list of items (ex. |.~.SearchQuery.by_list|_)\n* Any search criteria you desire (see `Building Custom Search Queries <https://my-magento.readthedocs.io/en/latest/interact-with-api.html#custom-queries>`_)\n\n\n\n\n...\n\nExample: |.~.search|_ an endpoint |.~.by_id|_\n=====================================================\n\n.. code-block:: python\n\n    # Query the \"invoices\" endpoint (also: api.invoices)\n    >>> api.search(\"invoices\").by_id(1)\n\n    <Magento Invoice: \"#000000001\"> for <Magento Order: \"#000000001\" placed on 2022-11-01 03:27:33>\n\n\n\nExample: |.~.search|_ an endpoint |.~.by_list|_\n=======================================================\n\n.. code-block:: python\n\n    # Retrieve invoices from a list of invoice ids\n    >>> ids = list(range(1,101))\n    >>> api.invoices.by_list(\"entity_id\", ids)\n\n    [<Magento Invoice: \"#000000001\"> for <Magento Order: \"#000000001\" placed on 2022-11-01 03:27:33>, ...]\n\n...\n\nSearch Results: The |.~.Model|_ Classes\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. |the_models| replace:: the ``magento.models`` subpackage\n.. _the_models: models.html\n\nThe |.~.SearchQuery.result|_ of any |.~.SearchQuery|_ will be parsed and wrapped by a\n|.~.Model|_ class in |the_models|_.\n\nThese classes make the API response data easier to work with.\n\nThey also provide endpoint-specific methods to update store data and search for related items.\n\nExample: Retrieving every |.~.Order|_ containing a |.~.Product|_\n==========================================================================\n\nLet's retrieve a |.~.Product|_ using |.~.ProductSearch.by_sku|_\n\n.. code-block:: python\n\n   >>> product = api.products.by_sku(\"24-MB01\")\n\nWe can search for orders containing this product in multiple ways:\n\n.. code-block:: python\n\n    # Using the Product itself\n    >>> product.get_orders()\n\n    [<Magento Order: \"#000000003\" placed on 2022-12-21 08:09:33>, ... ]\n\n    # Using an OrderSearch\n    >>> api.orders.by_product(product)\n    >>> api.orders.by_product_id(product.id)\n    >>> api.orders.by_sku(product.sku)\n\n    [<Magento Order: \"#000000003\" placed on 2022-12-21 08:09:33>, ... ]\n\n\n\nExample: Retrieving all |.~.Product|_\\s and |.~.Invoice|_\\s for a |.~.Category|_\n===============================================================================================\n\n.. code-block:: python\n\n    >>> category = api.categories.by_name(\"Watches\")\n    >>> category.get_products()\n    >>> category.get_invoices()\n\n    [<Magento Product: 24-MG04>, <Magento Product: 24-MG01>, <Magento Product: 24-MG03>, ... ]\n    [<Magento Invoice: \"#000000004\"> for <Magento Order: \"#000000004\" placed on 2022-11-14 03:27:33>, ... ]\n\n\n\nExample: Updating the Thumbnail |.~.MediaEntry|_ of a |.~.Product|_\n=============================================================================\n\n.. code-block:: python\n\n    # Update product thumbnail label on specific store view\n   >>> product.thumbnail.set_alt_text(\"bonjour\", scope=\"FR\")\n   >>> print(product.thumbnail)\n\n    <MediaEntry 3417 for <Magento Product: 24-MB01>: bonjour>\n\n\n...\n\n\n\n.. list-table::\n   :header-rows: 1\n   \n   * - \ud83d\udca1 Tip: Set the Store Scope\n   * - If you have multiple store views, a ``store_code`` can be specified when\n       retrieving/updating data\n    \n       * The |..Client.scope|_ is used by default - simply change it to switch store |.~.views|_\n       * Passing the ``scope`` keyword argument to |..Client.url_for|_, |..Model.refresh|_,\n         and some Model update methods will temporarily override the Client scope\n\n\n...\n\n\n\n.. _Custom Queries:\n\nBuilding Custom Search Queries\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIn addition to the predefined methods, you can also build your own queries\n\n* Simply |.~.add_criteria|_, |.~.restrict_fields|_, and |.~.execute|_ the search\n* The |.~.since|_ and |.~.until|_ methods allow you to further filter your query by date\n\n\n\n\n.. list-table::\n   :header-rows: 1\n   \n   * - \ud83d\udccb Example: Retrieve Orders Over $50 Placed Since the Start of 2023\n   * - .. code-block:: python\n    \n        >>> api.orders.add_criteria(\n        ...    field=\"grand_total\",\n        ...    value=\"50\",\n        ...    condition=\"gt\"\n        ... ).since(\"2023-01-01\").execute()\n    \n        [<Magento Order: \"#000000012\" placed on 2023-01-02 05:19:55>, ...]\n\n\n\n.. list-table::\n   :header-rows: 1\n\n   * - \ud83d\udccb Example: Retrieve Orders Over $50 Placed Since the Start of 2023\n   * - .. code-block:: python\n\n          >>> api.orders.add_criteria(\n          ...    field=\"grand_total\",\n          ...    value=\"50\",\n          ...    condition=\"gt\"\n          ... ).since(\"2023-01-01\").execute()\n\n          [<Magento Order: \"#000000012\" placed on 2023-01-02 05:19:55>, ...]\n\n...\n\n\nMaking Authorized Requests\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe |.~.Client|_ can be used to generate the |.~.url_for|_ any API endpoint,\nincluding a store |.~.scope|_.\n\nYou can use this URL to make an authorized\n|.~.get|_, |.~.post|_, |.~.put|_, or |.~.delete|_ request.\n\n\nExample: Making a |.~.get|_ Request\n=============================================\n\n.. code-block:: python\n\n # Request the data for credit memo with id 7\n >>> url = api.url_for('creditmemo/7')\n >>> response = api.get(url)\n >>> print(response.json())\n\n {'adjustment': 1.5, 'adjustment_negative': 0, 'adjustment_positive': 1.5, 'base_adjustment': 1.5,  ... }\n\n\n\n.. list-table::\n   :header-rows: 1\n   \n   * - \ud83d\udcdd Note\n   * - A |.~.search|_ is simpler than making |.~.get|_ requests, as the result will\n       be wrapped by  |.~.APIResponse|_ or other |.~.Model|_\n    \n       .. code-block:: python\n    \n            # Retrieve credit memo with id 7 using a search\n            >>> memo = api.search(\"creditmemo\").by_id(7)\n            >>> print(memo.data)\n            >>> print(memo)\n    \n            {'adjustment': 1.5, 'adjustment_negative': 0, 'adjustment_positive': 1.5, 'base_adjustment': 1.5,  ... }\n            <magento.models.model.APIResponse object at 0x000001BA42FD0FD1>\n\n\n\n\n\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Python Magento 2 REST API Wrapper",
    "version": "2.2.0",
    "project_urls": {
        "Download": "https://github.com/TDKorn/my-magento/tarball/master",
        "Homepage": "https://www.github.com/TDKorn/my-magento"
    },
    "split_keywords": [
        "magento",
        "magento-api",
        "python-magento",
        "python",
        "python3",
        "magento-python",
        "pymagento",
        "py-magento",
        "magento2",
        "magento-2",
        "magento2-api"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "ea599e177696838e178087c1f50188faa14e2de82a1c1790e082eda3d8b85b1d",
                "md5": "d5a1c507421f3fbb7936dcc637df0ab0",
                "sha256": "c037f152ea055738269fedc363508063d10affed4c89afd52e73e6074a69f50a"
            },
            "downloads": -1,
            "filename": "my_magento-2.2.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "d5a1c507421f3fbb7936dcc637df0ab0",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": null,
            "size": 42508,
            "upload_time": "2024-01-09T05:48:45",
            "upload_time_iso_8601": "2024-01-09T05:48:45.981717Z",
            "url": "https://files.pythonhosted.org/packages/ea/59/9e177696838e178087c1f50188faa14e2de82a1c1790e082eda3d8b85b1d/my_magento-2.2.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "8ca026f55a697790174454e70ff262b698bec2797eee896e7babc7cc965660b1",
                "md5": "836fa1a99b5c69eae2d6e74974ccc8ca",
                "sha256": "0629c41c6117ef7f72741a925ae1cc9bb6356939a28efe036a9f1a4ee3aec103"
            },
            "downloads": -1,
            "filename": "my-magento-2.2.0.tar.gz",
            "has_sig": false,
            "md5_digest": "836fa1a99b5c69eae2d6e74974ccc8ca",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 40818,
            "upload_time": "2024-01-09T05:48:47",
            "upload_time_iso_8601": "2024-01-09T05:48:47.345233Z",
            "url": "https://files.pythonhosted.org/packages/8c/a0/26f55a697790174454e70ff262b698bec2797eee896e7babc7cc965660b1/my-magento-2.2.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-01-09 05:48:47",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "TDKorn",
    "github_project": "my-magento",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [],
    "lcname": "my-magento"
}
        
Elapsed time: 0.16599s