예제 #1
0
def test_arrete_ministeriel():
    am = ArreteMinisteriel(
        _str('Arrete du 01/01/10'),
        [_node_section()],
        [_enriched_string_links()],
        date(2010, 1, 1),
        'aida',
        'legifrance',
        classements=[Classement('1510', Regime.A, 'al')],
        classements_with_alineas=[ClassementWithAlineas('1510', Regime.A, ['al', 'albis'])],
        id='JORFTEXTid',
    )
    dict_ = am.to_dict()
    new_dict = ArreteMinisteriel.from_dict(json.loads(json.dumps(dict_))).to_dict()

    assert new_dict == dict_
예제 #2
0
def _build_am() -> ArreteMinisteriel:
    subsection1 = StructuredText(EnrichedString('A'), [], [], None)
    subsection2 = StructuredText(EnrichedString('A'), [], [], None)
    sections = [
        StructuredText(EnrichedString('Art. 1'), [], [subsection1], None),
        StructuredText(EnrichedString('Art. 2'), [], [subsection2], None),
        StructuredText(EnrichedString('Conditions d\'application'), [], [],
                       None),
        StructuredText(EnrichedString('Art. 3'), [], [], None),
    ]
    return ArreteMinisteriel(EnrichedString('arrete du 10/10/10'),
                             sections, [],
                             None,
                             id='FAKE_ID')
예제 #3
0
def add_simple_topics(am: ArreteMinisteriel) -> ArreteMinisteriel:
    """Add simple topics to AM sections.

    We first look for the depth in the am structure at which at least 3 titles match the ontology.
    Then we detect topics for all titles at this depth.

    Args:
        am (ArreteMinisteriel): arrete ministeriel to decorate.

    Returns:
        ArreteMinisteriel: arrete ministeriel with simple topics where detected.
    """
    target_depth = _detect_first_matching_depth(am)
    if target_depth is None or target_depth == 0:
        return am
    am = copy(am)
    am.sections = [
        _detect_and_add_topics(sec, target_depth, 1) for sec in am.sections
    ]
    return am
def test_add_topics():
    sub_section_1 = StructuredText(EnrichedString('Section 1.1'), [], [], None)
    section_1 = StructuredText(EnrichedString('Section 1'), [],
                               [sub_section_1], None)
    section_2 = StructuredText(EnrichedString('Section 2'), [], [], None)
    am = ArreteMinisteriel(EnrichedString('arrete du 10/10/10'),
                           [section_1, section_2], [],
                           None,
                           id='FAKE_ID')

    am_with_topics = add_topics(
        am, {
            (0, ): TopicName.INCENDIE,
            (0, 0): TopicName.INCENDIE,
            (1, ): TopicName.BRUIT_VIBRATIONS
        })
    sections = am_with_topics.sections
    assert sections[0].annotations.topic == TopicName.INCENDIE  # type: ignore
    assert sections[0].sections[
        0].annotations.topic == TopicName.INCENDIE  # type: ignore
    assert sections[
        1].annotations.topic == TopicName.BRUIT_VIBRATIONS  # type: ignore
예제 #5
0
def test_add_references():
    sub_sub_sections = [
        StructuredText(estr('1.1. azeaze'), [], [], None, None),
        StructuredText(estr('1. 2. azeaze'), [], [], None, None),
    ]
    sub_sections = [
        StructuredText(estr('1. azeaze'), [], sub_sub_sections, None, None)
    ]
    sections = [
        StructuredText(estr('Article 1. efzefz'), [], sub_sections, None),
        StructuredText(estr('2. zefez'), [], [], None),
        StructuredText(estr('A. zefze'), [], [], None),
        StructuredText(estr('a) zefze'), [], [], None),
        StructuredText(estr('V. zefze'), [], [], None),
        StructuredText(estr('ANNEXE I zefze'), [], [], None),
        StructuredText(estr('Article 18.1'), [], [], None),
        StructuredText(estr('Article 1'), [], [], None),
    ]
    am = ArreteMinisteriel(estr('Arrete du 10/10/10'),
                           sections, [],
                           None,
                           id='FAKE_ID')
    am_with_references = add_references(am)
    secs = am_with_references.sections
    assert ensure_not_none(secs[0].reference).nb == 'Article 1.'
    assert ensure_not_none(
        secs[0].sections[0].reference).nb == 'Article 1. > 1.'
    assert ensure_not_none(
        secs[0].sections[0].sections[0].reference).nb == 'Article 1. > 1.1.'
    assert ensure_not_none(
        secs[0].sections[0].sections[1].reference).nb == 'Article 1. > 1.2.'
    assert ensure_not_none(secs[1].reference).nb == '2.'
    assert ensure_not_none(secs[2].reference).nb == 'A.'
    assert ensure_not_none(secs[3].reference).nb == 'a)'
    assert ensure_not_none(secs[4].reference).nb == 'V.'
    assert ensure_not_none(secs[5].reference).nb == 'Annexe I'
    assert ensure_not_none(secs[6].reference).nb == 'Article 18.1'
    assert ensure_not_none(secs[7].reference).nb == 'Article 1'
예제 #6
0
 def upsert_am(self, am_id: str, am: ArreteMinisteriel) -> None:
     query = (
         'INSERT INTO structured_am(am_id, data) VALUES(%s, %s) ON CONFLICT (am_id)'
         ' DO UPDATE SET data = %s WHERE structured_am.am_id =%s;')
     data = json.dumps(am.to_dict())
     self._exectute_update_query(query, (am_id, data, data, am_id))
예제 #7
0
def _load_am_str(str_: str) -> ArreteMinisteriel:
    return ArreteMinisteriel.from_dict(json.loads(str_))
예제 #8
0
def test_add_references_2():
    am = ArreteMinisteriel.from_dict(
        json.load(open('test_data/AM/minified_texts/DEVP1235896A.json')))
    expected = [
        ('Article 1', 'Article 1'),
        ('Article 2', 'Article 2'),
        ('Chapitre Ier : Dispositions générales', ''),
        ('Article 3', 'Article 3'),
        ('Article 4', 'Article 4'),
        ('Article 5', 'Article 5'),
        ('Article 6', 'Article 6'),
        ('Article 7', 'Article 7'),
        ('Chapitre II : Prévention des accidents et des pollutions', ''),
        ('Section I : Généralités', ''),
        ('Article 8', 'Article 8'),
        ('Article 9', 'Article 9'),
        ('Article 10', 'Article 10'),
        ('Article 11', 'Article 11'),
        ('Article 12', 'Article 12'),
        ('Section II : Tuyauteries de fluides', ''),
        ('Article 13', 'Article 13'),
        ('Section III : Comportement au feu des locaux', ''),
        ('Article 14', 'Article 14'),
        ('Section IV : Dispositions de sécurité', ''),
        ('Article 15', 'Article 15'),
        ('Article 16', 'Article 16'),
        ('Article 17', 'Article 17'),
        ('Section V : Exploitation', ''),
        ('Article 18', 'Article 18'),
        ('Article 19', 'Article 19'),
        ('Article 20', 'Article 20'),
        ('Section VI : Pollutions accidentelles', ''),
        ('Article 21', 'Article 21'),
        ("I. ― Tout stockage d'un liquide susceptible", 'Article 21 > I.'),
        ("II. ― La capacité de rétention est étanche ", 'Article 21 > II.'),
        ('III. ― Rétention et confinement.', 'Article 21 > III.'),
        ("IV. ― Isolement des réseaux d'eau.", 'Article 21 > IV.'),
        ("Chapitre III : Emissions dans l'eau", ''),
        ('Section I : Principes généraux', ''),
        ('Article 22', 'Article 22'),
        ("Section II : Prélèvements et consommation d'eau", ''),
        ('Article 23', 'Article 23'),
        ('Article 24', 'Article 24'),
        ('Article 25', 'Article 25'),
        ('Section III : Collecte et rejet des effluents liquides', ''),
        ('Article 26', 'Article 26'),
        ('Article 27', 'Article 27'),
        ('Article 28', 'Article 28'),
        ('Article 29', 'Article 29'),
        ('Article 30', 'Article 30'),
        ('Section IV : Valeurs limites de rejet', ''),
        ('Article 31', 'Article 31'),
        ('Article 32', 'Article 32'),
        ('Article 33', 'Article 33'),
        ('Article 34', 'Article 34'),
        ('Section V : Traitement des effluents', ''),
        ('Article 35', 'Article 35'),
        ('Article 36', 'Article 36'),
        ("Chapitre IV : Emissions dans l'air", ''),
        ('Section I : Généralités', ''),
        ('Article 37', 'Article 37'),
        ("Section II : Rejets à l'atmosphère", ''),
        ('Article 38', 'Article 38'),
        ('Article 39', 'Article 39'),
        ("Section III : Valeurs limites d'émission", ''),
        ('Article 40', 'Article 40'),
        ('Article 41', 'Article 41'),
        ("a) Capacité d'aspiration supérieure à 7 000 m³/h.",
         'Article 41 > a)'),
        ("b) Capacité d'aspiration inférieure ou égale à 7 000 m3/h.",
         'Article 41 > b)'),
        ('Article 42', 'Article 42'),
        ('Chapitre V : Emissions dans les sols', ''),
        ('Article 43', 'Article 43'),
        ('Chapitre VI : Bruit et vibrations', ''),
        ('Article 44', 'Article 44'),
        ('Article 45', 'Article 45'),
        ('Article 46', 'Article 46'),
        ('Article 47', 'Article 47'),
        ('Article 48', 'Article 48'),
        ('Article 49', 'Article 49'),
        ('Article 50', 'Article 50'),
        ('Article 51', 'Article 51'),
        ('1. Eléments de base.', 'Article 51 > 1.'),
        ('2. Appareillage de mesure.', 'Article 51 > 2.'),
        ('3. Précautions opératoires.', 'Article 51 > 3.'),
        ('Article 52', 'Article 52'),
        ('1. Pour les établissements existants :', 'Article 52 > 1.'),
        ('2. Pour les nouvelles installations :', 'Article 52 > 2.'),
        ("3. Pour les installations fonctionnant sur une ", 'Article 52 > 3.'),
        ('Chapitre VII : Déchets', ''),
        ('Article 53', 'Article 53'),
        ('Article 54', 'Article 54'),
        ('Article 55', 'Article 55'),
        ('Chapitre VIII : Surveillance des émissions', ''),
        ('Section I : Généralités', ''),
        ('Article 56', 'Article 56'),
        ("Section II : Emissions dans l'air", ''),
        ('Article 57', 'Article 57'),
        ("Section III : Emissions dans l'eau", ''),
        ('Article 58', 'Article 58'),
        ('Section VI : Impacts sur les eaux souterraines', ''),
        ('Article 59', 'Article 59'),
        ('Chapitre IX : Exécution', ''),
        ('Article 60', 'Article 60'),
        ('Annexes', 'Annexe'),
        ('Article Annexe I', 'Annexe I'),
        ('1. Définitions.', 'Annexe I > 1.'),
        ('1.1. Niveau de pression acoustique continu équivalent pondéré A " court ", LAeq, t.',
         'Annexe I > 1.1.'),
        ('1.2. Niveau acoustique fractile, LAN, t.', 'Annexe I > 1.2.'),
        ('1.3. Intervalle de mesurage.', 'Annexe I > 1.3.'),
        ("1.4. Intervalle d'observation.", 'Annexe I > 1.4.'),
        ('1.5. Intervalle de référence.', 'Annexe I > 1.5.'),
        ('1.6. Bruit ambiant.', 'Annexe I > 1.6.'),
        ('1.7. Bruit particulier (1).', 'Annexe I > 1.7.'),
        ('1.8. Bruit résiduel.', 'Annexe I > 1.8.'),
        ('1.9. Tonalité marquée.', 'Annexe I > 1.9.'),
        ("2. Méthode d'expertise (point 6 de la norme).", 'Annexe I > 2.'),
        ('2.1. Appareillage de mesure (point 6.1 de la norme).',
         'Annexe I > 2.1.'),
        ('2.2. Conditions de mesurage (point 6.2 de la norme).',
         'Annexe I > 2.2.'),
        ('2.3. Gamme de fréquence (point 6.3 de la norme).',
         'Annexe I > 2.3.'),
        ('2.4. Conditions météorologiques (point 6.4 de la norme).',
         'Annexe I > 2.4.'),
        ('2.5. Indicateurs (point 6.5 de la norme).', 'Annexe I > 2.5.'),
        ('a) Contrôle des niveaux de bruit admissibles en limites de propriété.',
         'Annexe I > 2.5. a)'),
        ("b) Contrôle de l'émergence.", 'Annexe I > 2.5. b)'),
        ("2.6. Acquisitions des données, choix ", 'Annexe I > 2.6.'),
        ('3. Méthode de contrôle (point 5 de la norme).', 'Annexe I > 3.'),
        ('4. Rapport de mesurage (point 7 de la norme).', 'Annexe I > 4.'),
        ('Article Annexe II', 'Annexe II'),
    ]
    res = extract_titles_and_reference_pairs(add_references(am))
    for exp, computed in zip(expected, res):
        assert exp[0][:15] == computed[0][:15]
        assert exp[1][:15] == computed[1][:15]