testing/sample_helpers.php (68 lines of code) (raw):

<?php namespace Google\Cloud\Samples; use ReflectionFunction; function execute_sample(string $file, string $namespace, ?array $argv) { // Return if sample file is not being executed via CLI if (is_null($argv)) { return null; } // Return if sample file is being included via PHPUnit $argvFile = array_shift($argv); if ('.php' != substr($argvFile, -4)) { return null; } // Determine the name of the function to execute $functionName = sprintf('%s\\%s', $namespace, basename($file, '.php')); // Verify the user has supplied the correct number of arguments $functionReflection = new ReflectionFunction($functionName); if ( count($argv) < $functionReflection->getNumberOfRequiredParameters() || count($argv) > $functionReflection->getNumberOfParameters() ) { print(get_usage(basename($file), $functionReflection)); return null; } // Require composer autoload for the user $autoloadDir = dirname(dirname($functionReflection->getFileName())); if (!file_exists($autoloadFile = $autoloadDir . '/vendor/autoload.php')) { printf( 'You must run "composer install" in the sample root (%s/)' . PHP_EOL, $autoloadDir ); return null; } require_once $autoloadFile; // If any parameters are typehinted as "array", explode user input on "," $validArrayTypes = ['array', 'array<string>', 'string[]']; $parameterReflections = $functionReflection->getParameters(); foreach (array_values($argv) as $i => $val) { $parameterReflection = $parameterReflections[$i]; if ($parameterReflection->hasType()) { $parameterType = $parameterReflection->getType()->getName(); if (in_array($parameterType, $validArrayTypes) && !is_array($val)) { $key = array_search($val, $argv); $argv[$key] = explode(',', $argv[$key]); } } } // Run the function return call_user_func_array($functionName, $argv); } function get_usage(string $file, ReflectionFunction $functionReflection): string { // Print basic usage $paramNames = []; foreach ($functionReflection->getParameters() as $param) { $name = '$' . $param->getName(); if ($param->isOptional()) { $default = var_export($param->getDefaultValue(), true); $name = "[$name=$default]"; } $paramNames[] = $name; } $usage = sprintf('Usage: %s %s' . PHP_EOL, $file, implode(' ', $paramNames)); // Print @param docs if they exist preg_match_all( "#(@param+\s*[a-zA-Z0-9, ()_].*)#", $functionReflection->getDocComment(), $matches ); if (isset($matches[0])) { $usage .= PHP_EOL . "\t"; $usage .= implode(PHP_EOL . "\t", $matches[0]) . PHP_EOL; $usage .= PHP_EOL; } return $usage; }