def convert( cls, tree_element: model.BlockAmendment) -> Iterable[BlockAmendment]: assert isinstance(tree_element.act_reference, model.ActReference) act_id = ActReferenceConversionHelper.get_act_id_from_parse_result( tree_element.act_reference) amended_reference = ReferenceConversionHelper.convert_potential_reference( act_id, tree_element.amended_reference) inserted_reference = ReferenceConversionHelper.convert_potential_reference( act_id, tree_element.inserted_reference) if amended_reference is not None: if inserted_reference: yield cls.convert_amendment_and_insertion( amended_reference, inserted_reference) else: yield BlockAmendment(position=amended_reference) elif inserted_reference is not None: yield BlockAmendment(position=inserted_reference) else: # One or both references were misparsed probably, or grammar is wrong # Don't fail horribly in this case, as the rest of the text is probably # okay, and we can salvage the situation. # TODO: Maybe we really should fail here. pass
def convert( cls, tree_element: model.BlockAmendment) -> Iterable[BlockAmendment]: assert isinstance(tree_element.act_reference, model.ActReference) act_id = ActReferenceConversionHelper.get_act_id_from_parse_result( tree_element.act_reference) if tree_element.amended_reference is not None: if tree_element.inserted_reference is not None: # TODO. Not even part of the grammar currently either. raise ValueError( "Simultaneous insertion and amendments with Structural References not yet supported" ) amended_reference = ReferenceConversionHelper.convert_structural_reference( act_id, tree_element.amended_reference) yield BlockAmendment(position=amended_reference, ) else: assert tree_element.inserted_reference is not None inserted_reference = ReferenceConversionHelper.convert_structural_reference( act_id, tree_element.inserted_reference) yield BlockAmendment(position=inserted_reference, )
def convert_amendment_and_insertion( cls, amended_reference: Reference, inserted_reference: Reference) -> BlockAmendment: # Act has to be cut off first, because otherwise relative_to does not do anything. inserted_reference = attr.evolve( inserted_reference, act=None).relative_to(amended_reference) if amended_reference.contains(inserted_reference.first_in_range()): # The weird case which amends 1-2, and inserts 1a in between union_reference = amended_reference else: union_reference = Reference.make_range( amended_reference.first_in_range(), inserted_reference.last_in_range()) return BlockAmendment(position=union_reference, )
def convert_one(cls, structural_reference: StructuralReference, reference: Reference) -> BlockAmendment: if reference.article is not None: article_id = reference.article if isinstance(article_id, tuple): # Don't bother with ranges for now. MAYBE TODO article_id = article_id[0] assert article_id is not None position = StructuralReference( act=reference.act, special=SubtitleArticleCombo( SubtitleArticleComboType.BEFORE_WITH_ARTICLE, article_id)) else: position = structural_reference return BlockAmendment(position=position)
def test_obj_to_dict_can_handle_specials() -> None: # This also used to test for Type fields, but we no longer have those. # But the dict2object unittests do, so it's properly tested. # This test will remain as a real-world test though. test_data = BlockAmendment(position=StructuralReference( "Btk.", special=SubtitleArticleCombo( SubtitleArticleComboType.BEFORE_WITH_ARTICLE, "123")), ) the_dict = dict2object.to_dict(test_data, BlockAmendment) # This should not throw the_json = json.dumps(the_dict) reconstructed_dict = json.loads(the_json) reconstructed_data = dict2object.to_object(reconstructed_dict, BlockAmendment) assert reconstructed_data == test_data
import pytest from hun_law.parsers.grammatical_analyzer import GrammaticalAnalyzer from hun_law.structure import \ BlockAmendment, \ StructuralReference, SubtitleArticleCombo, SubtitleArticleComboType \ from tests.cheap.utils import ref BLOCK_AMENDMENT_CASES: Tuple[Tuple[str, BlockAmendment], ...] = ( ( "A hegyközségekről szóló 2012. évi CCXIX. törvény (a továbbiakban: Hktv.) 28. §-a helyébe a következő rendelkezés lép:", BlockAmendment( position=ref("2012. évi CCXIX. törvény", '28'), ) ), ( "A szabálysértésekről és egyebekről szóló 2012. évi I. törvény (a továbbiakban: Szabs. tv.) 29. § (2) bekezdés e) pontja helyébe a következő rendelkezés lép:", BlockAmendment( position=ref("2012. évi I. törvény", "29", "2", "e"), ) ), ( "A Tv. 1. § 3. pontja helyébe a következő rendelkezés lép:", BlockAmendment( position=ref('Tv.', "1", None, "3"), ) ), (
def test_semantic_reparse_abbrevs() -> None: TEST_ACT = Act( identifier="2050. évi XD. törvény", publication_date=Date(2050, 3, 4), subject="A nyelvtani tesztelésről", preamble='', children=( Article( identifier="1", children=(Paragraph( text= "Fontos lesz később a tesztelés X tulajdonságiról szóló 2040. évi DX. törvény (a továbbiakban Xtv.) rövidítésének feloldása.", ), )), Article( identifier="2", children=( Paragraph( identifier="1", text= "Bekeverünk a tesztelés Y tulajdonságiról szóló 2041. évi X. törvény (a továbbiakban Ytv.) dolgaival", ), Paragraph( identifier="2", text= "Itt megemlítendő az Ytv. 10. §-a és a tesztelés Z tulajdonságiról szóló 2041. évi XXX. törvény (a továbbiakban Ztv.) 1. §-a közötti különbség", ), Paragraph( identifier="3", intro="Mert később használatban van", children=( AlphabeticPoint(identifier="a", text="az Xtv. 1. § c) pontja, és"), AlphabeticPoint(identifier="b", text="az Ytv. 2. §-a."), ), ), ), ), Article( identifier="3", children=(Paragraph( text= "Mégegyszer megemlítendő, hogy fontos az Xtv. 1. §-a, Ytv. 1. §-a, és Ztv. 1337. §-a.", ), )), Article( identifier="4", children=(Paragraph( intro= "Az Ytv. 12. § (8) bekezdése helyébe a következő rendelkezés lép:", children=(BlockAmendmentContainer(children=(Paragraph( identifier='8', text="Beillesztett referencia: 12. §, vajon lesz baj?" ), ), ), ), ), ), ), ), ) with_semantics_1 = ActSemanticsParser.add_semantics_to_act(TEST_ACT) assert with_semantics_1.is_semantic_parsed assert with_semantics_1.article('1').paragraph().act_id_abbreviations == ( ActIdAbbreviation('Xtv.', '2040. évi DX. törvény'), ) assert with_semantics_1.article('2').paragraph( '1').act_id_abbreviations == (ActIdAbbreviation( 'Ytv.', '2041. évi X. törvény'), ) assert with_semantics_1.article('2').paragraph( '2').act_id_abbreviations == (ActIdAbbreviation( 'Ztv.', '2041. évi XXX. törvény'), ) assert with_semantics_1.article('3').paragraph().outgoing_references == ( OutgoingReference(start_pos=40, end_pos=44, reference=Reference(act='2040. évi DX. törvény')), OutgoingReference(start_pos=45, end_pos=51, reference=Reference(act='2040. évi DX. törvény', article='1')), OutgoingReference(start_pos=53, end_pos=57, reference=Reference(act='2041. évi X. törvény')), OutgoingReference(start_pos=58, end_pos=64, reference=Reference(act='2041. évi X. törvény', article='1')), OutgoingReference(start_pos=69, end_pos=73, reference=Reference(act='2041. évi XXX. törvény')), OutgoingReference(start_pos=74, end_pos=83, reference=Reference(act='2041. évi XXX. törvény', article='1337')), ) with_semantics_2 = ActSemanticsParser.add_semantics_to_act( with_semantics_1) # TODO: with_semantics_2 is with_semantics_1 assert with_semantics_2 == with_semantics_1 modified_paragraph = attr.evolve( with_semantics_1.article("2").paragraph("1"), text= "Bekeverünk a tesztelés Y új tulajdonságiról szóló 2057. évi X. törvény (a továbbiakban Ytv.) dolgaival", semantic_data=None, outgoing_references=None, act_id_abbreviations=None, ) modified_article = attr.evolve( with_semantics_1.article("2"), children=(modified_paragraph, ) + with_semantics_1.article("2").children[1:], ) modified_act = attr.evolve( with_semantics_1, children=(with_semantics_1.children[0], modified_article, with_semantics_1.children[2], with_semantics_1.children[3]), ) assert not modified_act.is_semantic_parsed modified_with_semantics = ActSemanticsParser.add_semantics_to_act( modified_act) assert modified_with_semantics.article('2').paragraph( '1').act_id_abbreviations == (ActIdAbbreviation( 'Ytv.', '2057. évi X. törvény'), ) assert modified_with_semantics.article('3').paragraph( ).outgoing_references == ( OutgoingReference(start_pos=40, end_pos=44, reference=Reference(act='2040. évi DX. törvény')), OutgoingReference(start_pos=45, end_pos=51, reference=Reference(act='2040. évi DX. törvény', article='1')), OutgoingReference(start_pos=53, end_pos=57, reference=Reference(act='2057. évi X. törvény')), OutgoingReference(start_pos=58, end_pos=64, reference=Reference(act='2057. évi X. törvény', article='1')), OutgoingReference(start_pos=69, end_pos=73, reference=Reference(act='2041. évi XXX. törvény')), OutgoingReference(start_pos=74, end_pos=83, reference=Reference(act='2041. évi XXX. törvény', article='1337')), ) assert modified_with_semantics.article('4').paragraph().semantic_data == ( BlockAmendment(position=Reference(act='2057. évi X. törvény', article='12', paragraph='8'), ), ) assert with_semantics_1.article('1') is modified_with_semantics.article( '1') # Note that because of the abbreviation change, everything else may be reparsed, # so no asserts for e.g. article('3') # No need to reparse BlockAmendments though a4_children = with_semantics_1.article('4').paragraph().children modified_a4_children = modified_with_semantics.article( '4').paragraph().children assert a4_children is not None assert modified_a4_children is not None assert a4_children[0] is modified_a4_children[0]
def test_semantic_reparse_simple() -> None: TEST_ACT = Act( identifier="2050. évi XD. törvény", publication_date=Date(2050, 3, 4), subject="A nyelvtani tesztelésről", preamble='', children=( Article( identifier="1", children=(Paragraph( text= "Fontos lesz később a tesztelés X tulajdonságiról szóló 2040. évi DX. törvény (a továbbiakban Xtv.) rövidítésének feloldása.", ), )), Article( identifier="2", children=( Paragraph( identifier="1", text= "Bekeverünk a tesztelés Y tulajdonságiról szóló 2041. évi X. törvény dolgaival.", ), Paragraph( identifier="2", text= "Itt megemlítendő a 1. § és a tesztelés Z tulajdonságiról szóló 2041. évi XXX. törvény (a továbbiakban Ztv.) 1. §-a közötti különbség", ), Paragraph( identifier="3", intro="Az Xtv.", wrap_up="szöveg lép.", children=( AlphabeticPoint( identifier="a", text= "12. § (7) bekezdésében a „fontatlan” szövegrész helyébe a „nem fontos”,", ), AlphabeticPoint( identifier="b", text= "11. §-ben a „nemigazán” szövegrész helyébe a „nem”", ), ), ), ), ), Article( identifier="3", children=(Paragraph( text= "Ez a törvény a kihirdetését követő napon lép hatályba."), )), Article( identifier="4", children=(Paragraph( intro= "A Ztv. 12. § (8) bekezdése helyébe a következő rendelkezés lép:", children=(BlockAmendmentContainer(children=(Paragraph( identifier='8', text="Beillesztett referencia: 11. §, vajon lesz baj?" ), ), ), ), ), ), ), ), ) with_semantics_1 = ActSemanticsParser.add_semantics_to_act(TEST_ACT) assert with_semantics_1.is_semantic_parsed assert with_semantics_1.article('1').paragraph().act_id_abbreviations == ( ActIdAbbreviation('Xtv.', '2040. évi DX. törvény'), ) assert with_semantics_1.article('2').paragraph( '2').act_id_abbreviations == (ActIdAbbreviation( 'Ztv.', '2041. évi XXX. törvény'), ) assert with_semantics_1.article('1').paragraph().outgoing_references == ( OutgoingReference(start_pos=55, end_pos=76, reference=Reference(act='2040. évi DX. törvény')), ) assert with_semantics_1.article('2').paragraph( '1').outgoing_references == (OutgoingReference( start_pos=47, end_pos=67, reference=Reference(act='2041. évi X. törvény')), ) assert with_semantics_1.article('2').paragraph('3').point( 'a').semantic_data == (TextAmendment(position=Reference( act='2040. évi DX. törvény', article='12', paragraph='7'), original_text='fontatlan', replacement_text='nem fontos'), ) assert with_semantics_1.article('3').paragraph().semantic_data == ( EnforcementDate(position=None, date=DaysAfterPublication(days=1)), ) assert with_semantics_1.article('4').paragraph().semantic_data == ( BlockAmendment(position=Reference(act='2041. évi XXX. törvény', article='12', paragraph='8'), ), ) a4_children = with_semantics_1.article('4').paragraph().children assert a4_children is not None the_block_amendment = a4_children[0] assert isinstance(the_block_amendment, BlockAmendmentContainer) assert the_block_amendment.semantic_data is None assert the_block_amendment.outgoing_references is None assert the_block_amendment.act_id_abbreviations is None with_semantics_2 = ActSemanticsParser.add_semantics_to_act( with_semantics_1) assert with_semantics_2 is with_semantics_1 modified_paragraph = attr.evolve( with_semantics_1.article("2").paragraph("1"), text="Az 1. § és 3. § egészen fontos.", semantic_data=None, outgoing_references=None, act_id_abbreviations=None, ) modified_article = attr.evolve( with_semantics_1.article("2"), children=(modified_paragraph, ) + with_semantics_1.article("2").children[1:], ) modified_act = attr.evolve( with_semantics_1, children=(with_semantics_1.children[0], modified_article, with_semantics_1.children[2], with_semantics_1.children[3]), ) assert modified_act.article('1').is_semantic_parsed assert not modified_act.article('2').is_semantic_parsed assert modified_act.article('3').is_semantic_parsed assert modified_act.article('4').is_semantic_parsed assert not modified_act.is_semantic_parsed modified_with_semantics = ActSemanticsParser.add_semantics_to_act( modified_act) assert modified_with_semantics.is_semantic_parsed assert modified_with_semantics.article('2').paragraph( '1').outgoing_references == ( OutgoingReference(start_pos=3, end_pos=7, reference=Reference(act=None, article='1')), OutgoingReference(start_pos=11, end_pos=15, reference=Reference(act=None, article='3')), ) # Check if nothing else was touched but the modified part. assert with_semantics_1.article('1') is modified_with_semantics.article( '1') assert with_semantics_1.article('2').paragraph( '2') is modified_with_semantics.article('2').paragraph('2') assert with_semantics_1.article('2').paragraph( '3') is modified_with_semantics.article('2').paragraph('3') assert with_semantics_1.article('3') is modified_with_semantics.article( '3') assert with_semantics_1.article('4') is modified_with_semantics.article( '4')
1. az illetékekről szóló 1990. évi XCIII. törvény 17. § (1) bekezdés c) pontjában a „vagy egészségügyi hozzájárulás” szövegrész; 2. a számvitelről szóló 2000. évi C. törvény a) 79. § (4) bekezdésében az „az egészségügyi hozzájárulás,” szövegrész; b) 103. § (2) bekezdés c) pontjában az „egészségügyi hozzájárulás,” szövegrész; 3. a különösen sok dologról szóló 2004. évi CXXIII. törvény a) 8/A. §–8/B. §-a, b) 16/A. §–16/B. §-a, c) 17/A. § (1) és (3) bekezdése; 4. a Katv. 2. § 21. pontja; """, ( ( ref(None, "40", "1"), (ref("2012. évi CXLVII. törvény"), ref("2012. évi CXLVII. törvény", "2", None, ("19", "20")), BlockAmendment(position=ref('2012. évi CXLVII. törvény', '2', None, ('19', '20')), )), ), ( ref(None, "41", None, "1"), ( ref("1990. évi XCIII. törvény"), ref("1990. évi XCIII. törvény", "17", "1", "c"), Repeal(position=ref("1990. évi XCIII. törvény", "17", "1", "c"), text="vagy egészségügyi hozzájárulás"), ), ), ( ref(None, "41", None, "2"), (ref("2000. évi C. törvény"), ), ),