Commit 1b345d7e authored by David Foucher's avatar David Foucher

WIP documentation

parent 4dd44822
Pipeline #1404 passed with stage
in 1 minute and 17 seconds
......@@ -19,11 +19,22 @@ cors(app)
@app.listen("response")
async def expose_version(request, response):
"""Ajout d'un header d'information pour la version
:param request:
:param response:
"""
response.headers["Version"] = VERSION
@app.listen("error")
async def json_error_response(request, response, error):
"""Retour en json des erreurs
:param request: requête HTTP
:param response: réponse de l'API
:param error: message de l'erreur
"""
if isinstance(error.message, (str, bytes)):
error.message = {"error": error.message}
response.json = error.message
......@@ -36,6 +47,16 @@ async def json_error_response(request, response, error):
@app.route("/financement", methods=["POST"])
async def simulate_(request, response):
"""Appel api de simulation
Paramètrage de la requête:
- eligible=1 ne renvoie que les financements éligibles
- explain=1 renvoie les régles explicites qui s'appliquent pour l'élégibilité
- scenario=1 renvoie des scénarios associés aux financements
:param request: données en JSON envoyées en POST
:param response: résultats en JSON de la simulation (la liste des financements)
"""
context = request.json
financements = get_financements(tags=request.query.list("tags", []))
try:
......@@ -69,55 +90,110 @@ async def simulate_(request, response):
log_simulate(context, financements=financements)
# Renvoie les financements en mode legacy (TMF)
app.route("/legacy", methods=["POST"])(simulate_legacy)
@app.route("/schema")
async def schema(request, response):
"""Renvoi le schéma des données en JSON
:param request:
:param response:
"""
response.json = OPENAPI
@app.route("/naf")
async def naf(request, response):
"""Renvoi la liste JSON des codes NAF à la recherche
exemple: /naf?q=charpentier
:param request: q=(string|integer)
:param response: JSON [{clé:{"code":clé, "label":label}},]
"""
response.json = search_term(NAF, request.query.get("q"))
@app.route("/idcc")
async def idcc(request, response):
"""Renvoi la liste JSON des codes IDCC correspondant à la recherche
exemple: /idcc?q=charpentier
:param request: q=(string|int)
:param response: JSON [{clé:{"convention collective":item1,"OPCO":item2}},]
"""
response.json = search_term(IDCC, request.query.get("q"))
@app.route("/explore/schema")
async def explore_schema(request, response):
"""Renvoi le schéma de donnée en JSON
:param request:
:param response:
"""
response.json = SCHEMA
@app.route("/explore/rules")
async def explore_rules(request, response):
"""Renvoi la liste des règles en JSON
:param request:
:param response:
"""
response.json = RAW_RULES
@app.route("/explore/glossary")
async def explore_glossary(request, response):
"""Renvoi les entrées du glossaires en JSON
:param request:
:param response:
"""
response.json = GLOSSARY
@app.route("/explore/financements")
async def explore_financements(request, response):
"""Renvoi la liste des financements en JSON
:param request:
:param response:
"""
response.json = FINANCEMENTS
@app.route("/explore/scenarios")
async def explore_scenarios(request, response):
"""Renvoi la liste des scénarios en JSON
:param request:
:param response:
"""
response.json = SCENARIOS
@app.route("/explore/catalog")
async def explore_catalog(request, response):
"""Interroge le catalogue de formation en foncion d'un id
:param request: id du catalogue de formation
:param response: JSON des données de formation
"""
data = await get_formation_json(request.query.get("id"))
response.body = json.dumps(data, indent=2, ensure_ascii=False)
@app.route("/explore/decode-lbf-url")
async def decode_lbf_url(request, response):
"""Décode une url LBF de simulation de financement
:param request: url codé LBF de simulation de financement
:param response: JSON des paramètres décodées
"""
response.json = data_from_lbf_url(request.query.get("url"))
......@@ -29,6 +29,14 @@ CATALOG_URL = os.environ.get(
def load_schema(data, output=None, namespace=None):
"""Chargement du schéma de données, des constantes et des étiquettes
le schéma de donnée est le fichier ./config/schema.yml
:param data: données à charger
:param output: données formatées
:param namespace: clé unique d'entrée
"""
if output is None:
output = {}
if namespace is None:
......@@ -59,6 +67,7 @@ def load_schema(data, output=None, namespace=None):
def load_financements():
"""Chargement des règles de financements"""
with (ROOT / "financements.yml").open() as f:
data = yaml.safe_load(f.read())
for id_, props in data.items():
......@@ -68,6 +77,10 @@ def load_financements():
def load_naf(data):
"""Chargement du fichier des codes NAF
:param data: données aux format CSV des codes NAF
"""
# Data from https://www.insee.fr/fr/information/2406147
from ..validators import format_naf
......@@ -82,7 +95,14 @@ def load_naf(data):
return out
def load_rules(path):
def load_rules(path: Path):
"""Chargement des règles de financements
le nom du fichier est utilisé comme nom et identifiant de règle
:param path: chemin du fichier de règle
:type root: Path
"""
with path.open() as rules_file:
data = rules_file.read()
# Don't use local path in rule id, so we can call it from a Pointer
......@@ -104,13 +124,19 @@ def load_rules(path):
raise
def load_dir_rules(root):
def load_dir_rules(root: Path):
"""Chargement des dossiers de règles
:param root: objet path du chemin de base des règles
:type root: Path
"""
paths = (root).glob("**/*.rules")
for path in sorted(paths, key=lambda p: fold_name(str(p))):
yield load_rules(path)
def load_features():
"""Chargement des scénarios de tests"""
paths = (ROOT / "features").glob("*.feature")
for path in sorted(paths, key=lambda p: p.name.lower()):
raw = path.read_text()
......@@ -119,6 +145,7 @@ def load_features():
class SmartDict(dict):
"""Ajout de getter et setter pour un dictionnaire"""
def __getattr__(self, key):
return self.get(key)
......@@ -127,6 +154,7 @@ class SmartDict(dict):
class Financement(SmartDict):
"""Classe de données des financemens"""
def format(self):
"""Allow to use financement properties as vars in text values."""
for key in [
......@@ -140,6 +168,7 @@ class Financement(SmartDict):
class Organisme(SmartDict):
"""Classe de données des organismes"""
...
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment