Metadata-Version: 2.1
Name: nldcsc
Version: 0.2.35
Summary: Package with general devops code
Home-page: https://github.com/NLDCSC/nldcsc
Author: NLDCSC
Author-email: NLDCSC@invalid.com
License: GNU General Public License v3.0
Project-URL: Code, https://github.com/NLDCSC/nldcsc
Platform: any
Classifier: Development Status :: 5 - Production/Stable
Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Operating System :: OS Independent
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: setuptools >=68.1.0
Provides-Extra: all
Requires-Dist: pymysql >=1.1.0 ; extra == 'all'
Requires-Dist: Flask-Socketio >=5.3.6 ; extra == 'all'
Requires-Dist: elasticsearch >=8.7.0 ; extra == 'all'
Requires-Dist: Werkzeug >=2.3.7 ; extra == 'all'
Requires-Dist: eswrap >=0.5.0 ; extra == 'all'
Requires-Dist: PyJWT >=2.8.0 ; extra == 'all'
Requires-Dist: httpx >=0.27.0 ; extra == 'all'
Requires-Dist: python-ldap >=3.4.3 ; extra == 'all'
Requires-Dist: SQLAlchemy >=2.0.21 ; extra == 'all'
Requires-Dist: ansicolors >=1.1.8 ; extra == 'all'
Requires-Dist: gunicorn >=21.2.0 ; extra == 'all'
Requires-Dist: kafka-python >=2.0.2 ; extra == 'all'
Requires-Dist: rfc3339 >=6.2 ; extra == 'all'
Requires-Dist: pygelf >=0.4.2 ; extra == 'all'
Requires-Dist: Flask-SQLAlchemy >=3.1.1 ; extra == 'all'
Requires-Dist: requests >=2.31.0 ; extra == 'all'
Requires-Dist: mysqlclient >=2.1.1 ; extra == 'all'
Requires-Dist: Flask-Migrate >=4.0.5 ; extra == 'all'
Requires-Dist: pyopenssl >=23.2.0 ; extra == 'all'
Requires-Dist: Authlib >=1.3.0 ; extra == 'all'
Requires-Dist: flask >=2.3.3 ; extra == 'all'
Requires-Dist: redis >=4.6.0 ; extra == 'all'
Provides-Extra: auth
Requires-Dist: python-ldap >=3.4.3 ; extra == 'auth'
Requires-Dist: gunicorn >=21.2.0 ; extra == 'auth'
Requires-Dist: ansicolors >=1.1.8 ; extra == 'auth'
Requires-Dist: pygelf >=0.4.2 ; extra == 'auth'
Provides-Extra: datatables
Requires-Dist: eswrap >=0.5.0 ; extra == 'datatables'
Requires-Dist: redis >=4.6.0 ; extra == 'datatables'
Requires-Dist: kafka-python >=2.0.2 ; extra == 'datatables'
Requires-Dist: elasticsearch >=8.7.0 ; extra == 'datatables'
Requires-Dist: flask >=2.3.3 ; extra == 'datatables'
Requires-Dist: SQLAlchemy >=2.0.21 ; extra == 'datatables'
Requires-Dist: Flask-SQLAlchemy >=3.1.1 ; extra == 'datatables'
Requires-Dist: Werkzeug >=2.3.7 ; extra == 'datatables'
Provides-Extra: flask_managers
Requires-Dist: gunicorn >=21.2.0 ; extra == 'flask_managers'
Requires-Dist: flask >=2.3.3 ; extra == 'flask_managers'
Requires-Dist: pyopenssl >=23.2.0 ; extra == 'flask_managers'
Requires-Dist: Werkzeug >=2.3.7 ; extra == 'flask_managers'
Requires-Dist: Flask-Socketio >=5.3.6 ; extra == 'flask_managers'
Requires-Dist: ansicolors >=1.1.8 ; extra == 'flask_managers'
Requires-Dist: pygelf >=0.4.2 ; extra == 'flask_managers'
Requires-Dist: Flask-Migrate >=4.0.5 ; extra == 'flask_managers'
Requires-Dist: Flask-SQLAlchemy >=3.1.1 ; extra == 'flask_managers'
Requires-Dist: pymysql >=1.1.0 ; extra == 'flask_managers'
Requires-Dist: mysqlclient >=2.1.1 ; extra == 'flask_managers'
Provides-Extra: flask_middleware
Requires-Dist: rfc3339 >=6.2 ; extra == 'flask_middleware'
Requires-Dist: gunicorn >=21.2.0 ; extra == 'flask_middleware'
Requires-Dist: flask >=2.3.3 ; extra == 'flask_middleware'
Requires-Dist: pyopenssl >=23.2.0 ; extra == 'flask_middleware'
Requires-Dist: Werkzeug >=2.3.7 ; extra == 'flask_middleware'
Requires-Dist: Flask-Socketio >=5.3.6 ; extra == 'flask_middleware'
Requires-Dist: ansicolors >=1.1.8 ; extra == 'flask_middleware'
Requires-Dist: pygelf >=0.4.2 ; extra == 'flask_middleware'
Requires-Dist: Flask-Migrate >=4.0.5 ; extra == 'flask_middleware'
Requires-Dist: Flask-SQLAlchemy >=3.1.1 ; extra == 'flask_middleware'
Requires-Dist: pymysql >=1.1.0 ; extra == 'flask_middleware'
Requires-Dist: mysqlclient >=2.1.1 ; extra == 'flask_middleware'
Provides-Extra: flask_plugins
Requires-Dist: eswrap >=0.5.0 ; extra == 'flask_plugins'
Requires-Dist: redis >=4.6.0 ; extra == 'flask_plugins'
Requires-Dist: kafka-python >=2.0.2 ; extra == 'flask_plugins'
Requires-Dist: elasticsearch >=8.7.0 ; extra == 'flask_plugins'
Requires-Dist: flask >=2.3.3 ; extra == 'flask_plugins'
Requires-Dist: SQLAlchemy >=2.0.21 ; extra == 'flask_plugins'
Requires-Dist: Flask-SQLAlchemy >=3.1.1 ; extra == 'flask_plugins'
Requires-Dist: Werkzeug >=2.3.7 ; extra == 'flask_plugins'
Provides-Extra: http_apis
Requires-Dist: requests >=2.31.0 ; extra == 'http_apis'
Provides-Extra: httpx_apis
Requires-Dist: httpx >=0.27.0 ; extra == 'httpx_apis'
Provides-Extra: loggers
Requires-Dist: gunicorn >=21.2.0 ; extra == 'loggers'
Requires-Dist: ansicolors >=1.1.8 ; extra == 'loggers'
Requires-Dist: pygelf >=0.4.2 ; extra == 'loggers'
Provides-Extra: sql_migrations
Requires-Dist: Flask-Migrate >=4.0.5 ; extra == 'sql_migrations'
Requires-Dist: Flask-SQLAlchemy >=3.1.1 ; extra == 'sql_migrations'
Requires-Dist: flask >=2.3.3 ; extra == 'sql_migrations'
Requires-Dist: pymysql >=1.1.0 ; extra == 'sql_migrations'
Requires-Dist: mysqlclient >=2.1.1 ; extra == 'sql_migrations'
Requires-Dist: gunicorn >=21.2.0 ; extra == 'sql_migrations'
Requires-Dist: ansicolors >=1.1.8 ; extra == 'sql_migrations'
Requires-Dist: pygelf >=0.4.2 ; extra == 'sql_migrations'
Provides-Extra: sso
Requires-Dist: Authlib >=1.3.0 ; extra == 'sso'
Requires-Dist: flask >=2.3.3 ; extra == 'sso'
Requires-Dist: PyJWT >=2.8.0 ; extra == 'sso'

# NLDCSC package

[![GitHub Release](https://img.shields.io/github/release/NLDCSC/nldcsc.svg?style=flat)]()
[![GPLv3 License](https://img.shields.io/badge/License-GPL%20v3-yellow.svg)](https://opensource.org/licenses/)

[![codecov](https://codecov.io/gh/NLDCSC/nldcsc/graph/badge.svg?token=QSHW4B6ADR)](https://codecov.io/gh/NLDCSC/nldcsc)
![pypi](https://github.com/NLDCSC/nldcsc/actions/workflows/package_to_pypi.yaml/badge.svg)
![pytest](https://github.com/NLDCSC/nldcsc/actions/workflows/tox_tests.yaml/badge.svg)

This package contains generic re-usable code.

Install the full package:

```
pip install nldcsc[all]
```

Package has several modules which can be installed separately by specifying them 
as an extra requirement. To install the loggers module only, specify:

```
pip install nldcsc[loggers]
```
Or for multiple modules:
```
pip install nldcsc[loggers, flask_managers]
```

## Modules

The following modules are available in the nldcsc package:

* auth
* datatables
* flask_managers
* flask_middleware
* flask_plugins
* http_apis
* loggers
* sql_migrations

### Loggers

There are two loggers provided:
* AppLogger (nldcsc.loggers.app_logger.AppLogger)
* GunicornLogger (nldcsc.loggers.app_logger.GunicornLogger)

The AppLogger is intended to be used as a loggerClass to be used for the 
standard python logging module.

```python
import logging
from nldcsc.loggers.app_logger import AppLogger

logging.setLoggerClass(AppLogger)

mylogger = logging.getLogger(__name__)
```
The 'mylogger' instance has all the proper formatting and handlers 
(according to the desired config) to log messages.

The Gunicorn logger is intended to be used for as a loggerClass for the 
gunicorn webserver; it enables the FlaskAppManager to set the necessary 
formatting and handles according to the AppLogger specs and a custom format
for the gunicorn access logging.

### Flask app manager

The FlaskAppManager is intended to be used to 'run' flask applications in 
both test, development as in production environments. 

```python
from YADA import app
from nldcsc.flask_managers.flask_app_manager import FlaskAppManager

fam = FlaskAppManager(version="1.0", app=app)
fam.run()
```
Depending on the configuration the FlaskAppManager uses a werkzeug (DEBUG == True)
or a gunicorn webserver. TLS could be set for both webservers iaw the module specific
README.md.

### HTTP apis

Baseclass for http api communication is present under 
nldcsc.http_apis.base_class.api_base_class.ApiBaseClass

### SQL Migrations

The sql migrations can be used to facilitate migration between different
versions of sql models / versions. It relies on flask migrate to perform
the different migrations. It has a CLI as well as an python class based API.

Check the command line help
```
python3 -m nldcsc.sql_migrations.flask_sql_migrate -a /path/to/script_with_flask_app.py -i
python3 -m nldcsc.sql_migrations.flask_sql_migrate -a /path/to/script_with_flask_app.py -m
python3 -m nldcsc.sql_migrations.flask_sql_migrate -a /path/to/script_with_flask_app.py -u
```

Or initiate the FlaskSqlMigrate as a class and initiate the migration 
process from there: 
```python
from nldcsc.sql_migrations.flask_sql_migrate import FlaskSqlMigrate
fsm = FlaskSqlMigrate(app_ref="/path/to/script_with_flask_app.py")

fsm.db_init()
fsm.db_migrate()
fsm.db_update()
```
