From c5a4442635062f352141198c2f77d2faa33f1913 Mon Sep 17 00:00:00 2001 From: sdnunca Date: Thu, 16 Nov 2023 15:44:32 +0100 Subject: [PATCH] Add destination file support to MakePoCommand --- README.md | 5 ++++- features/makemo.feature | 46 +++++++++++++++++++++++++++++++++++++++-- src/MakeMoCommand.php | 27 +++++++++++++++++++----- 3 files changed, 70 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 3250b43..5782b1c 100644 --- a/README.md +++ b/README.md @@ -212,7 +212,7 @@ wp i18n make-mo [] Path to an existing PO file or a directory containing multiple PO files. [] - Path to the destination directory for the resulting MO files. Defaults to the source directory. + Path to the destination file or directory for the resulting MO files. Defaults to the source directory. **EXAMPLES** @@ -222,6 +222,9 @@ wp i18n make-mo [] # Create a MO file from a single PO file in a specific directory. $ wp i18n make-mo example-plugin-de_DE.po languages + # Create a MO file from a single PO file to a specific file destination + $ wp i18n make-mo example-plugin-de_DE.po languages/bar.mo + ### wp i18n update-po diff --git a/features/makemo.feature b/features/makemo.feature index 0c817eb..782035b 100644 --- a/features/makemo.feature +++ b/features/makemo.feature @@ -10,7 +10,17 @@ Feature: Generate MO files from PO files Error: Source file or directory does not exist! """ And the return code should be 1 - + Scenario: Bail for destination being a file when source is a folder + Given an empty foo directory + And a foo/foo.po file: + """ + """ + When I try `wp i18n make-mo foo test.mo ` + Then STDERR should contain: + """ + Error: Destination file not supported when source is a directory! + """ + And the return code should be 1 Scenario: Uses source folder as destination by default Given an empty foo-plugin directory And a foo-plugin/foo-plugin-de_DE.po file: @@ -44,7 +54,39 @@ Feature: Generate MO files from PO files """ And the return code should be 0 And the foo-plugin/foo-plugin-de_DE.mo file should exist - + Scenario: Uses the provided destination file name + Given a foo.po file: + """ + """ + When I run `wp i18n make-mo foo.po bar.mo` + Then STDOUT should contain: + """ + Success: Created 1 file. + """ + And the return code should be 0 + And the bar.mo file should exist + Scenario: Uses the provided destination file name with no extension + Given a foo.po file: + """ + """ + When I run `wp i18n make-mo foo.po bar` + Then STDOUT should contain: + """ + Success: Created 1 file. + """ + And the return code should be 0 + And the bar file should exist + Scenario: Preserves the provided source name with no destination + Given a foo.po file: + """ + """ + When I run `wp i18n make-mo foo.po` + Then STDOUT should contain: + """ + Success: Created 1 file. + """ + And the return code should be 0 + And the foo.mo file should exist Scenario: Allows setting custom destination directory Given an empty foo-plugin directory And a foo-plugin/foo-plugin-de_DE.po file: diff --git a/src/MakeMoCommand.php b/src/MakeMoCommand.php index ac82fed..b97bf3c 100644 --- a/src/MakeMoCommand.php +++ b/src/MakeMoCommand.php @@ -20,7 +20,7 @@ class MakeMoCommand extends WP_CLI_Command { * : Path to an existing PO file or a directory containing multiple PO files. * * [] - * : Path to the destination directory for the resulting MO files. Defaults to the source directory. + * : Path to the destination file or directory for the resulting MO files. Defaults to the source directory. * * ## EXAMPLES * @@ -30,6 +30,9 @@ class MakeMoCommand extends WP_CLI_Command { * # Create a MO file from a single PO file in a specific directory. * $ wp i18n make-mo example-plugin-de_DE.po languages * + * # Create a MO file from a single PO file to a specific file destination + * $ wp i18n make-mo example-plugin-de_DE.po languages/bar.mo + * * @when before_wp_load * * @throws WP_CLI\ExitException @@ -40,9 +43,19 @@ public function __invoke( $args, $assoc_args ) { WP_CLI::error( 'Source file or directory does not exist!' ); } - $destination = is_file( $source ) ? dirname( $source ) : $source; + $destination = is_file( $source ) ? dirname( $source ) : $source; + $custom_file_name = null; if ( isset( $args[1] ) ) { - $destination = $args[1]; + $destination = $args[1]; + $destination_pathinfo = pathinfo( $destination ); + // Destination is a file, make sure source is also a file + if ( ! empty( $destination_pathinfo['filename'] ) && ! empty( $destination_pathinfo['extension'] ) ) { + if ( ! is_file( $source ) ) { + WP_CLI::error( 'Destination file not supported when source is a directory!' ); + } + $destination = $destination_pathinfo['dirname']; + $custom_file_name = $destination_pathinfo['filename'] . '.' . $destination_pathinfo['extension']; + } } // Two is_dir() checks in case of a race condition. @@ -71,8 +84,12 @@ public function __invoke( $args, $assoc_args ) { continue; } - $file_basename = basename( $file->getFilename(), '.po' ); - $destination_file = "{$destination}/{$file_basename}.mo"; + $file_basename = basename( $file->getFilename(), '.po' ); + $file_name = $file_basename . '.mo'; + if ( $custom_file_name ) { + $file_name = $custom_file_name; + } + $destination_file = "{$destination}/{$file_name}"; $translations = Translations::fromPoFile( $file->getPathname() ); if ( ! $translations->toMoFile( $destination_file ) ) {