diff --git a/src/catleg/skeleton.py b/src/catleg/skeleton.py index 88a893f..4717e17 100644 --- a/src/catleg/skeleton.py +++ b/src/catleg/skeleton.py @@ -28,8 +28,7 @@ async def markdown_skeleton(textid: str, sectionid: str) -> str: # If it is not a section, then it is an article parts.append(f"{'#' * (level + 1)} Article {node['num']} | {node['id']}") article = await back.article(node["id"]) - formatted = mdformat.text(article.to_markdown(), options={"wrap": 80}) - parts.append(formatted) + parts.append(_formatted_atricle(article)) else: parts.append(f"{'#' * level} {node['title']}") @@ -43,3 +42,7 @@ def _preorder(node, level=1): yield article, level for section in node["sections"]: yield from _preorder(section, level + 1) + + +def _formatted_atricle(article): + return mdformat.text(article.to_markdown(), options={"wrap": 80, "number": True}) diff --git a/tests/LEGIARTI000044983201.json b/tests/LEGIARTI000044983201.json new file mode 100644 index 0000000..a451f62 --- /dev/null +++ b/tests/LEGIARTI000044983201.json @@ -0,0 +1,272 @@ +{ + "executionTime": 0, + "dereferenced": false, + "article": { + "id": "LEGIARTI000044983201", + "idTexte": null, + "type": "AUTONOME", + "texte": "1. Le bénéfice ou revenu imposable est constitué par l'excédent du produit brut, y compris la valeur des profits et avantages en nature, sur les dépenses effectuées en vue de l'acquisition et de la conservation du revenu. 2. Le revenu global net annuel servant de base à l'impôt sur le revenu est déterminé en totalisant les bénéfices ou revenus nets mentionnés aux I à VI de la 1re sous-section de la présente section ainsi que les revenus, gains nets, profits, plus-values et créances pris en compte dans l'assiette de ce revenu global net en application des 3, 6 bis et 6 ter de l'article 158, compte tenu, le cas échéant, du montant des déficits visés au I de l'article 156, des charges énumérées au II dudit article et de l'abattement prévu à l'article 157 bis. 3. Le bénéfice ou revenu net de chacune des catégories de revenus visées au 2 est déterminé distinctement suivant les règles propres à chacune d'elles. Le résultat d'ensemble de chaque catégorie de revenus est obtenu en totalisant, s'il y a lieu, le bénéfice ou revenu afférent à chacune des entreprises, exploitations ou professions ressortissant à cette catégorie et déterminé dans les conditions prévues pour cette dernière. 4. Pour l'application du 3, il est fait état, le cas échéant, du montant des bénéfices correspondant aux droits que le contribuable ou les membres du foyer fiscal désignés aux 1 et 3 de l'article 6 possèdent en tant qu'associés ou membres de sociétés ou groupements soumis au régime fiscal des sociétés de personnes mentionné à l'article 8. 5.1°. Pour l'application du 3 et par dérogation aux dispositions du présent code relatives à l'imposition des plus-values, le produit résultant de la première cession à titre onéreux d'un même usufruit temporaire ou, si elle est supérieure, la valeur vénale de cet usufruit temporaire est imposable au nom du cédant, personne physique ou société ou groupement qui relève des articles 8 à 8 ter, dans la catégorie de revenus à laquelle se rattache, au jour de la cession, le bénéfice ou revenu procuré ou susceptible d'être procuré par le bien ou le droit sur lequel porte l'usufruit temporaire cédé. Lorsque l'usufruit temporaire cédé porte sur des biens ou droits procurant ou susceptibles de procurer des revenus relevant de différentes catégories, le produit résultant de la cession de cet usufruit temporaire, ou le cas échéant sa valeur vénale, est imposable dans chacune de ces catégories à proportion du rapport entre, d'une part, la valeur vénale des biens ou droits dont les revenus se rattachent à la même catégorie et, d'autre part, la valeur vénale totale des biens ou droits sur lesquels porte l'usufruit temporaire cédé. 2°. Pour l'application du 1° et à défaut de pouvoir déterminer, au jour de la cession, une catégorie de revenus, le produit résultant de la cession de l'usufruit temporaire, ou le cas échéant sa valeur vénale, est imposé : a) Dans la catégorie des revenus fonciers, sans qu'il puisse être fait application du II de l'article 15, lorsque l'usufruit temporaire cédé est relatif à un bien immobilier ou à des parts de sociétés, groupements ou organismes, quelle qu'en soit la forme, non soumis à l'impôt sur les sociétés et à prépondérance immobilière au sens des articles 150 UB ou 244 bis A ; b) Dans la catégorie des revenus de capitaux mobiliers, lorsque l'usufruit temporaire cédé est relatif à des valeurs mobilières, droits sociaux, titres ou droits s'y rapportant, ou à des titres représentatifs des mêmes valeurs, droits ou titres, mentionnés à l'article 150-0 A ; c) Dans la catégorie des bénéfices non commerciaux, dans les autres cas.", + "texteHtml": "

1. Le bénéfice ou revenu imposable est constitué par l'excédent du produit brut, y compris la valeur des profits et avantages en nature, sur les dépenses effectuées en vue de l'acquisition et de la conservation du revenu.

2. Le revenu global net annuel servant de base à l'impôt sur le revenu est déterminé en totalisant les bénéfices ou revenus nets mentionnés aux I à VI de la 1re sous-section de la présente section ainsi que les revenus, gains nets, profits, plus-values et créances pris en compte dans l'assiette de ce revenu global net en application des 3, 6 bis et 6 ter de l'article 158, compte tenu, le cas échéant, du montant des déficits visés au I de l'article 156, des charges énumérées au II dudit article et de l'abattement prévu à l'article 157 bis.

3. Le bénéfice ou revenu net de chacune des catégories de revenus visées au 2 est déterminé distinctement suivant les règles propres à chacune d'elles.

Le résultat d'ensemble de chaque catégorie de revenus est obtenu en totalisant, s'il y a lieu, le bénéfice ou revenu afférent à chacune des entreprises, exploitations ou professions ressortissant à cette catégorie et déterminé dans les conditions prévues pour cette dernière.

4. Pour l'application du 3, il est fait état, le cas échéant, du montant des bénéfices correspondant aux droits que le contribuable ou les membres du foyer fiscal désignés aux 1 et 3 de l'article 6 possèdent en tant qu'associés ou membres de sociétés ou groupements soumis au régime fiscal des sociétés de personnes mentionné à l'article 8.

5.1°. Pour l'application du 3 et par dérogation aux dispositions du présent code relatives à l'imposition des plus-values, le produit résultant de la première cession à titre onéreux d'un même usufruit temporaire ou, si elle est supérieure, la valeur vénale de cet usufruit temporaire est imposable au nom du cédant, personne physique ou société ou groupement qui relève des articles 8 à 8 ter, dans la catégorie de revenus à laquelle se rattache, au jour de la cession, le bénéfice ou revenu procuré ou susceptible d'être procuré par le bien ou le droit sur lequel porte l'usufruit temporaire cédé.

Lorsque l'usufruit temporaire cédé porte sur des biens ou droits procurant ou susceptibles de procurer des revenus relevant de différentes catégories, le produit résultant de la cession de cet usufruit temporaire, ou le cas échéant sa valeur vénale, est imposable dans chacune de ces catégories à proportion du rapport entre, d'une part, la valeur vénale des biens ou droits dont les revenus se rattachent à la même catégorie et, d'autre part, la valeur vénale totale des biens ou droits sur lesquels porte l'usufruit temporaire cédé.

2°. Pour l'application du 1° et à défaut de pouvoir déterminer, au jour de la cession, une catégorie de revenus, le produit résultant de la cession de l'usufruit temporaire, ou le cas échéant sa valeur vénale, est imposé :

a) Dans la catégorie des revenus fonciers, sans qu'il puisse être fait application du II de l'article 15, lorsque l'usufruit temporaire cédé est relatif à un bien immobilier ou à des parts de sociétés, groupements ou organismes, quelle qu'en soit la forme, non soumis à l'impôt sur les sociétés et à prépondérance immobilière au sens des articles 150 UB ou 244 bis A ;

b) Dans la catégorie des revenus de capitaux mobiliers, lorsque l'usufruit temporaire cédé est relatif à des valeurs mobilières, droits sociaux, titres ou droits s'y rapportant, ou à des titres représentatifs des mêmes valeurs, droits ou titres, mentionnés à l'article 150-0 A ;

c) Dans la catégorie des bénéfices non commerciaux, dans les autres cas.

", + "num": "13", + "origine": "LEGI", + "nature": "Article", + "versionArticle": "8.0", + "etat": "VIGUEUR", + "dateDebut": 1672531200000, + "dateFin": 32472144000000, + "dateDebutExtension": 32472144000000, + "dateFinExtension": 32472144000000, + "inap": null, + "ordre": 85898, + "context": { + "titresTM": [ + { + "debut": "1952-02-14", + "fin": "2999-01-01", + "titre": "Livre premier : Assiette et liquidation de l'impôt", + "xPath": "/ARTICLE/CONTEXTE/TEXTE/TM/TITRE_TM", + "cid": "LEGISCTA000006084232", + "id": "LEGISCTA000006084232", + "etat": "VIGUEUR" + }, + { + "debut": "1952-02-14", + "fin": "2999-01-01", + "titre": "Première Partie : Impôts d'État", + "xPath": "/ARTICLE/CONTEXTE/TEXTE/TM/TM/TITRE_TM", + "cid": "LEGISCTA000006114494", + "id": "LEGISCTA000006114494", + "etat": "VIGUEUR" + }, + { + "debut": "1954-08-05", + "fin": "2999-01-01", + "titre": "Titre premier : Impôts directs et taxes assimilées", + "xPath": "/ARTICLE/CONTEXTE/TEXTE/TM/TM/TM/TITRE_TM", + "cid": "LEGISCTA000006133844", + "id": "LEGISCTA000006133844", + "etat": "VIGUEUR" + }, + { + "debut": "1954-08-05", + "fin": "2999-01-01", + "titre": "Chapitre premier : Impôt sur le revenu", + "xPath": "/ARTICLE/CONTEXTE/TEXTE/TM/TM/TM/TM/TITRE_TM", + "cid": "LEGISCTA000006147017", + "id": "LEGISCTA000006147017", + "etat": "VIGUEUR" + }, + { + "debut": "1954-08-05", + "fin": "2999-01-01", + "titre": "Section II : Revenus imposables", + "xPath": "/ARTICLE/CONTEXTE/TEXTE/TM/TM/TM/TM/TM/TITRE_TM", + "cid": "LEGISCTA000006162523", + "id": "LEGISCTA000006162523", + "etat": "VIGUEUR" + }, + { + "debut": "1979-07-01", + "fin": "2999-01-01", + "titre": "Définition générale du revenu imposable", + "xPath": "/ARTICLE/CONTEXTE/TEXTE/TM/TM/TM/TM/TM/TM/TITRE_TM", + "cid": "LEGISCTA000006179571", + "id": "LEGISCTA000006179571", + "etat": "VIGUEUR" + } + ], + "nombreVersionParent": 1, + "longeurChemin": 50, + "titreTxt": [ + { + "debut": "1952-02-14", + "fin": "2999-01-01", + "titre": "Code général des impôts", + "xPath": "/ARTICLE/CONTEXTE/TEXTE/TITRE_TXT", + "cid": "LEGITEXT000006069577", + "id": "LEGITEXT000006069577", + "etat": "VIGUEUR" + } + ] + }, + "cid": "LEGIARTI000006307044", + "cidTexte": null, + "sectionParentCid": "LEGISCTA000006179571", + "sectionParentId": "LEGISCTA000006179571", + "sectionParentTitre": "Définition générale du revenu imposable", + "fullSectionsTitre": "Livre premier : Assiette et liquidation de l'impôt > Première Partie : Impôts d'État > Titre premier : Impôts directs et taxes assimilées > Chapitre premier : Impôt sur le revenu > Section II : Revenus imposables > Définition générale du revenu imposable", + "refInjection": "IG-20230712", + "idTechInjection": "LEGIARTI000044983201", + "idEli": null, + "idEliAlias": null, + "calipsos": [], + "textTitles": [ + { + "id": "LEGITEXT000006069577", + "titre": "Code général des impôts, CGI.", + "titreLong": "Code général des impôts", + "etat": "VIGUEUR", + "dateDebut": -564278400000, + "dateFin": 32472144000000, + "cid": "LEGITEXT000006069577", + "datePubli": 32472144000000, + "datePubliComputed": null, + "dateTexte": 32472144000000, + "dateTexteComputed": null, + "nature": "CODE", + "nor": "", + "num": "", + "numParution": "", + "originePubli": "", + "appliGeo": null, + "codesNomenclatures": [], + "visas": null, + "nota": null, + "notice": null, + "travauxPreparatoires": null, + "signataires": null, + "dossiersLegislatifs": [], + "ancienId": null, + "appellations": null + } + ], + "nota": "Conformément au II de l'article 79 de la loi n° 2021-1900 du 30 décembre 2021, ces dispositions s'appliquent aux cessions réalisées à compter du 1er janvier 2023.", + "notaHtml": "

Conformément au II de l'article 79 de la loi n° 2021-1900 du 30 décembre 2021, ces dispositions s'appliquent aux cessions réalisées à compter du 1er janvier 2023.

", + "activitePro": [], + "numeroBrochure": [], + "numeroBo": null, + "conteneurs": [], + "lienModifications": [ + { + "textCid": "JORFTEXT000044637640", + "textTitle": "LOI n°2021-1900 du 30 décembre 2021 - art. 79 (V)", + "linkType": "MODIFIE", + "linkOrientation": "cible", + "articleNum": "79", + "articleId": "LEGIARTI000044794856", + "natureText": "LOI", + "datePubliTexte": "2021-12-31", + "dateSignaTexte": "2021-12-30", + "dateDebutCible": "2022-01-01" + } + ], + "lienCitations": [ + { + "textCid": "JORFTEXT000026858820", + "textTitle": "Décision n° 2012-661 DC du 29 décembre 2012 - art., v. init.", + "linkType": "CITATION", + "linkOrientation": "cible", + "articleNum": "", + "articleId": "JORFARTI000026858821", + "natureText": "DECISION", + "date": 1689147578940, + "parentCid": null, + "numTexte": "2012-661 DC", + "datePubli": 1356825600000, + "dateDebut": 32472144000000 + }, + { + "textCid": "JORFTEXT000041566883", + "textTitle": "Rapport - art., v. init.", + "linkType": "CITATION", + "linkOrientation": "cible", + "articleNum": "", + "articleId": "JORFARTI000041566884", + "natureText": "RAPPORT", + "date": 1689147578940, + "parentCid": null, + "numTexte": "", + "datePubli": 1581552000000, + "dateDebut": 32472144000000 + } + ], + "lienConcordes": [], + "lienAutres": [], + "articleVersions": [ + { + "id": "LEGIARTI000006307044", + "etat": "MODIFIE", + "version": "1.0", + "dateDebut": 299635200000, + "dateFin": 314668800000, + "numero": null, + "ordre": null + }, + { + "id": "LEGIARTI000006307045", + "etat": "MODIFIE", + "version": "2.0", + "dateDebut": 314668800000, + "dateFin": 434505600000, + "numero": null, + "ordre": null + }, + { + "id": "LEGIARTI000006307046", + "etat": "MODIFIE", + "version": "3.0", + "dateDebut": 434505600000, + "dateFin": 1356998400000, + "numero": null, + "ordre": null + }, + { + "id": "LEGIARTI000026946864", + "etat": "MODIFIE", + "version": "4.0", + "dateDebut": 1356998400000, + "dateFin": 1370563200000, + "numero": null, + "ordre": null + }, + { + "id": "LEGIARTI000027518487", + "etat": "MODIFIE", + "version": "5.0", + "dateDebut": 1370563200000, + "dateFin": 1514764800000, + "numero": null, + "ordre": null + }, + { + "id": "LEGIARTI000036428268", + "etat": "MODIFIE", + "version": "6.0", + "dateDebut": 1514764800000, + "dateFin": 1577836800000, + "numero": null, + "ordre": null + }, + { + "id": "LEGIARTI000037991024", + "etat": "MODIFIE", + "version": "7.0", + "dateDebut": 1577836800000, + "dateFin": 1672531200000, + "numero": null, + "ordre": null + }, + { + "id": "LEGIARTI000044983201", + "etat": "VIGUEUR", + "version": "8.0", + "dateDebut": 1672531200000, + "dateFin": 32472144000000, + "numero": null, + "ordre": null + } + ], + "computedNums": [ + "13" + ], + "versionPrecedente": "LEGIARTI000037991024", + "conditionDiffere": null, + "historique": null, + "surtitre": null, + "renvoi": null, + "infosComplementaires": null, + "infosComplementairesHtml": null, + "infosRestructurationBranche": null, + "infosRestructurationBrancheHtml": null + } +} diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_skeleton.py b/tests/test_skeleton.py new file mode 100644 index 0000000..771cfeb --- /dev/null +++ b/tests/test_skeleton.py @@ -0,0 +1,16 @@ +from catleg.query import _article_from_legifrance_reply +from catleg.skeleton import _formatted_atricle + +from .test_legifrance_queries import _json_from_test_file + + +# Regression test for https://github.com/CatalaLang/catleg/issues/71 +def test_no_article_renumbering(): + article_json = _json_from_test_file("LEGIARTI000044983201.json") + article = _article_from_legifrance_reply(article_json) + formatted_article_md = _formatted_atricle(article) + assert "1. Le bénéfice ou revenu imposable est constitué" in formatted_article_md + assert "2. Le revenu global net annuel" in formatted_article_md + assert ( + "3. Le bénéfice ou revenu net de chacune des catégories" in formatted_article_md + )