Metadata-Version: 2.1
Name: nldcsc
Version: 0.2.39
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: httpx-apis
Requires-Dist: httpx>=0.27.0; extra == "httpx-apis"
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: 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: gunicorn>=21.2.0; 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: flask>=2.3.3; extra == "flask-middleware"
Requires-Dist: pymysql>=1.1.0; extra == "flask-middleware"
Requires-Dist: mysqlclient>=2.1.1; extra == "flask-middleware"
Requires-Dist: gunicorn>=21.2.0; extra == "flask-middleware"
Requires-Dist: ansicolors>=1.1.8; extra == "flask-middleware"
Requires-Dist: pygelf>=0.4.2; extra == "flask-middleware"
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: 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: 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"
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: 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: gunicorn>=21.2.0; 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: flask>=2.3.3; extra == "flask-managers"
Requires-Dist: pymysql>=1.1.0; extra == "flask-managers"
Requires-Dist: mysqlclient>=2.1.1; extra == "flask-managers"
Requires-Dist: gunicorn>=21.2.0; extra == "flask-managers"
Requires-Dist: ansicolors>=1.1.8; extra == "flask-managers"
Requires-Dist: pygelf>=0.4.2; extra == "flask-managers"
Provides-Extra: http-apis
Requires-Dist: requests>=2.31.0; extra == "http-apis"
Provides-Extra: all
Requires-Dist: Werkzeug>=2.3.7; extra == "all"
Requires-Dist: PyJWT>=2.8.0; extra == "all"
Requires-Dist: pymysql>=1.1.0; extra == "all"
Requires-Dist: Authlib>=1.3.0; extra == "all"
Requires-Dist: pyopenssl>=23.2.0; extra == "all"
Requires-Dist: Flask-Socketio>=5.3.6; extra == "all"
Requires-Dist: ansicolors>=1.1.8; extra == "all"
Requires-Dist: elasticsearch>=8.7.0; extra == "all"
Requires-Dist: kafka-python>=2.0.2; extra == "all"
Requires-Dist: Flask-Migrate>=4.0.5; extra == "all"
Requires-Dist: httpx>=0.27.0; extra == "all"
Requires-Dist: redis>=4.6.0; extra == "all"
Requires-Dist: gunicorn>=21.2.0; extra == "all"
Requires-Dist: rfc3339>=6.2; extra == "all"
Requires-Dist: SQLAlchemy>=2.0.21; 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: python-ldap>=3.4.3; extra == "all"
Requires-Dist: eswrap>=0.5.0; extra == "all"
Requires-Dist: mysqlclient>=2.1.1; extra == "all"
Requires-Dist: flask>=2.3.3; extra == "all"

# 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()
```
