Automatically add new page (application) in a directory

Hi,

I like how in streamlit it can automatically display the list of python files in a pages directory and show them in the sidebar, including newly added pages and automatically remove deleted pages.

So far what I have come up is by automatically restarting the server using the script below when new files are added or removed from the directory. Is there an easier way to do this?

import argparse
import time
from datetime import datetime

import panel.io.server  # enable bokeh server patch
from panel.command.serve import Serve
from path import Path
from watchdog.events import FileCreatedEvent, FileDeletedEvent, FileSystemEventHandler
from watchdog.observers import Observer

restart = False


class ServeCmd(Serve):
    def customize_server(self, server):
        self.__server = server
        return server

    def stop(self):
        loop = self.__server.io_loop
        loop.add_callback(loop.stop)
        self.__server.unlisten()


class EventHandler(FileSystemEventHandler):
    def __init__(self):
        self._last_event_time = None

    def _check_time(self):
        t = datetime.now().timestamp()
        if self._last_event_time is not None and (t - self._last_event_time) < 2:
            print('skipped')
            return False
        self._last_event_time = t
        return True

    def _restart(self):
        global cmd, restart
        if self._check_time():
            time.sleep(1)
            restart = True
            cmd.stop()

    def on_created(self, event):
        if isinstance(event, FileCreatedEvent):
            print('on_created')
            self._restart()

    def on_deleted(self, event):
        global cmd, restart
        if isinstance(event, FileDeletedEvent):
            print('on_deleted')
            self._restart()


observer = Observer()
handler = EventHandler()
observer.schedule(handler, 'pages')
observer.start()

while True:
    parser = argparse.ArgumentParser()
    cmd = ServeCmd(parser=parser)
    files = Path('pages').files('*.py')
    args = parser.parse_args(['--autoreload'] + files)
    cmd.invoke(args)
    if not restart:
        break
    restart = False