ppss-auth


Nameppss-auth JSON
Version 0.11.2.0 PyPI version JSON
download
home_pagehttps://bitbucket.org/pingpongstars/ppss_auth/src/master/
Summarysimple auth scheme for pyramid, based on Mako template and sqlalchemy backend
upload_time2024-05-17 08:47:06
maintainerNone
docs_urlNone
authorpdepmcp
requires_python>=3.6
licenseMIT
keywords pyramid module authentication accelerator
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            This package aims to give and easy pluggable module to provide authentication and user maintennance in a Pyramid web application.
It relies the Pyramid+SQLAlchemy+Mako stack. Implementation for other template languages is on the roadmap.


# Installation and setup

## Install the package
Install the package with:
```sh
  pip install ppss_auth
```
or put ppss_auth in your app dependencies (setup.py, in the install_requires list of packages)



To activate the package, in your main *\_\_init\_\_.py* file, inside the main function, add this line: 
```python
  config.include('ppss_auth')
```

in your models include the ppss_auth's models with this line:
```python
from ppss_auth.models import *
```



## Configure the database
This can be a zero-db-conf module:
run the app with _ppss_auth.initdb_ set to True (that is the default for the params, so you can even leave it blank: see configuration, below). You are done with this, unless you need more in-depth initialization (follow reading)


### You want to do it yourself

To init the Tables manually, in the initialization script (usually in *scripts/intializedb.py*), add this row:
```python
  from ppss_auth import (models as ppssmodels)
```

and while creating the default data (in the "with transaction.manager" block of code), use something like:
```python
  ppssmodels.initdb(dbsession,createdefault=False)
```
This creates the tables and, if *createdefault* evaulates to True, it create a default admin/admin user with the admin permission. 
Please change the password to avoid secuirity issues.


You can create some data as well. Refer to [models] section, below, for more info.

## Requirements
When a user login, *essionauthpolicy* is used to store her informations (userid and user groups). 


## ini file configuration 
ppss_auth use these info from the ini file:

*default user*
- ppss_auth.adminname - the name of a sueruser. Deafult to "admin"
- ppss_auth.adminpass - the corresponding password. If not provided the admin is not allowed to log in (with the ini credentials. It may exist in database)

*predefined permissions, groups, users*

- ppss_auth.permission_list - list of permission, one on each indented row
- ppss_auth.group_list
- ppss_auth.user_list
- ppss_auth.default_password

An example is as follow: 

```python
  ppss_auth.permission_list =
    permision1
    permision2
    permision3
  ppss_auth.group_list =
    group1=permision1,permision2
    group2=permision1
    group3=permision2
  ppss_auth.user_list=
    user1=group1,group2
    iser2=group3
  ppss_auth.default_password = temp0r4ryPassword->changeme!
```


*db stuff*
- ppss_auth.initdb [True] - true/false value, tells the lib to init db automatically on first run.


*routes*
- ppss_auth.login_url [/login] - url for login.
- ppss_auth.logout_url [/logout]- url for logout.

*where to land after succesfull login/logout*
- ppss_auth.post_login_follow - try to redirect the browser back to where it came from after successful login (use true case insensitive to activate it). It's useful if combined with the forbidden pattern
- ppss_auth.post_login_route [home] - name of the route where to send the browser after user logged in. Ignored if ppss_auth.post_login_follow is set to true AND there is a referer to go to.
- ppss_auth.post_logout_route - name of the route where to send the browser after log out. Defaults to home

*templates stuff*
You can override all this values and even provide a mako-free environment. This can be a litlle tricky, but there is no hard-coded dependency to mako, just the defaults.

- ppss_auth.logintemplate - name of the login template. It defaults to the internal template: "ppss_auth:/templates/login.mako"
- ppss_auth.changepasswordtemplate - name of the change password template. Defaults to: ppss_auth:/templates/change.mako
- ppss_auth.modifyusertemplate - Defaults to: ppss_auth:/templates/modifyuser.mako
- ppss_auth.listusertemplate - Defaults to: ppss_auth:/templates/listuser.mako
- ppss_auth.logintemplateinherit - Defaults to: ppss_auth:/templates/layout.mako


*look and feel*

- ppss_auth.bootstrapversion - Should 3 or 4, accordind to the the version of bootstrap that the hosting site uses. Defaults to 4

# Things to know (devs only)

## database
Thi package provide the creation and usage of 3 main tables (and the other tables required for ER consistency):
- ppss_user - containing basic information about the users (username, hashed password and related data )
- ppss_group - user groups to allow for easier handling of user groups and permissions
- ppss_permission - a list of permissions (just an id and a name)

## models

### PPSsuser

This represents the user of your application.
She has a _username_, a _password_ and relation to her _groups_. She also has a _enabled_ property and some timestamps (creation times, and similar times).

Use the _setPassword(password)_ method on PPSsuser instances to change the password, providing the new password.

_todict(self)_ is a commodity method to get a dict of the main properties.

### PPSsgroup

This class represnts the groups of your users. It's a many-to-many relation: each user can belong to many groups, and each group can gather many users.
Other than a _name_ and the _enabled_ flag (integer with 1 for enabled), its main user is the many-to-many relation to permissions. This means that all users in the same group share (at least) all the permissions given to the group.

### PPSspermission

This class represents the permissions of the application. You can create new permissions and link them to group. You can use those permissions in the _permission_ attribute of the _view\_config_ decorator to restrict usage of some methods using ACL, or you can check it whenever needed.



# Integrating with existing alembic

- enp.py file
add the following row among the imports:
```python
from ppss_auth.ppss_auth_utils.db import exclude_ppss_auth_tables
```

and use it *run_migrations_offline* function substituting context with:

```python
context.configure(url=settings['sqlalchemy.url'],**exclude_ppss_auth_tables(config))
```

and in *run_migrations_online* substituting context with:

```python
context.configure(
  connection=connection,
  target_metadata=target_metadata,**exclude_ppss_auth_tables(config)
)
```

add the following to your .ini file, below *alembic* section:

```ini
[alembic:exclude]
tables = module_db_version
pattern = ppss*
  *auth*
```


This package aims to give and easy pluggable module to provide authentication and user maintennance in a Pyramid web application.
It relies the Pyramid+SQLAlchemy+Mako stack. Implementation for other template languages is on the roadmap.


# Installation and setup

## Install the package
Install the package with:
```sh
  pip install ppss_auth
```
or put ppss_auth in your app dependencies (setup.py, in the install_requires list of packages)



To activate the package, in your main *\_\_init\_\_.py* file, inside the main function, add this line: 
```python
  config.include('ppss_auth')
```

in your models include the ppss_auth's models with this line:
```python
from ppss_auth.models import *
```



## Configure the database
This can be a zero-db-conf module:
run the app with _ppss_auth.initdb_ set to True (that is the default for the params, so you can even leave it blank: see configuration, below). You are done with this, unless you need more in-depth initialization (follow reading)


### You want to do it yourself

To init the Tables manually, in the initialization script (usually in *scripts/intializedb.py*), add this row:
```python
  from ppss_auth import (models as ppssmodels)
```

and while creating the default data (in the "with transaction.manager" block of code), use something like:
```python
  ppssmodels.initdb(dbsession,createdefault=False)
```
This creates the tables and, if *createdefault* evaulates to True, it create a default admin/admin user with the admin permission. 
Please change the password to avoid secuirity issues.


You can create some data as well. Refer to [models] section, below, for more info.

## Requirements
When a user login, *essionauthpolicy* is used to store her informations (userid and user groups). 


## ini file configuration 
ppss_auth use these info from the ini file:

*default user*
- ppss_auth.adminname - the name of a sueruser. Deafult to "admin"
- ppss_auth.adminpass - the corresponding password. If not provided the admin is not allowed to log in (with the ini credentials. It may exist in database)

*predefined permissions, groups, users*

- ppss_auth.permission_list - list of permission, one on each indented row
- ppss_auth.group_list
- ppss_auth.user_list
- ppss_auth.default_password

An example is as follow: 

```python
  ppss_auth.permission_list =
    permision1
    permision2
    permision3
  ppss_auth.group_list =
    group1=permision1,permision2
    group2=permision1
    group3=permision2
  ppss_auth.user_list=
    user1=group1,group2
    iser2=group3
  ppss_auth.default_password = temp0r4ryPassword->changeme!
```


*db stuff*
- ppss_auth.initdb [True] - true/false value, tells the lib to init db automatically on first run.


*routes*
- ppss_auth.login_url [/login] - url for login.
- ppss_auth.logout_url [/logout]- url for logout.

*where to land after succesfull login/logout*
- ppss_auth.post_login_follow - try to redirect the browser back to where it came from after successful login (use true case insensitive to activate it). It's useful if combined with the forbidden pattern
- ppss_auth.post_login_route [home] - name of the route where to send the browser after user logged in. Ignored if ppss_auth.post_login_follow is set to true AND there is a referer to go to.
- ppss_auth.post_logout_route - name of the route where to send the browser after log out. Defaults to home

*templates stuff*
You can override all this values and even provide a mako-free environment. This can be a litlle tricky, but there is no hard-coded dependency to mako, just the defaults.

- ppss_auth.logintemplate - name of the login template. It defaults to the internal template: "ppss_auth:/templates/login.mako"
- ppss_auth.changepasswordtemplate - name of the change password template. Defaults to: ppss_auth:/templates/change.mako
- ppss_auth.modifyusertemplate - Defaults to: ppss_auth:/templates/modifyuser.mako
- ppss_auth.listusertemplate - Defaults to: ppss_auth:/templates/listuser.mako
- ppss_auth.logintemplateinherit - Defaults to: ppss_auth:/templates/layout.mako


*look and feel*

- ppss_auth.bootstrapversion - Should 3 or 4, accordind to the the version of bootstrap that the hosting site uses. Defaults to 4

# Things to know (devs only)

## database
Thi package provide the creation and usage of 3 main tables (and the other tables required for ER consistency):
- ppss_user - containing basic information about the users (username, hashed password and related data )
- ppss_group - user groups to allow for easier handling of user groups and permissions
- ppss_permission - a list of permissions (just an id and a name)

## models

### PPSsuser

This represents the user of your application.
She has a _username_, a _password_ and relation to her _groups_. She also has a _enabled_ property and some timestamps (creation times, and similar times).

Use the _setPassword(password)_ method on PPSsuser instances to change the password, providing the new password.

_todict(self)_ is a commodity method to get a dict of the main properties.

### PPSsgroup

This class represnts the groups of your users. It's a many-to-many relation: each user can belong to many groups, and each group can gather many users.
Other than a _name_ and the _enabled_ flag (integer with 1 for enabled), its main user is the many-to-many relation to permissions. This means that all users in the same group share (at least) all the permissions given to the group.

### PPSspermission

This class represents the permissions of the application. You can create new permissions and link them to group. You can use those permissions in the _permission_ attribute of the _view\_config_ decorator to restrict usage of some methods using ACL, or you can check it whenever needed.



# Integrating with existing alembic

- enp.py file
add the following row among the imports:
```python
from ppss_auth.ppss_auth_utils.db import exclude_ppss_auth_tables
```

and use it *run_migrations_offline* function substituting context with:

```python
context.configure(url=settings['sqlalchemy.url'],**exclude_ppss_auth_tables(config))
```

and in *run_migrations_online* substituting context with:

```python
context.configure(
  connection=connection,
  target_metadata=target_metadata,**exclude_ppss_auth_tables(config)
)
```

add the following to your .ini file, below *alembic* section:

```ini
[alembic:exclude]
tables = module_db_version
pattern = ppss*
  *auth*
```

            

Raw data

            {
    "_id": null,
    "home_page": "https://bitbucket.org/pingpongstars/ppss_auth/src/master/",
    "name": "ppss-auth",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.6",
    "maintainer_email": null,
    "keywords": "pyramid module authentication accelerator",
    "author": "pdepmcp",
    "author_email": "d.cariboni@pingpongstars.it",
    "download_url": "https://files.pythonhosted.org/packages/0a/fc/f71cbbfa0e2542966ba76c5666d2b2fdb650086e483ee0f379ef6a7c341c/ppss_auth-0.11.2.0.tar.gz",
    "platform": null,
    "description": "This package aims to give and easy pluggable module to provide authentication and user maintennance in a Pyramid web application.\nIt relies the Pyramid+SQLAlchemy+Mako stack. Implementation for other template languages is on the roadmap.\n\n\n# Installation and setup\n\n## Install the package\nInstall the package with:\n```sh\n  pip install ppss_auth\n```\nor put ppss_auth in your app dependencies (setup.py, in the install_requires list of packages)\n\n\n\nTo activate the package, in your main *\\_\\_init\\_\\_.py* file, inside the main function, add this line: \n```python\n  config.include('ppss_auth')\n```\n\nin your models include the ppss_auth's models with this line:\n```python\nfrom ppss_auth.models import *\n```\n\n\n\n## Configure the database\nThis can be a zero-db-conf module:\nrun the app with _ppss_auth.initdb_ set to True (that is the default for the params, so you can even leave it blank: see configuration, below). You are done with this, unless you need more in-depth initialization (follow reading)\n\n\n### You want to do it yourself\n\nTo init the Tables manually, in the initialization script (usually in *scripts/intializedb.py*), add this row:\n```python\n  from ppss_auth import (models as ppssmodels)\n```\n\nand while creating the default data (in the \"with transaction.manager\" block of code), use something like:\n```python\n  ppssmodels.initdb(dbsession,createdefault=False)\n```\nThis creates the tables and, if *createdefault* evaulates to True, it create a default admin/admin user with the admin permission. \nPlease change the password to avoid secuirity issues.\n\n\nYou can create some data as well. Refer to [models] section, below, for more info.\n\n## Requirements\nWhen a user login, *essionauthpolicy* is used to store her informations (userid and user groups). \n\n\n## ini file configuration \nppss_auth use these info from the ini file:\n\n*default user*\n- ppss_auth.adminname - the name of a sueruser. Deafult to \"admin\"\n- ppss_auth.adminpass - the corresponding password. If not provided the admin is not allowed to log in (with the ini credentials. It may exist in database)\n\n*predefined permissions, groups, users*\n\n- ppss_auth.permission_list - list of permission, one on each indented row\n- ppss_auth.group_list\n- ppss_auth.user_list\n- ppss_auth.default_password\n\nAn example is as follow: \n\n```python\n  ppss_auth.permission_list =\n    permision1\n    permision2\n    permision3\n  ppss_auth.group_list =\n    group1=permision1,permision2\n    group2=permision1\n    group3=permision2\n  ppss_auth.user_list=\n    user1=group1,group2\n    iser2=group3\n  ppss_auth.default_password = temp0r4ryPassword->changeme!\n```\n\n\n*db stuff*\n- ppss_auth.initdb [True] - true/false value, tells the lib to init db automatically on first run.\n\n\n*routes*\n- ppss_auth.login_url [/login] - url for login.\n- ppss_auth.logout_url [/logout]- url for logout.\n\n*where to land after succesfull login/logout*\n- ppss_auth.post_login_follow - try to redirect the browser back to where it came from after successful login (use true case insensitive to activate it). It's useful if combined with the forbidden pattern\n- ppss_auth.post_login_route [home] - name of the route where to send the browser after user logged in. Ignored if ppss_auth.post_login_follow is set to true AND there is a referer to go to.\n- ppss_auth.post_logout_route - name of the route where to send the browser after log out. Defaults to home\n\n*templates stuff*\nYou can override all this values and even provide a mako-free environment. This can be a litlle tricky, but there is no hard-coded dependency to mako, just the defaults.\n\n- ppss_auth.logintemplate - name of the login template. It defaults to the internal template: \"ppss_auth:/templates/login.mako\"\n- ppss_auth.changepasswordtemplate - name of the change password template. Defaults to: ppss_auth:/templates/change.mako\n- ppss_auth.modifyusertemplate - Defaults to: ppss_auth:/templates/modifyuser.mako\n- ppss_auth.listusertemplate - Defaults to: ppss_auth:/templates/listuser.mako\n- ppss_auth.logintemplateinherit - Defaults to: ppss_auth:/templates/layout.mako\n\n\n*look and feel*\n\n- ppss_auth.bootstrapversion - Should 3 or 4, accordind to the the version of bootstrap that the hosting site uses. Defaults to 4\n\n# Things to know (devs only)\n\n## database\nThi package provide the creation and usage of 3 main tables (and the other tables required for ER consistency):\n- ppss_user - containing basic information about the users (username, hashed password and related data )\n- ppss_group - user groups to allow for easier handling of user groups and permissions\n- ppss_permission - a list of permissions (just an id and a name)\n\n## models\n\n### PPSsuser\n\nThis represents the user of your application.\nShe has a _username_, a _password_ and relation to her _groups_. She also has a _enabled_ property and some timestamps (creation times, and similar times).\n\nUse the _setPassword(password)_ method on PPSsuser instances to change the password, providing the new password.\n\n_todict(self)_ is a commodity method to get a dict of the main properties.\n\n### PPSsgroup\n\nThis class represnts the groups of your users. It's a many-to-many relation: each user can belong to many groups, and each group can gather many users.\nOther than a _name_ and the _enabled_ flag (integer with 1 for enabled), its main user is the many-to-many relation to permissions. This means that all users in the same group share (at least) all the permissions given to the group.\n\n### PPSspermission\n\nThis class represents the permissions of the application. You can create new permissions and link them to group. You can use those permissions in the _permission_ attribute of the _view\\_config_ decorator to restrict usage of some methods using ACL, or you can check it whenever needed.\n\n\n\n# Integrating with existing alembic\n\n- enp.py file\nadd the following row among the imports:\n```python\nfrom ppss_auth.ppss_auth_utils.db import exclude_ppss_auth_tables\n```\n\nand use it *run_migrations_offline* function substituting context with:\n\n```python\ncontext.configure(url=settings['sqlalchemy.url'],**exclude_ppss_auth_tables(config))\n```\n\nand in *run_migrations_online* substituting context with:\n\n```python\ncontext.configure(\n  connection=connection,\n  target_metadata=target_metadata,**exclude_ppss_auth_tables(config)\n)\n```\n\nadd the following to your .ini file, below *alembic* section:\n\n```ini\n[alembic:exclude]\ntables = module_db_version\npattern = ppss*\n  *auth*\n```\n\n\nThis package aims to give and easy pluggable module to provide authentication and user maintennance in a Pyramid web application.\nIt relies the Pyramid+SQLAlchemy+Mako stack. Implementation for other template languages is on the roadmap.\n\n\n# Installation and setup\n\n## Install the package\nInstall the package with:\n```sh\n  pip install ppss_auth\n```\nor put ppss_auth in your app dependencies (setup.py, in the install_requires list of packages)\n\n\n\nTo activate the package, in your main *\\_\\_init\\_\\_.py* file, inside the main function, add this line: \n```python\n  config.include('ppss_auth')\n```\n\nin your models include the ppss_auth's models with this line:\n```python\nfrom ppss_auth.models import *\n```\n\n\n\n## Configure the database\nThis can be a zero-db-conf module:\nrun the app with _ppss_auth.initdb_ set to True (that is the default for the params, so you can even leave it blank: see configuration, below). You are done with this, unless you need more in-depth initialization (follow reading)\n\n\n### You want to do it yourself\n\nTo init the Tables manually, in the initialization script (usually in *scripts/intializedb.py*), add this row:\n```python\n  from ppss_auth import (models as ppssmodels)\n```\n\nand while creating the default data (in the \"with transaction.manager\" block of code), use something like:\n```python\n  ppssmodels.initdb(dbsession,createdefault=False)\n```\nThis creates the tables and, if *createdefault* evaulates to True, it create a default admin/admin user with the admin permission. \nPlease change the password to avoid secuirity issues.\n\n\nYou can create some data as well. Refer to [models] section, below, for more info.\n\n## Requirements\nWhen a user login, *essionauthpolicy* is used to store her informations (userid and user groups). \n\n\n## ini file configuration \nppss_auth use these info from the ini file:\n\n*default user*\n- ppss_auth.adminname - the name of a sueruser. Deafult to \"admin\"\n- ppss_auth.adminpass - the corresponding password. If not provided the admin is not allowed to log in (with the ini credentials. It may exist in database)\n\n*predefined permissions, groups, users*\n\n- ppss_auth.permission_list - list of permission, one on each indented row\n- ppss_auth.group_list\n- ppss_auth.user_list\n- ppss_auth.default_password\n\nAn example is as follow: \n\n```python\n  ppss_auth.permission_list =\n    permision1\n    permision2\n    permision3\n  ppss_auth.group_list =\n    group1=permision1,permision2\n    group2=permision1\n    group3=permision2\n  ppss_auth.user_list=\n    user1=group1,group2\n    iser2=group3\n  ppss_auth.default_password = temp0r4ryPassword->changeme!\n```\n\n\n*db stuff*\n- ppss_auth.initdb [True] - true/false value, tells the lib to init db automatically on first run.\n\n\n*routes*\n- ppss_auth.login_url [/login] - url for login.\n- ppss_auth.logout_url [/logout]- url for logout.\n\n*where to land after succesfull login/logout*\n- ppss_auth.post_login_follow - try to redirect the browser back to where it came from after successful login (use true case insensitive to activate it). It's useful if combined with the forbidden pattern\n- ppss_auth.post_login_route [home] - name of the route where to send the browser after user logged in. Ignored if ppss_auth.post_login_follow is set to true AND there is a referer to go to.\n- ppss_auth.post_logout_route - name of the route where to send the browser after log out. Defaults to home\n\n*templates stuff*\nYou can override all this values and even provide a mako-free environment. This can be a litlle tricky, but there is no hard-coded dependency to mako, just the defaults.\n\n- ppss_auth.logintemplate - name of the login template. It defaults to the internal template: \"ppss_auth:/templates/login.mako\"\n- ppss_auth.changepasswordtemplate - name of the change password template. Defaults to: ppss_auth:/templates/change.mako\n- ppss_auth.modifyusertemplate - Defaults to: ppss_auth:/templates/modifyuser.mako\n- ppss_auth.listusertemplate - Defaults to: ppss_auth:/templates/listuser.mako\n- ppss_auth.logintemplateinherit - Defaults to: ppss_auth:/templates/layout.mako\n\n\n*look and feel*\n\n- ppss_auth.bootstrapversion - Should 3 or 4, accordind to the the version of bootstrap that the hosting site uses. Defaults to 4\n\n# Things to know (devs only)\n\n## database\nThi package provide the creation and usage of 3 main tables (and the other tables required for ER consistency):\n- ppss_user - containing basic information about the users (username, hashed password and related data )\n- ppss_group - user groups to allow for easier handling of user groups and permissions\n- ppss_permission - a list of permissions (just an id and a name)\n\n## models\n\n### PPSsuser\n\nThis represents the user of your application.\nShe has a _username_, a _password_ and relation to her _groups_. She also has a _enabled_ property and some timestamps (creation times, and similar times).\n\nUse the _setPassword(password)_ method on PPSsuser instances to change the password, providing the new password.\n\n_todict(self)_ is a commodity method to get a dict of the main properties.\n\n### PPSsgroup\n\nThis class represnts the groups of your users. It's a many-to-many relation: each user can belong to many groups, and each group can gather many users.\nOther than a _name_ and the _enabled_ flag (integer with 1 for enabled), its main user is the many-to-many relation to permissions. This means that all users in the same group share (at least) all the permissions given to the group.\n\n### PPSspermission\n\nThis class represents the permissions of the application. You can create new permissions and link them to group. You can use those permissions in the _permission_ attribute of the _view\\_config_ decorator to restrict usage of some methods using ACL, or you can check it whenever needed.\n\n\n\n# Integrating with existing alembic\n\n- enp.py file\nadd the following row among the imports:\n```python\nfrom ppss_auth.ppss_auth_utils.db import exclude_ppss_auth_tables\n```\n\nand use it *run_migrations_offline* function substituting context with:\n\n```python\ncontext.configure(url=settings['sqlalchemy.url'],**exclude_ppss_auth_tables(config))\n```\n\nand in *run_migrations_online* substituting context with:\n\n```python\ncontext.configure(\n  connection=connection,\n  target_metadata=target_metadata,**exclude_ppss_auth_tables(config)\n)\n```\n\nadd the following to your .ini file, below *alembic* section:\n\n```ini\n[alembic:exclude]\ntables = module_db_version\npattern = ppss*\n  *auth*\n```\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "simple auth scheme for pyramid, based on Mako template and sqlalchemy backend",
    "version": "0.11.2.0",
    "project_urls": {
        "Homepage": "https://bitbucket.org/pingpongstars/ppss_auth/src/master/"
    },
    "split_keywords": [
        "pyramid",
        "module",
        "authentication",
        "accelerator"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "0afcf71cbbfa0e2542966ba76c5666d2b2fdb650086e483ee0f379ef6a7c341c",
                "md5": "2663e688dc9615eaf97abbc46b1be6cb",
                "sha256": "16afdc1bbb59ce7d56b1cdaba3d9cd7bd82ed9665e9b7665002e769690f6933e"
            },
            "downloads": -1,
            "filename": "ppss_auth-0.11.2.0.tar.gz",
            "has_sig": false,
            "md5_digest": "2663e688dc9615eaf97abbc46b1be6cb",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.6",
            "size": 52423,
            "upload_time": "2024-05-17T08:47:06",
            "upload_time_iso_8601": "2024-05-17T08:47:06.850872Z",
            "url": "https://files.pythonhosted.org/packages/0a/fc/f71cbbfa0e2542966ba76c5666d2b2fdb650086e483ee0f379ef6a7c341c/ppss_auth-0.11.2.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-05-17 08:47:06",
    "github": false,
    "gitlab": false,
    "bitbucket": true,
    "codeberg": false,
    "bitbucket_user": "pingpongstars",
    "bitbucket_project": "ppss_auth",
    "lcname": "ppss-auth"
}
        
Elapsed time: 0.25318s