Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: export csv bal with lang #396

Merged
merged 1 commit into from
May 21, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lib/distribute/cli.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ require('dotenv').config()
const {getDepartements} = require('../util/cli.cjs')
const {runInParallel} = require('../util/parallel.cjs')

const DISTRIBUTIONS = ['csv', 'csv-bal', 'addok', 'geojson', 'csv-with-ids']
const DISTRIBUTIONS = ['csv', 'csv-bal', 'addok', 'geojson', 'csv-with-ids', 'csv-bal-with-lang']

async function main() {
const departements = getDepartements()
Expand Down
49 changes: 49 additions & 0 deletions lib/distribute/writers/csv-bal-with-lang.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
/* eslint camelcase: off */
const {promisify} = require('util')
const {join} = require('path')
const {createWriteStream} = require('fs')
const {createGzip} = require('zlib')
const finished = promisify(require('stream').finished)
const {ensureDir} = require('fs-extra')
const csvWriter = require('csv-write-stream')
const pumpify = require('pumpify')

const {prepareAdresses} = require('../../formatters/csv-bal.cjs')

function createCsvWriteStream(file) {
return pumpify.obj(
csvWriter({separator: ';'}),
createGzip(),
file
)
}

function waitForDrain(stream) {
if (stream.writableLength > stream.writableHighWaterMark) {
return new Promise(resolve => {
stream.once('drain', resolve)
})
}
}

async function createWriter(outputPath, departement) {
await ensureDir(outputPath)
const adressesFile = createWriteStream(join(outputPath, `adresses-${departement}-beta.csv.gz`))
const adressesStream = createCsvWriteStream(adressesFile)

return {
async writeAdresses({voies, numeros}) {
prepareAdresses({voies, numeros}, {includesAllLang: true})
.forEach(a => adressesStream.write(a))

await waitForDrain(adressesStream)
},

async finish() {
adressesStream.end()
await finished(adressesFile)
}
}
}

module.exports = {createWriter}
53 changes: 39 additions & 14 deletions lib/formatters/csv-bal.cjs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
/* eslint camelcase: off */
const {groupBy} = require('lodash')
const languesRegionales = require('@ban-team/shared-data/langues-regionales.json')
const {harmlessProj} = require('../util/geo.cjs')
const {idsIdentifier} = require('../util/digest-ids-from-bal-uids.cjs')

Expand Down Expand Up @@ -61,7 +62,36 @@ function buildBalIDs(numero, version) {
}
}

function buildRow(voie, numero, position, {includesAlt = false, version = '1.3'}) {
function addIncludeAlt(voie, numero) {
const result = {}

if (voie.nomVoieAlt) {
Object.keys(voie.nomVoieAlt).forEach(o => {
result['voie_nom_' + o] = voie.nomVoieAlt[o]
})
}

if (numero.lieuDitComplementNomAlt) {
Object.keys(numero.lieuDitComplementNomAlt).forEach(o => {
result['lieudit_complement_nom_' + o] = numero.lieuDitComplementNomAlt[o]
})
}

return result
}

function addIncludeAllLang(voie, numero) {
const result = {}

for (const {code} of languesRegionales) {
result['voie_nom_' + code] = voie.nomVoieAlt && voie.nomVoieAlt[code]
result['lieudit_complement_nom_' + code] = numero.lieuDitComplementNomAlt && numero.lieuDitComplementNomAlt[code]
}

return result
}

function buildRow(voie, numero, position, {includesAlt = false, includesAllLang = false, version = '1.3'}) {
const row = {
...buildBalIDs(numero, version),
cle_interop: numero.cleInterop,
Expand All @@ -83,18 +113,13 @@ function buildRow(voie, numero, position, {includesAlt = false, version = '1.3'}
date_der_maj: numero.dateMAJ || '',
certification_commune: numero.certifie ? '1' : '0'
}

if (includesAlt) {
if (voie.nomVoieAlt) {
Object.keys(voie.nomVoieAlt).forEach(o => {
row['voie_nom_' + o] = voie.nomVoieAlt[o]
})
}
row.push(...addIncludeAlt(voie, numero))
}

if (numero.lieuDitComplementNomAlt) {
Object.keys(numero.lieuDitComplementNomAlt).forEach(o => {
row['lieudit_complement_nom_' + o] = numero.lieuDitComplementNomAlt[o]
})
}
if (includesAllLang) {
row.push(...addIncludeAllLang(voie, numero))
}

if (position) {
Expand Down Expand Up @@ -123,20 +148,20 @@ function createFakeNumero(voie) {
}
}

function prepareAdresses({voies, numeros}, {includesAlt, version} = {}) {
function prepareAdresses({voies, numeros}, {includesAlt, includesAllLang, version} = {}) {
const numerosIndex = groupBy(numeros, 'idVoie')
const rows = []

for (const voie of voies) {
if (voie.type === 'lieu-dit') {
const fakeNumero = createFakeNumero(voie)
const position = voie.position ? {position: voie.position} : null
rows.push(buildRow(voie, fakeNumero, position, {includesAlt, version}))
rows.push(buildRow(voie, fakeNumero, position, {includesAlt, includesAllLang, version}))
} else if (voie.type === 'voie') {
const numerosVoie = numerosIndex[voie.idVoie] || []
for (const numero of numerosVoie) {
for (const position of numero.positions) {
rows.push(buildRow(voie, numero, position, {includesAlt, version}))
rows.push(buildRow(voie, numero, position, {includesAlt, includesAllLang, version}))
}
}
}
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
"dependencies": {
"@ban-team/fantoir": "^0.15.0",
"@ban-team/gazetteer": "^2.0.0",
"@ban-team/shared-data": "^1.2.0",
"@ban-team/validateur-bal": "^2.17.0",
"@etalab/adresses-util": "^0.8.2",
"@etalab/decoupage-administratif": "^3.0.0",
Expand Down
Loading