Commit ee56ab44 authored by Yohan Boniface's avatar Yohan Boniface

Use a controled context when trying to resolve pointer labels

parent 3923ebd5
......@@ -240,6 +240,24 @@ Si le prénom de l'organisme est «BLAH»
Rule.load(data.splitlines(), name='foo')
def test_should_raise_with_a_wrong_label_in_condition():
data = """
Si la région du bénéficiaire est «BLAH»
Alors le plafond horaire applicable vaut 150
"""
with pytest.raises(WrongPointerError):
Rule.load(data.splitlines(), name='foo')
def test_can_use_raw_value_instead_of_label():
data = """
# Guadeloupe
Si la région du bénéficiaire est «01»
Alors le plafond horaire applicable vaut 150
"""
Rule.load(data.splitlines(), name='foo')
def test_should_raise_with_a_wrong_pointer_in_action():
data = """
Si l'organisme paritaire est «BLAH»
......
......@@ -12,14 +12,16 @@ from trefle.api import app
from trefle.debugging import data_from_lbf_url, green, make_scenario, red
from trefle.exceptions import DataError
from trefle.helpers import flatten
from trefle.rules import parse_value, SCHEMA
from trefle.rules import SCHEMA, Pointer
def parse_args(args):
data = {}
for arg in args:
key, value = arg.split('=')
data[key] = parse_value(value, default=value)
pointer = Pointer(value)
pointer.resolve_labels(key)
data[key] = pointer.get({})
return data
......
......@@ -39,12 +39,12 @@ def load_schema(data, output=None, namespace=None):
CONSTANTS[name] = more['value']
if 'label' in more:
LABELS[more['label']] = name
if 'enum' in more:
for key, label in more['enum'].items():
LABELS[label] = key
if more['type'] == 'array' and 'enum' in more['items']:
for key, label in more['items']['enum'].items():
LABELS[label] = key
enum = more.get('enum') or more.get('items', {}).get('enum')
if enum:
more['enum'] = enum # Always store it at the schema root.
more['labels'] = {}
for key, label in enum.items():
more['labels'][label] = key
if 'pattern' in more:
more['pattern'] = re.compile(more['pattern'])
else:
......
......@@ -147,7 +147,7 @@ Scénario: période de professionnalisation + CPF
Et la région de l'établissement du bénéficiaire vaut «Provence-Alpes-Côte d'Azur»
Et ce n'est pas une formation éligible COPANEF
Et c'est une formation éligible région «Provence-Alpes-Côte d'Azur»
Et la régions éligibles COPAREF vaut [93]
Et la régions éligibles COPAREF vaut [«Provence-Alpes-Côte d'Azur»]
Et la liste des codes FORMACODE de la formation vaut [44028]
Et la liste des domaines FORMACODE de la formation vaut [440]
Et le code CERTIFINFO de la formation vaut 30958
......@@ -188,7 +188,7 @@ Scénario: pas de financement pour une formation réservée Pôle Emploi
Et les codes financeur de la formation valent [«Pôle emploi»]
Et ce n'est pas une formation éligible COPANEF
Et c'est une formation éligible région «Provence-Alpes-Côte d'Azur»
Et la régions éligibles COPAREF vaut [93]
Et la régions éligibles COPAREF vaut [«Provence-Alpes-Côte d'Azur»]
Et la liste des codes FORMACODE de la formation vaut [44028]
Et la liste des domaines FORMACODE de la formation vaut [440]
Et le code CERTIFINFO de la formation vaut 30958
......
......@@ -390,7 +390,6 @@ Scénario: Formation de 12 mois
Et l'IDCC de l'établissement du bénéficiaire vaut «1412»
Et la région de l'établissement du bénéficiaire vaut «Normandie»
Et ce n'est pas une formation éligible COPANEF
Et la régions éligibles COPAREF vaut [25]
Et la liste des codes FORMACODE de la formation vaut [31715,31715,31795]
Et le niveau de sortie de la formation vaut «aucun»
Et la durée en heures de la formation vaut 1000
......@@ -447,7 +446,6 @@ Scénario: Avec un code financeur collectif
Et l'IDCC de l'établissement du bénéficiaire vaut «1412»
Et la région de l'établissement du bénéficiaire vaut «Normandie»
Et ce n'est pas une formation éligible COPANEF
Et la régions éligibles COPAREF vaut [25]
Et la liste des codes FORMACODE de la formation vaut [31715,31715,31795]
Et le niveau de sortie de la formation vaut «aucun»
Et la durée en heures de la formation vaut 1000
......
......@@ -15,7 +15,7 @@ Scénario: Formation CPF
Et la région de l'établissement du bénéficiaire vaut «Centre-Val de Loire»
Et c'est une formation éligible COPANEF
Et c'est une formation éligible région «Pays de la Loire»
Et la régions éligibles COPAREF vaut [52]
Et la régions éligibles COPAREF vaut [«Pays de la Loire»]
Et la liste des codes FORMACODE de la formation vaut [42752]
Et la liste des domaines FORMACODE de la formation vaut [427]
Et le code CERTIFINFO de la formation vaut 83257
......@@ -52,7 +52,7 @@ Scénario: Formation CPF réservée
Et les codes financeur de la formation valent [4,5,10,16,17]
Et c'est une formation éligible COPANEF
Et c'est une formation éligible région «Pays de la Loire»
Et la régions éligibles COPAREF vaut [52]
Et la régions éligibles COPAREF vaut [«Pays de la Loire»]
Et la liste des codes FORMACODE de la formation vaut [42752]
Et la liste des domaines FORMACODE de la formation vaut [427]
Et le code CERTIFINFO de la formation vaut 83257
......
......@@ -75,7 +75,6 @@ Scénario: Financement POEC
Et la département de la formation vaut «Manche»
Et les codes financeur de la formation valent [16]
Et c'est une formation éligible COPANEF
Et la régions éligibles COPAREF vaut [25]
Et la liste des codes ROME de la formation vaut [H3404]
Et la liste des codes FORMACODE de la formation vaut [22472,23042,23053]
Et la liste des domaines FORMACODE de la formation vaut [224,230]
......
......@@ -17,8 +17,9 @@ def setup(context):
@given(r"(?:les? |la |l')(?P<label>.+) (?:est|vaut|valent) (?P<value>.+)")
def given_set_value(context, label, value):
key = LABELS[label]
value = Pointer(value).get({})
context.data[key] = value
pointer = Pointer(value)
pointer.resolve_labels(key)
context.data[key] = pointer.get({})
@given(r"c'est une formation éligible région «(?P<label>.+)»")
......
# FIXME CIF vs cdi (clash with Pointer loading enum label)
CPF sur son temps de travail:
tags: [CPF, sur son temps de travail]
racine: organisme paritaire.rules
......@@ -9,16 +8,16 @@ CPF demandeur d'emploi:
tags: [CPF, DE]
racine: CPF DE.rules
CIF CDI sur son temps de travail:
tags: [CIF, cdi, sur son temps de travail]
tags: [CIF, CDI, sur son temps de travail]
racine: organisme paritaire.rules
CIF CDI hors temps de travail:
tags: [CIF, cdi, hors temps de travail]
tags: [CIF, CDI, hors temps de travail]
racine: organisme paritaire.rules
CIF CDD sur son temps de travail:
tags: [CIF, cdd, sur son temps de travail]
tags: [CIF, CDD, sur son temps de travail]
racine: organisme paritaire.rules
CIF CDD hors temps de travail:
tags: [CIF, cdd, hors temps de travail, DE]
tags: [CIF, CDD, hors temps de travail, DE]
racine: organisme paritaire.rules
CIF intérim sur son temps de travail:
tags: [CIF, interim, sur son temps de travail]
......
Si c'est une formation ouverte aux bénéficiaires individuels
Si c'est un bénéficiaire de droit privé
Ou le type de contrat du bénéficiaire vaut «CDD»
Ou le type de contrat du bénéficiaire vaut «interim»
Ou le type de contrat du bénéficiaire vaut «intérimaire»
Alors définir les organismes paritaires
......
......@@ -8,19 +8,19 @@ Si le financement est de type «FAJ»
Alors appliquer les règles «FAJ»
Si le financement est de type «POEC»
Alors appliquer les règles «POEC.rules»
Alors appliquer les règles «POEC»