From dc14056092605081cd893b4feb2da6f960c6363a 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 ++- src/MakeMoCommand.php | 22 +++++++++++-- tests/MakeMoTest.php | 74 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 98 insertions(+), 3 deletions(-) create mode 100644 tests/MakeMoTest.php diff --git a/README.md b/README.md index 3250b43d..5782b1cc 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/src/MakeMoCommand.php b/src/MakeMoCommand.php index ac82fed1..a34d1f76 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 @@ -41,10 +44,21 @@ public function __invoke( $args, $assoc_args ) { } $destination = is_file( $source ) ? dirname( $source ) : $source; + $custom_file_name = null; if ( isset( $args[1] ) ) { $destination = $args[1]; + $destionation_pathinfo = pathinfo( $destination ); + // Destination is a file, make sure source is also a file + if( ! empty( $destionation_pathinfo['filename'] ) ) { + if( !is_file( $source ) ) { + WP_CLI::error( 'Destination file not supported when source is a directory!' ); + } + $destination = $destionation_pathinfo['dirname']; + $custom_file_name = $destionation_pathinfo['filename'] . '.' . $destionation_pathinfo['extension'] ; + } } + // Two is_dir() checks in case of a race condition. if ( ! is_dir( $destination ) && ! mkdir( $destination, 0777, true ) @@ -72,7 +86,11 @@ public function __invoke( $args, $assoc_args ) { } $file_basename = basename( $file->getFilename(), '.po' ); - $destination_file = "{$destination}/{$file_basename}.mo"; + $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 ) ) { diff --git a/tests/MakeMoTest.php b/tests/MakeMoTest.php new file mode 100644 index 00000000..858b30d0 --- /dev/null +++ b/tests/MakeMoTest.php @@ -0,0 +1,74 @@ +temp_dir = Utils\get_temp_dir() . uniqid( 'wp-cli-test-make-po-', true ) . '/'; + mkdir( $this->temp_dir ); + } + + public function tear_down() { + rmdir( $this->temp_dir ); + + parent::tear_down(); + } + + /** + * Test wp i18n make-mo foo.po + */ + public function test_single_file_generation() { + $file_path = $this->temp_dir . '/test.po'; + touch( $file_path ); + $make_mo = new MakeMoCommand(); + $make_mo( array( + $file_path, + ), array() ); + $this->assertTrue( is_file( $this->temp_dir . '/test.mo' ), 'MO file not generated' ); + unlink( $file_path ); + unlink( $this->temp_dir . '/test.mo' ); + } + + /** + * Test wp i18n make-mo foo.po bar.mo + */ + public function test_single_file_generation_named() { + $file_path = $this->temp_dir . '/test.po'; + $mo_file_path = $this->temp_dir . '/bar.mo'; + touch( $file_path ); + $make_mo = new MakeMoCommand(); + $make_mo( array( + $file_path, + $mo_file_path, + ), array() ); + $this->assertTrue( is_file( $mo_file_path ), 'MO file not generated' ); + unlink( $file_path ); + unlink( $mo_file_path ); + } + + /** + * Test wp i18n make-mo foo/ + */ + public function test_whole_directory_generation() { + $base_directory = $this->temp_dir . '/foo'; + mkdir( $base_directory, 0777, true ); + $file_path = $base_directory . '/test.po'; + touch( $file_path ); + $make_mo = new MakeMoCommand(); + $make_mo( array( + $base_directory, + ), array() ); + $this->assertTrue( is_file( $base_directory . '/test.mo' ), 'MO file not generated' ); + unlink( $file_path ); + unlink( $base_directory . '/test.mo' ); + rmdir( $base_directory ); + } +}