From e21999c84acb0decdc6c5cefa4acbf676dfb4a51 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Guillaume=20Perr=C3=A9al?= <guillaume.perreal@irstea.fr>
Date: Fri, 23 Nov 2018 11:45:17 +0100
Subject: [PATCH] =?UTF-8?q?Ajout=20d'une=20option=20=C3=A0=20ng-model:gene?=
 =?UTF-8?q?rate=20pour=20limiter=20les=20fichiers=20g=C3=A9n=C3=A9r=C3=A9s?=
 =?UTF-8?q?.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/Command/NgModelGenerateCommand.php | 17 ++++++-
 src/Writers/FilteringFileWriter.php    | 65 ++++++++++++++++++++++++++
 src/Writers/NullWriter.php             | 45 ++++++++++++++++++
 3 files changed, 126 insertions(+), 1 deletion(-)
 create mode 100644 src/Writers/FilteringFileWriter.php
 create mode 100644 src/Writers/NullWriter.php

diff --git a/src/Command/NgModelGenerateCommand.php b/src/Command/NgModelGenerateCommand.php
index 8004451..9359fcf 100644
--- a/src/Command/NgModelGenerateCommand.php
+++ b/src/Command/NgModelGenerateCommand.php
@@ -23,6 +23,7 @@ use ApiPlatform\Core\Documentation\Documentation;
 use Irstea\NgModelGeneratorBundle\ModelGenerator;
 use Irstea\NgModelGeneratorBundle\Writers\ConsoleWriter;
 use Irstea\NgModelGeneratorBundle\Writers\DirectoryWriter;
+use Irstea\NgModelGeneratorBundle\Writers\FilteringFileWriter;
 use Irstea\NgModelGeneratorBundle\Writers\MultiFileWriter;
 use Irstea\NgModelGeneratorBundle\Writers\PhonyFileWriter;
 use Irstea\NgModelGeneratorBundle\Writers\ZipWriter;
@@ -72,7 +73,8 @@ final class NgModelGenerateCommand extends Command
             ->setDescription('Dump Typescript representations')
             ->addOption('zip', 'z', InputOption::VALUE_REQUIRED, 'Archive ZIP à créer')
             ->addOption('output', 'o', InputOption::VALUE_REQUIRED, 'Dossier de destination')
-            ->addOption('force', 'f', InputOption::VALUE_NONE, 'Ecrase la cible');
+            ->addOption('force', 'f', InputOption::VALUE_NONE, 'Ecrase la cible')
+            ->addOption('restrict', 'r', InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'Limite la sortie aux modèles de nom de fichier');
     }
 
     /**
@@ -85,6 +87,19 @@ final class NgModelGenerateCommand extends Command
             $output
         );
 
+        if ($input->getOption('restrict')) {
+            $globs = $input->getOption('restrict');
+            $writer = new FilteringFileWriter($writer, function (string $path) use ($globs): bool {
+                foreach ($globs as $glob) {
+                    if (fnmatch($glob, $path, FNM_PATHNAME)) {
+                        return true;
+                    }
+                }
+
+                return false;
+            });
+        }
+
         try {
             $this->generator->generate($this->documentation, $writer);
         } finally {
diff --git a/src/Writers/FilteringFileWriter.php b/src/Writers/FilteringFileWriter.php
new file mode 100644
index 0000000..a617718
--- /dev/null
+++ b/src/Writers/FilteringFileWriter.php
@@ -0,0 +1,65 @@
+<?php declare(strict_types=1);
+/*
+ * irstea/ng-model-generator-bundle generates Typescript interfaces for Angular using api-platform metadata.
+ * Copyright (C) 2018 IRSTEA
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option) any
+ * later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License and the GNU
+ * Lesser General Public License along with this program. If not, see
+ * <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\NgModelGeneratorBundle\Writers;
+
+/**
+ * Class FilteringFileWriter.
+ */
+final class FilteringFileWriter implements MultiFileWriter
+{
+    /**
+     * @var MultiFileWriter
+     */
+    private $writer;
+
+    /**
+     * @var callable
+     */
+    private $accept;
+
+    /**
+     * FilteringFileWriter constructor.
+     *
+     * @param MultiFileWriter $writer
+     * @param callable        $accept
+     */
+    public function __construct(MultiFileWriter $writer, callable $accept)
+    {
+        $this->writer = $writer;
+        $this->accept = $accept;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function newFile(string $path): Writer
+    {
+        if (!($this->accept)($path)) {
+            return new NullWriter();
+        }
+
+        return $this->writer->newFile($path);
+    }
+
+    public function close(): void
+    {
+        $this->writer->close();
+    }
+}
diff --git a/src/Writers/NullWriter.php b/src/Writers/NullWriter.php
new file mode 100644
index 0000000..9106895
--- /dev/null
+++ b/src/Writers/NullWriter.php
@@ -0,0 +1,45 @@
+<?php declare(strict_types=1);
+/*
+ * irstea/ng-model-generator-bundle generates Typescript interfaces for Angular using api-platform metadata.
+ * Copyright (C) 2018 IRSTEA
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option) any
+ * later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License and the GNU
+ * Lesser General Public License along with this program. If not, see
+ * <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\NgModelGeneratorBundle\Writers;
+
+/**
+ * Class NullWriter.
+ */
+class NullWriter implements MultiFileWriter, Writer
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function newFile(string $path): Writer
+    {
+        return $this;
+    }
+
+    public function close(): void
+    {
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function write(string $data): void
+    {
+    }
+}
-- 
GitLab