Skip to content

Commit

Permalink
feat: numi transformation config (#53)
Browse files Browse the repository at this point in the history
* feat: create extract command

* fix: linter

* feat: numi transformation config

* fix: extract by data inclusion api
  • Loading branch information
abelkhay authored Apr 6, 2023
1 parent f5502d5 commit 7c57c54
Show file tree
Hide file tree
Showing 22 changed files with 399 additions and 5 deletions.
3 changes: 2 additions & 1 deletion .github/workflows/nightly-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ jobs:
rhin-occ,
res-in,
les-landes,
la-creuse
la-creuse,
numi
]
runs-on: ubuntu-latest
environment: production
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@ jobs:
rhin-occ,
res-in,
les-landes,
la-creuse
la-creuse,
numi
]
runs-on: ubuntu-latest
environment: production
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/validate.yml
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,8 @@ jobs:
rhin-occ,
res-in,
les-landes,
la-creuse
la-creuse,
numi
]
runs-on: ubuntu-latest
environment: demo
Expand Down
236 changes: 236 additions & 0 deletions assets/input/numi/numi.config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,236 @@
{
"id": {
"colonne": "id"
},
"pivot": {
"colonne": "pivot"
},
"nom": {
"colonne": "nom"
},
"commune": {
"colonne": "commune"
},
"code_postal": {
"colonne": "code_postal"
},
"code_insee": {
"colonne": "code_insee"
},
"adresse": {
"colonne": "adresse"
},
"latitude": {
"colonne": "latitude"
},
"longitude": {
"colonne": "longitude"
},
"telephone": {
"colonne": "telephone"
},
"courriel": {
"colonne": "courriel"
},
"site_web": {
"colonne": "site_web"
},
"date_maj": {
"colonne": "date_maj"
},
"source": {
"colonne": "source"
},
"prise_rdv": {
"colonne": "prise_rdv"
},
"labels_nationaux": [
{
"colonnes": ["labels_nationaux"],
"termes": ["CNFS"],
"cible": "CNFS"
},
{
"colonnes": ["labels_nationaux"],
"termes": ["France Services"],
"cible": "France Services"
}
],
"conditions_acces": [
{
"colonnes": ["conditions_acces"],
"termes": ["Gratuit : Je peux accéder gratuitement au lieu et à ses services"],
"cible": "Gratuit : Je peux accéder gratuitement au lieu et à ses services"
},

{
"colonnes": ["conditions_acces"],
"termes": ["Adhésion : L'accès au lieu et/ou à ses services nécessite d'y adhérer"],
"cible": "Adhésion : L'accès au lieu et/ou à ses services nécessite d'y adhérer"
},
{
"colonnes": ["conditions_acces"],
"termes": ["Payant : L'accès au lieu et/ou à ses services est payant"],
"cible": "Payant : L'accès au lieu et/ou à ses services est payant"
},
{
"colonnes": ["conditions_acces"],
"termes": ["Accepte le Pass numérique : Il est possible d'utiliser un Pass numérique pour accéder au lieu"],
"cible": "Accepte le Pass numérique : Il est possible d'utiliser un Pass numérique pour accéder au lieu"
}
],
"modalites_accompagnement": [
{
"colonnes": ["modalites_accompagnement"],
"termes": ["Dans un atelier : j'apprends collectivement à utiliser le numérique"],
"cible": "Dans un atelier : j'apprends collectivement à utiliser le numérique"
},
{
"colonnes": ["modalites_accompagnement"],
"termes": ["A ma place : une personne habilitée fait les démarches à ma place"],
"cible": "A ma place : une personne habilitée fait les démarches à ma place"
},
{
"colonnes": ["modalites_accompagnement"],
"termes": ["Avec de l'aide : je suis accompagné seul dans l'usage du numérique"],
"cible": "Avec de l'aide : je suis accompagné seul dans l'usage du numérique"
},
{
"colonnes": ["modalites_accompagnement"],
"termes": ["Seul : j'ai accès à du matériel et une connexion"],
"cible": "Seul : j'ai accès à du matériel et une connexion"
}
],
"publics_accueillis": [
{
"colonnes": ["publics_accueillis"],
"termes": ["Adultes"],
"cible": "Adultes"
},
{
"colonnes": ["publics_accueillis"],
"termes": ["Familles/enfants"],
"cible": "Familles/enfants"
},
{
"colonnes": ["publics_accueillis"],
"termes": ["Jeunes (16-26 ans)"],
"cible": "Jeunes (16-26 ans)"
},
{
"colonnes": ["publics_accueillis"],
"termes": ["Seniors (+ 65 ans)"],
"cible": "Seniors (+ 65 ans)"
},
{
"colonnes": ["publics_accueillis"],
"termes": ["Surdité"],
"cible": "Surdité"
},
{
"colonnes": ["publics_accueillis"],
"termes": ["Handicaps mentaux : déficiences limitant les activités d'une personne"],
"cible": "Handicaps mentaux : déficiences limitant les activités d'une personne"
},
{
"colonnes": ["publics_accueillis"],
"termes": ["Personnes en situation d'illettrisme"],
"cible": "Personnes en situation d'illettrisme"
},
{
"colonnes": ["publics_accueillis"],
"termes": ["Public langues étrangères"],
"cible": "Public langues étrangères"
},
{
"colonnes": ["publics_accueillis"],
"termes": ["Handicaps psychiques : troubles psychiatriques donnant lieu à des atteintes comportementales"],
"cible": "Handicaps psychiques : troubles psychiatriques donnant lieu à des atteintes comportementales"
},
{
"colonnes": ["publics_accueillis"],
"termes": ["Déficience visuelle"],
"cible": "Déficience visuelle"
}
],
"services": [
{
"colonnes": ["services"],
"termes": ["Devenir autonome dans les démarches administratives"],
"cible": "Devenir autonome dans les démarches administratives"
},
{
"colonnes": ["services"],
"termes": ["Réaliser des démarches administratives avec un accompagnement"],
"cible": "Réaliser des démarches administratives avec un accompagnement"
},
{
"colonnes": ["services"],
"termes": ["Prendre en main un smartphone ou une tablette"],
"cible": "Prendre en main un smartphone ou une tablette"
},
{
"colonnes": ["services"],
"termes": ["Prendre en main un ordinateur"],
"cible": "Prendre en main un ordinateur"
},
{
"colonnes": ["services"],
"termes": ["Utiliser le numérique au quotidien"],
"cible": "Utiliser le numérique au quotidien"
},
{
"colonnes": ["services"],
"termes": ["Approfondir ma culture numérique"],
"cible": "Approfondir ma culture numérique"
},
{
"colonnes": ["services"],
"termes": ["Favoriser mon insertion professionnelle"],
"cible": "Favoriser mon insertion professionnelle"
},
{
"colonnes": ["services"],
"termes": ["Accéder à une connexion internet"],
"cible": "Accéder à une connexion internet"
},
{
"colonnes": ["services"],
"termes": ["Accéder à du matériel"],
"cible": "Accéder à du matériel"
},
{
"colonnes": ["services"],
"termes": ["S'équiper en matériel informatique"],
"cible": "S'équiper en matériel informatique"
},
{
"colonnes": ["services"],
"termes": ["Créer et développer mon entreprise"],
"cible": "Créer et développer mon entreprise"
},
{
"colonnes": ["services"],
"termes": ["Créer avec le numérique"],
"cible": "Créer avec le numérique"
},
{
"colonnes": ["services"],
"termes": ["Accompagner les démarches de santé"],
"cible": "Accompagner les démarches de santé"
},
{
"colonnes": ["services"],
"termes": ["Promouvoir la citoyenneté numérique"],
"cible": "Promouvoir la citoyenneté numérique"
},
{
"colonnes": ["services"],
"termes": ["Soutenir la parentalité et l'éducation avec le numérique"],
"cible": "Soutenir la parentalité et l'éducation avec le numérique"
}
],
"horaires": {
"semaine": "horaires"
}
}
3 changes: 3 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
"build": "tsc --project .tsconfig/tsconfig.json && cp -r ./src/data ./dist/",
"start.data-inclusion": "ts-node src/data-inclusion/main.ts",
"mednum": "ts-node src/index.ts",
"extract.numi": "ts-node src/index.ts extract -n \"numi\" -o \"./assets/output-extraction/numi\" -d \"76,61,50,27,14\"",
"transformer.angers": "ts-node src/index.ts transformer -n \"Angers\" -t \"Maine-et-Loire\" -s \"./assets/input/angers/angers.json\" -c \"./assets/input/angers/angers.config.json\" -o \"./assets/output/angers\"",
"fetch.france-tiers-lieux": "curl --request POST --url https://cartographie.francetierslieux.fr/co2/search/globalautocomplete --header 'Content-Type: application/x-www-form-urlencoded' --data 'searchType[]=organizations' --data indexStep= --data costumSlug=franceTierslieux > assets/input/france-tiers-lieux/france-tiers-lieux.json",
"transformer.conseiller-numerique": "ts-node src/index.ts transformer -n \"Conseiller Numerique\" -t \"National\" -s \"https://api.conseiller-numerique.gouv.fr/permanences\" -c \"./assets/input/conseiller-numerique/conseiller-numerique.config.json\" -o \"./assets/output/conseiller-numerique\"",
Expand All @@ -57,6 +58,7 @@
"transformer.hub-lo": "ts-node src/index.ts transformer -n \"Hub-lo\" -t \"Centre-Val-de-Loire\" -s \"./assets/input/hub-lo/hub-lo.json\" -c \"./assets/input/hub-lo/hub-lo.config.json\" -o \"./assets/output/hub-lo\"",
"transformer.maine-et-loire": "ts-node src/index.ts transformer -n \"Département du Maine-et-Loire\" -t \"Maine-et-Loire\" -s \"./assets/input/maine-et-loire/maine-et-loire.json\" -c \"./assets/input/maine-et-loire/maine-et-loire.config.json\" -o \"./assets/output/maine-et-loire\"",
"transformer.mulhouse": "ts-node src/index.ts transformer -n \"Mulhouse\" -t \"Haut-Rhin\" -s \"https://www.data.gouv.fr/fr/datasets/r/e3c4dec5-1c68-4ecf-a420-90924ea61daf\" -c \"./assets/input/mulhouse/mulhouse.config.json\" -o \"./assets/output/mulhouse\"",
"transformer.numi": "yarn extract.numi && ts-node src/index.ts transformer -n \"Numi\" -t \"Normandie\" -s \"./assets/input/numi/numi.json\" -c \"./assets/input/numi/numi.config.json\" -o \"./assets/output/numi\"",
"transformer.la-creuse": "ts-node src/index.ts transformer -n \"La Creuse\" -t \"Nouvelle-Aquitaine\" -s \"./assets/input/la-creuse/la-creuse.json\" -c \"./assets/input/la-creuse/la-creuse.config.json\" -o \"./assets/output/la-creuse\"",
"transformer.les-assembleurs": "ts-node src/index.ts transformer -n \"Les Assembleurs\" -t \"Hauts-de-France\" -s \"./assets/input/les-assembleurs/les-assembleurs.json\" -c \"./assets/input/les-assembleurs/les-assembleurs.config.json\" -o \"./assets/output/les-assembleurs\"",
"transformer.les-landes": "ts-node src/index.ts transformer -n \"Les Landes\" -t \"Nouvelle-Aquitaine\" -s \"https://www.pigma.org/geoserver/alpi/ows?SERVICE=WFS&VERSION=2.0.0&request=GetFeature&typename=alpi:lieux_mediation_num-1&outputFormat=csv&SRSNAME=EPSG:4326&sortBy=gid\" -c \"./assets/input/les-landes/les-landes.config.json\" -o \"./assets/output/les-landes\"",
Expand All @@ -74,6 +76,7 @@
"publier.hub-lo": "ts-node src/index.ts publier -z \"fr:region:24\" -m \"./assets/output/hub-lo/publier.json\"",
"publier.maine-et-loire": "ts-node src/index.ts publier -z \"fr:departement:49\" -m \"./assets/output/maine-et-loire/publier.json\"",
"publier.mulhouse": "ts-node src/index.ts publier -z \"fr:commune:68224\" -m \"./assets/output/mulhouse/publier.json\"",
"publier.numi": "ts-node src/index.ts publier -z \"fr:region:28\" -m \"./assets/output/numi/publier.json\"",
"publier.la-creuse": "ts-node src/index.ts publier -z \"fr:departement:23\" -m \"./assets/output/la-creuse/publier.json\"",
"publier.les-assembleurs": "ts-node src/index.ts publier -z \"fr:region:32\" -m \"./assets/output/les-assembleurs/publier.json\"",
"publier.les-landes": "ts-node src/index.ts publier -z \"fr:departement:40\" -m \"./assets/output/les-landes/publier.json\"",
Expand Down
2 changes: 1 addition & 1 deletion src/data-inclusion/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import {
import { DataInclusionMerged, mergeServicesInStructure } from './merge-services-in-structure';
import axios, { AxiosResponse } from 'axios';

type SchemaStructureDataInclusionWithServices = SchemaStructureDataInclusion & {
export type SchemaStructureDataInclusionWithServices = SchemaStructureDataInclusion & {
services: string;
labels_nat: string;
labels_autre: string;
Expand Down
30 changes: 30 additions & 0 deletions src/extract/cli/action/extract.action.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/* eslint-disable-next-line @typescript-eslint/no-restricted-imports */
import * as fs from 'fs';
import { ExtractOptions } from '../extract-options';
import { SchemaStructureDataInclusionWithServices } from '../../../data-inclusion/main';
import axios, { AxiosResponse } from 'axios';

const filterDataByDepartement = (
lieuxMediationNumerique: SchemaStructureDataInclusionWithServices[],
departements: string
): SchemaStructureDataInclusionWithServices[] =>
lieuxMediationNumerique.filter((lieu: SchemaStructureDataInclusionWithServices): boolean => {
const arrayDepartements: string[] = departements.split(',');
const codePostalDepartement: string = lieu.code_postal.slice(0, 2);
return arrayDepartements.includes(codePostalDepartement);
});

export const extractAction = async (extractOptions: ExtractOptions): Promise<void> => {
const fetchLieuxFromDataInclusion: AxiosResponse = await axios.get(
'https://www.data.gouv.fr/fr/datasets/r/b5e5a1e1-122e-4f87-b6cf-d1ce342671be'
);
const filteredLieuxForExtraction: SchemaStructureDataInclusionWithServices[] = filterDataByDepartement(
fetchLieuxFromDataInclusion.data,
extractOptions.departements
);
fs.writeFileSync(
`./assets/input/${extractOptions.sourceName}/${extractOptions.sourceName}.json`,
JSON.stringify(filteredLieuxForExtraction),
'utf8'
);
};
1 change: 1 addition & 0 deletions src/extract/cli/action/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './extract.action';
18 changes: 18 additions & 0 deletions src/extract/cli/extract-options.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { Command } from 'commander';
import { Question } from 'inquirer';
import { departementsOption, outputDirectoryOption, sourceNameOption } from './options';
import { departementsQuestion, outputDirectoryQuestion, sourceNameQuestion } from './questions';

export type ExtractOptions = {
outputDirectory: string;
sourceName: string;
departements: string;
};

export const EXTRACT_OPTIONS: ((program: Command) => Command)[] = [outputDirectoryOption, sourceNameOption, departementsOption];

export const extractOptionsQuestions = (extractOptions: ExtractOptions): Question[] => [
outputDirectoryQuestion(extractOptions),
sourceNameQuestion(extractOptions),
departementsQuestion(extractOptions)
];
26 changes: 26 additions & 0 deletions src/extract/cli/extract.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { Command } from 'commander';
import inquirer, { Answers } from 'inquirer';
import { EXTRACT_OPTIONS, ExtractOptions, extractOptionsQuestions } from './extract-options';
import { extractAction } from './action';

const promptAndRun = async (extractOptions: ExtractOptions): Promise<void> =>
inquirer
.prompt(extractOptionsQuestions(extractOptions))
.then(async (mednumAnswers: Answers): Promise<void> => extractAction({ ...extractOptions, ...mednumAnswers }))
.catch((error: Error): void => {
/* eslint-disable-next-line no-console */
console.error(error.message);
});

const configureCommandOptions = (command: Command, option: (_: Command) => Command): Command => option(command);

const configureCommand = (program: Command): Command =>
program
.command('extract')
.alias('e')
.description('Extraction de données selon une entrée geographique spécifique via data.gouv');

const commandAction = async (_: unknown, command: Command): Promise<void> => promptAndRun(command.opts());

export const addExtractCommandTo = (program: Command): Command =>
EXTRACT_OPTIONS.reduce(configureCommandOptions, configureCommand(program)).action(commandAction);
1 change: 1 addition & 0 deletions src/extract/cli/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './extract';
4 changes: 4 additions & 0 deletions src/extract/cli/options/departements.option.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import { Command } from 'commander';

export const departementsOption = (program: Command): Command =>
program.option('-d, --departements <departements>', "Les départements pour la creation d'une zone géographique");
3 changes: 3 additions & 0 deletions src/extract/cli/options/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export * from './output-directory.option';
export * from './source-name.option';
export * from './departements.option';
4 changes: 4 additions & 0 deletions src/extract/cli/options/output-directory.option.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import { Command } from 'commander';

export const outputDirectoryOption = (program: Command): Command =>
program.option('-o, --output-directory <output-directory>', 'Le dossier dans lequel écrire les fichiers extraits');
4 changes: 4 additions & 0 deletions src/extract/cli/options/source-name.option.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import { Command } from 'commander';

export const sourceNameOption = (program: Command): Command =>
program.option('-n, --source-name <source-name>', "Le nom de l'entité source à l'origine de la collecte des données");
Loading

0 comments on commit 7c57c54

Please sign in to comment.