Refatora msc:export-translations para saída configurável

O comando passa a aceitar um argumento opcional output-path. Se
fornecido, grava o CSV no caminho indicado; se omitido, escreve em
stdout (permitindo redirecionamento com >). Mensagens de status
(contagens, erros) sempre vão para stderr via $this->io().

O comando não lê mais nem escreve no CSV do módulo: carrega todos os
termos msc_2020 do banco ordenados por field_msc_code e gera o CSV
inteiramente a partir do banco (header fixo, parent_code derivado do
comprimento do código).

Remove a dependência de ModuleExtensionList do construtor e do
drush.services.yml.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-15 09:20:09 -03:00
parent d33378c2f0
commit d14aa22445
2 changed files with 99 additions and 0 deletions

View File

@@ -0,0 +1,7 @@
services:
site_tools_msc_2020_migrate.commands:
class: \Drupal\site_tools_msc_2020_migrate\Commands\MscMigrateCommands
arguments:
- '@entity_type.manager'
tags:
- { name: drush.command }

View File

@@ -0,0 +1,92 @@
<?php
namespace Drupal\site_tools_msc_2020_migrate\Commands;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drush\Commands\DrushCommands;
/**
* Comandos Drush para o módulo site_tools_msc_2020_migrate.
*/
class MscMigrateCommands extends DrushCommands {
public function __construct(
protected EntityTypeManagerInterface $entityTypeManager,
) {
parent::__construct();
}
/**
* Exporta as traduções pt-br dos termos MSC 2020 para um arquivo CSV ou stdout.
*
* @command msc:export-translations
* @argument output_path Caminho do arquivo de saída (opcional; padrão: stdout).
* @aliases msc-et
* @usage drush msc:export-translations
* Exporta para stdout (pode ser redirecionado: drush msc-et > novo.csv).
* @usage drush msc:export-translations /tmp/msc_2020_updated.csv
* Exporta para o arquivo especificado.
*/
public function exportTranslations(string $output_path = ''): void {
$storage = $this->entityTypeManager->getStorage('taxonomy_term');
$tids = $storage->getQuery()
->condition('vid', 'msc_2020')
->sort('field_msc_code', 'ASC')
->accessCheck(FALSE)
->execute();
$with_translation = 0;
$missing = 0;
// Monta o CSV em memória.
$buffer = fopen('php://memory', 'r+');
fputcsv($buffer, ['code', 'name_en', 'name_pt_br', 'parent_code']);
foreach ($storage->loadMultiple($tids) as $term) {
$code = $term->get('field_msc_code')->value;
$name_en = $term->label();
if ($term->hasTranslation('pt-br')) {
$name_pt_br = $term->getTranslation('pt-br')->label();
$with_translation++;
}
else {
$name_pt_br = '';
$missing++;
}
// Deriva o parent_code a partir do comprimento do código.
$len = strlen($code);
if ($len === 3) {
$parent_code = substr($code, 0, 2);
}
elseif ($len === 5) {
$parent_code = substr($code, 0, 3);
}
else {
$parent_code = '';
}
fputcsv($buffer, [$code, $name_en, $name_pt_br, $parent_code]);
}
rewind($buffer);
$csv_content = stream_get_contents($buffer);
fclose($buffer);
// Escreve no destino: arquivo ou stdout.
if ($output_path !== '') {
if (file_put_contents($output_path, $csv_content) === FALSE) {
$this->io()->error("Não foi possível escrever no arquivo: $output_path");
return;
}
$this->io()->success("CSV exportado para: $output_path");
}
else {
$this->output()->write($csv_content);
}
$this->io()->success("$with_translation tradução(ões) exportada(s); $missing sem tradução pt-br.");
}
}