From afb5503ac4add7d0d8cf9dad264e80b71978c8aa Mon Sep 17 00:00:00 2001 From: Pierlou Ramade <48205215+Pierlou@users.noreply.github.com> Date: Wed, 17 May 2023 12:01:25 +0200 Subject: [PATCH] Initial commit --- .github/pull_request_template.md | 13 +++++ .github/workflows/test.yml | 28 ++++++++++ .gitignore | 1 + CHANGELOG.md | 11 ++++ LICENSE.md | 77 +++++++++++++++++++++++++++ README.md | 64 ++++++++++++++++++++++ exemple-valide.csv | 4 ++ requirements.txt | 1 + schema.json | 91 ++++++++++++++++++++++++++++++++ 9 files changed, 290 insertions(+) create mode 100644 .github/pull_request_template.md create mode 100644 .github/workflows/test.yml create mode 100644 .gitignore create mode 100644 CHANGELOG.md create mode 100644 LICENSE.md create mode 100644 README.md create mode 100644 exemple-valide.csv create mode 100644 requirements.txt create mode 100644 schema.json diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..c305d6f --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,13 @@ +# Publication d'une nouvelle version d'un schéma + +Vous publiez une nouvelle version d'un schéma ? +Pensez à réaliser les actions suivantes. + +- [ ] Mettre à jour les fichiers d'exemples +- [ ] Mettre à jour le champ `version` +- [ ] Mettre à jour le champ `lastModified` +- [ ] Changer les liens vers les fichiers d'exemples présents dans `schema.json` et `README.md` +- [ ] Mettre à jour le fichier `CHANGELOG.md` en incluant une description de la version +- [ ] Merger cette pull-request +- [ ] Publier un nouveau tag et une nouvelle version +- [ ] Prévenir les utilisateurs de ce schéma diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..4d73943 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,28 @@ +name: Vérification du respect des spécifications + +on: + push: + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Installation Python 3.7 + uses: actions/setup-python@v1 + with: + python-version: '3.7' + - name: Cache pip + uses: actions/cache@v1 + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip-${{ hashFiles('requirements.txt') }} + restore-keys: | + ${{ runner.os }}-pip- + ${{ runner.os }}- + - name: Installation des dépendances + run: pip install -r requirements.txt + - name: Vérification du schéma et des fichiers d'exemples + run: | + frictionless validate --type schema schema.json + frictionless validate --schema schema.json exemple-valide.csv \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5ceb386 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +venv diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..2dc8c55 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,11 @@ +# Changements + +Ce fichier répertorie les changements entre différentes versions d'un schéma. + +## Version 0.1.1 - 2019-05-06 + +- Clarification de la description du champ `date_creation` + +## Version 0.1.0 - 2018-06-29 + +Publication initiale. diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..66b48e6 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,77 @@ +# LICENCE OUVERTE 2.0 / OPEN LICENCE 2.0 + +## « Réutilisation » de l'« Information » sous cette licence + +Le « Concédant » concède au « Réutilisateur » un droit non exclusif et gratuit de libre « Réutilisation » de l'« Information » objet de la présente licence, à des fins commerciales ou non, dans le monde entier et pour une durée illimitée, dans les conditions exprimées ci-dessous. + +**Le « Réutilisateur » est libre de réutiliser l'« Information » :** + +- de la reproduire, la copier, +- de l‘adapter, la modifier, l‘extraire et la transformer, pour créer des « Informations dérivées », des produits ou des services, +- de la communiquer, la diffuser, la redistribuer, la publier et la transmettre, +- de l'exploiter à titre commercial, par exemple en la combinant avec d'autres informations, ou en l'incluant dans son propre produit ou application. + +**Sous réserve de :** + +- mentionner la paternité de l'« Information » : sa source (au moins le nom du « Concédant ») et la date de dernière mise à jour de l'« Information » réutilisée. + +Le « Réutilisateur » peut notamment s'acquitter de cette condition en renvoyant, par un lien hypertexte, vers la source de «l'Information» et assurant une mention effective de sa paternité. +Par exemple : *« Ministère de xxx - Données originales téléchargées sur http://www.data.gouv.fr/fr/datasets/xxx/, mise à jour du 14 février 2017 »*. + +Cette mention de paternité ne confère aucun caractère officiel à la « Réutilisation » de l'« Information », et ne doit pas suggérer une quelconque reconnaissance ou caution par le « Concédant », ou par toute autre entité publique, du « Réutilisateur » ou de sa « Réutilisation ». + +## « Données à caractère personnel » + +L‘ « Information » mise à disposition peut contenir des « Données à caractère personnel » pouvant faire l'objet d'une « Réutilisation ». Si tel est le cas, le « Concédant » informe le « Réutilisateur » de leur présence. L' « Information » peut être librement réutilisée, dans le cadre des droits accordés par la présente licence, à condition de respecter le cadre légal relatif à la protection des données à caractère personnel. + +## « Droits de propriété intellectuelle » + +Il est garanti au « Réutilisateur » que les éventuels « Droits de propriété intellectuelle » détenus par des tiers ou par le « Concédant » sur l'« Information » ne font pas obstacle aux droits accordés par la présente licence. + +Lorsque le « Concédant » détient des « Droits de propriété intellectuelle » cessibles sur l'« Information », il les cède au « Réutilisateur » de façon non exclusive, à titre gracieux, pour le monde entier, pour toute la durée des « Droits de propriété intellectuelle », et le « Réutilisateur » peut faire tout usage de l'« Information » conformément aux libertés et aux conditions définies par la présente licence. + +## Responsabilité + +L' « Information » est mise à disposition telle que produite ou reçue par le « Concédant », sans autre garantie expresse ou tacite que celles prévues par la présente licence. L'absence de défauts ou d'erreurs éventuellement contenues dans l'« Information », comme la fourniture continue de l'« Information » n'est pas garantie par le « Concédant ». Il ne peut être tenu pour responsable de toute perte, préjudice ou dommage de quelque sorte causé à des tiers du fait de la « Réutilisation ». + +Le « Réutilisateur » est seul responsable de la « Réutilisation » de l'« Information ». + +La « Réutilisation » ne doit pas induire en erreur des tiers quant au contenu de l'« Information », sa source et sa date de mise à jour. + +## Droit applicable + +La présente licence est régie par le droit français. + +## Compatibilité de la présente licence + +La présente licence a été conçue pour être compatible avec toute licence libre qui exige au moins la mention de paternité et notamment avec la version antérieure de la présente licence ainsi qu'avec les licences « Open Government Licence » (OGL) du Royaume-Uni, « Creative Commons Attribution » (CC-BY) de Creative Commons et « Open Data Commons Attribution » (ODC-BY) de l'Open Knowledge Foundation. + +## Définitions + +Sont considérés, au sens de la présente licence comme : + +- Le **« Concédant »** : toute personne concédant un droit de « Réutilisation » sur l'« Information » dans les libertés et les conditions prévues par la présente licence +- L'**« Information »** : + - toute information publique figurant dans des documents communiqués ou publiés par une administration mentionnée au premier alinéa de l'article L.300-2 du CRPA ; + - toute information mise à disposition par toute personne selon les termes et conditions de la présente licence. +- La **« Réutilisation »** : l'utilisation de l'« Information » à d'autres fins que celles pour lesquelles elle a été produite ou reçue. +- Le **« Réutilisateur »** : toute personne qui réutilise les « Informations » conformément aux conditions de la présente licence. +- Des **« Données à caractère personnel »** : toute information se rapportant à une personne physique identifiée ou identifiable, pouvant être identifiée directement ou indirectement. Leur « Réutilisation » est subordonnée au respect du cadre juridique en vigueur. +- Une **« Information dérivée »** : toute nouvelle donnée ou information créées directement à partir de l'« Information » ou à partir d'une combinaison de l'« Information » et d'autres données ou informations non soumises à cette licence. +- Les **« Droits de propriété intellectuelle »** : tous droits identifiés comme tels par le Code de la propriété intellectuelle (notamment le droit d'auteur, droits voisins au droit d'auteur, droit sui generis des producteurs de bases de données…). + +## À propos de cette licence + +La présente licence a vocation à être utilisée par les administrations pour la réutilisation de leurs informations publiques. Elle peut également être utilisée par toute personne souhaitant mettre à disposition de l'« Information » dans les conditions définies par la présente licence + +La France est dotée d'un cadre juridique global visant à une diffusion spontanée par les administrations de leurs informations publiques afin d'en permettre la plus large réutilisation. + +Le droit de la « Réutilisation » de l'« Information » des administrations est régi par le code des relations entre le public et l'administration (CRPA). + +Cette licence facilite la réutilisation libre et gratuite des informations publiques et figure parmi les licences qui peuvent être utilisées par l'administration en vertu du décret pris en application de l'article L.323-2 du CRPA. + +Etalab est la mission chargée, sous l'autorité du Premier ministre, d'ouvrir le plus grand nombre de données publiques des administrations de l'État et de ses établissements publics. Elle a réalisé la Licence Ouverte pour faciliter la réutilisation libre et gratuite de ces informations publiques, telles que définies par l'article L321-1 du CRPA. + +Cette licence est la version 2.0 de la Licence Ouverte. + +Etalab se réserve la faculté de proposer de nouvelles versions de la Licence Ouverte. Cependant, les « Réutilisateurs » pourront continuer à réutiliser les informations qu'ils ont obtenues sous cette licence s'ils le souhaitent. diff --git a/README.md b/README.md new file mode 100644 index 0000000..edfac41 --- /dev/null +++ b/README.md @@ -0,0 +1,64 @@ +# Template de départ pour Table Schema + +Ce dépôt contient les fichiers nécessaires pour démarrer la création d'un dépôt pour un schéma [Table Schema](https://specs.frictionlessdata.io/table-schema/). + +## Utiliser ce template + +- Si vous créez votre dépôt sur GitHub, il vous suffit d'appuyer sur le bouton vert "Use this template". Consultez [la documentation](https://help.github.com/en/github/creating-cloning-and-archiving-repositories/creating-a-repository-from-a-template) pour plus d'infos ; +- Si votre projet sera hébergé ailleurs (par exemple Gitlab), vous pouvez cloner ce répertoire ou télécharger les fichiers correspondants. Utilisez le bouton "Clone or download". + +## Fichiers disponibles + +Ce dépôt contient un ensemble de fichiers utiles pour un dépôt d'un schéma [Table Schema](https://specs.frictionlessdata.io/table-schema/). + +- [`CHANGELOG.md`](CHANGELOG.md) contient la liste des changements entre les différentes versions de votre schéma ; +- [`exemple-valide.csv`](exemple-valide.csv) est un fichier CSV d'exemple conforme par rapport au schéma décrit dans `schema.json` ; +- [`LICENSE.md`](LICENSE.md) est le fichier de licence du dépôt. Nous recommandons d'utiliser la [Licence Ouverte](https://www.etalab.gouv.fr/licence-ouverte-open-licence), cette licence est recommandée par l'administration française pour le partage de données et de documents ; +- [`README.md`](README.md) est le fichier que vous lisez actuellement. À terme, il devra présenter votre schéma ; +- [`requirements.txt`](requirements.txt) liste les dépendances Python nécessaires pour effectuer des tests en intégration continue sur votre dépôt ; +- [`schema.json`](schema.json) est le schéma au format Table Schema. + +### Intégration continue + +Ce dépôt est configuré pour utiliser de l'intégration continue, si vous utilisez GitHub. À chaque commit, une suite de tests sera lancée via [GitHub Actions](https://github.com/features/actions) afin de vérifier : + +- que votre schéma est valide à la spécification Table Schema ; +- que vos fichiers d'exemples sont conformes au schéma. + +Si vous n'utilisez pas GitHub, vous pouvez lancer ces tests sur votre machine ou sur un autre service d'intégration continue comme Gitlab CI, Jenkins, Circle CI, Travis etc. Consultez la configuration utilisée dans [`.github/workflows/test.yml`](.github/workflows/test.yml). + +Localement, voici la procédure à suivre pour installer l'environnement de test et lancer les tests : + +```bash +# Création d'un environnement virtuel en Python 3 +python3 -m venv venv +source venv/bin/activate + +# Installation des dépendances +pip install -r requirements.txt + +# Test de la validité du schéma +frictionless validate --type schema schema.json + +# Test de la conformité des fichiers d'exemples +frictionless validate --schema schema.json exemple-valide.csv +``` + +## Étapes à suivre + +Nous détaillons ci-dessous les étapes que nous vous conseillons de suivre après avoir créé votre dépôt Git, tout en utilisant les fichiers d'exemples. + +- [ ] Décrire votre schéma dans le fichier `schema.json` en respectant la spécification Table Schema. Le fichier d'exemple comprend des valeurs d'exemples pour toutes les métadonnées possibles. Notez que les champs d'exemple ne comprennent qu'une petite partie des types, formats et contraintes disponibles, référez-vous à [la documentation](https://specs.frictionlessdata.io/table-schema/#types-and-formats) pour toutes les valeurs possibles. Si certaines métadonnées ne sont pas nécessaires pour votre projet, vous pouvez les supprimer. Pour vérifier que votre schéma est conforme, vous pouvez utiliser l'outil [tableschema](https://pypi.org/project/tableschema/) en ligne de commande : `tableschema validate schema.json` +- [ ] Modifier le fichier d'exemple CSV avec des données conforme à votre schéma. L'outil [frictionless](https://pypi.org/project/frictionless/) permet de vérifier que vos fichiers sont conformes au schéma en ligne de commande `frictionless validate --schema schema.json exemple-valide.csv` +- [ ] Modifier le fichier [`CHANGELOG.md`](CHANGELOG.md) pour indiquer la publication initiale +- [ ] Modifier le fichier [`README.md`](README.md), en supprimant tout son contenu tout d'abord. Au sein de plusieurs paragraphes, vous indiquerez le contexte, les modalités de production des données, le cadre juridique, la finalité, les cas d’usage etc. Consultez plusieurs schémas sur [schema.data.gouv.fr](https://schema.data.gouv.fr) pour découvrir quelles informations sont pertinentes à indiquer +- [ ] Vérifier que la licence ouverte vous convient. Si vous devez utiliser une autre licence, modifiez le fichier [`LICENSE.md`](LICENSE.md) et indiquez la licence dans le fichier [`schema.json`](schema.json), dans la clé `licenses` + + +## Documentation + +Pour vous aider dans la construction de votre dépôt, nous vous recommandons de vous référer à : + +- [Le guide à destination des producteurs de schéma](https://guides.etalab.gouv.fr/producteurs-schemas/) +- [La documentation de schema.data.gouv.fr](https://schema.data.gouv.fr) +- [La spécification Table Schema](https://specs.frictionlessdata.io/table-schema/) diff --git a/exemple-valide.csv b/exemple-valide.csv new file mode 100644 index 0000000..c1fc96f --- /dev/null +++ b/exemple-valide.csv @@ -0,0 +1,4 @@ +id,date_creation,nom,classification +42,2020-02-27,Brouette,"[""Classification A""]" +44,2020-02-25,Pelle,"[""Classification A"",""Classification B"",""Classification C""]" +45,2020-02-25,Bus,"[""Classification A"",""Classification C""]" diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..f677a4f --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +frictionless==4.40.8 diff --git a/schema.json b/schema.json new file mode 100644 index 0000000..61b63eb --- /dev/null +++ b/schema.json @@ -0,0 +1,91 @@ +{ + "$schema":"https://specs.frictionlessdata.io/schemas/table-schema.json", + "name":"objets-importants", + "title":"Schéma des objets importants", + "description":"Spécification du fichier d'échange relatif aux objets importants gérés par les collectivités.", + "keywords":[ + "objets", + "autre-tag" + ], + "countryCode":"FR", + "homepage":"https://github.com/mon-orga/schema-objets-importants", + "path":"https://github.com/mon-orga/schema-objets-importants/raw/v0.1.1/schema.json", + "image":"https://github.com/mon-orga/schema-objets-importants/raw/v0.1.1/irve.png", + "licenses":[ + { + "title":"Etalab Licence Ouverte 2.0", + "name":"etalab-2.0", + "path":"https://spdx.org/licenses/etalab-2.0.html" + } + ], + "resources":[ + { + "title":"Fichier valide (CSV)", + "name":"exemple-valide-csv", + "path":"https://github.com/mon-orga/schema-objets-importants/raw/v0.1.1/exemple-valide.csv" + } + ], + "sources":[ + { + "title":"Arrêté du 12 janvier 2017 relatif aux objets importants", + "path":"https://beta.legifrance.gouv.fr/codes/id/LEGISCTA000031367685/2020-05-25" + } + ], + "created":"2018-06-29", + "lastModified":"2019-05-06", + "version":"0.1.1", + "contributors":[ + { + "title":"John Smith", + "email":"john.smith@etalab.gouv.fr", + "organisation":"Etalab", + "role":"author" + }, + { + "title":"Jane Doe", + "email":"jane.doe@example.com", + "organisation":"Association très importante", + "role":"contributor" + } + ], + "fields":[ + { + "name":"id", + "description":"Un identifiant unique de l'objet.", + "example":42, + "type":"integer", + "constraints":{ + "required":true, + "minimum":1 + } + }, + { + "name":"date_creation", + "description":"La date de création de l'objet, au format ISO 8601 AAAA-MM-DD.", + "example":"2020-02-27", + "type":"date", + "constraints":{ + "required":true + } + }, + { + "name":"nom", + "description":"Le nom de l'objet.", + "example":"Brouette", + "type":"string", + "constraints":{ + "required":true + } + }, + { + "name":"classification", + "description":"Classification de l'objet.", + "example":"Classification A", + "type":"string", + "constraints": { + "enum": ["Classification A", "Classification B", "Classification C"] + } + } + ], + "primaryKey":"id" +}