Improved detection of collections (affected on -f and -d)

This commit is contained in:
Anthony Axenov 2023-08-09 22:02:00 +08:00
parent 9613697ada
commit 1b3dd8b677
Signed by: anthony
GPG Key ID: EA9EC32FF7CCD4EC
2 changed files with 51 additions and 10 deletions

View File

@ -10,8 +10,17 @@ use PmConverter\Exceptions\{
DirectoryIsNotWriteableException, DirectoryIsNotWriteableException,
DirectoryNotExistsException}; DirectoryNotExistsException};
/**
* Helper class to work with files and directories
*/
class FileSystem class FileSystem
{ {
/**
* Normalizes a given path
*
* @param string $path
* @return string
*/
public static function normalizePath(string $path): string public static function normalizePath(string $path): string
{ {
$path = str_replace('~', $_SERVER['HOME'], $path); $path = str_replace('~', $_SERVER['HOME'], $path);
@ -19,6 +28,8 @@ class FileSystem
} }
/** /**
* Recursively creates a new directory by given path
*
* @param string $path * @param string $path
* @return string * @return string
* @throws CannotCreateDirectoryException * @throws CannotCreateDirectoryException
@ -38,6 +49,8 @@ class FileSystem
} }
/** /**
* Recursively removes a given directory
*
* @param string $path * @param string $path
* @return void * @return void
* @throws DirectoryIsNotReadableException * @throws DirectoryIsNotReadableException
@ -77,11 +90,10 @@ class FileSystem
} }
/** /**
* Returns content of given directory path
*
* @param string $path * @param string $path
* @return array * @return array
* @throws DirectoryIsNotReadableException
* @throws DirectoryIsNotWriteableException
* @throws DirectoryNotExistsException
*/ */
public static function dirContents(string $path): array public static function dirContents(string $path): array
{ {
@ -92,4 +104,22 @@ class FileSystem
} }
return $records; return $records;
} }
/**
* Checks if a given file is a valid collection json file
*
* @param string $path
* @return bool
*/
public static function isCollectionFile(string $path): bool
{
$path = static::normalizePath($path);
return !empty($path = trim($path))
&& str_ends_with($path, '.postman_collection.json')
&& file_exists($path)
&& is_readable($path)
&& ($json = json_decode(file_get_contents($path), true))
&& json_last_error() === JSON_ERROR_NONE
&& isset($json['collection']['info']['name']);
}
} }

View File

@ -92,47 +92,58 @@ class Processor
switch ($arg) { switch ($arg) {
case '-f': case '-f':
case '--file': case '--file':
$path = FileSystem::normalizePath($this->argv[$idx + 1]); $rawpath = $this->argv[$idx + 1];
if (empty($path) || !str_ends_with($path, '.json') || !file_exists($path) || !is_readable($path)) { $normpath = FileSystem::normalizePath($rawpath);
throw new InvalidArgumentException('a valid json-file path is expected for -f (--file)'); if (!FileSystem::isCollectionFile($normpath)) {
throw new InvalidArgumentException(
sprintf("this is not a valid collection file:%s\t%s %s", PHP_EOL, $arg, $rawpath)
);
} }
$this->collectionPaths[] = $this->argv[$idx + 1]; $this->collectionPaths[] = $this->argv[$idx + 1];
break; break;
case '-o': case '-o':
case '--output': case '--output':
if (empty($this->argv[$idx + 1])) { if (empty($this->argv[$idx + 1])) {
throw new InvalidArgumentException('-o expected'); throw new InvalidArgumentException('-o is required');
} }
$this->outputPath = $this->argv[$idx + 1]; $this->outputPath = $this->argv[$idx + 1];
break; break;
case '-d': case '-d':
case '--dir': case '--dir':
if (empty($this->argv[$idx + 1])) { if (empty($this->argv[$idx + 1])) {
throw new InvalidArgumentException('a directory path is expected for -d (--dir)'); throw new InvalidArgumentException('a directory path is expected for -d (--dir)');
} }
$path = $this->argv[$idx + 1]; $normpath = $this->argv[$idx + 1];
$files = array_filter( $files = array_filter(
FileSystem::dirContents($path), FileSystem::dirContents($normpath),
static fn($filename) => str_ends_with($filename, '.json') static fn($filename) => FileSystem::isCollectionFile($filename)
); );
$this->collectionPaths = array_unique(array_merge($this?->collectionPaths ?? [], $files)); $this->collectionPaths = array_unique(array_merge($this?->collectionPaths ?? [], $files));
break; break;
case '-p': case '-p':
case '--preserve': case '--preserve':
$this->preserveOutput = true; $this->preserveOutput = true;
break; break;
case '--http': case '--http':
$this->formats[ConvertFormat::Http->name] = ConvertFormat::Http; $this->formats[ConvertFormat::Http->name] = ConvertFormat::Http;
break; break;
case '--curl': case '--curl':
$this->formats[ConvertFormat::Curl->name] = ConvertFormat::Curl; $this->formats[ConvertFormat::Curl->name] = ConvertFormat::Curl;
break; break;
case '--wget': case '--wget':
$this->formats[ConvertFormat::Wget->name] = ConvertFormat::Wget; $this->formats[ConvertFormat::Wget->name] = ConvertFormat::Wget;
break; break;
case '-v': case '-v':
case '--version': case '--version':
die(implode(PHP_EOL, $this->version()) . PHP_EOL); die(implode(PHP_EOL, $this->version()) . PHP_EOL);
case '-h': case '-h':
case '--help': case '--help':
die(implode(PHP_EOL, $this->usage()) . PHP_EOL); die(implode(PHP_EOL, $this->usage()) . PHP_EOL);