Skip to content
__init__.py 1.9 KiB
Newer Older
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

'''Automatic REST APIs'''

Davide Ricci's avatar
Davide Ricci committed
# System modules
import configparser
import importlib
import sys

from flask import Blueprint
Davide Ricci's avatar
Davide Ricci committed
from flask_restx import Api, Namespace, Resource

# Custom modules
import devices
Davide Ricci's avatar
Davide Ricci committed
from utils.url_stuff import build_url

from .blocks import api as blocks_api
from .environment import api as environment_api
from .templates import api as templates_api
from .testfulvio import api as testfulvio_api
Davide Ricci's avatar
Davide Ricci committed
api_blueprint = Blueprint('api', __name__)

api = Api(api_blueprint,
Davide Ricci's avatar
Davide Ricci committed
          title='Generic APIs for observatory control',
Davide Ricci's avatar
Davide Ricci committed
          version='1.0',
vertighel's avatar
vertighel committed
          )
Davide Ricci's avatar
Davide Ricci committed

base = "api." # this module
ends = configparser.ConfigParser()
ends.read('./config/api.ini')

Davide Ricci's avatar
Davide Ricci committed
def dynamic_import(url):
    """Dynamically import into this module api.ini files.
Davide Ricci's avatar
Davide Ricci committed

    parts = url.split('/') # /dome/shutter/movement
    namespace = parts[1]  #  dome
    end = '/' + '/'.join(parts[2:]) # /shutter/movement
Davide Ricci's avatar
Davide Ricci committed

    dev_api = Namespace(namespace) # adding namespace /dome. Endpoint will be added
Davide Ricci's avatar
Davide Ricci committed

    dev = getattr(devices, ends.get(url,"device"))           # devices.light instance
    cls = dev.__class__.__name__                             # string "Switch"
    mod_name = cls.lower()                                   # string "switch"
    module = importlib.import_module(base + mod_name )       # module api.switch
Davide Ricci's avatar
Davide Ricci committed
    module_class = getattr(module, ends.get(url,"resource")) # class api.switch.State

Davide Ricci's avatar
Davide Ricci committed
    # Assigning endpoint to api.ShutterMovement
Davide Ricci's avatar
Davide Ricci committed
    dev_api.add_resource(module_class, end , resource_class_kwargs={"dev": dev})
    api.add_namespace(dev_api) # Adding to /dome: /shutter/movement

for end in ends.sections():
    dynamic_import(end)
Davide Ricci's avatar
Davide Ricci committed
# Apart, what is not in the api.ini.

api.add_namespace(environment_api)

api.add_namespace(blocks_api)
api.add_namespace(templates_api)

Davide Ricci's avatar
Davide Ricci committed
api.add_namespace(testfulvio_api)