mama


Namemama JSON
Version 0.9.7 PyPI version JSON
download
home_pageNone
SummaryA modular C++ build tool even your mama can use
upload_time2024-05-02 08:35:21
maintainerNone
docs_urlNone
authorNone
requires_python>=3.6
licenseMIT
keywords mama build mamabuild c c++ tool cmake simple easy package manager cross-platform
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Mama Build Tool
Mama - A modular C++ build tool even your mama can use

The main goal of this project is to provide extremely convenient in-source builds
for cross platform projects. Building is as simple as `mama build windows` - no ceremony~!

CMake projects with trivial configurations and no dependencies can be handled
automatically by Mama. This makes header-only libraries or stand-alone C libraries
extremely easy to link.

Adding projects with already configured `mamafile.py` is trivial and allows you to manage
large scale projects in a modular way. Dependencies are added and configured through mamafiles.

Each mama build target exports CMake `${ProjectName}_INCLUDES` and `${ProjectName}_LIBS`. All exports
are gathered in correct linker order inside `MAMA_INCLUDES` and `MAMA_LIBS`. This ensures the least
amount of friction for developers - everything just works.

There is no central package repository, all packages are pulled and updated from public or 
private git repositories. Package versioning is done through git tags or branches.

Custom build systems are also supported. For additional documentation explore: [build_target.py](mama/build_target.py)


## Who is this FOR?
Anyone who develops cross-platform C++ libraries or applications which
target any combination of [Windows, Linux, macOS, iOS, Android, Raspberry, Oclea, MIPS].
And anyone who is not satisfied with system-wide dependencies and linker
bugs caused by incompatible system-wide libraries on Linux.

If you require an easy to use, reproducible project/namespace scoped package+build system, this is for you.
Your builds will not rely on hard to setup system packages, all you need to do is type `mama build`.

### Supported platforms ###
- Windows (64-bit x86_64, 32-bit x86, 64-bit arm64, 32-bit armv7) default is latest MSVC
- Linux (Ubuntu) (64-bit x86_64, 32-bit x86) both GCC and Clang
- MacOS (64-bit x86_64, 64-bit arm64) via config.macos_version
- iOS (64-bit arm64) via config.ios_version
- Android (64-bit arm64, 32-bit armv7) via env ANDROID_NDK_HOME or ANDROID_HOME
- Raspberry (32-bit armv7) via env RASPI_HOME
- Oclea (64-bit arm64) via config.set_oclea_toolchain()
- MIPS (mips mipsel, mips64, mips64el) via config.set_mips_toolchain()

## Who is this NOT for?
Single platform projects with platform specific build configuration and system wide dependency management
such as Linux exclusive G++ projects using apt-get libraries or iOS-only apps using cocoapods.


## Artifactory
Provides a mechanism to upload pre-built packages to a private artifactory server through `mama upload mypackage`. These packages will be automatically used if a git:package commit hash matches.


## Setup For Users
1. Get python 3.6 and PIP
2. `$ pip install mama --upgrade`
3. `$ cd yourproject`
3. `$ mama init` which creates a `mamafile.py` and patches your CMakeLists.txt
4. (optional) Manual setup: Create your own `mamafile.py` (examples below) and add this to your CMakeLists.txt:
```cmake
include(mama.cmake)
include_directories(${MAMA_INCLUDES})
target_link_libraries(YourProject PRIVATE ${MAMA_LIBS})
```
5. `$ mama build` and enjoy!
6. `$ mama open` to open your project in an IDE / VSCode


## Command examples
```
  mama init                      Initialize a new project. Tries to create mamafile.py and CMakeLists.txt
  mama build                     Update and build main project only. This only clones, but does not update!
  mama build x86 opencv          Cross compile build target opencv to x86 architecture
  mama build android             Cross compile to arm64 android NDK
  mama build android-26 arm      Cross compile to armv7 android NDK API level 26
  mama update                    Update all dependencies by doing git pull and build.
  mama clean                     Cleans main project only.
  mama clean x86 opencv          Cleans main project only.
  mama clean all                 Cleans EVERYTHING in the dependency chain for current arch.
  mama rebuild                   Cleans, update and build main project only.
  mama build dep1                Update and build dep1 only.
  mama update dep1               Update and build the specified target.
  mama serve android             Update, build and deploy for Android
  mama wipe dep1                 Wipe target dependency completely and clone again.
  mama upload dep1               Deploys and uploads dependency to Artifactory server.
  mama test                      Run tests on main project.
  mama test=arg                  Run tests on main project with an argument.
  mama test="arg1 arg2"          Run tests on main project with multiple arguments.
  mama test dep1                 Run tests on target dependency project.
  mama dep1 start=dbtool         Call target project mamafile start() with args [`dbtool`].
```
Call `mama help` for more usage information.

## Mamafile examples

Project `AlphaGL/mamafile.py`
```py
import mama
class AlphaGL(mama.BuildTarget):
    # where to build intermediates
    workspace = 'build' # for system-wide workspace, use: global_workspace = 'mycompany'

    # grab dependencies straight from git repositories
    # if the projects are trivial, then no extra configuration is needed
    def dependencies(self):
        # set artifactory package server for prebuilt packages
        # the credentials can be configured by env vars for CI, call `mama help`
        self.set_artifactory_ftp('artifacts.myftp.com', auth='store')
        # add packages
        self.add_git('ReCpp',   'https://github.com/RedFox20/ReCpp.git', branch='master')
        self.add_git('libpng',  'https://github.com/LuaDist/libpng.git')
        self.add_git('libjpeg', 'https://github.com/LuaDist/libjpeg.git')
        self.add_git('glfw',    'https://github.com/glfw/glfw.git')

        # add local packages from existing directory root:
        self.add_local('utils', 'libs/utils')

        # add a prebuilt package, use `mama upload myproject` to generate these:
        self.add_artifactory_pkg('opencv', version='df76b66')
        if self.linux: # or do it conditionally for linux only:
            self.add_artifactory_pkg('opencv', fullname='opencv-linux-x64-release-df76b66')

    # optional: customize package exports if repository doesn't have `include` or `src`
    def package(self):
        self.export_libs('.', ['.lib', '.a']) # export any .lib or .a from build folder
        self.export_includes(['AGL']) # export AGL as include from source folder
        # platform specific system library exports:
        if self.ios:   self.export_syslib('-framework OpenGLES')
        if self.macos: self.export_syslib('-framework OpenGL')
        if self.linux: self.export_syslib('GL')

    def test(self, args):
        self.gdb(f'bin/AlphaGLTests {args}')
```

If a dependency is non-trivial (it has dependencies and configuration),
you can simply place a target mamafile at: `mama/{DependencyName}.py`

Example dependency config `AlphaGL/mama/libpng.py`
```py
import mama
class libpng_static(mama.BuildTarget):
    def dependencies(self):
        # custom mamafile can be passed explicitly:
        self.add_git('zlib', 'https://github.com/madler/zlib.git', mamafile='zlib.py')

    def configure(self):
        zinclude, zlibrary = self.get_target_products('zlib')
        self.add_cmake_options(f'ZLIB_INCLUDE_DIR={zinclude}')
        self.add_cmake_options(f'ZLIB_LIBRARY={zlibrary}')
        self.add_cmake_options('BUILD_SHARED_LIB=NO', 'PNG_TESTS=NO')

    def package(self):
        # libpng builds its stuff into `{build}/lib`
        self.export_libs('lib', ['.lib', '.a'])
        # export installed include path from build dir
        self.export_include('include', build_dir=True)
```

## Example output from Mama Build
```
$ mama build
========= Mama Build Tool ==========
  - Target FaceOne            BUILD [root target]
  - Target dlib               OK
  - Target CppGuid            OK
  - Target opencv             OK
  - Target ReCpp              OK
  - Target NanoMesh           OK
  - Package ReCpp
    <I>  build/ReCpp/ReCpp
    [L]  build/ReCpp/windows/RelWithDebInfo/ReCpp.lib
  - Package opencv
    <I>  build/opencv/windows/include
    [L]  build/opencv/windows/lib/Release/opencv_xphoto342.lib
    [L]  build/opencv/windows/lib/Release/opencv_features2d342.lib
    [L]  build/opencv/windows/lib/Release/opencv_imgcodecs342.lib
    [L]  build/opencv/windows/lib/Release/opencv_imgproc342.lib
    [L]  build/opencv/windows/lib/Release/opencv_core342.lib
    [L]  build/opencv/windows/3rdparty/lib/Release/libjpeg-turbo.lib
    [L]  build/opencv/windows/3rdparty/lib/Release/libpng.lib
    [L]  build/opencv/windows/3rdparty/lib/Release/zlib.lib
  - Package dlib
    <I>  build/dlib/windows/include
    [L]  build/dlib/windows/lib/dlib19.15.99_relwithdebinfo_64bit_msvc1914.lib
  - Package NanoMesh
    <I>  build/NanoMesh/NanoMesh
    [L]  build/NanoMesh/windows/RelWithDebInfo/NanoMesh.lib
  - Package CppGuid
    <I>  build/CppGuid/CppGuid/include
    [L]  build/CppGuid/windows/RelWithDebInfo/CppGuid.lib
  - Package FaceOne
    <I>  include
    [L]  bin/FaceOne.dll
    [L]  bin/FaceOne.lib
```
### Uploading packages ###
```python
    def dependencies(self):
        self.set_artifactory_ftp('ftp.myartifactory.com', auth='store')
        self.add_git('googletest', 'git@github.com:RedFox20/googletest.git')
```
```
$ mama upload googletest
========= Mama Build Tool ==========
  - Package googletest
    <I>  myworkspace/googletest/linux/include
    [L]  myworkspace/googletest/linux/lib/libgmock.a
    [L]  myworkspace/googletest/linux/lib/libgtest.a
  - PAPA Deploy /home/XXX/myworkspace/googletest/linux/deploy/googletest
    I (googletest)       include
    L (googletest)       libgmock.a
    L (googletest)       libgtest.a
  PAPA Deployed: 1 includes, 2 libs, 0 syslibs, 0 assets
  - PAPA Upload googletest-linux-x64-release-ebb36f3  770.6KB
    |==================================================>| 100 %
```
And then rebuilding with an artifactory package available
```
$ mama rebuild googletest
========= Mama Build Tool ==========
  - Target googletest         CLEAN  linux
  - Target googletest         BUILD [cleaned target]  
    Artifactory fetch ftp.myartifactory.com/googletest-linux-x64-release-ebb36f3  770.6KB
    |<==================================================| 100 %
    Artifactory unzip googletest-linux-x64-release-ebb36f3
  - Package googletest
    <I>  myworkspace/googletest/linux/include
    [L]  myworkspace/googletest/linux/libgmock.a
    [L]  myworkspace/googletest/linux/libgtest.a
```


## For Mama Contributors
We are open for any improvements and feedback via pull requests.

The package `setuptools>=65.0` is required, ensure the version is correct with `pip3 show setuptools`.

You can set up local development with `$ pip3 install -e . --no-cache-dir` but make sure you have latest setuptools (>65.0) and latest pip3 (>22.3). This command will fail with older toolkits.

Uploading a source distributionP:
1. Get dependencies: `pip3 install build twine`
2. Build sdist: `python -m build`
3. Upload with twine: `twine upload --skip-existing dist/*`
It will prompt for Username and Password, unless you set up ~/.pypirc file:
```
[distutils]
index-servers = pypi
[pypi]
username=__token__
password=<pypi-api-token>
```
Quick build & upload using Python 3.9: `./deploy.sh`

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "mama",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.6",
    "maintainer_email": null,
    "keywords": "mama, build, mamabuild, c, c++, tool, cmake, simple, easy, package, manager, cross-platform",
    "author": null,
    "author_email": "Jorma Rebane <jorma.rebane@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/84/5a/b719247609e3edc6a45c4d65ce2eae0687a51249f08037c579de255c7506/mama-0.9.7.tar.gz",
    "platform": null,
    "description": "# Mama Build Tool\nMama - A modular C++ build tool even your mama can use\n\nThe main goal of this project is to provide extremely convenient in-source builds\nfor cross platform projects. Building is as simple as `mama build windows` - no ceremony~!\n\nCMake projects with trivial configurations and no dependencies can be handled\nautomatically by Mama. This makes header-only libraries or stand-alone C libraries\nextremely easy to link.\n\nAdding projects with already configured `mamafile.py` is trivial and allows you to manage\nlarge scale projects in a modular way. Dependencies are added and configured through mamafiles.\n\nEach mama build target exports CMake `${ProjectName}_INCLUDES` and `${ProjectName}_LIBS`. All exports\nare gathered in correct linker order inside `MAMA_INCLUDES` and `MAMA_LIBS`. This ensures the least\namount of friction for developers - everything just works.\n\nThere is no central package repository, all packages are pulled and updated from public or \nprivate git repositories. Package versioning is done through git tags or branches.\n\nCustom build systems are also supported. For additional documentation explore: [build_target.py](mama/build_target.py)\n\n\n## Who is this FOR?\nAnyone who develops cross-platform C++ libraries or applications which\ntarget any combination of [Windows, Linux, macOS, iOS, Android, Raspberry, Oclea, MIPS].\nAnd anyone who is not satisfied with system-wide dependencies and linker\nbugs caused by incompatible system-wide libraries on Linux.\n\nIf you require an easy to use, reproducible project/namespace scoped package+build system, this is for you.\nYour builds will not rely on hard to setup system packages, all you need to do is type `mama build`.\n\n### Supported platforms ###\n- Windows (64-bit x86_64, 32-bit x86, 64-bit arm64, 32-bit armv7) default is latest MSVC\n- Linux (Ubuntu) (64-bit x86_64, 32-bit x86) both GCC and Clang\n- MacOS (64-bit x86_64, 64-bit arm64) via config.macos_version\n- iOS (64-bit arm64) via config.ios_version\n- Android (64-bit arm64, 32-bit armv7) via env ANDROID_NDK_HOME or ANDROID_HOME\n- Raspberry (32-bit armv7) via env RASPI_HOME\n- Oclea (64-bit arm64) via config.set_oclea_toolchain()\n- MIPS (mips mipsel, mips64, mips64el) via config.set_mips_toolchain()\n\n## Who is this NOT for?\nSingle platform projects with platform specific build configuration and system wide dependency management\nsuch as Linux exclusive G++ projects using apt-get libraries or iOS-only apps using cocoapods.\n\n\n## Artifactory\nProvides a mechanism to upload pre-built packages to a private artifactory server through `mama upload mypackage`. These packages will be automatically used if a git:package commit hash matches.\n\n\n## Setup For Users\n1. Get python 3.6 and PIP\n2. `$ pip install mama --upgrade`\n3. `$ cd yourproject`\n3. `$ mama init` which creates a `mamafile.py` and patches your CMakeLists.txt\n4. (optional) Manual setup: Create your own `mamafile.py` (examples below) and add this to your CMakeLists.txt:\n```cmake\ninclude(mama.cmake)\ninclude_directories(${MAMA_INCLUDES})\ntarget_link_libraries(YourProject PRIVATE ${MAMA_LIBS})\n```\n5. `$ mama build` and enjoy!\n6. `$ mama open` to open your project in an IDE / VSCode\n\n\n## Command examples\n```\n  mama init                      Initialize a new project. Tries to create mamafile.py and CMakeLists.txt\n  mama build                     Update and build main project only. This only clones, but does not update!\n  mama build x86 opencv          Cross compile build target opencv to x86 architecture\n  mama build android             Cross compile to arm64 android NDK\n  mama build android-26 arm      Cross compile to armv7 android NDK API level 26\n  mama update                    Update all dependencies by doing git pull and build.\n  mama clean                     Cleans main project only.\n  mama clean x86 opencv          Cleans main project only.\n  mama clean all                 Cleans EVERYTHING in the dependency chain for current arch.\n  mama rebuild                   Cleans, update and build main project only.\n  mama build dep1                Update and build dep1 only.\n  mama update dep1               Update and build the specified target.\n  mama serve android             Update, build and deploy for Android\n  mama wipe dep1                 Wipe target dependency completely and clone again.\n  mama upload dep1               Deploys and uploads dependency to Artifactory server.\n  mama test                      Run tests on main project.\n  mama test=arg                  Run tests on main project with an argument.\n  mama test=\"arg1 arg2\"          Run tests on main project with multiple arguments.\n  mama test dep1                 Run tests on target dependency project.\n  mama dep1 start=dbtool         Call target project mamafile start() with args [`dbtool`].\n```\nCall `mama help` for more usage information.\n\n## Mamafile examples\n\nProject `AlphaGL/mamafile.py`\n```py\nimport mama\nclass AlphaGL(mama.BuildTarget):\n    # where to build intermediates\n    workspace = 'build' # for system-wide workspace, use: global_workspace = 'mycompany'\n\n    # grab dependencies straight from git repositories\n    # if the projects are trivial, then no extra configuration is needed\n    def dependencies(self):\n        # set artifactory package server for prebuilt packages\n        # the credentials can be configured by env vars for CI, call `mama help`\n        self.set_artifactory_ftp('artifacts.myftp.com', auth='store')\n        # add packages\n        self.add_git('ReCpp',   'https://github.com/RedFox20/ReCpp.git', branch='master')\n        self.add_git('libpng',  'https://github.com/LuaDist/libpng.git')\n        self.add_git('libjpeg', 'https://github.com/LuaDist/libjpeg.git')\n        self.add_git('glfw',    'https://github.com/glfw/glfw.git')\n\n        # add local packages from existing directory root:\n        self.add_local('utils', 'libs/utils')\n\n        # add a prebuilt package, use `mama upload myproject` to generate these:\n        self.add_artifactory_pkg('opencv', version='df76b66')\n        if self.linux: # or do it conditionally for linux only:\n            self.add_artifactory_pkg('opencv', fullname='opencv-linux-x64-release-df76b66')\n\n    # optional: customize package exports if repository doesn't have `include` or `src`\n    def package(self):\n        self.export_libs('.', ['.lib', '.a']) # export any .lib or .a from build folder\n        self.export_includes(['AGL']) # export AGL as include from source folder\n        # platform specific system library exports:\n        if self.ios:   self.export_syslib('-framework OpenGLES')\n        if self.macos: self.export_syslib('-framework OpenGL')\n        if self.linux: self.export_syslib('GL')\n\n    def test(self, args):\n        self.gdb(f'bin/AlphaGLTests {args}')\n```\n\nIf a dependency is non-trivial (it has dependencies and configuration),\nyou can simply place a target mamafile at: `mama/{DependencyName}.py`\n\nExample dependency config `AlphaGL/mama/libpng.py`\n```py\nimport mama\nclass libpng_static(mama.BuildTarget):\n    def dependencies(self):\n        # custom mamafile can be passed explicitly:\n        self.add_git('zlib', 'https://github.com/madler/zlib.git', mamafile='zlib.py')\n\n    def configure(self):\n        zinclude, zlibrary = self.get_target_products('zlib')\n        self.add_cmake_options(f'ZLIB_INCLUDE_DIR={zinclude}')\n        self.add_cmake_options(f'ZLIB_LIBRARY={zlibrary}')\n        self.add_cmake_options('BUILD_SHARED_LIB=NO', 'PNG_TESTS=NO')\n\n    def package(self):\n        # libpng builds its stuff into `{build}/lib`\n        self.export_libs('lib', ['.lib', '.a'])\n        # export installed include path from build dir\n        self.export_include('include', build_dir=True)\n```\n\n## Example output from Mama Build\n```\n$ mama build\n========= Mama Build Tool ==========\n  - Target FaceOne            BUILD [root target]\n  - Target dlib               OK\n  - Target CppGuid            OK\n  - Target opencv             OK\n  - Target ReCpp              OK\n  - Target NanoMesh           OK\n  - Package ReCpp\n    <I>  build/ReCpp/ReCpp\n    [L]  build/ReCpp/windows/RelWithDebInfo/ReCpp.lib\n  - Package opencv\n    <I>  build/opencv/windows/include\n    [L]  build/opencv/windows/lib/Release/opencv_xphoto342.lib\n    [L]  build/opencv/windows/lib/Release/opencv_features2d342.lib\n    [L]  build/opencv/windows/lib/Release/opencv_imgcodecs342.lib\n    [L]  build/opencv/windows/lib/Release/opencv_imgproc342.lib\n    [L]  build/opencv/windows/lib/Release/opencv_core342.lib\n    [L]  build/opencv/windows/3rdparty/lib/Release/libjpeg-turbo.lib\n    [L]  build/opencv/windows/3rdparty/lib/Release/libpng.lib\n    [L]  build/opencv/windows/3rdparty/lib/Release/zlib.lib\n  - Package dlib\n    <I>  build/dlib/windows/include\n    [L]  build/dlib/windows/lib/dlib19.15.99_relwithdebinfo_64bit_msvc1914.lib\n  - Package NanoMesh\n    <I>  build/NanoMesh/NanoMesh\n    [L]  build/NanoMesh/windows/RelWithDebInfo/NanoMesh.lib\n  - Package CppGuid\n    <I>  build/CppGuid/CppGuid/include\n    [L]  build/CppGuid/windows/RelWithDebInfo/CppGuid.lib\n  - Package FaceOne\n    <I>  include\n    [L]  bin/FaceOne.dll\n    [L]  bin/FaceOne.lib\n```\n### Uploading packages ###\n```python\n    def dependencies(self):\n        self.set_artifactory_ftp('ftp.myartifactory.com', auth='store')\n        self.add_git('googletest', 'git@github.com:RedFox20/googletest.git')\n```\n```\n$ mama upload googletest\n========= Mama Build Tool ==========\n  - Package googletest\n    <I>  myworkspace/googletest/linux/include\n    [L]  myworkspace/googletest/linux/lib/libgmock.a\n    [L]  myworkspace/googletest/linux/lib/libgtest.a\n  - PAPA Deploy /home/XXX/myworkspace/googletest/linux/deploy/googletest\n    I (googletest)       include\n    L (googletest)       libgmock.a\n    L (googletest)       libgtest.a\n  PAPA Deployed: 1 includes, 2 libs, 0 syslibs, 0 assets\n  - PAPA Upload googletest-linux-x64-release-ebb36f3  770.6KB\n    |==================================================>| 100 %\n```\nAnd then rebuilding with an artifactory package available\n```\n$ mama rebuild googletest\n========= Mama Build Tool ==========\n  - Target googletest         CLEAN  linux\n  - Target googletest         BUILD [cleaned target]  \n    Artifactory fetch ftp.myartifactory.com/googletest-linux-x64-release-ebb36f3  770.6KB\n    |<==================================================| 100 %\n    Artifactory unzip googletest-linux-x64-release-ebb36f3\n  - Package googletest\n    <I>  myworkspace/googletest/linux/include\n    [L]  myworkspace/googletest/linux/libgmock.a\n    [L]  myworkspace/googletest/linux/libgtest.a\n```\n\n\n## For Mama Contributors\nWe are open for any improvements and feedback via pull requests.\n\nThe package `setuptools>=65.0` is required, ensure the version is correct with `pip3 show setuptools`.\n\nYou can set up local development with `$ pip3 install -e . --no-cache-dir` but make sure you have latest setuptools (>65.0) and latest pip3 (>22.3). This command will fail with older toolkits.\n\nUploading a source distributionP:\n1. Get dependencies: `pip3 install build twine`\n2. Build sdist: `python -m build`\n3. Upload with twine: `twine upload --skip-existing dist/*`\nIt will prompt for Username and Password, unless you set up ~/.pypirc file:\n```\n[distutils]\nindex-servers = pypi\n[pypi]\nusername=__token__\npassword=<pypi-api-token>\n```\nQuick build & upload using Python 3.9: `./deploy.sh`\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "A modular C++ build tool even your mama can use",
    "version": "0.9.7",
    "project_urls": {
        "Bug Tracker": "https://github.com/RedFox20/Mama/issues",
        "Homepage": "https://github.com/RedFox20/Mama"
    },
    "split_keywords": [
        "mama",
        " build",
        " mamabuild",
        " c",
        " c++",
        " tool",
        " cmake",
        " simple",
        " easy",
        " package",
        " manager",
        " cross-platform"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "70e65c436a556e2bca239611fb6d2384ea7eb4f6359b6575a829789b67ddda40",
                "md5": "e11e86114b1cfb495167162e05264d07",
                "sha256": "cfd10741c941474aeda2395f87dc42ba4265afdf5645b26bda71c825b72daad4"
            },
            "downloads": -1,
            "filename": "mama-0.9.7-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "e11e86114b1cfb495167162e05264d07",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.6",
            "size": 91123,
            "upload_time": "2024-05-02T08:35:17",
            "upload_time_iso_8601": "2024-05-02T08:35:17.167483Z",
            "url": "https://files.pythonhosted.org/packages/70/e6/5c436a556e2bca239611fb6d2384ea7eb4f6359b6575a829789b67ddda40/mama-0.9.7-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "845ab719247609e3edc6a45c4d65ce2eae0687a51249f08037c579de255c7506",
                "md5": "711ac38377ddc98e9ebb9ce0be8c8b99",
                "sha256": "24dc1eb2de7f6d7b1e01fe42db2e0eb2d08045ac7ce463dbce08940f94c89a8a"
            },
            "downloads": -1,
            "filename": "mama-0.9.7.tar.gz",
            "has_sig": false,
            "md5_digest": "711ac38377ddc98e9ebb9ce0be8c8b99",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.6",
            "size": 83537,
            "upload_time": "2024-05-02T08:35:21",
            "upload_time_iso_8601": "2024-05-02T08:35:21.517052Z",
            "url": "https://files.pythonhosted.org/packages/84/5a/b719247609e3edc6a45c4d65ce2eae0687a51249f08037c579de255c7506/mama-0.9.7.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-05-02 08:35:21",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "RedFox20",
    "github_project": "Mama",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "mama"
}
        
Elapsed time: 0.27970s