From 337168e84e0a03cbde0ac249593eba8290a68a10 Mon Sep 17 00:00:00 2001 From: th3r00t Date: Sat, 9 Aug 2025 19:55:45 +0000 Subject: [PATCH] Updated Documentation and Readme --- docker/Dockerfile | 38 - docker/README.md | 4 - docker/config.json | 19 - docker/development.docker-compose.yml | 36 - docker/docker-compose.yml | 26 - docker/requirements.txt | 1 - docs/pyShelf/html/annotated.html | 104 +++ docs/pyShelf/html/classes.html | 98 +++ ..._1lib_1_1models_1_1Collection-members.html | 75 ++ ...espacesrc_1_1backend_1_1lib_1_1config.html | 75 ++ ..._1lib_1_1pyShelf_1_1InitFiles-members.html | 74 ++ .../classobjects_1_1JSInterface-members.html | 76 ++ ...ests_1_1library__test_1_1Test__Config.html | 721 +++++++++++++++ ...tests_1_1library__test_1_1Test__Config.png | Bin 0 -> 872 bytes ...nd_1_1lib_1_1config_1_1Config-members.html | 98 +++ ...ibrary__test_1_1TestCatalogue-members.html | 75 ++ ...astAPIServer_1_1FastAPIServer-members.html | 87 ++ ...assDataHooks_1_1BookInterface-members.html | 74 ++ ...nd_1_1lib_1_1models_1_1BookCollection.html | 205 +++++ ...end_1_1lib_1_1models_1_1BookCollection.png | Bin 0 -> 1095 bytes ...ackend_1_1lib_1_1library_1_1Catalogue.html | 640 ++++++++++++++ ...backend_1_1lib_1_1library_1_1Catalogue.png | Bin 0 -> 1462 bytes ...library__test_1_1Test__Config-members.html | 98 +++ ...1_1config__test_1_1TestConfig-members.html | 76 ++ ..._1lib_1_1library_1_1Catalogue-members.html | 98 +++ ...c_1_1backend_1_1lib_1_1models_1_1Book.html | 438 ++++++++++ ...rc_1_1backend_1_1lib_1_1models_1_1Book.png | Bin 0 -> 1013 bytes ...c_1_1backend_1_1lib_1_1models_1_1Base.html | 85 ++ ...rc_1_1backend_1_1lib_1_1models_1_1Base.png | Bin 0 -> 2159 bytes ...1backend_1_1lib_1_1storage_1_1Storage.html | 559 ++++++++++++ ...nd_1_1lib_1_1api__hooks_1_1DuckDuckGo.html | 181 ++++ ..._1backend_1_1lib_1_1pyShelf_1_1Server.html | 327 +++++++ .../d7/dd7/namespacesrc_1_1____main____.html | 161 ++++ .../html/d7/df9/namespaceDataHooks.html | 71 ++ ...sts_1_1library__test_1_1TestCatalogue.html | 150 ++++ .../d8/def/classobjects_1_1JSInterface.html | 157 ++++ ...1_1backend_1_1lib_1_1config_1_1Config.html | 591 +++++++++++++ ..._1_1backend_1_1lib_1_1config_1_1Config.png | Bin 0 -> 883 bytes ...kend_1_1lib_1_1models_1_1User-members.html | 81 ++ .../d71/classDataHooks_1_1BookInterface.html | 111 +++ ...1lib_1_1overide_1_1ACatalogue-members.html | 98 +++ ...ackend_1_1lib_1_1pyShelf_1_1InitFiles.html | 127 +++ ...kend_1_1lib_1_1models_1_1Book-members.html | 87 ++ ..._1_1lib_1_1storage_1_1Storage-members.html | 92 ++ .../html/db/dd5/namespaceFastAPIServer.html | 348 ++++++++ ...s_1_1library__test_1_1Test__Catalogue.html | 825 ++++++++++++++++++ ...ts_1_1library__test_1_1Test__Catalogue.png | Bin 0 -> 981 bytes ...rary__test_1_1Test__Catalogue-members.html | 99 +++ ...ckend_1_1lib_1_1overide_1_1ACatalogue.html | 795 +++++++++++++++++ ...ackend_1_1lib_1_1overide_1_1ACatalogue.png | Bin 0 -> 856 bytes .../classFastAPIServer_1_1FastAPIServer.html | 404 +++++++++ ...c_1_1backend_1_1lib_1_1models_1_1User.html | 303 +++++++ ...rc_1_1backend_1_1lib_1_1models_1_1User.png | Bin 0 -> 1013 bytes ...spacesrc_1_1backend_1_1lib_1_1storage.html | 75 ++ ...b_1_1api__hooks_1_1DuckDuckGo-members.html | 77 ++ ...d_1_1lib_1_1pyShelf_1_1Server-members.html | 85 ++ ...ackend_1_1lib_1_1models_1_1Collection.html | 162 ++++ ...backend_1_1lib_1_1models_1_1Collection.png | Bin 0 -> 1069 bytes .../pyShelf/html/df/d4c/namespaceobjects.html | 71 ++ ...b_1_1models_1_1BookCollection-members.html | 77 ++ ..._1tests_1_1config__test_1_1TestConfig.html | 163 ++++ .../dir_1c7294442ce83d360610449d04c9d7fc.html | 78 ++ .../dir_3f615ade772d23cefe5e20dcb18424a2.html | 78 ++ .../dir_68267d1309a1af8e8297ef4c3efbcdba.html | 77 ++ .../dir_8509b06bafa958d2011203a730bf5778.html | 71 ++ .../dir_9020577e2da81c4cf5a5554c26431f94.html | 74 ++ .../dir_d6d65651a873fbc3232a07f3f4a594e4.html | 74 ++ docs/pyShelf/html/doxygen.svg | 28 + docs/pyShelf/html/doxygen_crawl.html | 138 +++ docs/pyShelf/html/dynsections.js | 198 +++++ docs/pyShelf/html/files.html | 94 ++ docs/pyShelf/html/functions.html | 170 ++++ docs/pyShelf/html/functions_func.html | 170 ++++ docs/pyShelf/html/hierarchy.html | 89 ++ docs/pyShelf/html/index.hhc | 342 ++++++++ docs/pyShelf/html/index.hhk | 292 +++++++ docs/pyShelf/html/index.hhp | 92 ++ docs/pyShelf/html/index.html | 58 ++ docs/pyShelf/html/jquery.js | 204 +++++ docs/pyShelf/html/menudata.js | 66 ++ docs/pyShelf/html/namespacemembers.html | 76 ++ docs/pyShelf/html/namespacemembers_func.html | 76 ++ docs/pyShelf/html/namespaces.html | 73 ++ docs/pyShelf/man/man3/DataHooks.3 | 27 + .../man/man3/DataHooks_BookInterface.3 | 37 + docs/pyShelf/man/man3/FastAPIServer.3 | 165 ++++ .../man/man3/FastAPIServer_FastAPIServer.3 | 152 ++++ docs/pyShelf/man/man3/objects.3 | 27 + docs/pyShelf/man/man3/objects_JSInterface.3 | 67 ++ docs/pyShelf/man/man3/src___main__.3 | 69 ++ .../src_backend_lib_api_hooks_DuckDuckGo.3 | 68 ++ .../pyShelf/man/man3/src_backend_lib_config.3 | 27 + .../man/man3/src_backend_lib_config_Config.3 | 258 ++++++ .../man3/src_backend_lib_library_Catalogue.3 | 272 ++++++ .../man/man3/src_backend_lib_models_Base.3 | 25 + .../man/man3/src_backend_lib_models_Book.3 | 111 +++ .../src_backend_lib_models_BookCollection.3 | 54 ++ .../man3/src_backend_lib_models_Collection.3 | 51 ++ .../man/man3/src_backend_lib_models_User.3 | 88 ++ .../man3/src_backend_lib_overide_ACatalogue.3 | 269 ++++++ .../man3/src_backend_lib_pyShelf_InitFiles.3 | 46 + .../man/man3/src_backend_lib_pyShelf_Server.3 | 102 +++ .../man/man3/src_backend_lib_storage.3 | 27 + .../man3/src_backend_lib_storage_Storage.3 | 297 +++++++ ...src_backend_tests_config_test_TestConfig.3 | 46 + ...backend_tests_library_test_TestCatalogue.3 | 41 + ...ackend_tests_library_test_Test_Catalogue.3 | 269 ++++++ ...c_backend_tests_library_test_Test_Config.3 | 207 +++++ docs/warn.log | 208 +++++ 109 files changed, 15102 insertions(+), 124 deletions(-) delete mode 100644 docker/Dockerfile delete mode 100644 docker/README.md delete mode 100644 docker/config.json delete mode 100644 docker/development.docker-compose.yml delete mode 100644 docker/docker-compose.yml delete mode 100644 docker/requirements.txt create mode 100644 docs/pyShelf/html/annotated.html create mode 100644 docs/pyShelf/html/classes.html create mode 100644 docs/pyShelf/html/d0/d49/classsrc_1_1backend_1_1lib_1_1models_1_1Collection-members.html create mode 100644 docs/pyShelf/html/d0/d93/namespacesrc_1_1backend_1_1lib_1_1config.html create mode 100644 docs/pyShelf/html/d1/dca/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1InitFiles-members.html create mode 100644 docs/pyShelf/html/d2/dcb/classobjects_1_1JSInterface-members.html create mode 100644 docs/pyShelf/html/d3/d29/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Config.html create mode 100644 docs/pyShelf/html/d3/d29/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Config.png create mode 100644 docs/pyShelf/html/d3/d4a/classsrc_1_1backend_1_1lib_1_1config_1_1Config-members.html create mode 100644 docs/pyShelf/html/d3/d95/classsrc_1_1backend_1_1tests_1_1library__test_1_1TestCatalogue-members.html create mode 100644 docs/pyShelf/html/d4/d6b/classFastAPIServer_1_1FastAPIServer-members.html create mode 100644 docs/pyShelf/html/d4/d71/classDataHooks_1_1BookInterface-members.html create mode 100644 docs/pyShelf/html/d5/d86/classsrc_1_1backend_1_1lib_1_1models_1_1BookCollection.html create mode 100644 docs/pyShelf/html/d5/d86/classsrc_1_1backend_1_1lib_1_1models_1_1BookCollection.png create mode 100644 docs/pyShelf/html/d5/da5/classsrc_1_1backend_1_1lib_1_1library_1_1Catalogue.html create mode 100644 docs/pyShelf/html/d5/da5/classsrc_1_1backend_1_1lib_1_1library_1_1Catalogue.png create mode 100644 docs/pyShelf/html/d5/ddf/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Config-members.html create mode 100644 docs/pyShelf/html/d5/dee/classsrc_1_1backend_1_1tests_1_1config__test_1_1TestConfig-members.html create mode 100644 docs/pyShelf/html/d6/d20/classsrc_1_1backend_1_1lib_1_1library_1_1Catalogue-members.html create mode 100644 docs/pyShelf/html/d6/d4e/classsrc_1_1backend_1_1lib_1_1models_1_1Book.html create mode 100644 docs/pyShelf/html/d6/d4e/classsrc_1_1backend_1_1lib_1_1models_1_1Book.png create mode 100644 docs/pyShelf/html/d6/d90/classsrc_1_1backend_1_1lib_1_1models_1_1Base.html create mode 100644 docs/pyShelf/html/d6/d90/classsrc_1_1backend_1_1lib_1_1models_1_1Base.png create mode 100644 docs/pyShelf/html/d7/d40/classsrc_1_1backend_1_1lib_1_1storage_1_1Storage.html create mode 100644 docs/pyShelf/html/d7/d88/classsrc_1_1backend_1_1lib_1_1api__hooks_1_1DuckDuckGo.html create mode 100644 docs/pyShelf/html/d7/db9/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1Server.html create mode 100644 docs/pyShelf/html/d7/dd7/namespacesrc_1_1____main____.html create mode 100644 docs/pyShelf/html/d7/df9/namespaceDataHooks.html create mode 100644 docs/pyShelf/html/d8/d3d/classsrc_1_1backend_1_1tests_1_1library__test_1_1TestCatalogue.html create mode 100644 docs/pyShelf/html/d8/def/classobjects_1_1JSInterface.html create mode 100644 docs/pyShelf/html/d8/dfe/classsrc_1_1backend_1_1lib_1_1config_1_1Config.html create mode 100644 docs/pyShelf/html/d8/dfe/classsrc_1_1backend_1_1lib_1_1config_1_1Config.png create mode 100644 docs/pyShelf/html/d9/d0e/classsrc_1_1backend_1_1lib_1_1models_1_1User-members.html create mode 100644 docs/pyShelf/html/d9/d71/classDataHooks_1_1BookInterface.html create mode 100644 docs/pyShelf/html/d9/d8b/classsrc_1_1backend_1_1lib_1_1overide_1_1ACatalogue-members.html create mode 100644 docs/pyShelf/html/da/d3c/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1InitFiles.html create mode 100644 docs/pyShelf/html/da/dc1/classsrc_1_1backend_1_1lib_1_1models_1_1Book-members.html create mode 100644 docs/pyShelf/html/db/d9a/classsrc_1_1backend_1_1lib_1_1storage_1_1Storage-members.html create mode 100644 docs/pyShelf/html/db/dd5/namespaceFastAPIServer.html create mode 100644 docs/pyShelf/html/db/dda/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Catalogue.html create mode 100644 docs/pyShelf/html/db/dda/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Catalogue.png create mode 100644 docs/pyShelf/html/dc/d3e/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Catalogue-members.html create mode 100644 docs/pyShelf/html/dc/ded/classsrc_1_1backend_1_1lib_1_1overide_1_1ACatalogue.html create mode 100644 docs/pyShelf/html/dc/ded/classsrc_1_1backend_1_1lib_1_1overide_1_1ACatalogue.png create mode 100644 docs/pyShelf/html/dd/d22/classFastAPIServer_1_1FastAPIServer.html create mode 100644 docs/pyShelf/html/dd/d98/classsrc_1_1backend_1_1lib_1_1models_1_1User.html create mode 100644 docs/pyShelf/html/dd/d98/classsrc_1_1backend_1_1lib_1_1models_1_1User.png create mode 100644 docs/pyShelf/html/dd/de1/namespacesrc_1_1backend_1_1lib_1_1storage.html create mode 100644 docs/pyShelf/html/de/d11/classsrc_1_1backend_1_1lib_1_1api__hooks_1_1DuckDuckGo-members.html create mode 100644 docs/pyShelf/html/de/d6d/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1Server-members.html create mode 100644 docs/pyShelf/html/df/d03/classsrc_1_1backend_1_1lib_1_1models_1_1Collection.html create mode 100644 docs/pyShelf/html/df/d03/classsrc_1_1backend_1_1lib_1_1models_1_1Collection.png create mode 100644 docs/pyShelf/html/df/d4c/namespaceobjects.html create mode 100644 docs/pyShelf/html/df/d54/classsrc_1_1backend_1_1lib_1_1models_1_1BookCollection-members.html create mode 100644 docs/pyShelf/html/df/d83/classsrc_1_1backend_1_1tests_1_1config__test_1_1TestConfig.html create mode 100644 docs/pyShelf/html/dir_1c7294442ce83d360610449d04c9d7fc.html create mode 100644 docs/pyShelf/html/dir_3f615ade772d23cefe5e20dcb18424a2.html create mode 100644 docs/pyShelf/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html create mode 100644 docs/pyShelf/html/dir_8509b06bafa958d2011203a730bf5778.html create mode 100644 docs/pyShelf/html/dir_9020577e2da81c4cf5a5554c26431f94.html create mode 100644 docs/pyShelf/html/dir_d6d65651a873fbc3232a07f3f4a594e4.html create mode 100644 docs/pyShelf/html/doxygen.svg create mode 100644 docs/pyShelf/html/doxygen_crawl.html create mode 100644 docs/pyShelf/html/dynsections.js create mode 100644 docs/pyShelf/html/files.html create mode 100644 docs/pyShelf/html/functions.html create mode 100644 docs/pyShelf/html/functions_func.html create mode 100644 docs/pyShelf/html/hierarchy.html create mode 100644 docs/pyShelf/html/index.hhc create mode 100644 docs/pyShelf/html/index.hhk create mode 100644 docs/pyShelf/html/index.hhp create mode 100644 docs/pyShelf/html/index.html create mode 100644 docs/pyShelf/html/jquery.js create mode 100644 docs/pyShelf/html/menudata.js create mode 100644 docs/pyShelf/html/namespacemembers.html create mode 100644 docs/pyShelf/html/namespacemembers_func.html create mode 100644 docs/pyShelf/html/namespaces.html create mode 100644 docs/pyShelf/man/man3/DataHooks.3 create mode 100644 docs/pyShelf/man/man3/DataHooks_BookInterface.3 create mode 100644 docs/pyShelf/man/man3/FastAPIServer.3 create mode 100644 docs/pyShelf/man/man3/FastAPIServer_FastAPIServer.3 create mode 100644 docs/pyShelf/man/man3/objects.3 create mode 100644 docs/pyShelf/man/man3/objects_JSInterface.3 create mode 100644 docs/pyShelf/man/man3/src___main__.3 create mode 100644 docs/pyShelf/man/man3/src_backend_lib_api_hooks_DuckDuckGo.3 create mode 100644 docs/pyShelf/man/man3/src_backend_lib_config.3 create mode 100644 docs/pyShelf/man/man3/src_backend_lib_config_Config.3 create mode 100644 docs/pyShelf/man/man3/src_backend_lib_library_Catalogue.3 create mode 100644 docs/pyShelf/man/man3/src_backend_lib_models_Base.3 create mode 100644 docs/pyShelf/man/man3/src_backend_lib_models_Book.3 create mode 100644 docs/pyShelf/man/man3/src_backend_lib_models_BookCollection.3 create mode 100644 docs/pyShelf/man/man3/src_backend_lib_models_Collection.3 create mode 100644 docs/pyShelf/man/man3/src_backend_lib_models_User.3 create mode 100644 docs/pyShelf/man/man3/src_backend_lib_overide_ACatalogue.3 create mode 100644 docs/pyShelf/man/man3/src_backend_lib_pyShelf_InitFiles.3 create mode 100644 docs/pyShelf/man/man3/src_backend_lib_pyShelf_Server.3 create mode 100644 docs/pyShelf/man/man3/src_backend_lib_storage.3 create mode 100644 docs/pyShelf/man/man3/src_backend_lib_storage_Storage.3 create mode 100644 docs/pyShelf/man/man3/src_backend_tests_config_test_TestConfig.3 create mode 100644 docs/pyShelf/man/man3/src_backend_tests_library_test_TestCatalogue.3 create mode 100644 docs/pyShelf/man/man3/src_backend_tests_library_test_Test_Catalogue.3 create mode 100644 docs/pyShelf/man/man3/src_backend_tests_library_test_Test_Config.3 create mode 100644 docs/warn.log diff --git a/docker/Dockerfile b/docker/Dockerfile deleted file mode 100644 index 401be3f..0000000 --- a/docker/Dockerfile +++ /dev/null @@ -1,38 +0,0 @@ - -# This file is used to build the Dockerhub image. To host pyShelf yourself for -# production, please use the official pyShelf image on -# https://hub.docker.com/r/pyshelf/pyshelf - -# Use the following commands to build and push the docker image to Dockerhub: -# -# docker build -t pyshelf/pyshelf -f ./docker/Dockerfile . -# docker login -# docker push pyshelf/pyshelf - -FROM ubuntu:latest - -EXPOSE 8080 -EXPOSE 1337 - -RUN apt-get update -y -RUN apt-get upgrade -y -RUN apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev \ -libnss3-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev wget \ -libbz2-dev curl -y -RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash -RUN export NVM_DIR="$HOME/.nvm" ; \ -[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" ; nvm install 14 npm -WORKDIR /tmp -RUN wget https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tgz -RUN tar -xf Python-3.12.0.tgz -WORKDIR /tmp/Python-3.12.0/ -RUN ./configure --enable-optimizations -RUN make -j 4 -RUN make install - -COPY . /pyshelf -COPY ./docker/config.json /pyshelf/config.json -COPY ./docker/requirements.txt /pyshelf/requirements.txt -WORKDIR /pyshelf/ -RUN python3 -m pip install --no-cache-dir -r requirements.txt -ENTRYPOINT hatch run ./pyShelf.py diff --git a/docker/README.md b/docker/README.md deleted file mode 100644 index 1892116..0000000 --- a/docker/README.md +++ /dev/null @@ -1,4 +0,0 @@ -Use `docker build -t pyshelf/pyshelf -f ./docker/Dockerfile .` in the project root to build the pyshelf image. - -Make sure the following files are in sync: -* config.json diff --git a/docker/config.json b/docker/config.json deleted file mode 100644 index e9f4c58..0000000 --- a/docker/config.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "TITLE": "pyShelf E-Book Server", - "VERSION": "0.8.0", - "BOOKPATH": "/books", - "DB_HOST": "127.0.0.1", - "DB_PORT": "5433", - "DB_ENGINE": "sqlite", - "DATABASE": "pyshelf", - "USER": "pyshelf", - "PASSWORD": "pyshelf", - "BOOKSHELF": "data/shelf.json", - "ALLOWED_HOSTS": [ - "localhost", - "127.0.0.1", - "[::1]", - "0.0.0.0" - ], - "BUILD_MODE": "production" -} diff --git a/docker/development.docker-compose.yml b/docker/development.docker-compose.yml deleted file mode 100644 index 138c4a8..0000000 --- a/docker/development.docker-compose.yml +++ /dev/null @@ -1,36 +0,0 @@ -version: "3.7" - -# This file is used to test the Dockerhub image. To host pyShelf yourself for -# production, please use the official pyShelf image on -# https://hub.docker.com/r/pyshelf/pyshelf - -# For development, use the following command in the root folder: -# -# docker-compose -f ./docker/development.docker-compose.yml up --build - -services: -# db: -# image: "postgres" -# environment: -# - "POSTGRES_PASSWORD=pyshelf" -# - "POSTGRES_USER=pyshelf" -# - "POSTGRES_DB=pyshelf" -# volumes: -# - "db_data:/var/lib/postgresql/data/" -# ports: -# - "5433:5432" - - pyshelf: - build: - context: .. - dockerfile: ./docker/Dockerfile - ports: - - "8080:8000" - - "1337:1337" - volumes: - - "${LOCAL_BOOK_DIR}:/books" -# depends_on: -# - db - -# volumes: -# db_data: diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml deleted file mode 100644 index 864b417..0000000 --- a/docker/docker-compose.yml +++ /dev/null @@ -1,26 +0,0 @@ -version: "3.7" - -services: -# db: -# image: "postgres" -# restart: always -# environment: -# - "POSTGRES_PASSWORD=pyshelf" -# - "POSTGRES_USER=pyshelf" -# - "POSTGRES_DB=pyshelf" -# volumes: -# - "db_data:/var/lib/postgresql/data/" -# ports: -# - "5433:5432" - pyshelf: - image: "pyshelf/pyshelf" - restart: always - ports: - - "8000:8000" - - "1337:1337" - volumes: - - "${LOCAL_BOOK_DIR}:/books" -# depends_on: -# - db -#volumes: -# db_data: diff --git a/docker/requirements.txt b/docker/requirements.txt deleted file mode 100644 index f06bada..0000000 --- a/docker/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -hatch diff --git a/docs/pyShelf/html/annotated.html b/docs/pyShelf/html/annotated.html new file mode 100644 index 0000000..b1301d8 --- /dev/null +++ b/docs/pyShelf/html/annotated.html @@ -0,0 +1,104 @@ + + + + + + + +pyShelf Open Source Ebook Server: Class List + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + +
+
+
+
Class List
+
+
+
Here are the classes, structs, unions and interfaces with brief descriptions:
+
[detail level 12345]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 NDataHooks
 CBookInterface
 NFastAPIServer
 CFastAPIServer
 Nobjects
 CJSInterface
 Nsrc
 Nbackend
 Nlib
 Napi_hooks
 CDuckDuckGo
 Nconfig
 CConfig
 Nlibrary
 CCatalogue
 Nmodels
 CBase
 CBook
 CBookCollection
 CCollection
 CUser
 Noveride
 CACatalogue
 NpyShelf
 CInitFiles
 CServer
 Nstorage
 CStorage
 Ntests
 Nconfig_test
 CTestConfig
 Nlibrary_test
 CTest_Catalogue
 CTest_Config
 CTestCatalogue
+
+
+ + +
+ + diff --git a/docs/pyShelf/html/classes.html b/docs/pyShelf/html/classes.html new file mode 100644 index 0000000..1b0c1f2 --- /dev/null +++ b/docs/pyShelf/html/classes.html @@ -0,0 +1,98 @@ + + + + + + + +pyShelf Open Source Ebook Server: Class Index + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + +
+
+
+
Class Index
+
+
+
A | B | C | D | F | I | J | S | T | U
+
+
+
A
+
ACatalogue (src.backend.lib.overide)
+
+
B
+
Base (src.backend.lib.models)
Book (src.backend.lib.models)
BookCollection (src.backend.lib.models)
BookInterface (DataHooks)
+
+
C
+
Catalogue (src.backend.lib.library)
Collection (src.backend.lib.models)
Config (src.backend.lib.config)
+
+
D
+
DuckDuckGo (src.backend.lib.api_hooks)
+
+
F
+
FastAPIServer (FastAPIServer)
+
+
I
+
InitFiles (src.backend.lib.pyShelf)
+
+
J
+
JSInterface (objects)
+
+
S
+
Server (src.backend.lib.pyShelf)
Storage (src.backend.lib.storage)
+
+
T
+
Test_Catalogue (src.backend.tests.library_test)
Test_Config (src.backend.tests.library_test)
TestCatalogue (src.backend.tests.library_test)
TestConfig (src.backend.tests.config_test)
+
+
U
+
User (src.backend.lib.models)
+
+
+ + +
+ + diff --git a/docs/pyShelf/html/d0/d49/classsrc_1_1backend_1_1lib_1_1models_1_1Collection-members.html b/docs/pyShelf/html/d0/d49/classsrc_1_1backend_1_1lib_1_1models_1_1Collection-members.html new file mode 100644 index 0000000..4e997df --- /dev/null +++ b/docs/pyShelf/html/d0/d49/classsrc_1_1backend_1_1lib_1_1models_1_1Collection-members.html @@ -0,0 +1,75 @@ + + + + + + + +pyShelf Open Source Ebook Server: Member List + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+
src.backend.lib.models.Collection Member List
+
+
+ +

This is the complete list of members for src.backend.lib.models.Collection, including all inherited members.

+ + + + +
book_collections (defined in src.backend.lib.models.Collection)src.backend.lib.models.Collectionstatic
id (defined in src.backend.lib.models.Collection)src.backend.lib.models.Collectionstatic
name (defined in src.backend.lib.models.Collection)src.backend.lib.models.Collectionstatic
+ + +
+ + diff --git a/docs/pyShelf/html/d0/d93/namespacesrc_1_1backend_1_1lib_1_1config.html b/docs/pyShelf/html/d0/d93/namespacesrc_1_1backend_1_1lib_1_1config.html new file mode 100644 index 0000000..984d903 --- /dev/null +++ b/docs/pyShelf/html/d0/d93/namespacesrc_1_1backend_1_1lib_1_1config.html @@ -0,0 +1,75 @@ + + + + + + + +pyShelf Open Source Ebook Server: src.backend.lib.config Namespace Reference + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+ +
src.backend.lib.config Namespace Reference
+
+
+ + + +

+Classes

class  Config
+

Detailed Description

+
Pyshelf's Configuration Object.
+ + +
+ + diff --git a/docs/pyShelf/html/d1/dca/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1InitFiles-members.html b/docs/pyShelf/html/d1/dca/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1InitFiles-members.html new file mode 100644 index 0000000..c53ba80 --- /dev/null +++ b/docs/pyShelf/html/d1/dca/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1InitFiles-members.html @@ -0,0 +1,74 @@ + + + + + + + +pyShelf Open Source Ebook Server: Member List + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+
src.backend.lib.pyShelf.InitFiles Member List
+
+
+ +

This is the complete list of members for src.backend.lib.pyShelf.InitFiles, including all inherited members.

+ + + +
__init__(self, file_array) (defined in src.backend.lib.pyShelf.InitFiles)src.backend.lib.pyShelf.InitFiles
CreateFile(self, _pointer)src.backend.lib.pyShelf.InitFiles
+ + +
+ + diff --git a/docs/pyShelf/html/d2/dcb/classobjects_1_1JSInterface-members.html b/docs/pyShelf/html/d2/dcb/classobjects_1_1JSInterface-members.html new file mode 100644 index 0000000..e6b18ce --- /dev/null +++ b/docs/pyShelf/html/d2/dcb/classobjects_1_1JSInterface-members.html @@ -0,0 +1,76 @@ + + + + + + + +pyShelf Open Source Ebook Server: Member List + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+
objects.JSInterface Member List
+
+
+ +

This is the complete list of members for objects.JSInterface, including all inherited members.

+ + + + + +
__init__(self, Config config)objects.JSInterface
config (defined in objects.JSInterface)objects.JSInterface
install(self)objects.JSInterface
package_json (defined in objects.JSInterface)objects.JSInterface
+ + +
+ + diff --git a/docs/pyShelf/html/d3/d29/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Config.html b/docs/pyShelf/html/d3/d29/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Config.html new file mode 100644 index 0000000..5121e8e --- /dev/null +++ b/docs/pyShelf/html/d3/d29/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Config.html @@ -0,0 +1,721 @@ + + + + + + + +pyShelf Open Source Ebook Server: src.backend.tests.library_test.Test_Config Class Reference + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+ +
src.backend.tests.library_test.Test_Config Class Reference
+
+
+
+Inheritance diagram for src.backend.tests.library_test.Test_Config:
+
+
+ + +src.backend.lib.config.Config + +
+ + + + + + +

+Public Member Functions

 __init__ (self)
 open_file (self, root="config.json")
 init_config (self)
 get_logger (self)
+ + + + + + + + + + + + + + + + + + + + +

+Public Attributes

 root = root
dict config_structure
 logger = self.get_logger()
 book_path = env.get("BOOKPATH", self._data["BOOKPATH"])
str TITLE = env.get("TITLE", self._data["TITLE"])
 VERSION = env.get("VERSION", self._data["VERSION"])
 book_shelf = env.get("BOOKSHELF", self._data["BOOKSHELF"])
 catalogue_db = env.get("DATABASE", self._data["DATABASE"])
 user = self._data["USER"]
 password = self._data["PASSWORD"]
 db_host = env.get("DB_HOST", self._data["DB_HOST"])
 db_port = env.get("DB_PORT", self._data["DB_PORT"])
list file_array = [self.book_shelf]
bool auto_scan = True
 allowed_hosts
 db_engine = env.get("DB_ENGINE", self._data["DB_ENGINE"])
 db_user = env.get("USER", self._data["USER"])
 db_pass = env.get("PASSWORD", self._data["PASSWORD"])
 build_mode = env.get("BUILD_MODE", self._data["BUILD_MODE"])
+ + + + +

+Protected Attributes

str _fp = "config.json"
 _cp = Path.joinpath(root, self._fp)
 _data = self.init_config()
+

Detailed Description

+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + +
src.backend.tests.library_test.Test_Config.__init__ ( self)
+
+ +
+
+

Member Function Documentation

+ +

◆ get_logger()

+ +
+
+ + + + + +
+ + + + + + + +
src.backend.lib.config.Config.get_logger ( self)
+
+inherited
+
+
Instantiate logging system.
+
+
+ +

◆ init_config()

+ +
+
+ + + + + +
+ + + + + + + +
src.backend.lib.config.Config.init_config ( self)
+
+inherited
+
+ +
+
+ +

◆ open_file()

+ +
+
+ + + + + + + + + + + +
src.backend.tests.library_test.Test_Config.open_file ( self,
root = "config.json" )
+
+
Open config.json and reads in configuration options.
+

Reimplemented from src.backend.lib.config.Config.

+ +
+
+

Member Data Documentation

+ +

◆ _cp

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.config.Config._cp = Path.joinpath(root, self._fp)
+
+protectedinherited
+
+ +
+
+ +

◆ _data

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.config.Config._data = self.init_config()
+
+protectedinherited
+
+ +
+
+ +

◆ _fp

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.config.Config._fp = "config.json"
+
+protectedinherited
+
+ +
+
+ +

◆ allowed_hosts

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.config.Config.allowed_hosts
+
+inherited
+
+Initial value:
= env.get("ALLOWED_HOSTS",
+
self._data["ALLOWED_HOSTS"])
+
+
+
+ +

◆ auto_scan

+ +
+
+ + + + + +
+ + + + +
bool src.backend.lib.config.Config.auto_scan = True
+
+inherited
+
+ +
+
+ +

◆ book_path

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.config.Config.book_path = env.get("BOOKPATH", self._data["BOOKPATH"])
+
+inherited
+
+ +
+
+ +

◆ book_shelf

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.config.Config.book_shelf = env.get("BOOKSHELF", self._data["BOOKSHELF"])
+
+inherited
+
+ +
+
+ +

◆ build_mode

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.config.Config.build_mode = env.get("BUILD_MODE", self._data["BUILD_MODE"])
+
+inherited
+
+ +
+
+ +

◆ catalogue_db

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.config.Config.catalogue_db = env.get("DATABASE", self._data["DATABASE"])
+
+inherited
+
+ +
+
+ +

◆ config_structure

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.config.Config.config_structure
+
+inherited
+
+Initial value:
= {
+
"TITLE": "pyShelf E-Book Server",
+
"VERSION": "0.7.0",
+
"BOOKPATH": "/mnt/books",
+
"DB_HOST": "localhost",
+
"DB_PORT": "5432",
+
"DB_ENGINE": "sqlite",
+
"DATABASE": "pyshelf",
+
"USER": "pyshelf",
+
"PASSWORD": "pyshelf",
+
"BOOKSHELF": "data/shelf.json",
+
"ALLOWED_HOSTS": [
+
"localhost",
+
"127.0.0.1",
+
"[::1]",
+
"0.0.0.0"
+
],
+
"BUILD_MODE": "development"
+
}
+
+
+
+ +

◆ db_engine

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.config.Config.db_engine = env.get("DB_ENGINE", self._data["DB_ENGINE"])
+
+inherited
+
+ +
+
+ +

◆ db_host

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.config.Config.db_host = env.get("DB_HOST", self._data["DB_HOST"])
+
+inherited
+
+ +
+
+ +

◆ db_pass

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.config.Config.db_pass = env.get("PASSWORD", self._data["PASSWORD"])
+
+inherited
+
+ +
+
+ +

◆ db_port

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.config.Config.db_port = env.get("DB_PORT", self._data["DB_PORT"])
+
+inherited
+
+ +
+
+ +

◆ db_user

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.config.Config.db_user = env.get("USER", self._data["USER"])
+
+inherited
+
+ +
+
+ +

◆ file_array

+ +
+
+ + + + + +
+ + + + +
list src.backend.lib.config.Config.file_array = [self.book_shelf]
+
+inherited
+
+ +
+
+ +

◆ logger

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.config.Config.logger = self.get_logger()
+
+inherited
+
+ +
+
+ +

◆ password

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.config.Config.password = self._data["PASSWORD"]
+
+inherited
+
+ +
+
+ +

◆ root

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.config.Config.root = root
+
+inherited
+
+ +
+
+ +

◆ TITLE

+ +
+
+ + + + + +
+ + + + +
str src.backend.lib.config.Config.TITLE = env.get("TITLE", self._data["TITLE"])
+
+inherited
+
+ +
+
+ +

◆ user

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.config.Config.user = self._data["USER"]
+
+inherited
+
+ +
+
+ +

◆ VERSION

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.config.Config.VERSION = env.get("VERSION", self._data["VERSION"])
+
+inherited
+
+ +
+
+
The documentation for this class was generated from the following file: +
+ + +
+ + diff --git a/docs/pyShelf/html/d3/d29/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Config.png b/docs/pyShelf/html/d3/d29/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Config.png new file mode 100644 index 0000000000000000000000000000000000000000..e7291f71db80d5b2ddf6458dd5dc585d45aba03d GIT binary patch literal 872 zcmV-u1DE`XP)vTJr#LVva2S`&=-}Ys|Ns9r%~qrU000SeQchC<|NsC0|NsC0Hv*f~0008> zNklyGOn41|Y?RQdg%_+&!@HaM4dx3^=ej8ecDK4YA}n5Jn8DNH08P=lN# zV`-3+WGwxjJdtE8x3l)oul$hYzEbLJ()=SyE60!|5A`x(xJRkzc;PPpxny`EsoZPLjvEZ1_dlPLhADK~9pfG{{LZmS*y4 znx=>XfVb%e03j8Y{C10q9+rFt4~ia_eAIRTh^9df0I@X40U(wJIRM1cAP0b08sq>F zOM@H$Vrh^AKr9V%0EneQ4gj$<$N?ah1~~x4(jW(b*DIxzLJCPlB%lVlh)66AauJbO zIw5xl_hzj9?XYRjjr@p+oXB^yR%Q`Vk8bv(xwrB62J!X|6}(r(VYU+w4r>b;y@@5mm0Kco=#{<1G~^o6{R==Im8 z=3Vz&8pUE;-Pr3#kvpq3EBlU`W9^5mk=b9nO+~Kko9SvFDm$E@bQ?Ak%{|vE>GlqJ zm+k&gPrkd&F56x5Ts16t?d!?cDzjaVKHJrd&9)7a>qwEiLywSqQFrETx3ftSH#wYB z>B(&rT5`A16tUxMKP7kevwzS1z6b9474rM;c^TXz@9w$E_F8RCZ7(&n)DE-pk_k;o zUfbrtYi(D)oe#6)$gS=5HmUD + + + + + + +pyShelf Open Source Ebook Server: Member List + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+
src.backend.lib.config.Config Member List
+
+
+ +

This is the complete list of members for src.backend.lib.config.Config, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
__init__(self, root)src.backend.lib.config.Config
_cp (defined in src.backend.lib.config.Config)src.backend.lib.config.Configprotected
_data (defined in src.backend.lib.config.Config)src.backend.lib.config.Configprotected
_fp (defined in src.backend.lib.config.Config)src.backend.lib.config.Configprotected
allowed_hosts (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
auto_scan (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
book_path (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
book_shelf (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
build_mode (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
catalogue_db (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
config_structure (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
db_engine (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
db_host (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
db_pass (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
db_port (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
db_user (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
file_array (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
get_logger(self)src.backend.lib.config.Config
init_config(self) (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
logger (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
open_file(self)src.backend.lib.config.Config
password (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
root (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
TITLE (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
user (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
VERSION (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
+ + +
+ + diff --git a/docs/pyShelf/html/d3/d95/classsrc_1_1backend_1_1tests_1_1library__test_1_1TestCatalogue-members.html b/docs/pyShelf/html/d3/d95/classsrc_1_1backend_1_1tests_1_1library__test_1_1TestCatalogue-members.html new file mode 100644 index 0000000..4265152 --- /dev/null +++ b/docs/pyShelf/html/d3/d95/classsrc_1_1backend_1_1tests_1_1library__test_1_1TestCatalogue-members.html @@ -0,0 +1,75 @@ + + + + + + + +pyShelf Open Source Ebook Server: Member List + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+
src.backend.tests.library_test.TestCatalogue Member List
+
+ + + +
+ + diff --git a/docs/pyShelf/html/d4/d6b/classFastAPIServer_1_1FastAPIServer-members.html b/docs/pyShelf/html/d4/d6b/classFastAPIServer_1_1FastAPIServer-members.html new file mode 100644 index 0000000..8fefa24 --- /dev/null +++ b/docs/pyShelf/html/d4/d6b/classFastAPIServer_1_1FastAPIServer-members.html @@ -0,0 +1,87 @@ + + + + + + + +pyShelf Open Source Ebook Server: Member List + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+
FastAPIServer.FastAPIServer Member List
+
+
+ +

This is the complete list of members for FastAPIServer.FastAPIServer, including all inherited members.

+ + + + + + + + + + + + + + + + +
__init__(self, config)FastAPIServer.FastAPIServer
book(Request request, int book_id) (defined in FastAPIServer.FastAPIServer)FastAPIServer.FastAPIServer
book(Request request, int book_id) (defined in FastAPIServer.FastAPIServer)FastAPIServer.FastAPIServer
books(Request request, int skip=0, int limit=10, collection=None) (defined in FastAPIServer.FastAPIServer)FastAPIServer.FastAPIServer
collection(Request request, str collection, int skip=0, int limit=30)FastAPIServer.FastAPIServer
collections(Request request) (defined in FastAPIServer.FastAPIServer)FastAPIServer.FastAPIServer
compile_static_files(self)FastAPIServer.FastAPIServer
config (defined in FastAPIServer.FastAPIServer)FastAPIServer.FastAPIServer
fe_config (defined in FastAPIServer.FastAPIServer)FastAPIServer.FastAPIServer
fe_server (defined in FastAPIServer.FastAPIServer)FastAPIServer.FastAPIServer
index(Request request, int skip=0, int limit=30) (defined in FastAPIServer.FastAPIServer)FastAPIServer.FastAPIServer
JSInterface (defined in FastAPIServer.FastAPIServer)FastAPIServer.FastAPIServer
run(self)FastAPIServer.FastAPIServer
search_books_api(Request request, str search)FastAPIServer.FastAPIServer
use_route_names_as_operation_ids(self, FastAPI app)FastAPIServer.FastAPIServer
+ + +
+ + diff --git a/docs/pyShelf/html/d4/d71/classDataHooks_1_1BookInterface-members.html b/docs/pyShelf/html/d4/d71/classDataHooks_1_1BookInterface-members.html new file mode 100644 index 0000000..d81d64e --- /dev/null +++ b/docs/pyShelf/html/d4/d71/classDataHooks_1_1BookInterface-members.html @@ -0,0 +1,74 @@ + + + + + + + +pyShelf Open Source Ebook Server: Member List + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+
DataHooks.BookInterface Member List
+
+
+ +

This is the complete list of members for DataHooks.BookInterface, including all inherited members.

+ + + +
config (defined in DataHooks.BookInterface)DataHooks.BookInterface
db (defined in DataHooks.BookInterface)DataHooks.BookInterface
+ + +
+ + diff --git a/docs/pyShelf/html/d5/d86/classsrc_1_1backend_1_1lib_1_1models_1_1BookCollection.html b/docs/pyShelf/html/d5/d86/classsrc_1_1backend_1_1lib_1_1models_1_1BookCollection.html new file mode 100644 index 0000000..29e3c13 --- /dev/null +++ b/docs/pyShelf/html/d5/d86/classsrc_1_1backend_1_1lib_1_1models_1_1BookCollection.html @@ -0,0 +1,205 @@ + + + + + + + +pyShelf Open Source Ebook Server: src.backend.lib.models.BookCollection Class Reference + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+ +
src.backend.lib.models.BookCollection Class Reference
+
+
+
+Inheritance diagram for src.backend.lib.models.BookCollection:
+
+
+ + +src.backend.lib.models.Base + +
+ + + + + + + +

+Static Public Attributes

Mapped id = mapped_column(primary_key=True)
Mapped book_id = mapped_column(ForeignKey("Book.id"))
Mapped collection_id = mapped_column(ForeignKey("Collection.id"))
 book = relationship("Book", back_populates="book_collections")
 collection = relationship("Collection", back_populates="book_collections")
+

Detailed Description

+
Association table linking Books and Collections.

Member Data Documentation

+ +

◆ book

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.models.BookCollection.book = relationship("Book", back_populates="book_collections")
+
+static
+
+ +
+
+ +

◆ book_id

+ +
+
+ + + + + +
+ + + + +
Mapped src.backend.lib.models.BookCollection.book_id = mapped_column(ForeignKey("Book.id"))
+
+static
+
+ +
+
+ +

◆ collection

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.models.BookCollection.collection = relationship("Collection", back_populates="book_collections")
+
+static
+
+ +
+
+ +

◆ collection_id

+ +
+
+ + + + + +
+ + + + +
Mapped src.backend.lib.models.BookCollection.collection_id = mapped_column(ForeignKey("Collection.id"))
+
+static
+
+ +
+
+ +

◆ id

+ +
+
+ + + + + +
+ + + + +
Mapped src.backend.lib.models.BookCollection.id = mapped_column(primary_key=True)
+
+static
+
+ +
+
+
The documentation for this class was generated from the following file: +
+ + +
+ + diff --git a/docs/pyShelf/html/d5/d86/classsrc_1_1backend_1_1lib_1_1models_1_1BookCollection.png b/docs/pyShelf/html/d5/d86/classsrc_1_1backend_1_1lib_1_1models_1_1BookCollection.png new file mode 100644 index 0000000000000000000000000000000000000000..6b6b1a16d856f6b8bbc87082a1e89d5a3a1e0275 GIT binary patch literal 1095 zcmeAS@N?(olHy`uVBq!ia0vp^&w#jtgBeI3@k(C|q@)9ULR|m<{|{uoc=NTi|Il&^ z1I+@7>1SR%c<=xyZhAIs2~du+B*-tA0mugfbEer>7#Nr@dAc};R4~4sn^^S9fT!j9 zDW288=l=+F$~jr6(0bvz)~gLOPHbDFKk4dzjipn5I4Pcd;pH=_XVDRrlNweWpRb+u zxRm|ocUG)#j)lTWOn4$_CG`1Qt^X;Th{L*_@%#7hd&imkS#f6{E-~PTLs$<&fZ<~yWa4b%(|zWLwEX|o0fVj zWwV}nvC7Y7b`yQ4A9LC?`S=&z6*Jxb&QOWJba8Ik@4R&ecbC~0nP*q>TIW99@pm4t zY4$$5=}-4>x;*Jgepu3^6cJT5Pq#o2V=nvVDM5$08S0|M89LS%C&cM3e_+G@Z0aYT zIqC<`_;E87PMN_V;M&Q_5J(C`{-TL*a806+VCT9cB7&WZz=XL$cZbLNg&S|KKm12f z@Mh5LGVasY=Xado{#AK~y?b85yBk_cMwjf){M4Nmt@cWKuid#c>pR6;ZFGWb&DKt4 zJ+OA|y*HP#BEz<^3r=Le)f$<+zrS~HYBn{0CK3La`&m{V`}4Rn zztr|#b7(SNrojLtfWX|&g zdxGXQepZ=rGm}xFPe_ zuUZwIbvf_hTJ2Sq)o0SG1ut8?=>8@>!*0v+8Eu)ZH}@Nz|KMi!yYFk%#k@JThfJP5FE7ryy=V4o z-TQlI>n?kq_(u2Etv&EC|EKXd<*I1=+-*}I?7BQ__2&hb`E1_*+P`v@lw&85a77T$ g59%zP^5GZz + + + + + + +pyShelf Open Source Ebook Server: src.backend.lib.library.Catalogue Class Reference + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+ +
src.backend.lib.library.Catalogue Class Reference
+
+
+
+Inheritance diagram for src.backend.lib.library.Catalogue:
+
+
+ + +src.backend.lib.overide.ACatalogue +src.backend.tests.library_test.Test_Catalogue + +
+ + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self, config)
 scan_folder (self, _path=None)
 filter_books (self)
 process_by_filetype (self, book)
 extract_metadata_epub (self, book)
 extract_metadata_pdf (self, book)
 extract_metadata_mobi (self, book)
 extract_content (self, book_zip, book)
 extract_cover_html (self, book_zip, book)
 extract_cover_image (self, book_zip, book)
 compare_shelf_current (self)
 import_books (self, list=None, **kwargs)
+ + + +

+Static Public Member Functions

 process_epub (book)
 stripTags (source)
+ + + + + + + + + + + + + +

+Public Attributes

list file_list = []
 opf_regx = re.compile(r"\.opf")
 cover_regx = re.compile(r"\.jpg|\.jpeg|\.png|\.bmp|\.gif")
 html_regx = re.compile(r"\.html")
 title_sanitization_regx = re.compile(r"^(Book )+[0-9]*")
 title_sanitization_lvl2_regx
 title_sanitization_dirs_regx = re.compile(r"/")
 root_dir = config.root
 book_folder = config.book_path
 books = None
 db_pointer = config.catalogue_db
 config = config
+

Detailed Description

+
Decodes book metadata for storage
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + +
src.backend.lib.library.Catalogue.__init__ ( self,
config )
+
+ +
+
+

Member Function Documentation

+ +

◆ compare_shelf_current()

+ +
+
+ + + + + + + +
src.backend.lib.library.Catalogue.compare_shelf_current ( self)
+
+
Calls storage system, gets list of books stored and compares against files on disk
+
+
+
+ +

◆ extract_content()

+ +
+
+ + + + + + + + + + + + + + + + +
src.backend.lib.library.Catalogue.extract_content ( self,
book_zip,
book )
+
+
Opens epub as zip file filters then stores as list any files matching opf_regx
+
+
+
+ +

◆ extract_cover_html()

+ +
+
+ + + + + + + + + + + + + + + + +
src.backend.lib.library.Catalogue.extract_cover_html ( self,
book_zip,
book )
+
+
Opens epub as zip file filters then stores as list any files matching html_regx
+
+
+
+ +

◆ extract_cover_image()

+ +
+
+ + + + + + + + + + + + + + + + +
src.backend.lib.library.Catalogue.extract_cover_image ( self,
book_zip,
book )
+
+
Opens epub as zip file filters then stores as list any files matching cover_regx
+
+
+
+ +

◆ extract_metadata_epub()

+ +
+
+ + + + + + + + + + + +
src.backend.lib.library.Catalogue.extract_metadata_epub ( self,
book )
+
+
Extract metadata from epub file
+
+:param book: Dictionary of epub file contents
+:returns: Dictionary of book metadata
+
+
+
+ +

◆ extract_metadata_mobi()

+ +
+
+ + + + + + + + + + + +
src.backend.lib.library.Catalogue.extract_metadata_mobi ( self,
book )
+
+ +
+
+ +

◆ extract_metadata_pdf()

+ +
+
+ + + + + + + + + + + +
src.backend.lib.library.Catalogue.extract_metadata_pdf ( self,
book )
+
+
Return extracted metadata
+:NOTES: Retrieval of data has been problematic, some pdf's providing
+reliable titles that corespond with the actual, and others being
+nonsense.
+
+
+
+ +

◆ filter_books()

+ +
+
+ + + + + + + +
src.backend.lib.library.Catalogue.filter_books ( self)
+
+
Calls scan_folder and filters out book files.
+
+:returns self._book_list_expanded: json string containing
+all book metadata
+
+

Reimplemented in src.backend.tests.library_test.Test_Catalogue.

+ +
+
+ +

◆ import_books()

+ +
+
+ + + + + + + + + + + + + + + + +
src.backend.lib.library.Catalogue.import_books ( self,
list = None,
** kwargs )
+
+
Main entry point for import operations.
+Gets a list of new files via compare_shelf_current.
+Iterates over list and inserts new books into database.
+
+

Reimplemented in src.backend.lib.overide.ACatalogue.

+ +
+
+ +

◆ process_by_filetype()

+ +
+
+ + + + + + + + + + + +
src.backend.lib.library.Catalogue.process_by_filetype ( self,
book )
+
+
Determine books filetype and process.
+
+
+ +

◆ process_epub()

+ +
+
+ + + + + +
+ + + + + + + +
src.backend.lib.library.Catalogue.process_epub ( book)
+
+static
+
+
Return dictionary of epub file contents
+
+
+ +

◆ scan_folder()

+ +
+
+ + + + + + + + + + + +
src.backend.lib.library.Catalogue.scan_folder ( self,
_path = None )
+
+
Scan folder by _path, allows recurisive scanning
+
+:param _path: Path to scan
+
+

Reimplemented in src.backend.lib.overide.ACatalogue.

+ +
+
+ +

◆ stripTags()

+ +
+
+ + + + + +
+ + + + + + + +
src.backend.lib.library.Catalogue.stripTags ( source)
+
+static
+
+ +
+
+

Member Data Documentation

+ +

◆ book_folder

+ +
+
+ + + + +
src.backend.lib.library.Catalogue.book_folder = config.book_path
+
+ +
+
+ +

◆ books

+ +
+
+ + + + +
src.backend.lib.library.Catalogue.books = None
+
+ +
+
+ +

◆ config

+ +
+
+ + + + +
src.backend.lib.library.Catalogue.config = config
+
+ +
+
+ +

◆ cover_regx

+ +
+
+ + + + +
src.backend.lib.library.Catalogue.cover_regx = re.compile(r"\.jpg|\.jpeg|\.png|\.bmp|\.gif")
+
+ +
+
+ +

◆ db_pointer

+ +
+
+ + + + +
src.backend.lib.library.Catalogue.db_pointer = config.catalogue_db
+
+ +
+
+ +

◆ file_list

+ +
+
+ + + + +
list src.backend.lib.library.Catalogue.file_list = []
+
+ +
+
+ +

◆ html_regx

+ +
+
+ + + + +
src.backend.lib.library.Catalogue.html_regx = re.compile(r"\.html")
+
+ +
+
+ +

◆ opf_regx

+ +
+
+ + + + +
src.backend.lib.library.Catalogue.opf_regx = re.compile(r"\.opf")
+
+ +
+
+ +

◆ root_dir

+ +
+
+ + + + +
src.backend.lib.library.Catalogue.root_dir = config.root
+
+ +
+
+ +

◆ title_sanitization_dirs_regx

+ +
+
+ + + + +
src.backend.lib.library.Catalogue.title_sanitization_dirs_regx = re.compile(r"/")
+
+ +
+
+ +

◆ title_sanitization_lvl2_regx

+ +
+
+ + + + +
src.backend.lib.library.Catalogue.title_sanitization_lvl2_regx
+
+Initial value:
= re.compile(
+
r"^(Book )+[0-9]*\W+(-)")
+
+
+
+ +

◆ title_sanitization_regx

+ +
+
+ + + + +
src.backend.lib.library.Catalogue.title_sanitization_regx = re.compile(r"^(Book )+[0-9]*")
+
+ +
+
+
The documentation for this class was generated from the following file: +
+ + +
+ + diff --git a/docs/pyShelf/html/d5/da5/classsrc_1_1backend_1_1lib_1_1library_1_1Catalogue.png b/docs/pyShelf/html/d5/da5/classsrc_1_1backend_1_1lib_1_1library_1_1Catalogue.png new file mode 100644 index 0000000000000000000000000000000000000000..13f6a78f6bd66ba8f01a5126d308e40d830b8ab4 GIT binary patch literal 1462 zcmbtUX;f236n+VdvIrPt35x~$Y5@TSMIa(Z36jVbLkzM+c0t({kO~Nu#Tt-2lL)nl zSa}2p%4PvU2^Pi3qOus&gDe(-5HKK>-AZ3Pr>FLJ=f^kS-1+X@duQg{i)1&a4T?I7 z003+t5eXCkK!XS;ua`k^GwS+%WYQ(OP#xFS)(|S1o{wj?mfGwvj?vEV5{-{hoHi=+QOBeHJmhOb#TsPpPoY3@R># z5`iJ%e4Iz-J58YyaiM7n>WT~+-7+{$y1lNw_wXU(y;r0u+ksp$@J=)5 zIMoR|P04VGa;94?qq#*5AE@I!v~S1HMXk5`DYyQqi_Q=jmwZ%evJ+@&g%AOg6&c94 z;ExhnHbt>Pn#-zTBktigg{>u6ZL9mGu&?`(b0MIlX&jJ#+yfV13!m^`v%AE3iJq*7Nb z22i?T?11)1?LzV~P2(yf;%<&q{L2@AL_DHv<=PkQ+P6zz&VP9c{adilv^?IkzAXxf z3;Ex4-mE@n)aEmv8>=T6&X2?jVoe_zk@`m&5Rp~)D$rW_A{ZY`lw!zNIByB2gJV3J zMEVW$VE%$8tF@V?+)%MwQvU3_a^4;2{@p~8EP*4JJts`cEldZa z$n}0n%(t(E_4Y-Sbu8K{h83|S?r&CVchYJ}Et&~9j_1FT2OXQrTaaMeCb{B1Gb0WA z_wf@3uX{TUS0h3#Wnav;9b>z~{CC~ipioG%{>JMQ?l0}F-Vo<_M)aS#Xi(@mW1Aq) z5-XVR8M3~&(1slpg~wjC6h?uQ4F2vxV(&~l($7d@X;=F%isjpFa*M6}P^?%z dr*Qsf8O{ma!zT_eJw`e#Kyq{=R37j@|2LlGqwD|x literal 0 HcmV?d00001 diff --git a/docs/pyShelf/html/d5/ddf/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Config-members.html b/docs/pyShelf/html/d5/ddf/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Config-members.html new file mode 100644 index 0000000..b912f6e --- /dev/null +++ b/docs/pyShelf/html/d5/ddf/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Config-members.html @@ -0,0 +1,98 @@ + + + + + + + +pyShelf Open Source Ebook Server: Member List + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+
src.backend.tests.library_test.Test_Config Member List
+
+
+ +

This is the complete list of members for src.backend.tests.library_test.Test_Config, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
__init__(self) (defined in src.backend.tests.library_test.Test_Config)src.backend.tests.library_test.Test_Config
_cp (defined in src.backend.lib.config.Config)src.backend.lib.config.Configprotected
_data (defined in src.backend.lib.config.Config)src.backend.lib.config.Configprotected
_fp (defined in src.backend.lib.config.Config)src.backend.lib.config.Configprotected
allowed_hosts (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
auto_scan (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
book_path (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
book_shelf (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
build_mode (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
catalogue_db (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
config_structure (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
db_engine (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
db_host (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
db_pass (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
db_port (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
db_user (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
file_array (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
get_logger(self)src.backend.lib.config.Config
init_config(self) (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
logger (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
open_file(self, root="config.json")src.backend.tests.library_test.Test_Config
password (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
root (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
TITLE (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
user (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
VERSION (defined in src.backend.lib.config.Config)src.backend.lib.config.Config
+ + +
+ + diff --git a/docs/pyShelf/html/d5/dee/classsrc_1_1backend_1_1tests_1_1config__test_1_1TestConfig-members.html b/docs/pyShelf/html/d5/dee/classsrc_1_1backend_1_1tests_1_1config__test_1_1TestConfig-members.html new file mode 100644 index 0000000..1cfe6bf --- /dev/null +++ b/docs/pyShelf/html/d5/dee/classsrc_1_1backend_1_1tests_1_1config__test_1_1TestConfig-members.html @@ -0,0 +1,76 @@ + + + + + + + +pyShelf Open Source Ebook Server: Member List + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+
src.backend.tests.config_test.TestConfig Member List
+
+ + + +
+ + diff --git a/docs/pyShelf/html/d6/d20/classsrc_1_1backend_1_1lib_1_1library_1_1Catalogue-members.html b/docs/pyShelf/html/d6/d20/classsrc_1_1backend_1_1lib_1_1library_1_1Catalogue-members.html new file mode 100644 index 0000000..767df66 --- /dev/null +++ b/docs/pyShelf/html/d6/d20/classsrc_1_1backend_1_1lib_1_1library_1_1Catalogue-members.html @@ -0,0 +1,98 @@ + + + + + + + +pyShelf Open Source Ebook Server: Member List + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+
src.backend.lib.library.Catalogue Member List
+
+
+ +

This is the complete list of members for src.backend.lib.library.Catalogue, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
__init__(self, config) (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
book_folder (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
books (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
compare_shelf_current(self)src.backend.lib.library.Catalogue
config (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
cover_regx (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
db_pointer (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
extract_content(self, book_zip, book)src.backend.lib.library.Catalogue
extract_cover_html(self, book_zip, book)src.backend.lib.library.Catalogue
extract_cover_image(self, book_zip, book)src.backend.lib.library.Catalogue
extract_metadata_epub(self, book)src.backend.lib.library.Catalogue
extract_metadata_mobi(self, book) (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
extract_metadata_pdf(self, book)src.backend.lib.library.Catalogue
file_list (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
filter_books(self)src.backend.lib.library.Catalogue
html_regx (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
import_books(self, list=None, **kwargs)src.backend.lib.library.Catalogue
opf_regx (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
process_by_filetype(self, book)src.backend.lib.library.Catalogue
process_epub(book)src.backend.lib.library.Cataloguestatic
root_dir (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
scan_folder(self, _path=None)src.backend.lib.library.Catalogue
stripTags(source) (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Cataloguestatic
title_sanitization_dirs_regx (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
title_sanitization_lvl2_regx (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
title_sanitization_regx (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
+ + +
+ + diff --git a/docs/pyShelf/html/d6/d4e/classsrc_1_1backend_1_1lib_1_1models_1_1Book.html b/docs/pyShelf/html/d6/d4e/classsrc_1_1backend_1_1lib_1_1models_1_1Book.html new file mode 100644 index 0000000..641d81b --- /dev/null +++ b/docs/pyShelf/html/d6/d4e/classsrc_1_1backend_1_1lib_1_1models_1_1Book.html @@ -0,0 +1,438 @@ + + + + + + + +pyShelf Open Source Ebook Server: src.backend.lib.models.Book Class Reference + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+ +
src.backend.lib.models.Book Class Reference
+
+
+
+Inheritance diagram for src.backend.lib.models.Book:
+
+
+ + +src.backend.lib.models.Base + +
+ + + + + + + + + + + + + + + + + +

+Static Public Attributes

Mapped id = mapped_column(primary_key=True, nullable=False)
Mapped title [str]
Mapped author [Optional[str]]
Mapped categories [Optional[str]]
Mapped cover [Optional[bytes]]
Mapped pages [Optional[int]]
Mapped progress [Optional[float]]
Mapped file_name [str]
Mapped description [Optional[str]]
Mapped date [timestamp]
Mapped rights [Optional[str]]
Mapped tags [Optional[str]]
Mapped identifier [Optional[str]]
Mapped publisher [Optional[str]]
 book_collections
+

Detailed Description

+
Book model.

Member Data Documentation

+ +

◆ author

+ +
+
+ + + + + +
+ + + + +
Mapped src.backend.lib.models.Book.author [Optional[str]]
+
+static
+
+ +
+
+ +

◆ book_collections

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.models.Book.book_collections
+
+static
+
+Initial value:
= relationship(
+
"BookCollection", back_populates="book", cascade="all, delete-orphan"
+
)
+
+
+
+ +

◆ categories

+ +
+
+ + + + + +
+ + + + +
Mapped src.backend.lib.models.Book.categories [Optional[str]]
+
+static
+
+ +
+
+ +

◆ cover

+ +
+
+ + + + + +
+ + + + +
Mapped src.backend.lib.models.Book.cover [Optional[bytes]]
+
+static
+
+ +
+
+ +

◆ date

+ +
+
+ + + + + +
+ + + + +
Mapped src.backend.lib.models.Book.date [timestamp]
+
+static
+
+ +
+
+ +

◆ description

+ +
+
+ + + + + +
+ + + + +
Mapped src.backend.lib.models.Book.description [Optional[str]]
+
+static
+
+ +
+
+ +

◆ file_name

+ +
+
+ + + + + +
+ + + + +
Mapped src.backend.lib.models.Book.file_name [str]
+
+static
+
+ +
+
+ +

◆ id

+ +
+
+ + + + + +
+ + + + +
Mapped src.backend.lib.models.Book.id = mapped_column(primary_key=True, nullable=False)
+
+static
+
+ +
+
+ +

◆ identifier

+ +
+
+ + + + + +
+ + + + +
Mapped src.backend.lib.models.Book.identifier [Optional[str]]
+
+static
+
+ +
+
+ +

◆ pages

+ +
+
+ + + + + +
+ + + + +
Mapped src.backend.lib.models.Book.pages [Optional[int]]
+
+static
+
+ +
+
+ +

◆ progress

+ +
+
+ + + + + +
+ + + + +
Mapped src.backend.lib.models.Book.progress [Optional[float]]
+
+static
+
+ +
+
+ +

◆ publisher

+ +
+
+ + + + + +
+ + + + +
Mapped src.backend.lib.models.Book.publisher [Optional[str]]
+
+static
+
+ +
+
+ +

◆ rights

+ +
+
+ + + + + +
+ + + + +
Mapped src.backend.lib.models.Book.rights [Optional[str]]
+
+static
+
+ +
+
+ +

◆ tags

+ +
+
+ + + + + +
+ + + + +
Mapped src.backend.lib.models.Book.tags [Optional[str]]
+
+static
+
+ +
+
+ +

◆ title

+ +
+
+ + + + + +
+ + + + +
Mapped src.backend.lib.models.Book.title [str]
+
+static
+
+ +
+
+
The documentation for this class was generated from the following file: +
+ + +
+ + diff --git a/docs/pyShelf/html/d6/d4e/classsrc_1_1backend_1_1lib_1_1models_1_1Book.png b/docs/pyShelf/html/d6/d4e/classsrc_1_1backend_1_1lib_1_1models_1_1Book.png new file mode 100644 index 0000000000000000000000000000000000000000..bf3088a842a99b293a5d6147232b5dec66a02352 GIT binary patch literal 1013 zcmeAS@N?(olHy`uVBq!ia0vp^>wvg}gBeJAsw;d4QqloFA+G=b{|7Q(y!l$%e`vXd zfo6fk^fNCWJa_;UH$5A+1SrQ@666=m0OW&#In(Sb3=GT-o-U3d6^w7^zU_Ogz~idl zcjfi>`bTe77;~JKUGCen+hbi-+p!wi1Bw3@O$oZj*s2n)Sn6ribw%~0#=Q%7@B2*p za^|=F;^|$p89hEN-?P|y`tGZ$p2yEJsQe7RclGZ7d9zDI%r@k|y8eE>{d2bOzn0zp z^*zwz6MM~~YQMYPd8RJ8zUI97ce6_V&nIa+&fo1`_xj89;_b4xzocc@{eG`} zq3q)P>Rh=h;|WjptHB%_G+kwJg#Y#_LDLu+lqwhwSgl$5yF%yb?rHBXm#N-ATJkxK zp}`_ZoMDkiEJKGe{Wsz@k^cBP3!SYW8-W;Bh8S^gWuJ_%@{LzcW4xqzu$U#eP{Nhg?p#{OUnp%v-g><_gE%Ppnm3^yF9jz zXIjk7n>$YY_kY#Z;WBZTl2YK3bsZieuV3cf-logU;PQc?p)|t#`^Sh=<+^v5zxCSJ z{qosa28O~VdJI723<9pNm>fh_ax(-H5ZGPsrI{)l5E2SZUZJ6jJz_(zYQ(+p(|%ty z=VN+dO=#%*7gyIk{P%73Dl4DI0(bMJ_FkAA?Z`pPBq0VoqswJYiQnweKyE*@tLVJSzF`vgp%U_*SlK};z;g7E~ zif8b=DK6*n*}cPN{Z4C>Ox|@T4X)a{ecWaHZQ(k}1fRC+yN_Se@C*O| literal 0 HcmV?d00001 diff --git a/docs/pyShelf/html/d6/d90/classsrc_1_1backend_1_1lib_1_1models_1_1Base.html b/docs/pyShelf/html/d6/d90/classsrc_1_1backend_1_1lib_1_1models_1_1Base.html new file mode 100644 index 0000000..6bf2fb5 --- /dev/null +++ b/docs/pyShelf/html/d6/d90/classsrc_1_1backend_1_1lib_1_1models_1_1Base.html @@ -0,0 +1,85 @@ + + + + + + + +pyShelf Open Source Ebook Server: src.backend.lib.models.Base Class Reference + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+
src.backend.lib.models.Base Class Reference
+
+
+
+Inheritance diagram for src.backend.lib.models.Base:
+
+
+ + +src.backend.lib.models.Book +src.backend.lib.models.BookCollection +src.backend.lib.models.Collection +src.backend.lib.models.User + +
+

Detailed Description

+
Base class for all models.

The documentation for this class was generated from the following file: +
+ + +
+ + diff --git a/docs/pyShelf/html/d6/d90/classsrc_1_1backend_1_1lib_1_1models_1_1Base.png b/docs/pyShelf/html/d6/d90/classsrc_1_1backend_1_1lib_1_1models_1_1Base.png new file mode 100644 index 0000000000000000000000000000000000000000..2ca7df0ea8a3b4b5c99fcec8e7c06718a045b7f7 GIT binary patch literal 2159 zcmcImdr(v96^|}fSEOW|R#+5-PSx%J3ti=k?;@#1W2l2GFyxRNysfB30WQyLI9zGKp^Rttexr1&UUAN^v>Kb=lkwC zzwf&kP0wFyAg| z?pC~L@^t+;)w<@@+v(|PaPGzre+0gLm>!A=LxH{N@z_fhqEP#{F9-bYdgdOrR88(2 zII?ea;npFAzD?WJov`|~XrhTXi?e<8D~B%$@wFWEYK5BIFV))Hf0fgpMOTiUV4_{` z4^uR?MT|2R+jg3qZu@fdq%RLxK{u zrczd__7<#j%l6D?(Hk5(iVA+~?ZP~6@U!9%F^Jm8-^=|t2HlO+5TzJlh#M}}Dzo&D zK`QR*6hgVU+I8;n`cqA#a;^wZS7y=kPZ$Aqo+0#4#oU!}g52Pad(EJNm_Ad?EMoVa zcwSS<8@iM2ot5N8CxuJ8bG{(am0LA{wDr(>goOWTKUKN)%ALvIcXgB84%o&9nb)QwXes1zB>=B;qL8Dim6fLR?h!oUzHJit-)` z|2w7r;au1V3p+Eh;dx7yo^CUX7LL2}iI|L}gq*Zx`az?zH(!!*3(QvP8K!EjDxjxD zeRD_@jG3{U5RvD6a<32^rv2v1YbZy#>xkW(t}=DAy10Y*v!upJ*=lMde+`hd_?{%< z{?TAkGWmD|vv%iYaz8oQ(mf*O$jr^CYN|YvCFo|KT59hZ|NbYVs z4S6hgIgPAU8AX;V$i5pWRmiuui19eA@0*F?>@QYjD^7U6JziV>wcDiztF}bCw7pgU z5*r85ddMebx6>(DY_uG@l6~#CtYdajTFQssCHxcE0f3)$xDwHpb6f&3Dvb z#?S2j$#fD@3&R)1z7sG!_E-kPAQ1!s8W03>wZMQ$3k=eQLl&nr;ZT`lM=NZDSp248kXGjs>S@Uc*so> zmY`Ew8uXhzu)9Rg+t4-pUY`pd-jEB^$!pwT9CTL^lBk<`?`$~D454TtNX~L$7B>t_ zd7CV~H`~^(P9jx$M4&l=K__j|q0AJ4FDRkN5kWbN>xd4!#6L@e}P8o7OpykhvI zi7deHoD~_`U%<)CONqKXq8wrSYdGH+ao!>9pe=mx zy3KVcPt8C`N=nR}f-ecrO4h|!@liaiEV7njEfKdZaDxYFla`4(|M#`*Pt-+Q8b;sf z??pg)3v482*SUAcYfIbZtg!OK;F~t4g9JH?1KW|Y15YIQv9cV$!xC|`zWA5n&@&$! zNlmtvY8O&UJl#RQ=kX+?n}`)w9Umvkse*T0ix!xDXDjmDHw$aCxUhbu8>Q_1l@xa5 z^%dv4{}qN^q&<^%C$qFY6pGF^8tZ#fJe6sjOu{7JUiGlz-;+t|Rfj^F$Bq@}qR z0v_S>G(D87v*842IL*cejEOef{_Y2HXn~MOy!?O&L1MeSrx4^5{L>P zhM91(XLApne4~U2iBdyTAW`pO2@ES98C5;_l3e%Xb|ycO_T;ur%%X7>8&HJCsi2It Tom=3q0qXK+m;i=<+`WGR3t>`h literal 0 HcmV?d00001 diff --git a/docs/pyShelf/html/d7/d40/classsrc_1_1backend_1_1lib_1_1storage_1_1Storage.html b/docs/pyShelf/html/d7/d40/classsrc_1_1backend_1_1lib_1_1storage_1_1Storage.html new file mode 100644 index 0000000..9e6654c --- /dev/null +++ b/docs/pyShelf/html/d7/d40/classsrc_1_1backend_1_1lib_1_1storage_1_1Storage.html @@ -0,0 +1,559 @@ + + + + + + + +pyShelf Open Source Ebook Server: src.backend.lib.storage.Storage Class Reference + + + + + + + +
+
+ +
src.backend.lib.storage.Storage Class Reference
+
+
+ + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self, config)
 get_connection_string (self)
 create_tables (self)
 insert_book (self, book)
 book_paths_list (self)
list() parse_collections_from_path (self, dict() book)
 make_collections (self)
 get_books (self, collection=None, skip=None, limit=None)
 get_book (self, id)
 get_collections (self)
 get_collection (self, name)
dict parse_advanced_query (self, str query)
 fuzzy_search_books (self, str query, int limit=30)
+ + + + + + + + +

+Public Attributes

 config = config
 sql = self.config.catalogue_db
 user = self.config.user
 password = self.config.password
 db_host = self.config.db_host
 db_port = self.config.db_port
 engine
+

Detailed Description

+
Create a new Storage object.
+
+>>> db = Storage(config)
+
+Parameters
+----------
+config : Config()
+    Main program configuration.
+
+Attributes
+----------
+config : Stores configuration
+sql : Database Name
+user : Database User Name
+password : Database Password
+db_host : Database Host
+db_port : Database Port
+engine : sqlalchemy.create_engine(url, executor, kw)
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + +
src.backend.lib.storage.Storage.__init__ ( self,
config )
+
+
Initialize storage object.
+
+
+

Member Function Documentation

+ +

◆ book_paths_list()

+ +
+
+ + + + + + + +
src.backend.lib.storage.Storage.book_paths_list ( self)
+
+
Get file paths from database for comparison to system files.
+
+Returns
+-------
+_result : ScalarResult Object
+
+
+
+ +

◆ create_tables()

+ +
+
+ + + + + + + +
src.backend.lib.storage.Storage.create_tables ( self)
+
+
Create table structure.
+
+
+ +

◆ fuzzy_search_books()

+ +
+
+ + + + + + + + + + + + + + + + +
src.backend.lib.storage.Storage.fuzzy_search_books ( self,
str query,
int limit = 30 )
+
+ +
+
+ +

◆ get_book()

+ +
+
+ + + + + + + + + + + +
src.backend.lib.storage.Storage.get_book ( self,
id )
+
+
Get book from database.
+
+Parameters
+----------
+id : int
+    Book ID to filter by.
+
+Returns
+-------
+_result : ScalarResult Object
+
+
+
+ +

◆ get_books()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
src.backend.lib.storage.Storage.get_books ( self,
collection = None,
skip = None,
limit = None )
+
+
Get books from database.
+
+Parameters
+----------
+collection : int or None
+    Collection ID to filter by.
+skip : int or None
+    Number of records to skip (offset).
+limit : int or None
+    Maximum number of records to return.
+
+
+
+ +

◆ get_collection()

+ +
+
+ + + + + + + + + + + +
src.backend.lib.storage.Storage.get_collection ( self,
name )
+
+
Get collection from database.
+
+Returns
+-------
+_result : ScalarResult Object
+
+
+
+ +

◆ get_collections()

+ +
+
+ + + + + + + +
src.backend.lib.storage.Storage.get_collections ( self)
+
+
Get collections from database.
+
+Returns
+-------
+_result : ScalarResult Object
+
+
+
+ +

◆ get_connection_string()

+ +
+
+ + + + + + + +
src.backend.lib.storage.Storage.get_connection_string ( self)
+
+
Get connection string.
+
+Engine type references config.json:DB_ENGINE.
+
+Returns
+-------
+str : sqlalchemy Connection String
+
+
+
+ +

◆ insert_book()

+ +
+
+ + + + + + + + + + + +
src.backend.lib.storage.Storage.insert_book ( self,
book )
+
+
Insert a new book into the database.
+
+Parameters
+----------
+book: dict()
+    Book object to insert.
+
+Returns
+-------
+bool
+    True on success False on failure
+
+
+
+ +

◆ make_collections()

+ +
+
+ + + + + + + +
src.backend.lib.storage.Storage.make_collections ( self)
+
+
Ensure collections exist and link them to books (many-to-many).
+
+
+ +

◆ parse_advanced_query()

+ +
+
+ + + + + + + + + + + +
dict src.backend.lib.storage.Storage.parse_advanced_query ( self,
str query )
+
+
Parse a query like 'title:"dark tower" author:king tags:fantasy'
+
+
+ +

◆ parse_collections_from_path()

+ +
+
+ + + + + + + + + + + +
list() src.backend.lib.storage.Storage.parse_collections_from_path ( self,
dict() book )
+
+
Parse book path's to determine common folder structure.
+
+Stores collections based on shared paths.
+
+Parameters
+----------
+book : dict()
+    Book object to parse.
+
+Returns
+-------
+collections : list()
+    List of collections.
+
+
+
+

Member Data Documentation

+ +

◆ config

+ +
+
+ + + + +
src.backend.lib.storage.Storage.config = config
+
+ +
+
+ +

◆ db_host

+ +
+
+ + + + +
src.backend.lib.storage.Storage.db_host = self.config.db_host
+
+ +
+
+ +

◆ db_port

+ +
+
+ + + + +
src.backend.lib.storage.Storage.db_port = self.config.db_port
+
+ +
+
+ +

◆ engine

+ +
+
+ + + + +
src.backend.lib.storage.Storage.engine
+
+Initial value:
= create_engine(self.get_connection_string(),
+
pool_pre_ping=True)
+
+
+
+ +

◆ password

+ +
+
+ + + + +
src.backend.lib.storage.Storage.password = self.config.password
+
+ +
+
+ +

◆ sql

+ +
+
+ + + + +
src.backend.lib.storage.Storage.sql = self.config.catalogue_db
+
+ +
+
+ +

◆ user

+ +
+
+ + + + +
src.backend.lib.storage.Storage.user = self.config.user
+
+ +
+
+
The documentation for this class was generated from the following file: +
+ + +
+ + diff --git a/docs/pyShelf/html/d7/d88/classsrc_1_1backend_1_1lib_1_1api__hooks_1_1DuckDuckGo.html b/docs/pyShelf/html/d7/d88/classsrc_1_1backend_1_1lib_1_1api__hooks_1_1DuckDuckGo.html new file mode 100644 index 0000000..5a88d5d --- /dev/null +++ b/docs/pyShelf/html/d7/d88/classsrc_1_1backend_1_1lib_1_1api__hooks_1_1DuckDuckGo.html @@ -0,0 +1,181 @@ + + + + + + + +pyShelf Open Source Ebook Server: src.backend.lib.api_hooks.DuckDuckGo Class Reference + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+ +
src.backend.lib.api_hooks.DuckDuckGo Class Reference
+
+
+ + + + + +

+Public Member Functions

 __init__ (self)
 image_result (self, query)
 description_result (self, query)
+ + + +

+Public Attributes

str url = "https://api.duckduckgo.com/?q="
str imageurl = "https://duckduckgo.com"
+

Detailed Description

+
duckduckgo related searching

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + +
src.backend.lib.api_hooks.DuckDuckGo.__init__ ( self)
+
+ +
+
+

Member Function Documentation

+ +

◆ description_result()

+ +
+
+ + + + + + + + + + + +
src.backend.lib.api_hooks.DuckDuckGo.description_result ( self,
query )
+
+ +
+
+ +

◆ image_result()

+ +
+
+ + + + + + + + + + + +
src.backend.lib.api_hooks.DuckDuckGo.image_result ( self,
query )
+
+
Returns json containing url to image
+:param _key: &t=h_&iar=images&iax=images&ia=images&format=json&pretty=1
+
+
+
+

Member Data Documentation

+ +

◆ imageurl

+ +
+
+ + + + +
str src.backend.lib.api_hooks.DuckDuckGo.imageurl = "https://duckduckgo.com"
+
+ +
+
+ +

◆ url

+ +
+
+ + + + +
str src.backend.lib.api_hooks.DuckDuckGo.url = "https://api.duckduckgo.com/?q="
+
+ +
+
+
The documentation for this class was generated from the following file: +
+ + +
+ + diff --git a/docs/pyShelf/html/d7/db9/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1Server.html b/docs/pyShelf/html/d7/db9/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1Server.html new file mode 100644 index 0000000..684ed50 --- /dev/null +++ b/docs/pyShelf/html/d7/db9/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1Server.html @@ -0,0 +1,327 @@ + + + + + + + +pyShelf Open Source Ebook Server: src.backend.lib.pyShelf.Server Class Reference + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+ +
src.backend.lib.pyShelf.Server Class Reference
+
+
+ + + + + + + + + +

+Public Member Functions

 __init__ (self, root)
 __aexit__ (self, *args, **kwargs)
 initialize_server (self)
 runImport (self)
 socketio (self, websocket, path)
 pong (self)
 start (self)
+ + + + + + + +

+Public Attributes

 root = root
tuple host = ("127.0.0.1", 1337)
 config = Config(self.root)
 loop = None
 serve = None
 socketio
+

Detailed Description

+
Main Server Container
+:TODO: Document this
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + +
src.backend.lib.pyShelf.Server.__init__ ( self,
root )
+
+ +
+
+

Member Function Documentation

+ +

◆ __aexit__()

+ +
+
+ + + + + + + + + + + + + + + + +
src.backend.lib.pyShelf.Server.__aexit__ ( self,
* args,
** kwargs )
+
+ +
+
+ +

◆ initialize_server()

+ +
+
+ + + + + + + +
src.backend.lib.pyShelf.Server.initialize_server ( self)
+
+ +
+
+ +

◆ pong()

+ +
+
+ + + + + + + +
src.backend.lib.pyShelf.Server.pong ( self)
+
+ +
+
+ +

◆ runImport()

+ +
+
+ + + + + + + +
src.backend.lib.pyShelf.Server.runImport ( self)
+
+ +
+
+ +

◆ socketio()

+ +
+
+ + + + + + + + + + + + + + + + +
src.backend.lib.pyShelf.Server.socketio ( self,
websocket,
path )
+
+ +
+
+ +

◆ start()

+ +
+
+ + + + + + + +
src.backend.lib.pyShelf.Server.start ( self)
+
+ +
+
+

Member Data Documentation

+ +

◆ config

+ +
+
+ + + + +
src.backend.lib.pyShelf.Server.config = Config(self.root)
+
+ +
+
+ +

◆ host

+ +
+
+ + + + +
tuple src.backend.lib.pyShelf.Server.host = ("127.0.0.1", 1337)
+
+ +
+
+ +

◆ loop

+ +
+
+ + + + +
src.backend.lib.pyShelf.Server.loop = None
+
+ +
+
+ +

◆ root

+ +
+
+ + + + +
src.backend.lib.pyShelf.Server.root = root
+
+ +
+
+ +

◆ serve

+ +
+
+ + + + +
src.backend.lib.pyShelf.Server.serve = None
+
+ +
+
+ +

◆ socketio

+ +
+
+ + + + +
src.backend.lib.pyShelf.Server.socketio
+
+ +
+
+
The documentation for this class was generated from the following file: +
+ + +
+ + diff --git a/docs/pyShelf/html/d7/dd7/namespacesrc_1_1____main____.html b/docs/pyShelf/html/d7/dd7/namespacesrc_1_1____main____.html new file mode 100644 index 0000000..09742f6 --- /dev/null +++ b/docs/pyShelf/html/d7/dd7/namespacesrc_1_1____main____.html @@ -0,0 +1,161 @@ + + + + + + + +pyShelf Open Source Ebook Server: src.__main__ Namespace Reference + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+ +
src.__main__ Namespace Reference
+
+
+ + + + +

+Functions

 run_import ()
 main ()
+ + + + +

+Variables

 root = Path.cwd()
 config = Config(root)
 PRG_PATH = Path.cwd().__str__()
+

Detailed Description

+
PyShelf Entrypoint.

Function Documentation

+ +

◆ main()

+ +
+
+ + + + + + + +
src.__main__.main ()
+
+
Program entrypoint.
+
+
+ +

◆ run_import()

+ +
+
+ + + + + + + +
src.__main__.run_import ()
+
+
Begin live import of books.
+
+
+

Variable Documentation

+ +

◆ config

+ +
+
+ + + + +
src.__main__.config = Config(root)
+
+ +
+
+ +

◆ PRG_PATH

+ +
+
+ + + + +
src.__main__.PRG_PATH = Path.cwd().__str__()
+
+ +
+
+ +

◆ root

+ +
+
+ + + + +
src.__main__.root = Path.cwd()
+
+ +
+
+
+ + +
+ + diff --git a/docs/pyShelf/html/d7/df9/namespaceDataHooks.html b/docs/pyShelf/html/d7/df9/namespaceDataHooks.html new file mode 100644 index 0000000..0d6f72f --- /dev/null +++ b/docs/pyShelf/html/d7/df9/namespaceDataHooks.html @@ -0,0 +1,71 @@ + + + + + + + +pyShelf Open Source Ebook Server: DataHooks Namespace Reference + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + +
+
+
+ +
DataHooks Namespace Reference
+
+
+ + + +

+Classes

class  BookInterface
+

Detailed Description

+
pyShelf's frontend database hooks.
+ + +
+ + diff --git a/docs/pyShelf/html/d8/d3d/classsrc_1_1backend_1_1tests_1_1library__test_1_1TestCatalogue.html b/docs/pyShelf/html/d8/d3d/classsrc_1_1backend_1_1tests_1_1library__test_1_1TestCatalogue.html new file mode 100644 index 0000000..4ba2525 --- /dev/null +++ b/docs/pyShelf/html/d8/d3d/classsrc_1_1backend_1_1tests_1_1library__test_1_1TestCatalogue.html @@ -0,0 +1,150 @@ + + + + + + + +pyShelf Open Source Ebook Server: src.backend.tests.library_test.TestCatalogue Class Reference + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+ +
src.backend.tests.library_test.TestCatalogue Class Reference
+
+
+ + + +

+Public Member Functions

 test_filter_books (self)
+ + + +

+Static Public Attributes

 root = os.path.abspath(os.path.curdir)
 config = Test_Config()
+

Detailed Description

+

Member Function Documentation

+ +

◆ test_filter_books()

+ +
+
+ + + + + + + +
src.backend.tests.library_test.TestCatalogue.test_filter_books ( self)
+
+ +
+
+

Member Data Documentation

+ +

◆ config

+ +
+
+ + + + + +
+ + + + +
src.backend.tests.library_test.TestCatalogue.config = Test_Config()
+
+static
+
+ +
+
+ +

◆ root

+ +
+
+ + + + + +
+ + + + +
src.backend.tests.library_test.TestCatalogue.root = os.path.abspath(os.path.curdir)
+
+static
+
+ +
+
+
The documentation for this class was generated from the following file: +
+ + +
+ + diff --git a/docs/pyShelf/html/d8/def/classobjects_1_1JSInterface.html b/docs/pyShelf/html/d8/def/classobjects_1_1JSInterface.html new file mode 100644 index 0000000..b5698df --- /dev/null +++ b/docs/pyShelf/html/d8/def/classobjects_1_1JSInterface.html @@ -0,0 +1,157 @@ + + + + + + + +pyShelf Open Source Ebook Server: objects.JSInterface Class Reference + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+ +
objects.JSInterface Class Reference
+
+
+ + + + +

+Public Member Functions

 __init__ (self, Config config)
 install (self)
+ + + +

+Public Attributes

Path package_json = Path(config.root, "src/frontend/package.json")
Config config = config
+

Detailed Description

+
A class to interface with the JavaScript side of pyShelf.

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + +
objects.JSInterface.__init__ ( self,
Config config )
+
+
Initialize the JSInterface object.
+
+
+

Member Function Documentation

+ +

◆ install()

+ +
+
+ + + + + + + +
objects.JSInterface.install ( self)
+
+
Install the JavaScript dependencies.
+
+
+

Member Data Documentation

+ +

◆ config

+ +
+
+ + + + +
Config objects.JSInterface.config = config
+
+ +
+
+ +

◆ package_json

+ +
+
+ + + + +
Path objects.JSInterface.package_json = Path(config.root, "src/frontend/package.json")
+
+ +
+
+
The documentation for this class was generated from the following file: +
+ + +
+ + diff --git a/docs/pyShelf/html/d8/dfe/classsrc_1_1backend_1_1lib_1_1config_1_1Config.html b/docs/pyShelf/html/d8/dfe/classsrc_1_1backend_1_1lib_1_1config_1_1Config.html new file mode 100644 index 0000000..63f991c --- /dev/null +++ b/docs/pyShelf/html/d8/dfe/classsrc_1_1backend_1_1lib_1_1config_1_1Config.html @@ -0,0 +1,591 @@ + + + + + + + +pyShelf Open Source Ebook Server: src.backend.lib.config.Config Class Reference + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+ +
src.backend.lib.config.Config Class Reference
+
+
+
+Inheritance diagram for src.backend.lib.config.Config:
+
+
+ + +src.backend.tests.library_test.Test_Config + +
+ + + + + + +

+Public Member Functions

 __init__ (self, root)
 init_config (self)
 get_logger (self)
 open_file (self)
+ + + + + + + + + + + + + + + + + + + + +

+Public Attributes

 root = root
dict config_structure
 logger = self.get_logger()
 book_path = env.get("BOOKPATH", self._data["BOOKPATH"])
str TITLE = env.get("TITLE", self._data["TITLE"])
 VERSION = env.get("VERSION", self._data["VERSION"])
 book_shelf = env.get("BOOKSHELF", self._data["BOOKSHELF"])
 catalogue_db = env.get("DATABASE", self._data["DATABASE"])
 user = self._data["USER"]
 password = self._data["PASSWORD"]
 db_host = env.get("DB_HOST", self._data["DB_HOST"])
 db_port = env.get("DB_PORT", self._data["DB_PORT"])
list file_array = [self.book_shelf]
bool auto_scan = True
 allowed_hosts
 db_engine = env.get("DB_ENGINE", self._data["DB_ENGINE"])
 db_user = env.get("USER", self._data["USER"])
 db_pass = env.get("PASSWORD", self._data["PASSWORD"])
 build_mode = env.get("BUILD_MODE", self._data["BUILD_MODE"])
+ + + + +

+Protected Attributes

str _fp = "config.json"
 _cp = Path.joinpath(root, self._fp)
 _data = self.init_config()
+

Detailed Description

+
Main System Configuration.
+
+>>> config = Config(root)
+
+Parameters
+----------
+root : File system root of program
+
+Attributes
+----------
+root : str() stores root.
+config_structure : dict() Default Configuration Structure.
+_fp : str() file pointer to main configuration.
+_cp : Path() object of configuration file.
+_data : dict() parsed json of _fp.
+logger : holds logging configuration from get_logger().
+book_path : directory pointer to main books folder.
+TITLE : str() Program title.
+VERSION : str() Program  version.
+TITLE : str() Combines TITLE & VERSION.
+book_shelf : Deprecation TODO: Is this still in use?
+catalogue_db : str() Database Name.
+user : str() Database user name.
+password : str() Database password.
+db_host : str() Database host.
+db_port : int() Database port.
+file_array : list() copy of book_shelf TODO: See book_shelf
+auto_scan: bool() Do we auto scan on launch?
+allowed_hosts : list() Allowed host list.
+db_engine : str() Desired database engine type.
+db_user : str() Database user name. Duplication Warning.
+db_pass : str() Database password. Duplication Warning.
+build_mode : str() Production | Development mode.
+
+Methods
+-------
+get_logger : Setup loguru.
+open_file : Parse configuration file.
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + +
src.backend.lib.config.Config.__init__ ( self,
root )
+
+
Initialize main configuration options.
+
+
+

Member Function Documentation

+ +

◆ get_logger()

+ +
+
+ + + + + + + +
src.backend.lib.config.Config.get_logger ( self)
+
+
Instantiate logging system.
+
+
+ +

◆ init_config()

+ +
+
+ + + + + + + +
src.backend.lib.config.Config.init_config ( self)
+
+ +
+
+ +

◆ open_file()

+ +
+
+ + + + + + + +
src.backend.lib.config.Config.open_file ( self)
+
+
Open config.json and reads in configuration options.
+

Reimplemented in src.backend.tests.library_test.Test_Config.

+ +
+
+

Member Data Documentation

+ +

◆ _cp

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.config.Config._cp = Path.joinpath(root, self._fp)
+
+protected
+
+ +
+
+ +

◆ _data

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.config.Config._data = self.init_config()
+
+protected
+
+ +
+
+ +

◆ _fp

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.config.Config._fp = "config.json"
+
+protected
+
+ +
+
+ +

◆ allowed_hosts

+ +
+
+ + + + +
src.backend.lib.config.Config.allowed_hosts
+
+Initial value:
= env.get("ALLOWED_HOSTS",
+
self._data["ALLOWED_HOSTS"])
+
+
+
+ +

◆ auto_scan

+ +
+
+ + + + +
bool src.backend.lib.config.Config.auto_scan = True
+
+ +
+
+ +

◆ book_path

+ +
+
+ + + + +
src.backend.lib.config.Config.book_path = env.get("BOOKPATH", self._data["BOOKPATH"])
+
+ +
+
+ +

◆ book_shelf

+ +
+
+ + + + +
src.backend.lib.config.Config.book_shelf = env.get("BOOKSHELF", self._data["BOOKSHELF"])
+
+ +
+
+ +

◆ build_mode

+ +
+
+ + + + +
src.backend.lib.config.Config.build_mode = env.get("BUILD_MODE", self._data["BUILD_MODE"])
+
+ +
+
+ +

◆ catalogue_db

+ +
+
+ + + + +
src.backend.lib.config.Config.catalogue_db = env.get("DATABASE", self._data["DATABASE"])
+
+ +
+
+ +

◆ config_structure

+ +
+
+ + + + +
src.backend.lib.config.Config.config_structure
+
+Initial value:
= {
+
"TITLE": "pyShelf E-Book Server",
+
"VERSION": "0.7.0",
+
"BOOKPATH": "/mnt/books",
+
"DB_HOST": "localhost",
+
"DB_PORT": "5432",
+
"DB_ENGINE": "sqlite",
+
"DATABASE": "pyshelf",
+
"USER": "pyshelf",
+
"PASSWORD": "pyshelf",
+
"BOOKSHELF": "data/shelf.json",
+
"ALLOWED_HOSTS": [
+
"localhost",
+
"127.0.0.1",
+
"[::1]",
+
"0.0.0.0"
+
],
+
"BUILD_MODE": "development"
+
}
+
+
+
+ +

◆ db_engine

+ +
+
+ + + + +
src.backend.lib.config.Config.db_engine = env.get("DB_ENGINE", self._data["DB_ENGINE"])
+
+ +
+
+ +

◆ db_host

+ +
+
+ + + + +
src.backend.lib.config.Config.db_host = env.get("DB_HOST", self._data["DB_HOST"])
+
+ +
+
+ +

◆ db_pass

+ +
+
+ + + + +
src.backend.lib.config.Config.db_pass = env.get("PASSWORD", self._data["PASSWORD"])
+
+ +
+
+ +

◆ db_port

+ +
+
+ + + + +
src.backend.lib.config.Config.db_port = env.get("DB_PORT", self._data["DB_PORT"])
+
+ +
+
+ +

◆ db_user

+ +
+
+ + + + +
src.backend.lib.config.Config.db_user = env.get("USER", self._data["USER"])
+
+ +
+
+ +

◆ file_array

+ +
+
+ + + + +
list src.backend.lib.config.Config.file_array = [self.book_shelf]
+
+ +
+
+ +

◆ logger

+ +
+
+ + + + +
src.backend.lib.config.Config.logger = self.get_logger()
+
+ +
+
+ +

◆ password

+ +
+
+ + + + +
src.backend.lib.config.Config.password = self._data["PASSWORD"]
+
+ +
+
+ +

◆ root

+ +
+
+ + + + +
src.backend.lib.config.Config.root = root
+
+ +
+
+ +

◆ TITLE

+ +
+
+ + + + +
str src.backend.lib.config.Config.TITLE = env.get("TITLE", self._data["TITLE"])
+
+ +
+
+ +

◆ user

+ +
+
+ + + + +
src.backend.lib.config.Config.user = self._data["USER"]
+
+ +
+
+ +

◆ VERSION

+ +
+
+ + + + +
src.backend.lib.config.Config.VERSION = env.get("VERSION", self._data["VERSION"])
+
+ +
+
+
The documentation for this class was generated from the following file: +
+ + +
+ + diff --git a/docs/pyShelf/html/d8/dfe/classsrc_1_1backend_1_1lib_1_1config_1_1Config.png b/docs/pyShelf/html/d8/dfe/classsrc_1_1backend_1_1lib_1_1config_1_1Config.png new file mode 100644 index 0000000000000000000000000000000000000000..fa87dc34ba19da0b88dc125def3f967755c88615 GIT binary patch literal 883 zcmV-(1C0EMP)vTJr#LVva2S`&=-}Ys|Ns9r%~qrU000SeQchC<|NsC0|NsC0Hv*f~00091 zNkl#pM<41|Y4s^9!)J{17a@e;QV5ddP?KDe zd})$Pk}v%|`EdT8)3twjrALzX6+&n8QQ6ulxVxrHe^nu0?q7h zUiqFM8A{T*{{DL|NiWysP5xKpm#^!#Tetebc->@cL|Xs9cq%3 zq%Tc!lJun$@<5WUhMlFq9j@9-BRwQ}qOqfpek9FfoBe3&ZT!7~{J;ZA^Xxk6r<Ym$`YuIP?tpDC&cG z+wE+UWSAU-Q|Za;D756mMpML&v;CBOu%G>VKJI(so?jtOA88{dNu^T5%twwK#vzUSQ~+Ntd%`2o82r6v{T_o^1XWfiI?DfTDFtq?`V>fq%Tc!lJup8JjNJ3>JLkv(O#@?nT7xW002ov JPDHLkV1lH2&iDWT literal 0 HcmV?d00001 diff --git a/docs/pyShelf/html/d9/d0e/classsrc_1_1backend_1_1lib_1_1models_1_1User-members.html b/docs/pyShelf/html/d9/d0e/classsrc_1_1backend_1_1lib_1_1models_1_1User-members.html new file mode 100644 index 0000000..1f9a8f7 --- /dev/null +++ b/docs/pyShelf/html/d9/d0e/classsrc_1_1backend_1_1lib_1_1models_1_1User-members.html @@ -0,0 +1,81 @@ + + + + + + + +pyShelf Open Source Ebook Server: Member List + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+
src.backend.lib.models.User Member List
+
+
+ +

This is the complete list of members for src.backend.lib.models.User, including all inherited members.

+ + + + + + + + + + +
date_joined (defined in src.backend.lib.models.User)src.backend.lib.models.Userstatic
email (defined in src.backend.lib.models.User)src.backend.lib.models.Userstatic
id (defined in src.backend.lib.models.User)src.backend.lib.models.Userstatic
is_active (defined in src.backend.lib.models.User)src.backend.lib.models.Userstatic
is_admin (defined in src.backend.lib.models.User)src.backend.lib.models.Userstatic
is_superuser (defined in src.backend.lib.models.User)src.backend.lib.models.Userstatic
last_login (defined in src.backend.lib.models.User)src.backend.lib.models.Userstatic
password (defined in src.backend.lib.models.User)src.backend.lib.models.Userstatic
username (defined in src.backend.lib.models.User)src.backend.lib.models.Userstatic
+ + +
+ + diff --git a/docs/pyShelf/html/d9/d71/classDataHooks_1_1BookInterface.html b/docs/pyShelf/html/d9/d71/classDataHooks_1_1BookInterface.html new file mode 100644 index 0000000..a88160d --- /dev/null +++ b/docs/pyShelf/html/d9/d71/classDataHooks_1_1BookInterface.html @@ -0,0 +1,111 @@ + + + + + + + +pyShelf Open Source Ebook Server: DataHooks.BookInterface Class Reference + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+ +
DataHooks.BookInterface Class Reference
+
+
+ + + + +

+Public Attributes

 config = config
 db = Storage(self.config)
+

Detailed Description

+
Access point for book database.

Member Data Documentation

+ +

◆ config

+ +
+
+ + + + +
DataHooks.BookInterface.config = config
+
+ +
+
+ +

◆ db

+ +
+
+ + + + +
DataHooks.BookInterface.db = Storage(self.config)
+
+ +
+
+
The documentation for this class was generated from the following file: +
+ + +
+ + diff --git a/docs/pyShelf/html/d9/d8b/classsrc_1_1backend_1_1lib_1_1overide_1_1ACatalogue-members.html b/docs/pyShelf/html/d9/d8b/classsrc_1_1backend_1_1lib_1_1overide_1_1ACatalogue-members.html new file mode 100644 index 0000000..1fb8636 --- /dev/null +++ b/docs/pyShelf/html/d9/d8b/classsrc_1_1backend_1_1lib_1_1overide_1_1ACatalogue-members.html @@ -0,0 +1,98 @@ + + + + + + + +pyShelf Open Source Ebook Server: Member List + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+
src.backend.lib.overide.ACatalogue Member List
+
+
+ +

This is the complete list of members for src.backend.lib.overide.ACatalogue, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
__init__(self) (defined in src.backend.lib.overide.ACatalogue)src.backend.lib.overide.ACatalogue
book_folder (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
books (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
compare_shelf_current(self)src.backend.lib.library.Catalogue
config (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
cover_regx (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
db_pointer (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
extract_content(self, book_zip, book)src.backend.lib.library.Catalogue
extract_cover_html(self, book_zip, book)src.backend.lib.library.Catalogue
extract_cover_image(self, book_zip, book)src.backend.lib.library.Catalogue
extract_metadata_epub(self, book)src.backend.lib.library.Catalogue
extract_metadata_mobi(self, book) (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
extract_metadata_pdf(self, book)src.backend.lib.library.Catalogue
file_list (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
filter_books(self)src.backend.lib.library.Catalogue
html_regx (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
import_books(self, **kwargs)src.backend.lib.overide.ACatalogue
opf_regx (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
process_by_filetype(self, book)src.backend.lib.library.Catalogue
process_epub(book)src.backend.lib.library.Cataloguestatic
root_dir (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
scan_folder(self, _path=None)src.backend.lib.overide.ACatalogue
stripTags(source) (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Cataloguestatic
title_sanitization_dirs_regx (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
title_sanitization_lvl2_regx (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
title_sanitization_regx (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
+ + +
+ + diff --git a/docs/pyShelf/html/da/d3c/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1InitFiles.html b/docs/pyShelf/html/da/d3c/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1InitFiles.html new file mode 100644 index 0000000..629b8e4 --- /dev/null +++ b/docs/pyShelf/html/da/d3c/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1InitFiles.html @@ -0,0 +1,127 @@ + + + + + + + +pyShelf Open Source Ebook Server: src.backend.lib.pyShelf.InitFiles Class Reference + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+ +
src.backend.lib.pyShelf.InitFiles Class Reference
+
+
+ + + + +

+Public Member Functions

 __init__ (self, file_array)
 CreateFile (self, _pointer)
+

Detailed Description

+
First run file creation operations

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + +
src.backend.lib.pyShelf.InitFiles.__init__ ( self,
file_array )
+
+ +
+
+

Member Function Documentation

+ +

◆ CreateFile()

+ +
+
+ + + + + + + + + + + +
src.backend.lib.pyShelf.InitFiles.CreateFile ( self,
_pointer )
+
+
Checks if file exists and creates it if not
+
+
+
+
The documentation for this class was generated from the following file: +
+ + +
+ + diff --git a/docs/pyShelf/html/da/dc1/classsrc_1_1backend_1_1lib_1_1models_1_1Book-members.html b/docs/pyShelf/html/da/dc1/classsrc_1_1backend_1_1lib_1_1models_1_1Book-members.html new file mode 100644 index 0000000..3f03664 --- /dev/null +++ b/docs/pyShelf/html/da/dc1/classsrc_1_1backend_1_1lib_1_1models_1_1Book-members.html @@ -0,0 +1,87 @@ + + + + + + + +pyShelf Open Source Ebook Server: Member List + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+
src.backend.lib.models.Book Member List
+
+ + + +
+ + diff --git a/docs/pyShelf/html/db/d9a/classsrc_1_1backend_1_1lib_1_1storage_1_1Storage-members.html b/docs/pyShelf/html/db/d9a/classsrc_1_1backend_1_1lib_1_1storage_1_1Storage-members.html new file mode 100644 index 0000000..48e6b1c --- /dev/null +++ b/docs/pyShelf/html/db/d9a/classsrc_1_1backend_1_1lib_1_1storage_1_1Storage-members.html @@ -0,0 +1,92 @@ + + + + + + + +pyShelf Open Source Ebook Server: Member List + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+
src.backend.lib.storage.Storage Member List
+
+
+ +

This is the complete list of members for src.backend.lib.storage.Storage, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + +
__init__(self, config)src.backend.lib.storage.Storage
book_paths_list(self)src.backend.lib.storage.Storage
config (defined in src.backend.lib.storage.Storage)src.backend.lib.storage.Storage
create_tables(self)src.backend.lib.storage.Storage
db_host (defined in src.backend.lib.storage.Storage)src.backend.lib.storage.Storage
db_port (defined in src.backend.lib.storage.Storage)src.backend.lib.storage.Storage
engine (defined in src.backend.lib.storage.Storage)src.backend.lib.storage.Storage
fuzzy_search_books(self, str query, int limit=30) (defined in src.backend.lib.storage.Storage)src.backend.lib.storage.Storage
get_book(self, id)src.backend.lib.storage.Storage
get_books(self, collection=None, skip=None, limit=None)src.backend.lib.storage.Storage
get_collection(self, name)src.backend.lib.storage.Storage
get_collections(self)src.backend.lib.storage.Storage
get_connection_string(self)src.backend.lib.storage.Storage
insert_book(self, book)src.backend.lib.storage.Storage
make_collections(self)src.backend.lib.storage.Storage
parse_advanced_query(self, str query)src.backend.lib.storage.Storage
parse_collections_from_path(self, dict() book)src.backend.lib.storage.Storage
password (defined in src.backend.lib.storage.Storage)src.backend.lib.storage.Storage
sql (defined in src.backend.lib.storage.Storage)src.backend.lib.storage.Storage
user (defined in src.backend.lib.storage.Storage)src.backend.lib.storage.Storage
+ + +
+ + diff --git a/docs/pyShelf/html/db/dd5/namespaceFastAPIServer.html b/docs/pyShelf/html/db/dd5/namespaceFastAPIServer.html new file mode 100644 index 0000000..87a5ca1 --- /dev/null +++ b/docs/pyShelf/html/db/dd5/namespaceFastAPIServer.html @@ -0,0 +1,348 @@ + + + + + + + +pyShelf Open Source Ebook Server: FastAPIServer Namespace Reference + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + +
+
+
+ +
FastAPIServer Namespace Reference
+
+
+ + + +

+Classes

class  FastAPIServer
+ + + + + + + + +

+Functions

str base64decode (string)
str summarize (string)
str convertDateTime (datetime timestamp)
dumps books_tojson (obj)
dumps book_tojson (book)
dumps tojson (obj)
dumps collections_tojson (collection)
+ + + + + + + + + + +

+Variables

 app = FastAPI()
 STATIC_DIR
 TEMPLATES_DIR
 templates = Jinja2Templates(directory=str(TEMPLATES_DIR))
list origins
 allow_origins
 allow_credentials
 allow_methods
 allow_headers
+

Detailed Description

+
pyShelf's main frontend library.

Function Documentation

+ +

◆ base64decode()

+ +
+
+ + + + + + + +
str FastAPIServer.base64decode ( string)
+
+
Decode a base64 string.
+
+
+ +

◆ book_tojson()

+ +
+
+ + + + + + + +
dumps FastAPIServer.book_tojson ( book)
+
+
Convert a book object to a json.
+
+
+ +

◆ books_tojson()

+ +
+
+ + + + + + + +
dumps FastAPIServer.books_tojson ( obj)
+
+
Convert an object to a dictionary.
+
+
+ +

◆ collections_tojson()

+ +
+
+ + + + + + + +
dumps FastAPIServer.collections_tojson ( collection)
+
+
Convert a collections object to json.
+
+
+ +

◆ convertDateTime()

+ +
+
+ + + + + + + +
str FastAPIServer.convertDateTime (datetime timestamp)
+
+
Convert a datetime object to a string.
+
+
+ +

◆ summarize()

+ +
+
+ + + + + + + +
str FastAPIServer.summarize ( string)
+
+
Summarize a string.
+
+
+ +

◆ tojson()

+ +
+
+ + + + + + + +
dumps FastAPIServer.tojson ( obj)
+
+ +
+
+

Variable Documentation

+ +

◆ allow_credentials

+ +
+
+ + + + +
FastAPIServer.allow_credentials
+
+ +
+
+ +

◆ allow_headers

+ +
+
+ + + + +
FastAPIServer.allow_headers
+
+ +
+
+ +

◆ allow_methods

+ +
+
+ + + + +
FastAPIServer.allow_methods
+
+ +
+
+ +

◆ allow_origins

+ +
+
+ + + + +
FastAPIServer.allow_origins
+
+ +
+
+ +

◆ app

+ +
+
+ + + + +
FastAPIServer.app = FastAPI()
+
+ +
+
+ +

◆ origins

+ +
+
+ + + + +
list FastAPIServer.origins
+
+Initial value:
1= [
+
2 "http://localhost",
+
3 "http://localhost:8081",
+
4 "http://localhost:8080",
+
5 "*"
+
6]
+
+
+
+ +

◆ STATIC_DIR

+ +
+
+ + + + +
FastAPIServer.STATIC_DIR
+
+ +
+
+ +

◆ templates

+ +
+
+ + + + +
FastAPIServer.templates = Jinja2Templates(directory=str(TEMPLATES_DIR))
+
+ +
+
+ +

◆ TEMPLATES_DIR

+ +
+
+ + + + +
FastAPIServer.TEMPLATES_DIR
+
+ +
+
+
+ + +
+ + diff --git a/docs/pyShelf/html/db/dda/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Catalogue.html b/docs/pyShelf/html/db/dda/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Catalogue.html new file mode 100644 index 0000000..6b2f526 --- /dev/null +++ b/docs/pyShelf/html/db/dda/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Catalogue.html @@ -0,0 +1,825 @@ + + + + + + + +pyShelf Open Source Ebook Server: src.backend.tests.library_test.Test_Catalogue Class Reference + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+ +
src.backend.tests.library_test.Test_Catalogue Class Reference
+
+
+
+Inheritance diagram for src.backend.tests.library_test.Test_Catalogue:
+
+
+ + +src.backend.lib.library.Catalogue + +
+ + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self)
 filter_books (self)
 scan_folder (self, _path=None)
 process_by_filetype (self, book)
 extract_metadata_epub (self, book)
 extract_metadata_pdf (self, book)
 extract_metadata_mobi (self, book)
 extract_content (self, book_zip, book)
 extract_cover_html (self, book_zip, book)
 extract_cover_image (self, book_zip, book)
 compare_shelf_current (self)
 import_books (self, list=None, **kwargs)
+ + + +

+Static Public Member Functions

 process_epub (book)
 stripTags (source)
+ + + + + + + + + + + + + + +

+Public Attributes

str book_shelf = "app/" + self.book_shelf
list file_list = []
 opf_regx = re.compile(r"\.opf")
 cover_regx = re.compile(r"\.jpg|\.jpeg|\.png|\.bmp|\.gif")
 html_regx = re.compile(r"\.html")
 title_sanitization_regx = re.compile(r"^(Book )+[0-9]*")
 title_sanitization_lvl2_regx
 title_sanitization_dirs_regx = re.compile(r"/")
 root_dir = config.root
 book_folder = config.book_path
 books = None
 db_pointer = config.catalogue_db
 config = config
+

Detailed Description

+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + +
src.backend.tests.library_test.Test_Catalogue.__init__ ( self)
+
+ +
+
+

Member Function Documentation

+ +

◆ compare_shelf_current()

+ +
+
+ + + + + +
+ + + + + + + +
src.backend.lib.library.Catalogue.compare_shelf_current ( self)
+
+inherited
+
+
Calls storage system, gets list of books stored and compares against files on disk
+
+
+
+ +

◆ extract_content()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
src.backend.lib.library.Catalogue.extract_content ( self,
book_zip,
book )
+
+inherited
+
+
Opens epub as zip file filters then stores as list any files matching opf_regx
+
+
+
+ +

◆ extract_cover_html()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
src.backend.lib.library.Catalogue.extract_cover_html ( self,
book_zip,
book )
+
+inherited
+
+
Opens epub as zip file filters then stores as list any files matching html_regx
+
+
+
+ +

◆ extract_cover_image()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
src.backend.lib.library.Catalogue.extract_cover_image ( self,
book_zip,
book )
+
+inherited
+
+
Opens epub as zip file filters then stores as list any files matching cover_regx
+
+
+
+ +

◆ extract_metadata_epub()

+ +
+
+ + + + + +
+ + + + + + + + + + + +
src.backend.lib.library.Catalogue.extract_metadata_epub ( self,
book )
+
+inherited
+
+
Extract metadata from epub file
+
+:param book: Dictionary of epub file contents
+:returns: Dictionary of book metadata
+
+
+
+ +

◆ extract_metadata_mobi()

+ +
+
+ + + + + +
+ + + + + + + + + + + +
src.backend.lib.library.Catalogue.extract_metadata_mobi ( self,
book )
+
+inherited
+
+ +
+
+ +

◆ extract_metadata_pdf()

+ +
+
+ + + + + +
+ + + + + + + + + + + +
src.backend.lib.library.Catalogue.extract_metadata_pdf ( self,
book )
+
+inherited
+
+
Return extracted metadata
+:NOTES: Retrieval of data has been problematic, some pdf's providing
+reliable titles that corespond with the actual, and others being
+nonsense.
+
+
+
+ +

◆ filter_books()

+ +
+
+ + + + + + + +
src.backend.tests.library_test.Test_Catalogue.filter_books ( self)
+
+
Calls scan_folder and filters out book files.
+
+:returns self._book_list_expanded: json string containing
+all book metadata
+
+

Reimplemented from src.backend.lib.library.Catalogue.

+ +
+
+ +

◆ import_books()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
src.backend.lib.library.Catalogue.import_books ( self,
list = None,
** kwargs )
+
+inherited
+
+
Main entry point for import operations.
+Gets a list of new files via compare_shelf_current.
+Iterates over list and inserts new books into database.
+
+

Reimplemented in src.backend.lib.overide.ACatalogue.

+ +
+
+ +

◆ process_by_filetype()

+ +
+
+ + + + + +
+ + + + + + + + + + + +
src.backend.lib.library.Catalogue.process_by_filetype ( self,
book )
+
+inherited
+
+
Determine books filetype and process.
+
+
+ +

◆ process_epub()

+ +
+
+ + + + + +
+ + + + + + + +
src.backend.lib.library.Catalogue.process_epub ( book)
+
+staticinherited
+
+
Return dictionary of epub file contents
+
+
+ +

◆ scan_folder()

+ +
+
+ + + + + +
+ + + + + + + + + + + +
src.backend.lib.library.Catalogue.scan_folder ( self,
_path = None )
+
+inherited
+
+
Scan folder by _path, allows recurisive scanning
+
+:param _path: Path to scan
+
+

Reimplemented in src.backend.lib.overide.ACatalogue.

+ +
+
+ +

◆ stripTags()

+ +
+
+ + + + + +
+ + + + + + + +
src.backend.lib.library.Catalogue.stripTags ( source)
+
+staticinherited
+
+ +
+
+

Member Data Documentation

+ +

◆ book_folder

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.library.Catalogue.book_folder = config.book_path
+
+inherited
+
+ +
+
+ +

◆ book_shelf

+ +
+
+ + + + +
str src.backend.tests.library_test.Test_Catalogue.book_shelf = "app/" + self.book_shelf
+
+ +
+
+ +

◆ books

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.library.Catalogue.books = None
+
+inherited
+
+ +
+
+ +

◆ config

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.library.Catalogue.config = config
+
+inherited
+
+ +
+
+ +

◆ cover_regx

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.library.Catalogue.cover_regx = re.compile(r"\.jpg|\.jpeg|\.png|\.bmp|\.gif")
+
+inherited
+
+ +
+
+ +

◆ db_pointer

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.library.Catalogue.db_pointer = config.catalogue_db
+
+inherited
+
+ +
+
+ +

◆ file_list

+ +
+
+ + + + + +
+ + + + +
list src.backend.lib.library.Catalogue.file_list = []
+
+inherited
+
+ +
+
+ +

◆ html_regx

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.library.Catalogue.html_regx = re.compile(r"\.html")
+
+inherited
+
+ +
+
+ +

◆ opf_regx

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.library.Catalogue.opf_regx = re.compile(r"\.opf")
+
+inherited
+
+ +
+
+ +

◆ root_dir

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.library.Catalogue.root_dir = config.root
+
+inherited
+
+ +
+
+ +

◆ title_sanitization_dirs_regx

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.library.Catalogue.title_sanitization_dirs_regx = re.compile(r"/")
+
+inherited
+
+ +
+
+ +

◆ title_sanitization_lvl2_regx

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.library.Catalogue.title_sanitization_lvl2_regx
+
+inherited
+
+Initial value:
= re.compile(
+
r"^(Book )+[0-9]*\W+(-)")
+
+
+
+ +

◆ title_sanitization_regx

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.library.Catalogue.title_sanitization_regx = re.compile(r"^(Book )+[0-9]*")
+
+inherited
+
+ +
+
+
The documentation for this class was generated from the following file: +
+ + +
+ + diff --git a/docs/pyShelf/html/db/dda/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Catalogue.png b/docs/pyShelf/html/db/dda/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Catalogue.png new file mode 100644 index 0000000000000000000000000000000000000000..fffbc888a4905315bfd22a8a1f0cdb81bee3a978 GIT binary patch literal 981 zcmeAS@N?(olHy`uVBq!ia0y~yVB`g|12~w0q{-?F%Yl@1fKQ0)|NsAi%olIImi8Z7 zZegHVATj;Siw6%L0L4wuhAjcgah3%61v3EoU|`NP`w9aCbAqRfV@L(#+qtj%UMujl zs0(L4{a*iQa_$a^$6J=V?|$ngoO&zazyWr%`i<{@>rG|1_Vn8BZsO9cV%*u5F(GBy z|79B|ri5g@`S$pI&D>g(2`TH|R%~jV_sVC|_b+-<$%{`qOj? zy@kCKkIlU6CUtk4-{KVS>y=$o*IGz*%!FgS@>j|xEUGu{+?)b zzC%U+b?Y9%bMKD&1l^uo`FNJw?%;W+q!nLIcv8DpOw;x;fBC5y51bd?)8w00EW~p+ zeoy1;gZ8gq&kc&WfZts$uo9n&N@zUP<#$&H8g(WpFss8V_ zWWtkt52R3QKDO`u?h-qO4~)N<7(7iF60TgIUeLkD;A54*(VoHJptMndm*Iqp)FMWP znJ&&I3<{GofU+q%M@gW5&xihKQ+Y|Oo_HkEz$%$X(C zKx59F0cn^qGquV=dF`H8fp0ceX~?&JHZ`tZa3}EOzqDs@@iN)Jp9?qdYdlsgy!&~^ zJGtre4I>s6GTqIKzWzY&=;b&6Pd&TlwDwi?^IO}CETlhY+`oUc`u5|S7b`rTY3;8v zuPVLs`-*GH;^h~o-G~Oq-vwa&eYM>3ef{EzJz{R>WLw|PUwzE2@Y}oWsL&-3Ygne| z<-HS8U9ilRNA~fWS$C)FXZTE<6rLKHCH1}PRq&D}Cg;wWTzau>rrXJscP(+3SL7=1 zxH56^#IW9pmy&sFH4+sk;+W;n{s-h(R!`3(uy{E zdzNey|8&gQ-xyePkY=FP+~tJWt!R+`jh>xJL2 z(+xUv=AJq*9*j4Gq9-kFCZE*pZMm0z{$Y;zd-r-`t*8|+12TBJ`njxgN@xNA8k^hv literal 0 HcmV?d00001 diff --git a/docs/pyShelf/html/dc/d3e/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Catalogue-members.html b/docs/pyShelf/html/dc/d3e/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Catalogue-members.html new file mode 100644 index 0000000..09e218d --- /dev/null +++ b/docs/pyShelf/html/dc/d3e/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Catalogue-members.html @@ -0,0 +1,99 @@ + + + + + + + +pyShelf Open Source Ebook Server: Member List + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+
src.backend.tests.library_test.Test_Catalogue Member List
+
+
+ +

This is the complete list of members for src.backend.tests.library_test.Test_Catalogue, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
__init__(self) (defined in src.backend.tests.library_test.Test_Catalogue)src.backend.tests.library_test.Test_Catalogue
book_folder (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
book_shelf (defined in src.backend.tests.library_test.Test_Catalogue)src.backend.tests.library_test.Test_Catalogue
books (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
compare_shelf_current(self)src.backend.lib.library.Catalogue
config (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
cover_regx (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
db_pointer (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
extract_content(self, book_zip, book)src.backend.lib.library.Catalogue
extract_cover_html(self, book_zip, book)src.backend.lib.library.Catalogue
extract_cover_image(self, book_zip, book)src.backend.lib.library.Catalogue
extract_metadata_epub(self, book)src.backend.lib.library.Catalogue
extract_metadata_mobi(self, book) (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
extract_metadata_pdf(self, book)src.backend.lib.library.Catalogue
file_list (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
filter_books(self)src.backend.tests.library_test.Test_Catalogue
html_regx (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
import_books(self, list=None, **kwargs)src.backend.lib.library.Catalogue
opf_regx (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
process_by_filetype(self, book)src.backend.lib.library.Catalogue
process_epub(book)src.backend.lib.library.Cataloguestatic
root_dir (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
scan_folder(self, _path=None)src.backend.lib.library.Catalogue
stripTags(source) (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Cataloguestatic
title_sanitization_dirs_regx (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
title_sanitization_lvl2_regx (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
title_sanitization_regx (defined in src.backend.lib.library.Catalogue)src.backend.lib.library.Catalogue
+ + +
+ + diff --git a/docs/pyShelf/html/dc/ded/classsrc_1_1backend_1_1lib_1_1overide_1_1ACatalogue.html b/docs/pyShelf/html/dc/ded/classsrc_1_1backend_1_1lib_1_1overide_1_1ACatalogue.html new file mode 100644 index 0000000..12f688a --- /dev/null +++ b/docs/pyShelf/html/dc/ded/classsrc_1_1backend_1_1lib_1_1overide_1_1ACatalogue.html @@ -0,0 +1,795 @@ + + + + + + + +pyShelf Open Source Ebook Server: src.backend.lib.overide.ACatalogue Class Reference + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+ +
src.backend.lib.overide.ACatalogue Class Reference
+
+
+
+Inheritance diagram for src.backend.lib.overide.ACatalogue:
+
+
+ + +src.backend.lib.library.Catalogue + +
+ + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self)
 scan_folder (self, _path=None)
 import_books (self, **kwargs)
 filter_books (self)
 process_by_filetype (self, book)
 extract_metadata_epub (self, book)
 extract_metadata_pdf (self, book)
 extract_metadata_mobi (self, book)
 extract_content (self, book_zip, book)
 extract_cover_html (self, book_zip, book)
 extract_cover_image (self, book_zip, book)
 compare_shelf_current (self)
+ + + +

+Static Public Member Functions

 process_epub (book)
 stripTags (source)
+ + + + + + + + + + + + + +

+Public Attributes

list file_list = []
 opf_regx = re.compile(r"\.opf")
 cover_regx = re.compile(r"\.jpg|\.jpeg|\.png|\.bmp|\.gif")
 html_regx = re.compile(r"\.html")
 title_sanitization_regx = re.compile(r"^(Book )+[0-9]*")
 title_sanitization_lvl2_regx
 title_sanitization_dirs_regx = re.compile(r"/")
 root_dir = config.root
 book_folder = config.book_path
 books = None
 db_pointer = config.catalogue_db
 config = config
+

Detailed Description

+
Aynchronous overide of library.Catalogue,
+: TODO : Complete or discard this overide
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + +
src.backend.lib.overide.ACatalogue.__init__ ( self)
+
+ +
+
+

Member Function Documentation

+ +

◆ compare_shelf_current()

+ +
+
+ + + + + +
+ + + + + + + +
src.backend.lib.library.Catalogue.compare_shelf_current ( self)
+
+inherited
+
+
Calls storage system, gets list of books stored and compares against files on disk
+
+
+
+ +

◆ extract_content()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
src.backend.lib.library.Catalogue.extract_content ( self,
book_zip,
book )
+
+inherited
+
+
Opens epub as zip file filters then stores as list any files matching opf_regx
+
+
+
+ +

◆ extract_cover_html()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
src.backend.lib.library.Catalogue.extract_cover_html ( self,
book_zip,
book )
+
+inherited
+
+
Opens epub as zip file filters then stores as list any files matching html_regx
+
+
+
+ +

◆ extract_cover_image()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
src.backend.lib.library.Catalogue.extract_cover_image ( self,
book_zip,
book )
+
+inherited
+
+
Opens epub as zip file filters then stores as list any files matching cover_regx
+
+
+
+ +

◆ extract_metadata_epub()

+ +
+
+ + + + + +
+ + + + + + + + + + + +
src.backend.lib.library.Catalogue.extract_metadata_epub ( self,
book )
+
+inherited
+
+
Extract metadata from epub file
+
+:param book: Dictionary of epub file contents
+:returns: Dictionary of book metadata
+
+
+
+ +

◆ extract_metadata_mobi()

+ +
+
+ + + + + +
+ + + + + + + + + + + +
src.backend.lib.library.Catalogue.extract_metadata_mobi ( self,
book )
+
+inherited
+
+ +
+
+ +

◆ extract_metadata_pdf()

+ +
+
+ + + + + +
+ + + + + + + + + + + +
src.backend.lib.library.Catalogue.extract_metadata_pdf ( self,
book )
+
+inherited
+
+
Return extracted metadata
+:NOTES: Retrieval of data has been problematic, some pdf's providing
+reliable titles that corespond with the actual, and others being
+nonsense.
+
+
+
+ +

◆ filter_books()

+ +
+
+ + + + + +
+ + + + + + + +
src.backend.lib.library.Catalogue.filter_books ( self)
+
+inherited
+
+
Calls scan_folder and filters out book files.
+
+:returns self._book_list_expanded: json string containing
+all book metadata
+
+

Reimplemented in src.backend.tests.library_test.Test_Catalogue.

+ +
+
+ +

◆ import_books()

+ +
+
+ + + + + + + + + + + +
src.backend.lib.overide.ACatalogue.import_books ( self,
** kwargs )
+
+
Async overide of import_books
+
+

Reimplemented from src.backend.lib.library.Catalogue.

+ +
+
+ +

◆ process_by_filetype()

+ +
+
+ + + + + +
+ + + + + + + + + + + +
src.backend.lib.library.Catalogue.process_by_filetype ( self,
book )
+
+inherited
+
+
Determine books filetype and process.
+
+
+ +

◆ process_epub()

+ +
+
+ + + + + +
+ + + + + + + +
src.backend.lib.library.Catalogue.process_epub ( book)
+
+staticinherited
+
+
Return dictionary of epub file contents
+
+
+ +

◆ scan_folder()

+ +
+
+ + + + + + + + + + + +
src.backend.lib.overide.ACatalogue.scan_folder ( self,
_path = None )
+
+
Scan folder by _path, allows recurisive scanning
+
+

Reimplemented from src.backend.lib.library.Catalogue.

+ +
+
+ +

◆ stripTags()

+ +
+
+ + + + + +
+ + + + + + + +
src.backend.lib.library.Catalogue.stripTags ( source)
+
+staticinherited
+
+ +
+
+

Member Data Documentation

+ +

◆ book_folder

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.library.Catalogue.book_folder = config.book_path
+
+inherited
+
+ +
+
+ +

◆ books

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.library.Catalogue.books = None
+
+inherited
+
+ +
+
+ +

◆ config

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.library.Catalogue.config = config
+
+inherited
+
+ +
+
+ +

◆ cover_regx

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.library.Catalogue.cover_regx = re.compile(r"\.jpg|\.jpeg|\.png|\.bmp|\.gif")
+
+inherited
+
+ +
+
+ +

◆ db_pointer

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.library.Catalogue.db_pointer = config.catalogue_db
+
+inherited
+
+ +
+
+ +

◆ file_list

+ +
+
+ + + + + +
+ + + + +
list src.backend.lib.library.Catalogue.file_list = []
+
+inherited
+
+ +
+
+ +

◆ html_regx

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.library.Catalogue.html_regx = re.compile(r"\.html")
+
+inherited
+
+ +
+
+ +

◆ opf_regx

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.library.Catalogue.opf_regx = re.compile(r"\.opf")
+
+inherited
+
+ +
+
+ +

◆ root_dir

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.library.Catalogue.root_dir = config.root
+
+inherited
+
+ +
+
+ +

◆ title_sanitization_dirs_regx

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.library.Catalogue.title_sanitization_dirs_regx = re.compile(r"/")
+
+inherited
+
+ +
+
+ +

◆ title_sanitization_lvl2_regx

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.library.Catalogue.title_sanitization_lvl2_regx
+
+inherited
+
+Initial value:
= re.compile(
+
r"^(Book )+[0-9]*\W+(-)")
+
+
+
+ +

◆ title_sanitization_regx

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.library.Catalogue.title_sanitization_regx = re.compile(r"^(Book )+[0-9]*")
+
+inherited
+
+ +
+
+
The documentation for this class was generated from the following file: +
+ + +
+ + diff --git a/docs/pyShelf/html/dc/ded/classsrc_1_1backend_1_1lib_1_1overide_1_1ACatalogue.png b/docs/pyShelf/html/dc/ded/classsrc_1_1backend_1_1lib_1_1overide_1_1ACatalogue.png new file mode 100644 index 0000000000000000000000000000000000000000..4b3acda01029ee1ef1939ac05afb723b5210cff3 GIT binary patch literal 856 zcmeAS@N?(olHy`uVBq!ia0vp^H-I>RgBeKr$a-f1Dd_;85ZC|z{{xvX-h3_XKeXJ! zK(jz%`k5CG9y|bwo1P6@0+iz{3GxeO0P?}WoN4wI1_q|bo-U3d6^w7^Ca!y|z|+#+ z8S?X=`n@fj3DV0|t9IveFFK`ilyNqH&u8)5+j5P$q&?3qXLXyToY^?>iN`BuZ<{3pVl{AXBZfD$V8??~z?c(h-HO;t%kG^KueEDm_@rBzGu9nHa(GkijnA~Oh z@P6aXtl~hMKeO6yPx9}){ir%YY!hqs{I0h>Rp(}S_i-;@xb|~TZ1dDrH%gD)VSMXx zG-|U?=oZyerbVG4cTRO0ht&Too?!gCV*ct!FK!B_H_SaQ89S zr2Zwl_OZQrSGV<~dr)lrlrEK@-?tp_C{ocim?YzAePdhh?G~nn_{+=;X;;=H^dDc6 zvbpJPOz|XN?rp1-7hzDJr!L-0^X}7H@w)-r?eMZ*`x5U}@^%&AVI+t>^rg-mve+biT>o1RvgEvcC50 z>E?Bp@7bLBRrt<5?@4&w@mERH6SMAUU%GfDjCUE&`RQNN?#LK#bK?z5i>|)9?AXb| z;>BN1*kya?CO$sG8)CS%{Jp}T>%YnpZmsMNJic;o@3Pm-`x$pj-EZ3Y;bByK)6JJv z8y<^9Z^(Mhti3YbXmieVEWfcGT>B)c^KDg74QktY>O&EC&Wk=avI5E^e2=!DAiarRlrE-c@en V&p&-y*1$Z#;OXk;vd$@?2>?Fmmn;AP literal 0 HcmV?d00001 diff --git a/docs/pyShelf/html/dd/d22/classFastAPIServer_1_1FastAPIServer.html b/docs/pyShelf/html/dd/d22/classFastAPIServer_1_1FastAPIServer.html new file mode 100644 index 0000000..25a579b --- /dev/null +++ b/docs/pyShelf/html/dd/d22/classFastAPIServer_1_1FastAPIServer.html @@ -0,0 +1,404 @@ + + + + + + + +pyShelf Open Source Ebook Server: FastAPIServer.FastAPIServer Class Reference + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+ +
FastAPIServer.FastAPIServer Class Reference
+
+
+ + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self, config)
 compile_static_files (self)
None use_route_names_as_operation_ids (self, FastAPI app)
 index (Request request, int skip=0, int limit=30)
 books (Request request, int skip=0, int limit=10, collection=None)
 book (Request request, int book_id)
 book (Request request, int book_id)
 collections (Request request)
 collection (Request request, str collection, int skip=0, int limit=30)
 search_books_api (Request request, str search)
 run (self)
+ + + + + +

+Public Attributes

 config = config
 fe_config
 fe_server = uvicorn.Server(self.fe_config)
JSInterface JSInterface = JSInterface(self.config)
+

Detailed Description

+
Entry point for FastAPI server.

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + +
FastAPIServer.FastAPIServer.__init__ ( self,
config )
+
+
Initialize FastAPIServer object parameters.
+
+
+

Member Function Documentation

+ +

◆ book() [1/2]

+ +
+
+ + + + + + + + + + + +
FastAPIServer.FastAPIServer.book (Request request,
int book_id )
+
+ +
+
+ +

◆ book() [2/2]

+ +
+
+ + + + + + + + + + + +
FastAPIServer.FastAPIServer.book (Request request,
int book_id )
+
+ +
+
+ +

◆ books()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
FastAPIServer.FastAPIServer.books (Request request,
int skip = 0,
int limit = 10,
collection = None )
+
+ +
+
+ +

◆ collection()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
FastAPIServer.FastAPIServer.collection (Request request,
str collection,
int skip = 0,
int limit = 30 )
+
+
Collection file responder.
+
+
+ +

◆ collections()

+ +
+
+ + + + + + + +
FastAPIServer.FastAPIServer.collections (Request request)
+
+ +
+
+ +

◆ compile_static_files()

+ +
+
+ + + + + + + +
FastAPIServer.FastAPIServer.compile_static_files ( self)
+
+
Compile static files for web frontend.
+
+
+ +

◆ index()

+ +
+
+ + + + + + + + + + + + + + + + +
FastAPIServer.FastAPIServer.index (Request request,
int skip = 0,
int limit = 30 )
+
+ +
+
+ +

◆ run()

+ +
+
+ + + + + + + +
FastAPIServer.FastAPIServer.run ( self)
+
+
Front end server entrypoint.
+
+
+ +

◆ search_books_api()

+ +
+
+ + + + + + + + + + + +
FastAPIServer.FastAPIServer.search_books_api (Request request,
str search )
+
+
Collection file responder.
+
+
+ +

◆ use_route_names_as_operation_ids()

+ +
+
+ + + + + + + + + + + +
None FastAPIServer.FastAPIServer.use_route_names_as_operation_ids ( self,
FastAPI app )
+
+
Use route name as operation id.
+
+
+

Member Data Documentation

+ +

◆ config

+ +
+
+ + + + +
FastAPIServer.FastAPIServer.config = config
+
+ +
+
+ +

◆ fe_config

+ +
+
+ + + + +
FastAPIServer.FastAPIServer.fe_config
+
+Initial value:
= uvicorn.Config(app, host="0.0.0.0", port=8080,
+
log_level="info", reload=True)
+
+
+
+ +

◆ fe_server

+ +
+
+ + + + +
FastAPIServer.FastAPIServer.fe_server = uvicorn.Server(self.fe_config)
+
+ +
+
+ +

◆ JSInterface

+ +
+
+ + + + +
JSInterface FastAPIServer.FastAPIServer.JSInterface = JSInterface(self.config)
+
+ +
+
+
The documentation for this class was generated from the following file: +
+ + +
+ + diff --git a/docs/pyShelf/html/dd/d98/classsrc_1_1backend_1_1lib_1_1models_1_1User.html b/docs/pyShelf/html/dd/d98/classsrc_1_1backend_1_1lib_1_1models_1_1User.html new file mode 100644 index 0000000..077a76f --- /dev/null +++ b/docs/pyShelf/html/dd/d98/classsrc_1_1backend_1_1lib_1_1models_1_1User.html @@ -0,0 +1,303 @@ + + + + + + + +pyShelf Open Source Ebook Server: src.backend.lib.models.User Class Reference + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+ +
src.backend.lib.models.User Class Reference
+
+
+
+Inheritance diagram for src.backend.lib.models.User:
+
+
+ + +src.backend.lib.models.Base + +
+ + + + + + + + + + + +

+Static Public Attributes

Mapped id = mapped_column(primary_key=True, nullable=False)
Mapped username = mapped_column(unique=True, nullable=False)
Mapped password = mapped_column(nullable=False)
Mapped email = mapped_column(unique=True, nullable=True)
Mapped date_joined
Mapped last_login
Mapped is_active = mapped_column(nullable=False, default=True)
Mapped is_admin = mapped_column(nullable=False, default=False)
Mapped is_superuser = mapped_column(nullable=False, default=False)
+

Detailed Description

+
User model.

Member Data Documentation

+ +

◆ date_joined

+ +
+
+ + + + + +
+ + + + +
Mapped src.backend.lib.models.User.date_joined
+
+static
+
+Initial value:
= mapped_column(
+
nullable=False, server_default=func.CURRENT_TIMESTAMP()
+
)
+
+
+
+ +

◆ email

+ +
+
+ + + + + +
+ + + + +
Mapped src.backend.lib.models.User.email = mapped_column(unique=True, nullable=True)
+
+static
+
+ +
+
+ +

◆ id

+ +
+
+ + + + + +
+ + + + +
Mapped src.backend.lib.models.User.id = mapped_column(primary_key=True, nullable=False)
+
+static
+
+ +
+
+ +

◆ is_active

+ +
+
+ + + + + +
+ + + + +
Mapped src.backend.lib.models.User.is_active = mapped_column(nullable=False, default=True)
+
+static
+
+ +
+
+ +

◆ is_admin

+ +
+
+ + + + + +
+ + + + +
Mapped src.backend.lib.models.User.is_admin = mapped_column(nullable=False, default=False)
+
+static
+
+ +
+
+ +

◆ is_superuser

+ +
+
+ + + + + +
+ + + + +
Mapped src.backend.lib.models.User.is_superuser = mapped_column(nullable=False, default=False)
+
+static
+
+ +
+
+ +

◆ last_login

+ +
+
+ + + + + +
+ + + + +
Mapped src.backend.lib.models.User.last_login
+
+static
+
+Initial value:
= mapped_column(
+
nullable=True, server_default=None
+
)
+
+
+
+ +

◆ password

+ +
+
+ + + + + +
+ + + + +
Mapped src.backend.lib.models.User.password = mapped_column(nullable=False)
+
+static
+
+ +
+
+ +

◆ username

+ +
+
+ + + + + +
+ + + + +
Mapped src.backend.lib.models.User.username = mapped_column(unique=True, nullable=False)
+
+static
+
+ +
+
+
The documentation for this class was generated from the following file: +
+ + +
+ + diff --git a/docs/pyShelf/html/dd/d98/classsrc_1_1backend_1_1lib_1_1models_1_1User.png b/docs/pyShelf/html/dd/d98/classsrc_1_1backend_1_1lib_1_1models_1_1User.png new file mode 100644 index 0000000000000000000000000000000000000000..c0860b604d692e8adfd92c61978c975c77483c6c GIT binary patch literal 1013 zcmeAS@N?(olHy`uVBq!ia0vp^>wvg}gBeJAsw;d4QqloFA+G=b{|7Q(y!l$%e`vXd zfo6fk^fNCWJa_;UH$5A+1SrQ@666=m0OW&#In(Sb3=GT-o-U3d6^w7^zV4G&(tE{}JD3OlHip?{3NKexh-IlHqp#4;$(Oy)<7pI89nTVV8=e>#IpABK8;V-uIdG zrRTT(;_Y208B~78)-AH0Hv842CCNq%o^{jbzj{}H-q(st`iA+}ufM-Ozw;n0zBK#4 z8JA~Wvwz9?mC+a1?0T{G>E7g6cF%oJ%}Z~`l--)S?&RHD|Mg$UU5@gvz7_sdaObMC z@2)*t)~B-n;PTzCw{4y9=EJUkq1g*B{&k!bY`0VL+0N?ArE~uky}OnyeUImA`u|#% zS9-sS_s?p-$D{Idy=UyC9;H%GqpmBeCpE5J)?GR!m7#${j$s2|_DefC@1N_I{@xOM zvfS|Q9!Um;zALN^8bRU=i#%c(I+RKo6}kurd_TV}_qJ7nuwZ2C6;Z)XrBYXyMHP#q zU0kZ#4vN)_9S?U&aa&!+d-}Dql98g@_infRlKUmOyN<6qwa>V;_55+=obKZH>)KbZ zx*uzOLiN$DYZr4aOYMx>#=bgQ_S~km3th7Umv7WvXLvhU`iVf!;Tf4R?_zds-?jPP zt7}t#9xfF7Cc~!vap!IJw%C|?x9_YKRgTra_*!mp#a*%A0oQp9yxO7?uO-Br79WW{ zArh`vcKqYRci-~Urt_?OXi&bJXT}-h9^c~c_nvMqzOLe2tNZtC!1|uD8G5n5EYB$X zGn#pqN7wO8%jDUPE>HfegS_SuD>zXjDBMM*>ubsO+}qO_8I&p*4p^;O`ny8s>F#Oo zE|;m^KU(rRjiJGUlu!hP^IiL;Q#SEwtXc(3UaM9GE?KuKOXPh?`_|2R>3tvq@73RLq*tW7e=I!eX zq1&zIq((b;Us>dr934}ZW zWCuUZeb<+K`Oe<*pNa44X7apkEirfAYji7dSINug=FLA&r<56QS+n~t&rkn|P}3P# tLPL9%N<%{zd&Gub)tI*n=wqJ!3@Y_sa(Sk_{|U^X44$rjF6*2UngDxh^PB(x literal 0 HcmV?d00001 diff --git a/docs/pyShelf/html/dd/de1/namespacesrc_1_1backend_1_1lib_1_1storage.html b/docs/pyShelf/html/dd/de1/namespacesrc_1_1backend_1_1lib_1_1storage.html new file mode 100644 index 0000000..04ebbe3 --- /dev/null +++ b/docs/pyShelf/html/dd/de1/namespacesrc_1_1backend_1_1lib_1_1storage.html @@ -0,0 +1,75 @@ + + + + + + + +pyShelf Open Source Ebook Server: src.backend.lib.storage Namespace Reference + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+ +
src.backend.lib.storage Namespace Reference
+
+
+ + + +

+Classes

class  Storage
+

Detailed Description

+
Pyshelf's Main Storage Class.
+ + +
+ + diff --git a/docs/pyShelf/html/de/d11/classsrc_1_1backend_1_1lib_1_1api__hooks_1_1DuckDuckGo-members.html b/docs/pyShelf/html/de/d11/classsrc_1_1backend_1_1lib_1_1api__hooks_1_1DuckDuckGo-members.html new file mode 100644 index 0000000..5798eb8 --- /dev/null +++ b/docs/pyShelf/html/de/d11/classsrc_1_1backend_1_1lib_1_1api__hooks_1_1DuckDuckGo-members.html @@ -0,0 +1,77 @@ + + + + + + + +pyShelf Open Source Ebook Server: Member List + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+
src.backend.lib.api_hooks.DuckDuckGo Member List
+
+ + + +
+ + diff --git a/docs/pyShelf/html/de/d6d/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1Server-members.html b/docs/pyShelf/html/de/d6d/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1Server-members.html new file mode 100644 index 0000000..63f791d --- /dev/null +++ b/docs/pyShelf/html/de/d6d/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1Server-members.html @@ -0,0 +1,85 @@ + + + + + + + +pyShelf Open Source Ebook Server: Member List + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+
src.backend.lib.pyShelf.Server Member List
+
+ + + +
+ + diff --git a/docs/pyShelf/html/df/d03/classsrc_1_1backend_1_1lib_1_1models_1_1Collection.html b/docs/pyShelf/html/df/d03/classsrc_1_1backend_1_1lib_1_1models_1_1Collection.html new file mode 100644 index 0000000..12b5dc0 --- /dev/null +++ b/docs/pyShelf/html/df/d03/classsrc_1_1backend_1_1lib_1_1models_1_1Collection.html @@ -0,0 +1,162 @@ + + + + + + + +pyShelf Open Source Ebook Server: src.backend.lib.models.Collection Class Reference + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+ +
src.backend.lib.models.Collection Class Reference
+
+
+
+Inheritance diagram for src.backend.lib.models.Collection:
+
+
+ + +src.backend.lib.models.Base + +
+ + + + + +

+Static Public Attributes

Mapped id = mapped_column(primary_key=True)
Mapped name = mapped_column(unique=True)
 book_collections
+

Detailed Description

+
Collection model.

Member Data Documentation

+ +

◆ book_collections

+ +
+
+ + + + + +
+ + + + +
src.backend.lib.models.Collection.book_collections
+
+static
+
+Initial value:
= relationship(
+
"BookCollection", back_populates="collection", cascade="all, delete-orphan"
+
)
+
+
+
+ +

◆ id

+ +
+
+ + + + + +
+ + + + +
Mapped src.backend.lib.models.Collection.id = mapped_column(primary_key=True)
+
+static
+
+ +
+
+ +

◆ name

+ +
+
+ + + + + +
+ + + + +
Mapped src.backend.lib.models.Collection.name = mapped_column(unique=True)
+
+static
+
+ +
+
+
The documentation for this class was generated from the following file: +
+ + +
+ + diff --git a/docs/pyShelf/html/df/d03/classsrc_1_1backend_1_1lib_1_1models_1_1Collection.png b/docs/pyShelf/html/df/d03/classsrc_1_1backend_1_1lib_1_1models_1_1Collection.png new file mode 100644 index 0000000000000000000000000000000000000000..0796e73c5669cdeaf8bfcd9653ee4de72c9b0f34 GIT binary patch literal 1069 zcmeAS@N?(olHy`uVBq!ia0vp^r+~PFgBeIp)Nc6;q@)9ULR|m<{|{uoc=NTi|Il&^ z1I+@7>1SR%c<=xyZhAIs2~du+B*-tA0mugfbEer>7#Ns$c)B=-R4~4s`?p9%o8xGI z$yJ$q|2yBG`Ld;H?acn1cS6(G&Y9unTF3QfzsAxjrY%mBv^4@fjAjY7sw{q)Jf-@) zg6H~;+gE=zF)VbLH2-Dsl)?wWB9lsHSty)5|HXF7@At=_zH2tUBmel@_qW#{C*G=Y zUHN;q_@tWX`|g!3SKGu2({0z<&cDu%Jxl&GKkat)4~V<*OD1)HZ_)mXRmRuP-_2=1K387;c*uXPYbOPlL`Uzv zx%6t$njCp0B|qUQQumW{YR(3=OEtw7&bhvC)@0is&yLAF{`Aqo@+@!UGmWoqd#<`> z+|PG-nZ4AUXZwy_o3;k2-*f%Q_)X(Cr`*z;b}oi|Zk%E2%l0P3eN)S|nk?CO=l#5o zhr?g)cA1`#x3Ht*`sApWo3exsUocxc_473OwW5;~w$}dO3yY5S7MR}j_vf+B{Ho1- z*Cw5l`QgYeEci1Q;ZraxiaQk;2%L-u&c9}2$j*?RaynIVT4}&KmDL+`S|-WzFg(%> zWKftT#LBRU6vn*(&82G;MMAHNPSIGk>LQrO$Y+u_6iKNk9YU7s{p#&FlxtFvRX z;+ETI$>;4qcRYH^u9t>p`_fiA^B!DhQL}CRvlRP%I}MNTs9B@2{N%;9cM{D>F(q<; zqvhY5TO7OYl`oN3X!%8C>G%A8OVt|!srqjHmvZD6Nw6iv*%llw)tj1-IE%oy|sC7jCQmdKI;Vst0B#rb A#sB~S literal 0 HcmV?d00001 diff --git a/docs/pyShelf/html/df/d4c/namespaceobjects.html b/docs/pyShelf/html/df/d4c/namespaceobjects.html new file mode 100644 index 0000000..c58a2f8 --- /dev/null +++ b/docs/pyShelf/html/df/d4c/namespaceobjects.html @@ -0,0 +1,71 @@ + + + + + + + +pyShelf Open Source Ebook Server: objects Namespace Reference + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + +
+
+
+ +
objects Namespace Reference
+
+
+ + + +

+Classes

class  JSInterface
+

Detailed Description

+
pyShelf's Frontend Objects.
+ + +
+ + diff --git a/docs/pyShelf/html/df/d54/classsrc_1_1backend_1_1lib_1_1models_1_1BookCollection-members.html b/docs/pyShelf/html/df/d54/classsrc_1_1backend_1_1lib_1_1models_1_1BookCollection-members.html new file mode 100644 index 0000000..36cfede --- /dev/null +++ b/docs/pyShelf/html/df/d54/classsrc_1_1backend_1_1lib_1_1models_1_1BookCollection-members.html @@ -0,0 +1,77 @@ + + + + + + + +pyShelf Open Source Ebook Server: Member List + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+
src.backend.lib.models.BookCollection Member List
+
+ + + +
+ + diff --git a/docs/pyShelf/html/df/d83/classsrc_1_1backend_1_1tests_1_1config__test_1_1TestConfig.html b/docs/pyShelf/html/df/d83/classsrc_1_1backend_1_1tests_1_1config__test_1_1TestConfig.html new file mode 100644 index 0000000..b647326 --- /dev/null +++ b/docs/pyShelf/html/df/d83/classsrc_1_1backend_1_1tests_1_1config__test_1_1TestConfig.html @@ -0,0 +1,163 @@ + + + + + + + +pyShelf Open Source Ebook Server: src.backend.tests.config_test.TestConfig Class Reference + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+ +
src.backend.tests.config_test.TestConfig Class Reference
+
+
+ + + + + +

+Public Member Functions

 test_book_dir (self)
 test_title (self)
 test_version (self)
+ + +

+Static Public Attributes

 config = Config(os.path.abspath(os.path.curdir))
+

Detailed Description

+

Member Function Documentation

+ +

◆ test_book_dir()

+ +
+
+ + + + + + + +
src.backend.tests.config_test.TestConfig.test_book_dir ( self)
+
+ +
+
+ +

◆ test_title()

+ +
+
+ + + + + + + +
src.backend.tests.config_test.TestConfig.test_title ( self)
+
+ +
+
+ +

◆ test_version()

+ +
+
+ + + + + + + +
src.backend.tests.config_test.TestConfig.test_version ( self)
+
+ +
+
+

Member Data Documentation

+ +

◆ config

+ +
+
+ + + + + +
+ + + + +
src.backend.tests.config_test.TestConfig.config = Config(os.path.abspath(os.path.curdir))
+
+static
+
+ +
+
+
The documentation for this class was generated from the following file: +
+ + +
+ + diff --git a/docs/pyShelf/html/dir_1c7294442ce83d360610449d04c9d7fc.html b/docs/pyShelf/html/dir_1c7294442ce83d360610449d04c9d7fc.html new file mode 100644 index 0000000..2b061c3 --- /dev/null +++ b/docs/pyShelf/html/dir_1c7294442ce83d360610449d04c9d7fc.html @@ -0,0 +1,78 @@ + + + + + + + +pyShelf Open Source Ebook Server: src/backend/lib Directory Reference + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+
lib Directory Reference
+
+
+ + + + + + + + + + +

+Files

 
__init__.py
 
api_hooks.py
 
config.py
 
library.py
 
models.py
 
overide.py
 
pyShelf.py
 
storage.py
+
+ + +
+ + diff --git a/docs/pyShelf/html/dir_3f615ade772d23cefe5e20dcb18424a2.html b/docs/pyShelf/html/dir_3f615ade772d23cefe5e20dcb18424a2.html new file mode 100644 index 0000000..d0ea18b --- /dev/null +++ b/docs/pyShelf/html/dir_3f615ade772d23cefe5e20dcb18424a2.html @@ -0,0 +1,78 @@ + + + + + + + +pyShelf Open Source Ebook Server: src/backend Directory Reference + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+
backend Directory Reference
+
+
+ + + + +

+Directories

 
lib
 
tests
+ + + + +

+Files

 
__init__.py
 
pyShelf_MakeCollections.py
 
pyShelf_ScanLibrary.py
+
+ + +
+ + diff --git a/docs/pyShelf/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html b/docs/pyShelf/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html new file mode 100644 index 0000000..b009008 --- /dev/null +++ b/docs/pyShelf/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html @@ -0,0 +1,77 @@ + + + + + + + +pyShelf Open Source Ebook Server: src Directory Reference + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+
src Directory Reference
+
+
+ + + +

+Directories

 
backend
+ + + + +

+Files

 
__about__.py
 
__init__.py
 
__main__.py
+
+ + +
+ + diff --git a/docs/pyShelf/html/dir_8509b06bafa958d2011203a730bf5778.html b/docs/pyShelf/html/dir_8509b06bafa958d2011203a730bf5778.html new file mode 100644 index 0000000..60e7119 --- /dev/null +++ b/docs/pyShelf/html/dir_8509b06bafa958d2011203a730bf5778.html @@ -0,0 +1,71 @@ + + + + + + + +pyShelf Open Source Ebook Server: src/frontend Directory Reference + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+
frontend Directory Reference
+
+
+ + + +

+Directories

 
lib
+
+ + +
+ + diff --git a/docs/pyShelf/html/dir_9020577e2da81c4cf5a5554c26431f94.html b/docs/pyShelf/html/dir_9020577e2da81c4cf5a5554c26431f94.html new file mode 100644 index 0000000..e6e9caf --- /dev/null +++ b/docs/pyShelf/html/dir_9020577e2da81c4cf5a5554c26431f94.html @@ -0,0 +1,74 @@ + + + + + + + +pyShelf Open Source Ebook Server: src/backend/tests Directory Reference + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+
tests Directory Reference
+
+
+ + + + + + +

+Files

 
__init__.py
 
config_test.py
 
library_test.py
 
server_test.py
+
+ + +
+ + diff --git a/docs/pyShelf/html/dir_d6d65651a873fbc3232a07f3f4a594e4.html b/docs/pyShelf/html/dir_d6d65651a873fbc3232a07f3f4a594e4.html new file mode 100644 index 0000000..d0f47b7 --- /dev/null +++ b/docs/pyShelf/html/dir_d6d65651a873fbc3232a07f3f4a594e4.html @@ -0,0 +1,74 @@ + + + + + + + +pyShelf Open Source Ebook Server: src/frontend/lib Directory Reference + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + + +
+
+
+
lib Directory Reference
+
+
+ + + + + + +

+Files

 
DataHooks.py
 
FastAPIServer.py
 
objects.py
 
runtime_paths.py
+
+ + +
+ + diff --git a/docs/pyShelf/html/doxygen.svg b/docs/pyShelf/html/doxygen.svg new file mode 100644 index 0000000..79a7635 --- /dev/null +++ b/docs/pyShelf/html/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/pyShelf/html/doxygen_crawl.html b/docs/pyShelf/html/doxygen_crawl.html new file mode 100644 index 0000000..fe41c16 --- /dev/null +++ b/docs/pyShelf/html/doxygen_crawl.html @@ -0,0 +1,138 @@ + + + +Validator / crawler helper + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/pyShelf/html/dynsections.js b/docs/pyShelf/html/dynsections.js new file mode 100644 index 0000000..4f8fb0e --- /dev/null +++ b/docs/pyShelf/html/dynsections.js @@ -0,0 +1,198 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ + +function toggleVisibility(linkObj) { + return dynsection.toggleVisibility(linkObj); +} + +let dynsection = { + // helper function + updateStripes : function() { + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); + }, + + toggleVisibility : function(linkObj) { + const base = $(linkObj).attr('id'); + const summary = $('#'+base+'-summary'); + const content = $('#'+base+'-content'); + const trigger = $('#'+base+'-trigger'); + const src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.slideUp('fast'); + summary.show(); + $(linkObj).find('.arrowhead').addClass('closed').removeClass('opened'); + } else { + content.slideDown('fast'); + summary.hide(); + $(linkObj).find('.arrowhead').removeClass('closed').addClass('opened'); + } + return false; + }, + + toggleLevel : function(level) { + $('table.directory tr').each(function() { + const l = this.id.split('_').length-1; + const i = $('#img'+this.id.substring(3)); + const a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + const id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + const start = $(this).attr('data-start'); + const end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + const line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').addClass('plus').removeClass('minus'); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); + }, +}; +/* @license-end */ +$(function() { + $('.code,.codeRef').each(function() { + $(this).data('powertip',$('#a'+$(this).attr('href').replace(/.*\//,'').replace(/[^a-z_A-Z0-9]/g,'_')).html()); + $.fn.powerTip.smartPlacementLists.s = [ 's', 'n', 'ne', 'se' ]; + $(this).powerTip({ placement: 's', smartPlacement: true, mouseOnToPopup: true }); + }); +}); diff --git a/docs/pyShelf/html/files.html b/docs/pyShelf/html/files.html new file mode 100644 index 0000000..3878bbf --- /dev/null +++ b/docs/pyShelf/html/files.html @@ -0,0 +1,94 @@ + + + + + + + +pyShelf Open Source Ebook Server: File List + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + +
+
+
+
File List
+
+
+
Here is a list of all documented files with brief descriptions:
+
[detail level 1234]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
src
 
backend
 
lib
 
__init__.py
 
api_hooks.py
 
config.py
 
library.py
 
models.py
 
overide.py
 
pyShelf.py
 
storage.py
 
tests
 
__init__.py
 
config_test.py
 
library_test.py
 
server_test.py
 
__init__.py
 
pyShelf_MakeCollections.py
 
pyShelf_ScanLibrary.py
 
frontend
 
lib
 
DataHooks.py
 
FastAPIServer.py
 
objects.py
 
runtime_paths.py
 
__about__.py
 
__init__.py
 
__main__.py
+
+
+ + +
+ + diff --git a/docs/pyShelf/html/functions.html b/docs/pyShelf/html/functions.html new file mode 100644 index 0000000..c571213 --- /dev/null +++ b/docs/pyShelf/html/functions.html @@ -0,0 +1,170 @@ + + + + + + + +pyShelf Open Source Ebook Server: Class Members + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + +
+
+
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- _ -

+ + +

- b -

+ + +

- c -

+ + +

- e -

+ + +

- f -

+ + +

- g -

+ + +

- i -

+ + +

- m -

+ + +

- o -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- u -

+
+ + +
+ + diff --git a/docs/pyShelf/html/functions_func.html b/docs/pyShelf/html/functions_func.html new file mode 100644 index 0000000..41be8c8 --- /dev/null +++ b/docs/pyShelf/html/functions_func.html @@ -0,0 +1,170 @@ + + + + + + + +pyShelf Open Source Ebook Server: Class Members - Functions + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + +
+
+
+
Here is a list of all documented functions with links to the class documentation for each member:
+ +

- _ -

+ + +

- b -

+ + +

- c -

+ + +

- e -

+ + +

- f -

+ + +

- g -

+ + +

- i -

+ + +

- m -

+ + +

- o -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- u -

+
+ + +
+ + diff --git a/docs/pyShelf/html/hierarchy.html b/docs/pyShelf/html/hierarchy.html new file mode 100644 index 0000000..0698be0 --- /dev/null +++ b/docs/pyShelf/html/hierarchy.html @@ -0,0 +1,89 @@ + + + + + + + +pyShelf Open Source Ebook Server: Class Hierarchy + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + +
+ + + diff --git a/docs/pyShelf/html/index.hhc b/docs/pyShelf/html/index.hhc new file mode 100644 index 0000000..5e6cd3f --- /dev/null +++ b/docs/pyShelf/html/index.hhc @@ -0,0 +1,342 @@ + + + + + +
    +
  • +
      +
    • +
        +
      • +
          +
        • +
            +
          +
        +
      • +
          +
        • +
            +
          • +
          • +
          • +
          • +
          • +
          • +
          +
        • +
        • +
        • +
        • +
        • +
        • +
        +
      • +
          +
        • +
            +
          • +
          • +
          +
        +
      • +
          +
        • +
            +
          • +
          • +
          +
        • +
            +
          • +
              +
            • +
                +
              • +
                  +
                • +
                • +
                • +
                +
              +
            • +
                +
              • +
                  +
                • +
                • +
                • +
                • +
                • +
                • +
                • +
                • +
                • +
                • +
                • +
                • +
                +
              +
            +
          +
        +
      +
    • +
        +
      • +
      • +
      +
    +
  • +
      +
    • +
        +
      • +
          +
        • +
            +
          +
        +
      • +
          +
        • +
            +
          • +
          • +
          • +
          • +
          • +
          • +
          +
        +
      • +
          +
        • +
            +
          • +
          • +
          +
        +
      • +
          +
        • +
            +
          • +
              +
            • +
                +
              • +
                  +
                • +
                +
              +
            • +
                +
              • +
                  +
                • +
                • +
                • +
                +
              +
            • +
                +
              • +
                  +
                • +
                • +
                • +
                • +
                • +
                • +
                • +
                • +
                • +
                • +
                +
              +
            • +
                +
              • +
              • +
                  +
                +
              • +
                  +
                +
              • +
                  +
                +
              • +
                  +
                +
              +
            • +
                +
              • +
                  +
                • +
                • +
                • +
                • +
                • +
                • +
                • +
                • +
                • +
                • +
                +
              +
            • +
                +
              • +
                  +
                • +
                +
              • +
                  +
                +
              +
            • +
                +
              • +
                  +
                • +
                • +
                • +
                • +
                • +
                • +
                • +
                • +
                • +
                • +
                • +
                • +
                +
              +
            +
          • +
              +
            • +
                +
              • +
                  +
                +
              +
            • +
                +
              • +
                  +
                • +
                • +
                • +
                • +
                • +
                • +
                • +
                • +
                • +
                • +
                +
              • +
                  +
                • +
                • +
                +
              • +
                  +
                +
              +
            +
          +
        +
      +
    • +
    • +
        +
      • +
      • +
          +
        • +
        • +
        +
      • +
          +
        • +
        +
      • +
          +
        • +
            +
          • +
          • +
          • +
          • +
          +
        +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      • +
      +
    • +
        +
      • +
      • +
      +
    +
  • +
      +
    • +
        +
      • +
          +
        • +
            +
          • +
              +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            • +
            +
          • +
              +
            • +
            • +
            • +
            • +
            +
          • +
          • +
          • +
          +
        • +
            +
          • +
              +
            • +
            • +
            • +
            • +
            +
          +
        • +
        • +
        • +
        +
      +
    +
+ + diff --git a/docs/pyShelf/html/index.hhk b/docs/pyShelf/html/index.hhk new file mode 100644 index 0000000..5040acd --- /dev/null +++ b/docs/pyShelf/html/index.hhk @@ -0,0 +1,292 @@ + + + + + +
    +
  • +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
  • +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
  • +
      +
    • +
    +
  • +
  • +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
  • +
      +
    • +
    +
  • +
  • +
  • +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
      +
    • +
    +
  • +
  • +
  • +
      +
    • +
    +
  • +
  • +
      +
    • +
    +
  • +
  • +
  • +
+ + diff --git a/docs/pyShelf/html/index.hhp b/docs/pyShelf/html/index.hhp new file mode 100644 index 0000000..92cbe22 --- /dev/null +++ b/docs/pyShelf/html/index.hhp @@ -0,0 +1,92 @@ +[OPTIONS] +Compiled file=pyShelf_docs +Compatibility=1.1 +Full-text search=Yes +Contents file=index.hhc +Default Window=main +Default topic=index.html +Index file=index.hhk +Language=0x409 English (United States) +Binary TOC=YES +Title=pyShelf Open Source Ebook Server + +[WINDOWS] +main="pyShelf Open Source Ebook Server","index.hhc","index.hhk","index.html","index.html",,,,,0x23520,,0x70387e,,,,,,,,0 + +[FILES] +annotated.html +classes.html +d0/d49/classsrc_1_1backend_1_1lib_1_1models_1_1Collection-members.html +d0/d93/namespacesrc_1_1backend_1_1lib_1_1config.html +d1/dca/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1InitFiles-members.html +d2/dcb/classobjects_1_1JSInterface-members.html +d3/d29/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Config.html +d3/d4a/classsrc_1_1backend_1_1lib_1_1config_1_1Config-members.html +d3/d95/classsrc_1_1backend_1_1tests_1_1library__test_1_1TestCatalogue-members.html +d4/d6b/classFastAPIServer_1_1FastAPIServer-members.html +d4/d71/classDataHooks_1_1BookInterface-members.html +d5/d86/classsrc_1_1backend_1_1lib_1_1models_1_1BookCollection.html +d5/da5/classsrc_1_1backend_1_1lib_1_1library_1_1Catalogue.html +d5/ddf/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Config-members.html +d5/dee/classsrc_1_1backend_1_1tests_1_1config__test_1_1TestConfig-members.html +d6/d20/classsrc_1_1backend_1_1lib_1_1library_1_1Catalogue-members.html +d6/d4e/classsrc_1_1backend_1_1lib_1_1models_1_1Book.html +d6/d90/classsrc_1_1backend_1_1lib_1_1models_1_1Base.html +d7/d40/classsrc_1_1backend_1_1lib_1_1storage_1_1Storage.html +d7/d88/classsrc_1_1backend_1_1lib_1_1api__hooks_1_1DuckDuckGo.html +d7/db9/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1Server.html +d7/dd7/namespacesrc_1_1____main____.html +d7/df9/namespaceDataHooks.html +d8/d3d/classsrc_1_1backend_1_1tests_1_1library__test_1_1TestCatalogue.html +d8/def/classobjects_1_1JSInterface.html +d8/dfe/classsrc_1_1backend_1_1lib_1_1config_1_1Config.html +d9/d0e/classsrc_1_1backend_1_1lib_1_1models_1_1User-members.html +d9/d71/classDataHooks_1_1BookInterface.html +d9/d8b/classsrc_1_1backend_1_1lib_1_1overide_1_1ACatalogue-members.html +da/d3c/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1InitFiles.html +da/dc1/classsrc_1_1backend_1_1lib_1_1models_1_1Book-members.html +db/d9a/classsrc_1_1backend_1_1lib_1_1storage_1_1Storage-members.html +db/dd5/namespaceFastAPIServer.html +db/dda/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Catalogue.html +dc/d3e/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Catalogue-members.html +dc/ded/classsrc_1_1backend_1_1lib_1_1overide_1_1ACatalogue.html +dd/d22/classFastAPIServer_1_1FastAPIServer.html +dd/d98/classsrc_1_1backend_1_1lib_1_1models_1_1User.html +dd/de1/namespacesrc_1_1backend_1_1lib_1_1storage.html +de/d11/classsrc_1_1backend_1_1lib_1_1api__hooks_1_1DuckDuckGo-members.html +de/d6d/classsrc_1_1backend_1_1lib_1_1pyShelf_1_1Server-members.html +df/d03/classsrc_1_1backend_1_1lib_1_1models_1_1Collection.html +df/d4c/namespaceobjects.html +df/d54/classsrc_1_1backend_1_1lib_1_1models_1_1BookCollection-members.html +df/d83/classsrc_1_1backend_1_1tests_1_1config__test_1_1TestConfig.html +dir_1c7294442ce83d360610449d04c9d7fc.html +dir_3f615ade772d23cefe5e20dcb18424a2.html +dir_68267d1309a1af8e8297ef4c3efbcdba.html +dir_8509b06bafa958d2011203a730bf5778.html +dir_9020577e2da81c4cf5a5554c26431f94.html +dir_d6d65651a873fbc3232a07f3f4a594e4.html +doxygen_crawl.html +files.html +functions.html +functions_func.html +hierarchy.html +index.html +namespacemembers.html +namespacemembers_func.html +namespaces.html +d3/d29/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Config.png +d5/d86/classsrc_1_1backend_1_1lib_1_1models_1_1BookCollection.png +d5/da5/classsrc_1_1backend_1_1lib_1_1library_1_1Catalogue.png +d6/d4e/classsrc_1_1backend_1_1lib_1_1models_1_1Book.png +d6/d90/classsrc_1_1backend_1_1lib_1_1models_1_1Base.png +d8/dfe/classsrc_1_1backend_1_1lib_1_1config_1_1Config.png +db/dda/classsrc_1_1backend_1_1tests_1_1library__test_1_1Test__Catalogue.png +dc/ded/classsrc_1_1backend_1_1lib_1_1overide_1_1ACatalogue.png +dd/d98/classsrc_1_1backend_1_1lib_1_1models_1_1User.png +df/d03/classsrc_1_1backend_1_1lib_1_1models_1_1Collection.png +doxygen.svg +doxygen.css +dynsections.js +jquery.js +navtree.css +tabs.css diff --git a/docs/pyShelf/html/index.html b/docs/pyShelf/html/index.html new file mode 100644 index 0000000..f776119 --- /dev/null +++ b/docs/pyShelf/html/index.html @@ -0,0 +1,58 @@ + + + + + + + +pyShelf Open Source Ebook Server: Main Page + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + +
+
+
+
pyShelf Open Source Ebook Server Documentation
+
+
+ +
+ + +
+ + diff --git a/docs/pyShelf/html/jquery.js b/docs/pyShelf/html/jquery.js new file mode 100644 index 0000000..875ada7 --- /dev/null +++ b/docs/pyShelf/html/jquery.js @@ -0,0 +1,204 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e} +var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp( +"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType +}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c +)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){ +return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll( +":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id") +)&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push( +"\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test( +a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null, +null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne +).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for( +var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n; +return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0, +r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r] +,C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each( +function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r, +"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})} +),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each( +"blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t +){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t +]=y.widget.extend({},this.options[t]),n=0;n
"),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i}, +getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within, +s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})), +this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t +).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split( +","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add( +this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{ +width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(), +!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){ +this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height +,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e, +i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left +)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e +){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0), +i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth( +)-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e, +function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0 +]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){ +targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se", +"n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if( +session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)} +closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if( +session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE, +function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset); +tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList, +finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight())); +return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")} +function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(), +elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight, +viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b, +"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery); +/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)), +mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend( +$.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy( +this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData( +"smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id" +).indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?( +this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for( +var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){ +return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if(( +!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&( +this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0 +]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass( +"highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){ +t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]" +)||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){ +t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"), +a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i, +downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2) +)&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t +)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0), +canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}}, +rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})} +return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1, +bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); diff --git a/docs/pyShelf/html/menudata.js b/docs/pyShelf/html/menudata.js new file mode 100644 index 0000000..8006205 --- /dev/null +++ b/docs/pyShelf/html/menudata.js @@ -0,0 +1,66 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Namespaces",url:"namespaces.html",children:[ +{text:"Namespace List",url:"namespaces.html"}, +{text:"Namespace Members",url:"namespacemembers.html",children:[ +{text:"All",url:"namespacemembers.html"}, +{text:"Functions",url:"namespacemembers_func.html"}]}]}, +{text:"Classes",url:"annotated.html",children:[ +{text:"Class List",url:"annotated.html"}, +{text:"Class Index",url:"classes.html"}, +{text:"Class Hierarchy",url:"hierarchy.html"}, +{text:"Class Members",url:"functions.html",children:[ +{text:"All",url:"functions.html",children:[ +{text:"_",url:"functions.html#index__5F"}, +{text:"b",url:"functions.html#index_b"}, +{text:"c",url:"functions.html#index_c"}, +{text:"e",url:"functions.html#index_e"}, +{text:"f",url:"functions.html#index_f"}, +{text:"g",url:"functions.html#index_g"}, +{text:"i",url:"functions.html#index_i"}, +{text:"m",url:"functions.html#index_m"}, +{text:"o",url:"functions.html#index_o"}, +{text:"p",url:"functions.html#index_p"}, +{text:"r",url:"functions.html#index_r"}, +{text:"s",url:"functions.html#index_s"}, +{text:"u",url:"functions.html#index_u"}]}, +{text:"Functions",url:"functions_func.html",children:[ +{text:"_",url:"functions_func.html#index__5F"}, +{text:"b",url:"functions_func.html#index_b"}, +{text:"c",url:"functions_func.html#index_c"}, +{text:"e",url:"functions_func.html#index_e"}, +{text:"f",url:"functions_func.html#index_f"}, +{text:"g",url:"functions_func.html#index_g"}, +{text:"i",url:"functions_func.html#index_i"}, +{text:"m",url:"functions_func.html#index_m"}, +{text:"o",url:"functions_func.html#index_o"}, +{text:"p",url:"functions_func.html#index_p"}, +{text:"r",url:"functions_func.html#index_r"}, +{text:"s",url:"functions_func.html#index_s"}, +{text:"u",url:"functions_func.html#index_u"}]}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}]}]} diff --git a/docs/pyShelf/html/namespacemembers.html b/docs/pyShelf/html/namespacemembers.html new file mode 100644 index 0000000..b16ff5a --- /dev/null +++ b/docs/pyShelf/html/namespacemembers.html @@ -0,0 +1,76 @@ + + + + + + + +pyShelf Open Source Ebook Server: Namespace Members + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + +
+
+
+
Here is a list of all documented namespace members with links to the namespaces they belong to:
+
+ + +
+ + diff --git a/docs/pyShelf/html/namespacemembers_func.html b/docs/pyShelf/html/namespacemembers_func.html new file mode 100644 index 0000000..fd6634b --- /dev/null +++ b/docs/pyShelf/html/namespacemembers_func.html @@ -0,0 +1,76 @@ + + + + + + + +pyShelf Open Source Ebook Server: Namespace Members + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + +
+
+
+
Here is a list of all documented namespace functions with links to the namespaces they belong to:
+
+ + +
+ + diff --git a/docs/pyShelf/html/namespaces.html b/docs/pyShelf/html/namespaces.html new file mode 100644 index 0000000..c1dea55 --- /dev/null +++ b/docs/pyShelf/html/namespaces.html @@ -0,0 +1,73 @@ + + + + + + + +pyShelf Open Source Ebook Server: Namespace List + + + + + + +
+
+ + + + + + +
+
pyShelf Open Source Ebook Server 0.8.0 +
+
FOSS E-Book Server, https://pyshelf.com
+
+
+ + + + +
+
+
+
Namespace List
+
+
+
Here is a list of all documented namespaces with brief descriptions:
+
[detail level 1234]
+ + + + + + +
 NDataHooks
 NFastAPIServer
 Nobjects
 Nsrc
 N__main__
 Nbackend
+
+
+ + +
+ + diff --git a/docs/pyShelf/man/man3/DataHooks.3 b/docs/pyShelf/man/man3/DataHooks.3 new file mode 100644 index 0000000..c36bf40 --- /dev/null +++ b/docs/pyShelf/man/man3/DataHooks.3 @@ -0,0 +1,27 @@ +.TH "DataHooks" 3 "Sat Aug 9 2025 19:53:55" "Version 0.8.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*- +.ad l +.nh +.SH NAME +DataHooks +.SH SYNOPSIS +.br +.PP +.SS "Classes" + +.in +1c +.ti -1c +.RI "class \fBBookInterface\fP" +.br +.in -1c +.SH "Detailed Description" +.PP + +.PP +.nf +pyShelf's frontend database hooks\&. +.fi +.PP + +.SH "Author" +.PP +Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&. diff --git a/docs/pyShelf/man/man3/DataHooks_BookInterface.3 b/docs/pyShelf/man/man3/DataHooks_BookInterface.3 new file mode 100644 index 0000000..9780582 --- /dev/null +++ b/docs/pyShelf/man/man3/DataHooks_BookInterface.3 @@ -0,0 +1,37 @@ +.TH "DataHooks.BookInterface" 3 "Sat Aug 9 2025 19:53:55" "Version 0.8.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*- +.ad l +.nh +.SH NAME +DataHooks.BookInterface +.SH SYNOPSIS +.br +.PP +.SS "Public Attributes" + +.in +1c +.ti -1c +.RI "\fBconfig\fP = config" +.br +.ti -1c +.RI "\fBdb\fP = \fBStorage\fP(self\&.config)" +.br +.in -1c +.SH "Detailed Description" +.PP + +.PP +.nf +Access point for book database\&. +.fi +.PP + +.SH "Member Data Documentation" +.PP +.SS "DataHooks\&.BookInterface\&.config = config" + +.SS "DataHooks\&.BookInterface\&.db = \fBStorage\fP(self\&.config)" + + +.SH "Author" +.PP +Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&. diff --git a/docs/pyShelf/man/man3/FastAPIServer.3 b/docs/pyShelf/man/man3/FastAPIServer.3 new file mode 100644 index 0000000..0431c08 --- /dev/null +++ b/docs/pyShelf/man/man3/FastAPIServer.3 @@ -0,0 +1,165 @@ +.TH "FastAPIServer" 3 "Sat Aug 9 2025 19:53:55" "Version 0.8.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*- +.ad l +.nh +.SH NAME +FastAPIServer +.SH SYNOPSIS +.br +.PP +.SS "Classes" + +.in +1c +.ti -1c +.RI "class \fBFastAPIServer\fP" +.br +.in -1c +.SS "Functions" + +.in +1c +.ti -1c +.RI "str \fBbase64decode\fP (string)" +.br +.ti -1c +.RI "str \fBsummarize\fP (string)" +.br +.ti -1c +.RI "str \fBconvertDateTime\fP (datetime timestamp)" +.br +.ti -1c +.RI "dumps \fBbooks_tojson\fP (obj)" +.br +.ti -1c +.RI "dumps \fBbook_tojson\fP (book)" +.br +.ti -1c +.RI "dumps \fBtojson\fP (obj)" +.br +.ti -1c +.RI "dumps \fBcollections_tojson\fP (collection)" +.br +.in -1c +.SS "Variables" + +.in +1c +.ti -1c +.RI "\fBapp\fP = FastAPI()" +.br +.ti -1c +.RI "\fBSTATIC_DIR\fP" +.br +.ti -1c +.RI "\fBTEMPLATES_DIR\fP" +.br +.ti -1c +.RI "\fBtemplates\fP = Jinja2Templates(directory=str(TEMPLATES_DIR))" +.br +.ti -1c +.RI "list \fBorigins\fP" +.br +.ti -1c +.RI "\fBallow_origins\fP" +.br +.ti -1c +.RI "\fBallow_credentials\fP" +.br +.ti -1c +.RI "\fBallow_methods\fP" +.br +.ti -1c +.RI "\fBallow_headers\fP" +.br +.in -1c +.SH "Detailed Description" +.PP + +.PP +.nf +pyShelf's main frontend library\&. +.fi +.PP + +.SH "Function Documentation" +.PP +.SS " str FastAPIServer\&.base64decode ( string)" + +.PP +.nf +Decode a base64 string\&. +.fi +.PP + +.SS " dumps FastAPIServer\&.book_tojson ( book)" + +.PP +.nf +Convert a book object to a json\&. +.fi +.PP + +.SS " dumps FastAPIServer\&.books_tojson ( obj)" + +.PP +.nf +Convert an object to a dictionary\&. +.fi +.PP + +.SS " dumps FastAPIServer\&.collections_tojson ( collection)" + +.PP +.nf +Convert a collections object to json\&. +.fi +.PP + +.SS " str FastAPIServer\&.convertDateTime (datetime timestamp)" + +.PP +.nf +Convert a datetime object to a string\&. +.fi +.PP + +.SS " str FastAPIServer\&.summarize ( string)" + +.PP +.nf +Summarize a string\&. +.fi +.PP + +.SS " dumps FastAPIServer\&.tojson ( obj)" + +.SH "Variable Documentation" +.PP +.SS "FastAPIServer\&.allow_credentials" + +.SS "FastAPIServer\&.allow_headers" + +.SS "FastAPIServer\&.allow_methods" + +.SS "FastAPIServer\&.allow_origins" + +.SS "FastAPIServer\&.app = FastAPI()" + +.SS "list FastAPIServer\&.origins" +\fBInitial value:\fP +.nf +1 = [ +2 "http://localhost", +3 "http://localhost:8081", +4 "http://localhost:8080", +5 "*" +6 ] +.PP +.fi + +.SS "FastAPIServer\&.STATIC_DIR" + +.SS "FastAPIServer\&.templates = Jinja2Templates(directory=str(TEMPLATES_DIR))" + +.SS "FastAPIServer\&.TEMPLATES_DIR" + +.SH "Author" +.PP +Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&. diff --git a/docs/pyShelf/man/man3/FastAPIServer_FastAPIServer.3 b/docs/pyShelf/man/man3/FastAPIServer_FastAPIServer.3 new file mode 100644 index 0000000..57b71ba --- /dev/null +++ b/docs/pyShelf/man/man3/FastAPIServer_FastAPIServer.3 @@ -0,0 +1,152 @@ +.TH "FastAPIServer.FastAPIServer" 3 "Sat Aug 9 2025 19:53:55" "Version 0.8.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*- +.ad l +.nh +.SH NAME +FastAPIServer.FastAPIServer +.SH SYNOPSIS +.br +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fB__init__\fP (self, config)" +.br +.ti -1c +.RI "\fBcompile_static_files\fP (self)" +.br +.ti -1c +.RI "None \fBuse_route_names_as_operation_ids\fP (self, FastAPI app)" +.br +.ti -1c +.RI "\fBindex\fP (Request request, int skip=0, int limit=30)" +.br +.ti -1c +.RI "\fBbooks\fP (Request request, int skip=0, int limit=10, \fBcollection\fP=None)" +.br +.ti -1c +.RI "\fBbook\fP (Request request, int book_id)" +.br +.ti -1c +.RI "\fBbook\fP (Request request, int book_id)" +.br +.ti -1c +.RI "\fBcollections\fP (Request request)" +.br +.ti -1c +.RI "\fBcollection\fP (Request request, str collection, int skip=0, int limit=30)" +.br +.ti -1c +.RI "\fBsearch_books_api\fP (Request request, str search)" +.br +.ti -1c +.RI "\fBrun\fP (self)" +.br +.in -1c +.SS "Public Attributes" + +.in +1c +.ti -1c +.RI "\fBconfig\fP = config" +.br +.ti -1c +.RI "\fBfe_config\fP" +.br +.ti -1c +.RI "\fBfe_server\fP = uvicorn\&.Server(self\&.fe_config)" +.br +.ti -1c +.RI "\fBJSInterface\fP \fBJSInterface\fP = \fBJSInterface\fP(self\&.config)" +.br +.in -1c +.SH "Detailed Description" +.PP + +.PP +.nf +Entry point for FastAPI server\&. +.fi +.PP + +.SH "Constructor & Destructor Documentation" +.PP +.SS "FastAPIServer\&.FastAPIServer\&.__init__ ( self, config)" + +.PP +.nf +Initialize FastAPIServer object parameters\&. +.fi +.PP + +.SH "Member Function Documentation" +.PP +.SS "FastAPIServer\&.FastAPIServer\&.book (Request request, int book_id)" + +.SS "FastAPIServer\&.FastAPIServer\&.book (Request request, int book_id)" + +.SS "FastAPIServer\&.FastAPIServer\&.books (Request request, int skip = \fR0\fP, int limit = \fR10\fP, collection = \fRNone\fP)" + +.SS "FastAPIServer\&.FastAPIServer\&.collection (Request request, str collection, int skip = \fR0\fP, int limit = \fR30\fP)" + +.PP +.nf +Collection file responder\&. +.fi +.PP + +.SS "FastAPIServer\&.FastAPIServer\&.collections (Request request)" + +.SS "FastAPIServer\&.FastAPIServer\&.compile_static_files ( self)" + +.PP +.nf +Compile static files for web frontend\&. +.fi +.PP + +.SS "FastAPIServer\&.FastAPIServer\&.index (Request request, int skip = \fR0\fP, int limit = \fR30\fP)" + +.SS "FastAPIServer\&.FastAPIServer\&.run ( self)" + +.PP +.nf +Front end server entrypoint\&. +.fi +.PP + +.SS "FastAPIServer\&.FastAPIServer\&.search_books_api (Request request, str search)" + +.PP +.nf +Collection file responder\&. +.fi +.PP + +.SS " None FastAPIServer\&.FastAPIServer\&.use_route_names_as_operation_ids ( self, FastAPI app)" + +.PP +.nf +Use route name as operation id\&. +.fi +.PP + +.SH "Member Data Documentation" +.PP +.SS "FastAPIServer\&.FastAPIServer\&.config = config" + +.SS "FastAPIServer\&.FastAPIServer\&.fe_config" +\fBInitial value:\fP +.nf += uvicorn\&.Config(app, host="0\&.0\&.0\&.0", port=8080, + log_level="info", reload=True) +.PP +.fi + +.SS "FastAPIServer\&.FastAPIServer\&.fe_server = uvicorn\&.Server(self\&.fe_config)" + +.SS "\fBJSInterface\fP FastAPIServer\&.FastAPIServer\&.JSInterface = \fBJSInterface\fP(self\&.config)" + + +.SH "Author" +.PP +Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&. diff --git a/docs/pyShelf/man/man3/objects.3 b/docs/pyShelf/man/man3/objects.3 new file mode 100644 index 0000000..7623076 --- /dev/null +++ b/docs/pyShelf/man/man3/objects.3 @@ -0,0 +1,27 @@ +.TH "objects" 3 "Sat Aug 9 2025 19:53:55" "Version 0.8.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*- +.ad l +.nh +.SH NAME +objects +.SH SYNOPSIS +.br +.PP +.SS "Classes" + +.in +1c +.ti -1c +.RI "class \fBJSInterface\fP" +.br +.in -1c +.SH "Detailed Description" +.PP + +.PP +.nf +pyShelf's Frontend Objects\&. +.fi +.PP + +.SH "Author" +.PP +Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&. diff --git a/docs/pyShelf/man/man3/objects_JSInterface.3 b/docs/pyShelf/man/man3/objects_JSInterface.3 new file mode 100644 index 0000000..d537c89 --- /dev/null +++ b/docs/pyShelf/man/man3/objects_JSInterface.3 @@ -0,0 +1,67 @@ +.TH "objects.JSInterface" 3 "Sat Aug 9 2025 19:53:55" "Version 0.8.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*- +.ad l +.nh +.SH NAME +objects.JSInterface +.SH SYNOPSIS +.br +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fB__init__\fP (self, Config config)" +.br +.ti -1c +.RI "\fBinstall\fP (self)" +.br +.in -1c +.SS "Public Attributes" + +.in +1c +.ti -1c +.RI "Path \fBpackage_json\fP = Path(config\&.root, 'src/frontend/package\&.json')" +.br +.ti -1c +.RI "Config \fBconfig\fP = config" +.br +.in -1c +.SH "Detailed Description" +.PP + +.PP +.nf +A class to interface with the JavaScript side of pyShelf\&. +.fi +.PP + +.SH "Constructor & Destructor Documentation" +.PP +.SS "objects\&.JSInterface\&.__init__ ( self, Config config)" + +.PP +.nf +Initialize the JSInterface object\&. +.fi +.PP + +.SH "Member Function Documentation" +.PP +.SS "objects\&.JSInterface\&.install ( self)" + +.PP +.nf +Install the JavaScript dependencies\&. +.fi +.PP + +.SH "Member Data Documentation" +.PP +.SS "Config objects\&.JSInterface\&.config = config" + +.SS "Path objects\&.JSInterface\&.package_json = Path(config\&.root, 'src/frontend/package\&.json')" + + +.SH "Author" +.PP +Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&. diff --git a/docs/pyShelf/man/man3/src___main__.3 b/docs/pyShelf/man/man3/src___main__.3 new file mode 100644 index 0000000..9f1332e --- /dev/null +++ b/docs/pyShelf/man/man3/src___main__.3 @@ -0,0 +1,69 @@ +.TH "src.__main__" 3 "Sat Aug 9 2025 19:53:55" "Version 0.8.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*- +.ad l +.nh +.SH NAME +src.__main__ +.SH SYNOPSIS +.br +.PP +.SS "Functions" + +.in +1c +.ti -1c +.RI "\fBrun_import\fP ()" +.br +.ti -1c +.RI "\fBmain\fP ()" +.br +.in -1c +.SS "Variables" + +.in +1c +.ti -1c +.RI "\fBroot\fP = Path\&.cwd()" +.br +.ti -1c +.RI "\fBconfig\fP = \fBConfig\fP(root)" +.br +.ti -1c +.RI "\fBPRG_PATH\fP = Path\&.cwd()\&.__str__()" +.br +.in -1c +.SH "Detailed Description" +.PP + +.PP +.nf +PyShelf Entrypoint\&. +.fi +.PP + +.SH "Function Documentation" +.PP +.SS "src\&.__main__\&.main ()" + +.PP +.nf +Program entrypoint\&. +.fi +.PP + +.SS "src\&.__main__\&.run_import ()" + +.PP +.nf +Begin live import of books\&. +.fi +.PP + +.SH "Variable Documentation" +.PP +.SS "src\&.__main__\&.config = \fBConfig\fP(root)" + +.SS "src\&.__main__\&.PRG_PATH = Path\&.cwd()\&.__str__()" + +.SS "src\&.__main__\&.root = Path\&.cwd()" + +.SH "Author" +.PP +Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&. diff --git a/docs/pyShelf/man/man3/src_backend_lib_api_hooks_DuckDuckGo.3 b/docs/pyShelf/man/man3/src_backend_lib_api_hooks_DuckDuckGo.3 new file mode 100644 index 0000000..457e752 --- /dev/null +++ b/docs/pyShelf/man/man3/src_backend_lib_api_hooks_DuckDuckGo.3 @@ -0,0 +1,68 @@ +.TH "src.backend.lib.api_hooks.DuckDuckGo" 3 "Sat Aug 9 2025 19:53:55" "Version 0.8.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*- +.ad l +.nh +.SH NAME +src.backend.lib.api_hooks.DuckDuckGo +.SH SYNOPSIS +.br +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fB__init__\fP (self)" +.br +.ti -1c +.RI "\fBimage_result\fP (self, query)" +.br +.ti -1c +.RI "\fBdescription_result\fP (self, query)" +.br +.in -1c +.SS "Public Attributes" + +.in +1c +.ti -1c +.RI "str \fBurl\fP = 'https://api\&.duckduckgo\&.com/?q='" +.br +.ti -1c +.RI "str \fBimageurl\fP = 'https://duckduckgo\&.com'" +.br +.in -1c +.SH "Detailed Description" +.PP + +.PP +.nf +duckduckgo related searching +.fi +.PP + +.SH "Constructor & Destructor Documentation" +.PP +.SS "src\&.backend\&.lib\&.api_hooks\&.DuckDuckGo\&.__init__ ( self)" + +.SH "Member Function Documentation" +.PP +.SS "src\&.backend\&.lib\&.api_hooks\&.DuckDuckGo\&.description_result ( self, query)" + +.SS "src\&.backend\&.lib\&.api_hooks\&.DuckDuckGo\&.image_result ( self, query)" + +.PP +.nf +Returns json containing url to image +:param _key: &t=h_&iar=images&iax=images&ia=images&format=json&pretty=1 + +.fi +.PP + +.SH "Member Data Documentation" +.PP +.SS "str src\&.backend\&.lib\&.api_hooks\&.DuckDuckGo\&.imageurl = 'https://duckduckgo\&.com'" + +.SS "str src\&.backend\&.lib\&.api_hooks\&.DuckDuckGo\&.url = 'https://api\&.duckduckgo\&.com/?q='" + + +.SH "Author" +.PP +Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&. diff --git a/docs/pyShelf/man/man3/src_backend_lib_config.3 b/docs/pyShelf/man/man3/src_backend_lib_config.3 new file mode 100644 index 0000000..6937f84 --- /dev/null +++ b/docs/pyShelf/man/man3/src_backend_lib_config.3 @@ -0,0 +1,27 @@ +.TH "src.backend.lib.config" 3 "Sat Aug 9 2025 19:53:55" "Version 0.8.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*- +.ad l +.nh +.SH NAME +src.backend.lib.config +.SH SYNOPSIS +.br +.PP +.SS "Classes" + +.in +1c +.ti -1c +.RI "class \fBConfig\fP" +.br +.in -1c +.SH "Detailed Description" +.PP + +.PP +.nf +Pyshelf's Configuration Object\&. +.fi +.PP + +.SH "Author" +.PP +Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&. diff --git a/docs/pyShelf/man/man3/src_backend_lib_config_Config.3 b/docs/pyShelf/man/man3/src_backend_lib_config_Config.3 new file mode 100644 index 0000000..1e9f971 --- /dev/null +++ b/docs/pyShelf/man/man3/src_backend_lib_config_Config.3 @@ -0,0 +1,258 @@ +.TH "src.backend.lib.config.Config" 3 "Sat Aug 9 2025 19:53:55" "Version 0.8.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*- +.ad l +.nh +.SH NAME +src.backend.lib.config.Config +.SH SYNOPSIS +.br +.PP +.PP +Inherited by \fBsrc\&.backend\&.tests\&.library_test\&.Test_Config\fP\&. +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fB__init__\fP (self, root)" +.br +.ti -1c +.RI "\fBinit_config\fP (self)" +.br +.ti -1c +.RI "\fBget_logger\fP (self)" +.br +.ti -1c +.RI "\fBopen_file\fP (self)" +.br +.in -1c +.SS "Public Attributes" + +.in +1c +.ti -1c +.RI "\fBroot\fP = root" +.br +.ti -1c +.RI "dict \fBconfig_structure\fP" +.br +.ti -1c +.RI "\fBlogger\fP = self\&.get_logger()" +.br +.ti -1c +.RI "\fBbook_path\fP = env\&.get('BOOKPATH', self\&._data['BOOKPATH'])" +.br +.ti -1c +.RI "str \fBTITLE\fP = env\&.get('TITLE', self\&._data['TITLE'])" +.br +.ti -1c +.RI "\fBVERSION\fP = env\&.get('VERSION', self\&._data['VERSION'])" +.br +.ti -1c +.RI "\fBbook_shelf\fP = env\&.get('BOOKSHELF', self\&._data['BOOKSHELF'])" +.br +.ti -1c +.RI "\fBcatalogue_db\fP = env\&.get('DATABASE', self\&._data['DATABASE'])" +.br +.ti -1c +.RI "\fBuser\fP = self\&._data['USER']" +.br +.ti -1c +.RI "\fBpassword\fP = self\&._data['PASSWORD']" +.br +.ti -1c +.RI "\fBdb_host\fP = env\&.get('DB_HOST', self\&._data['DB_HOST'])" +.br +.ti -1c +.RI "\fBdb_port\fP = env\&.get('DB_PORT', self\&._data['DB_PORT'])" +.br +.ti -1c +.RI "list \fBfile_array\fP = [self\&.book_shelf]" +.br +.ti -1c +.RI "bool \fBauto_scan\fP = True" +.br +.ti -1c +.RI "\fBallowed_hosts\fP" +.br +.ti -1c +.RI "\fBdb_engine\fP = env\&.get('DB_ENGINE', self\&._data['DB_ENGINE'])" +.br +.ti -1c +.RI "\fBdb_user\fP = env\&.get('USER', self\&._data['USER'])" +.br +.ti -1c +.RI "\fBdb_pass\fP = env\&.get('PASSWORD', self\&._data['PASSWORD'])" +.br +.ti -1c +.RI "\fBbuild_mode\fP = env\&.get('BUILD_MODE', self\&._data['BUILD_MODE'])" +.br +.in -1c +.SS "Protected Attributes" + +.in +1c +.ti -1c +.RI "str \fB_fp\fP = 'config\&.json'" +.br +.ti -1c +.RI "\fB_cp\fP = Path\&.joinpath(root, self\&._fp)" +.br +.ti -1c +.RI "\fB_data\fP = self\&.init_config()" +.br +.in -1c +.SH "Detailed Description" +.PP + +.PP +.nf +Main System Configuration\&. + +>>> config = Config(root) + +Parameters +---------- +root : File system root of program + +Attributes +---------- +root : str() stores root\&. +config_structure : dict() Default Configuration Structure\&. +_fp : str() file pointer to main configuration\&. +_cp : Path() object of configuration file\&. +_data : dict() parsed json of _fp\&. +logger : holds logging configuration from get_logger()\&. +book_path : directory pointer to main books folder\&. +TITLE : str() Program title\&. +VERSION : str() Program version\&. +TITLE : str() Combines TITLE & VERSION\&. +book_shelf : Deprecation TODO: Is this still in use? +catalogue_db : str() Database Name\&. +user : str() Database user name\&. +password : str() Database password\&. +db_host : str() Database host\&. +db_port : int() Database port\&. +file_array : list() copy of book_shelf TODO: See book_shelf +auto_scan: bool() Do we auto scan on launch? +allowed_hosts : list() Allowed host list\&. +db_engine : str() Desired database engine type\&. +db_user : str() Database user name\&. Duplication Warning\&. +db_pass : str() Database password\&. Duplication Warning\&. +build_mode : str() Production | Development mode\&. + +Methods +------- +get_logger : Setup loguru\&. +open_file : Parse configuration file\&. + +.fi +.PP + +.SH "Constructor & Destructor Documentation" +.PP +.SS "src\&.backend\&.lib\&.config\&.Config\&.__init__ ( self, root)" + +.PP +.nf +Initialize main configuration options\&. +.fi +.PP + +.SH "Member Function Documentation" +.PP +.SS "src\&.backend\&.lib\&.config\&.Config\&.get_logger ( self)" + +.PP +.nf +Instantiate logging system\&. +.fi +.PP + +.SS "src\&.backend\&.lib\&.config\&.Config\&.init_config ( self)" + +.SS "src\&.backend\&.lib\&.config\&.Config\&.open_file ( self)" + +.PP +.nf +Open config\&.json and reads in configuration options\&. +.fi +.PP + +.PP +Reimplemented in \fBsrc\&.backend\&.tests\&.library_test\&.Test_Config\fP\&. +.SH "Member Data Documentation" +.PP +.SS "src\&.backend\&.lib\&.config\&.Config\&._cp = Path\&.joinpath(root, self\&._fp)\fR [protected]\fP" + +.SS "src\&.backend\&.lib\&.config\&.Config\&._data = self\&.init_config()\fR [protected]\fP" + +.SS "src\&.backend\&.lib\&.config\&.Config\&._fp = 'config\&.json'\fR [protected]\fP" + +.SS "src\&.backend\&.lib\&.config\&.Config\&.allowed_hosts" +\fBInitial value:\fP +.nf += env\&.get("ALLOWED_HOSTS", + self\&._data["ALLOWED_HOSTS"]) +.PP +.fi + +.SS "bool src\&.backend\&.lib\&.config\&.Config\&.auto_scan = True" + +.SS "src\&.backend\&.lib\&.config\&.Config\&.book_path = env\&.get('BOOKPATH', self\&._data['BOOKPATH'])" + +.SS "src\&.backend\&.lib\&.config\&.Config\&.book_shelf = env\&.get('BOOKSHELF', self\&._data['BOOKSHELF'])" + +.SS "src\&.backend\&.lib\&.config\&.Config\&.build_mode = env\&.get('BUILD_MODE', self\&._data['BUILD_MODE'])" + +.SS "src\&.backend\&.lib\&.config\&.Config\&.catalogue_db = env\&.get('DATABASE', self\&._data['DATABASE'])" + +.SS "src\&.backend\&.lib\&.config\&.Config\&.config_structure" +\fBInitial value:\fP +.nf += { + "TITLE": "pyShelf E\-Book Server", + "VERSION": "0\&.7\&.0", + "BOOKPATH": "/mnt/books", + "DB_HOST": "localhost", + "DB_PORT": "5432", + "DB_ENGINE": "sqlite", + "DATABASE": "pyshelf", + "USER": "pyshelf", + "PASSWORD": "pyshelf", + "BOOKSHELF": "data/shelf\&.json", + "ALLOWED_HOSTS": [ + "localhost", + "127\&.0\&.0\&.1", + "[::1]", + "0\&.0\&.0\&.0" + ], + "BUILD_MODE": "development" + } +.PP +.fi + +.SS "src\&.backend\&.lib\&.config\&.Config\&.db_engine = env\&.get('DB_ENGINE', self\&._data['DB_ENGINE'])" + +.SS "src\&.backend\&.lib\&.config\&.Config\&.db_host = env\&.get('DB_HOST', self\&._data['DB_HOST'])" + +.SS "src\&.backend\&.lib\&.config\&.Config\&.db_pass = env\&.get('PASSWORD', self\&._data['PASSWORD'])" + +.SS "src\&.backend\&.lib\&.config\&.Config\&.db_port = env\&.get('DB_PORT', self\&._data['DB_PORT'])" + +.SS "src\&.backend\&.lib\&.config\&.Config\&.db_user = env\&.get('USER', self\&._data['USER'])" + +.SS "list src\&.backend\&.lib\&.config\&.Config\&.file_array = [self\&.book_shelf]" + +.SS "src\&.backend\&.lib\&.config\&.Config\&.logger = self\&.get_logger()" + +.SS "src\&.backend\&.lib\&.config\&.Config\&.password = self\&._data['PASSWORD']" + +.SS "src\&.backend\&.lib\&.config\&.Config\&.root = root" + +.SS "str src\&.backend\&.lib\&.config\&.Config\&.TITLE = env\&.get('TITLE', self\&._data['TITLE'])" + +.SS "src\&.backend\&.lib\&.config\&.Config\&.user = self\&._data['USER']" + +.SS "src\&.backend\&.lib\&.config\&.Config\&.VERSION = env\&.get('VERSION', self\&._data['VERSION'])" + + +.SH "Author" +.PP +Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&. diff --git a/docs/pyShelf/man/man3/src_backend_lib_library_Catalogue.3 b/docs/pyShelf/man/man3/src_backend_lib_library_Catalogue.3 new file mode 100644 index 0000000..17d10f1 --- /dev/null +++ b/docs/pyShelf/man/man3/src_backend_lib_library_Catalogue.3 @@ -0,0 +1,272 @@ +.TH "src.backend.lib.library.Catalogue" 3 "Sat Aug 9 2025 19:53:55" "Version 0.8.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*- +.ad l +.nh +.SH NAME +src.backend.lib.library.Catalogue +.SH SYNOPSIS +.br +.PP +.PP +Inherited by \fBsrc\&.backend\&.lib\&.overide\&.ACatalogue\fP, and \fBsrc\&.backend\&.tests\&.library_test\&.Test_Catalogue\fP\&. +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fB__init__\fP (self, config)" +.br +.ti -1c +.RI "\fBscan_folder\fP (self, _path=None)" +.br +.ti -1c +.RI "\fBfilter_books\fP (self)" +.br +.ti -1c +.RI "\fBprocess_by_filetype\fP (self, book)" +.br +.ti -1c +.RI "\fBextract_metadata_epub\fP (self, book)" +.br +.ti -1c +.RI "\fBextract_metadata_pdf\fP (self, book)" +.br +.ti -1c +.RI "\fBextract_metadata_mobi\fP (self, book)" +.br +.ti -1c +.RI "\fBextract_content\fP (self, book_zip, book)" +.br +.ti -1c +.RI "\fBextract_cover_html\fP (self, book_zip, book)" +.br +.ti -1c +.RI "\fBextract_cover_image\fP (self, book_zip, book)" +.br +.ti -1c +.RI "\fBcompare_shelf_current\fP (self)" +.br +.ti -1c +.RI "\fBimport_books\fP (self, list=None, **kwargs)" +.br +.in -1c +.SS "Static Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBprocess_epub\fP (book)" +.br +.ti -1c +.RI "\fBstripTags\fP (source)" +.br +.in -1c +.SS "Public Attributes" + +.in +1c +.ti -1c +.RI "list \fBfile_list\fP = []" +.br +.ti -1c +.RI "\fBopf_regx\fP = re\&.compile(r'\\\&.opf')" +.br +.ti -1c +.RI "\fBcover_regx\fP = re\&.compile(r'\\\&.jpg|\\\&.jpeg|\\\&.png|\\\&.bmp|\\\&.gif')" +.br +.ti -1c +.RI "\fBhtml_regx\fP = re\&.compile(r'\\\&.html')" +.br +.ti -1c +.RI "\fBtitle_sanitization_regx\fP = re\&.compile(r'^(Book )+[0\-9]*')" +.br +.ti -1c +.RI "\fBtitle_sanitization_lvl2_regx\fP" +.br +.ti -1c +.RI "\fBtitle_sanitization_dirs_regx\fP = re\&.compile(r'/')" +.br +.ti -1c +.RI "\fBroot_dir\fP = config\&.root" +.br +.ti -1c +.RI "\fBbook_folder\fP = config\&.book_path" +.br +.ti -1c +.RI "\fBbooks\fP = None" +.br +.ti -1c +.RI "\fBdb_pointer\fP = config\&.catalogue_db" +.br +.ti -1c +.RI "\fBconfig\fP = config" +.br +.in -1c +.SH "Detailed Description" +.PP + +.PP +.nf +Decodes book metadata for storage + +.fi +.PP + +.SH "Constructor & Destructor Documentation" +.PP +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.__init__ ( self, config)" + +.SH "Member Function Documentation" +.PP +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.compare_shelf_current ( self)" + +.PP +.nf +Calls storage system, gets list of books stored and compares against files on disk + +.fi +.PP + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.extract_content ( self, book_zip, book)" + +.PP +.nf +Opens epub as zip file filters then stores as list any files matching opf_regx + +.fi +.PP + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.extract_cover_html ( self, book_zip, book)" + +.PP +.nf +Opens epub as zip file filters then stores as list any files matching html_regx + +.fi +.PP + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.extract_cover_image ( self, book_zip, book)" + +.PP +.nf +Opens epub as zip file filters then stores as list any files matching cover_regx + +.fi +.PP + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.extract_metadata_epub ( self, book)" + +.PP +.nf +Extract metadata from epub file + +:param book: Dictionary of epub file contents +:returns: Dictionary of book metadata + +.fi +.PP + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.extract_metadata_mobi ( self, book)" + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.extract_metadata_pdf ( self, book)" + +.PP +.nf +Return extracted metadata +:NOTES: Retrieval of data has been problematic, some pdf's providing +reliable titles that corespond with the actual, and others being +nonsense\&. + +.fi +.PP + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.filter_books ( self)" + +.PP +.nf +Calls scan_folder and filters out book files\&. + +:returns self\&._book_list_expanded: json string containing +all book metadata + +.fi +.PP + +.PP +Reimplemented in \fBsrc\&.backend\&.tests\&.library_test\&.Test_Catalogue\fP\&. +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.import_books ( self, list = \fRNone\fP, ** kwargs)" + +.PP +.nf +Main entry point for import operations\&. +Gets a list of new files via compare_shelf_current\&. +Iterates over list and inserts new books into database\&. + +.fi +.PP + +.PP +Reimplemented in \fBsrc\&.backend\&.lib\&.overide\&.ACatalogue\fP\&. +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.process_by_filetype ( self, book)" + +.PP +.nf +Determine books filetype and process\&. +.fi +.PP + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.process_epub ( book)\fR [static]\fP" + +.PP +.nf +Return dictionary of epub file contents +.fi +.PP + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.scan_folder ( self, _path = \fRNone\fP)" + +.PP +.nf +Scan folder by _path, allows recurisive scanning + +:param _path: Path to scan + +.fi +.PP + +.PP +Reimplemented in \fBsrc\&.backend\&.lib\&.overide\&.ACatalogue\fP\&. +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.stripTags ( source)\fR [static]\fP" + +.SH "Member Data Documentation" +.PP +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.book_folder = config\&.book_path" + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.books = None" + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.config = config" + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.cover_regx = re\&.compile(r'\\\&.jpg|\\\&.jpeg|\\\&.png|\\\&.bmp|\\\&.gif')" + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.db_pointer = config\&.catalogue_db" + +.SS "list src\&.backend\&.lib\&.library\&.Catalogue\&.file_list = []" + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.html_regx = re\&.compile(r'\\\&.html')" + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.opf_regx = re\&.compile(r'\\\&.opf')" + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.root_dir = config\&.root" + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.title_sanitization_dirs_regx = re\&.compile(r'/')" + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.title_sanitization_lvl2_regx" +\fBInitial value:\fP +.nf += re\&.compile( + r"^(Book )+[0\-9]*\\W+(\-)") +.PP +.fi + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.title_sanitization_regx = re\&.compile(r'^(Book )+[0\-9]*')" + + +.SH "Author" +.PP +Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&. diff --git a/docs/pyShelf/man/man3/src_backend_lib_models_Base.3 b/docs/pyShelf/man/man3/src_backend_lib_models_Base.3 new file mode 100644 index 0000000..705be85 --- /dev/null +++ b/docs/pyShelf/man/man3/src_backend_lib_models_Base.3 @@ -0,0 +1,25 @@ +.TH "src.backend.lib.models.Base" 3 "Sat Aug 9 2025 19:53:55" "Version 0.8.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*- +.ad l +.nh +.SH NAME +src.backend.lib.models.Base +.SH SYNOPSIS +.br +.PP +.PP +Inherits DeclarativeBase\&. +.PP +Inherited by \fBsrc\&.backend\&.lib\&.models\&.Book\fP, \fBsrc\&.backend\&.lib\&.models\&.BookCollection\fP, \fBsrc\&.backend\&.lib\&.models\&.Collection\fP, and \fBsrc\&.backend\&.lib\&.models\&.User\fP\&. +.SH "Detailed Description" +.PP + +.PP +.nf +Base class for all models\&. +.fi +.PP + + +.SH "Author" +.PP +Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&. diff --git a/docs/pyShelf/man/man3/src_backend_lib_models_Book.3 b/docs/pyShelf/man/man3/src_backend_lib_models_Book.3 new file mode 100644 index 0000000..244b8c4 --- /dev/null +++ b/docs/pyShelf/man/man3/src_backend_lib_models_Book.3 @@ -0,0 +1,111 @@ +.TH "src.backend.lib.models.Book" 3 "Sat Aug 9 2025 19:53:55" "Version 0.8.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*- +.ad l +.nh +.SH NAME +src.backend.lib.models.Book +.SH SYNOPSIS +.br +.PP +.PP +Inherits \fBsrc\&.backend\&.lib\&.models\&.Base\fP\&. +.SS "Static Public Attributes" + +.in +1c +.ti -1c +.RI "Mapped \fBid\fP = mapped_column(primary_key=True, nullable=False)" +.br +.ti -1c +.RI "Mapped \fBtitle\fP [str]" +.br +.ti -1c +.RI "Mapped \fBauthor\fP [Optional[str]]" +.br +.ti -1c +.RI "Mapped \fBcategories\fP [Optional[str]]" +.br +.ti -1c +.RI "Mapped \fBcover\fP [Optional[bytes]]" +.br +.ti -1c +.RI "Mapped \fBpages\fP [Optional[int]]" +.br +.ti -1c +.RI "Mapped \fBprogress\fP [Optional[float]]" +.br +.ti -1c +.RI "Mapped \fBfile_name\fP [str]" +.br +.ti -1c +.RI "Mapped \fBdescription\fP [Optional[str]]" +.br +.ti -1c +.RI "Mapped \fBdate\fP [timestamp]" +.br +.ti -1c +.RI "Mapped \fBrights\fP [Optional[str]]" +.br +.ti -1c +.RI "Mapped \fBtags\fP [Optional[str]]" +.br +.ti -1c +.RI "Mapped \fBidentifier\fP [Optional[str]]" +.br +.ti -1c +.RI "Mapped \fBpublisher\fP [Optional[str]]" +.br +.ti -1c +.RI "\fBbook_collections\fP" +.br +.in -1c +.SH "Detailed Description" +.PP + +.PP +.nf +Book model\&. +.fi +.PP + +.SH "Member Data Documentation" +.PP +.SS "Mapped src\&.backend\&.lib\&.models\&.Book\&.author [Optional[str]]\fR [static]\fP" + +.SS "src\&.backend\&.lib\&.models\&.Book\&.book_collections\fR [static]\fP" +\fBInitial value:\fP +.nf += relationship( + "BookCollection", back_populates="book", cascade="all, delete\-orphan" + ) +.PP +.fi + +.SS "Mapped src\&.backend\&.lib\&.models\&.Book\&.categories [Optional[str]]\fR [static]\fP" + +.SS "Mapped src\&.backend\&.lib\&.models\&.Book\&.cover [Optional[bytes]]\fR [static]\fP" + +.SS "Mapped src\&.backend\&.lib\&.models\&.Book\&.date [timestamp]\fR [static]\fP" + +.SS "Mapped src\&.backend\&.lib\&.models\&.Book\&.description [Optional[str]]\fR [static]\fP" + +.SS "Mapped src\&.backend\&.lib\&.models\&.Book\&.file_name [str]\fR [static]\fP" + +.SS "Mapped src\&.backend\&.lib\&.models\&.Book\&.id = mapped_column(primary_key=True, nullable=False)\fR [static]\fP" + +.SS "Mapped src\&.backend\&.lib\&.models\&.Book\&.identifier [Optional[str]]\fR [static]\fP" + +.SS "Mapped src\&.backend\&.lib\&.models\&.Book\&.pages [Optional[int]]\fR [static]\fP" + +.SS "Mapped src\&.backend\&.lib\&.models\&.Book\&.progress [Optional[float]]\fR [static]\fP" + +.SS "Mapped src\&.backend\&.lib\&.models\&.Book\&.publisher [Optional[str]]\fR [static]\fP" + +.SS "Mapped src\&.backend\&.lib\&.models\&.Book\&.rights [Optional[str]]\fR [static]\fP" + +.SS "Mapped src\&.backend\&.lib\&.models\&.Book\&.tags [Optional[str]]\fR [static]\fP" + +.SS "Mapped src\&.backend\&.lib\&.models\&.Book\&.title [str]\fR [static]\fP" + + +.SH "Author" +.PP +Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&. diff --git a/docs/pyShelf/man/man3/src_backend_lib_models_BookCollection.3 b/docs/pyShelf/man/man3/src_backend_lib_models_BookCollection.3 new file mode 100644 index 0000000..68f5181 --- /dev/null +++ b/docs/pyShelf/man/man3/src_backend_lib_models_BookCollection.3 @@ -0,0 +1,54 @@ +.TH "src.backend.lib.models.BookCollection" 3 "Sat Aug 9 2025 19:53:55" "Version 0.8.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*- +.ad l +.nh +.SH NAME +src.backend.lib.models.BookCollection +.SH SYNOPSIS +.br +.PP +.PP +Inherits \fBsrc\&.backend\&.lib\&.models\&.Base\fP\&. +.SS "Static Public Attributes" + +.in +1c +.ti -1c +.RI "Mapped \fBid\fP = mapped_column(primary_key=True)" +.br +.ti -1c +.RI "Mapped \fBbook_id\fP = mapped_column(ForeignKey('Book\&.id'))" +.br +.ti -1c +.RI "Mapped \fBcollection_id\fP = mapped_column(ForeignKey('Collection\&.id'))" +.br +.ti -1c +.RI "\fBbook\fP = relationship('Book', back_populates='book_collections')" +.br +.ti -1c +.RI "\fBcollection\fP = relationship('Collection', back_populates='book_collections')" +.br +.in -1c +.SH "Detailed Description" +.PP + +.PP +.nf +Association table linking Books and Collections\&. +.fi +.PP + +.SH "Member Data Documentation" +.PP +.SS "src\&.backend\&.lib\&.models\&.BookCollection\&.book = relationship('Book', back_populates='book_collections')\fR [static]\fP" + +.SS "Mapped src\&.backend\&.lib\&.models\&.BookCollection\&.book_id = mapped_column(ForeignKey('Book\&.id'))\fR [static]\fP" + +.SS "src\&.backend\&.lib\&.models\&.BookCollection\&.collection = relationship('Collection', back_populates='book_collections')\fR [static]\fP" + +.SS "Mapped src\&.backend\&.lib\&.models\&.BookCollection\&.collection_id = mapped_column(ForeignKey('Collection\&.id'))\fR [static]\fP" + +.SS "Mapped src\&.backend\&.lib\&.models\&.BookCollection\&.id = mapped_column(primary_key=True)\fR [static]\fP" + + +.SH "Author" +.PP +Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&. diff --git a/docs/pyShelf/man/man3/src_backend_lib_models_Collection.3 b/docs/pyShelf/man/man3/src_backend_lib_models_Collection.3 new file mode 100644 index 0000000..efe1f75 --- /dev/null +++ b/docs/pyShelf/man/man3/src_backend_lib_models_Collection.3 @@ -0,0 +1,51 @@ +.TH "src.backend.lib.models.Collection" 3 "Sat Aug 9 2025 19:53:55" "Version 0.8.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*- +.ad l +.nh +.SH NAME +src.backend.lib.models.Collection +.SH SYNOPSIS +.br +.PP +.PP +Inherits \fBsrc\&.backend\&.lib\&.models\&.Base\fP\&. +.SS "Static Public Attributes" + +.in +1c +.ti -1c +.RI "Mapped \fBid\fP = mapped_column(primary_key=True)" +.br +.ti -1c +.RI "Mapped \fBname\fP = mapped_column(unique=True)" +.br +.ti -1c +.RI "\fBbook_collections\fP" +.br +.in -1c +.SH "Detailed Description" +.PP + +.PP +.nf +Collection model\&. +.fi +.PP + +.SH "Member Data Documentation" +.PP +.SS "src\&.backend\&.lib\&.models\&.Collection\&.book_collections\fR [static]\fP" +\fBInitial value:\fP +.nf += relationship( + "BookCollection", back_populates="collection", cascade="all, delete\-orphan" + ) +.PP +.fi + +.SS "Mapped src\&.backend\&.lib\&.models\&.Collection\&.id = mapped_column(primary_key=True)\fR [static]\fP" + +.SS "Mapped src\&.backend\&.lib\&.models\&.Collection\&.name = mapped_column(unique=True)\fR [static]\fP" + + +.SH "Author" +.PP +Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&. diff --git a/docs/pyShelf/man/man3/src_backend_lib_models_User.3 b/docs/pyShelf/man/man3/src_backend_lib_models_User.3 new file mode 100644 index 0000000..ec6025b --- /dev/null +++ b/docs/pyShelf/man/man3/src_backend_lib_models_User.3 @@ -0,0 +1,88 @@ +.TH "src.backend.lib.models.User" 3 "Sat Aug 9 2025 19:53:55" "Version 0.8.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*- +.ad l +.nh +.SH NAME +src.backend.lib.models.User +.SH SYNOPSIS +.br +.PP +.PP +Inherits \fBsrc\&.backend\&.lib\&.models\&.Base\fP\&. +.SS "Static Public Attributes" + +.in +1c +.ti -1c +.RI "Mapped \fBid\fP = mapped_column(primary_key=True, nullable=False)" +.br +.ti -1c +.RI "Mapped \fBusername\fP = mapped_column(unique=True, nullable=False)" +.br +.ti -1c +.RI "Mapped \fBpassword\fP = mapped_column(nullable=False)" +.br +.ti -1c +.RI "Mapped \fBemail\fP = mapped_column(unique=True, nullable=True)" +.br +.ti -1c +.RI "Mapped \fBdate_joined\fP" +.br +.ti -1c +.RI "Mapped \fBlast_login\fP" +.br +.ti -1c +.RI "Mapped \fBis_active\fP = mapped_column(nullable=False, default=True)" +.br +.ti -1c +.RI "Mapped \fBis_admin\fP = mapped_column(nullable=False, default=False)" +.br +.ti -1c +.RI "Mapped \fBis_superuser\fP = mapped_column(nullable=False, default=False)" +.br +.in -1c +.SH "Detailed Description" +.PP + +.PP +.nf +User model\&. +.fi +.PP + +.SH "Member Data Documentation" +.PP +.SS "Mapped src\&.backend\&.lib\&.models\&.User\&.date_joined\fR [static]\fP" +\fBInitial value:\fP +.nf += mapped_column( + nullable=False, server_default=func\&.CURRENT_TIMESTAMP() + ) +.PP +.fi + +.SS "Mapped src\&.backend\&.lib\&.models\&.User\&.email = mapped_column(unique=True, nullable=True)\fR [static]\fP" + +.SS "Mapped src\&.backend\&.lib\&.models\&.User\&.id = mapped_column(primary_key=True, nullable=False)\fR [static]\fP" + +.SS "Mapped src\&.backend\&.lib\&.models\&.User\&.is_active = mapped_column(nullable=False, default=True)\fR [static]\fP" + +.SS "Mapped src\&.backend\&.lib\&.models\&.User\&.is_admin = mapped_column(nullable=False, default=False)\fR [static]\fP" + +.SS "Mapped src\&.backend\&.lib\&.models\&.User\&.is_superuser = mapped_column(nullable=False, default=False)\fR [static]\fP" + +.SS "Mapped src\&.backend\&.lib\&.models\&.User\&.last_login\fR [static]\fP" +\fBInitial value:\fP +.nf += mapped_column( + nullable=True, server_default=None + ) +.PP +.fi + +.SS "Mapped src\&.backend\&.lib\&.models\&.User\&.password = mapped_column(nullable=False)\fR [static]\fP" + +.SS "Mapped src\&.backend\&.lib\&.models\&.User\&.username = mapped_column(unique=True, nullable=False)\fR [static]\fP" + + +.SH "Author" +.PP +Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&. diff --git a/docs/pyShelf/man/man3/src_backend_lib_overide_ACatalogue.3 b/docs/pyShelf/man/man3/src_backend_lib_overide_ACatalogue.3 new file mode 100644 index 0000000..f961125 --- /dev/null +++ b/docs/pyShelf/man/man3/src_backend_lib_overide_ACatalogue.3 @@ -0,0 +1,269 @@ +.TH "src.backend.lib.overide.ACatalogue" 3 "Sat Aug 9 2025 19:53:55" "Version 0.8.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*- +.ad l +.nh +.SH NAME +src.backend.lib.overide.ACatalogue +.SH SYNOPSIS +.br +.PP +.PP +Inherits \fBsrc\&.backend\&.lib\&.library\&.Catalogue\fP\&. +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fB__init__\fP (self)" +.br +.ti -1c +.RI "\fBscan_folder\fP (self, _path=None)" +.br +.ti -1c +.RI "\fBimport_books\fP (self, **kwargs)" +.br +.ti -1c +.RI "\fBfilter_books\fP (self)" +.br +.ti -1c +.RI "\fBprocess_by_filetype\fP (self, book)" +.br +.ti -1c +.RI "\fBextract_metadata_epub\fP (self, book)" +.br +.ti -1c +.RI "\fBextract_metadata_pdf\fP (self, book)" +.br +.ti -1c +.RI "\fBextract_metadata_mobi\fP (self, book)" +.br +.ti -1c +.RI "\fBextract_content\fP (self, book_zip, book)" +.br +.ti -1c +.RI "\fBextract_cover_html\fP (self, book_zip, book)" +.br +.ti -1c +.RI "\fBextract_cover_image\fP (self, book_zip, book)" +.br +.ti -1c +.RI "\fBcompare_shelf_current\fP (self)" +.br +.in -1c +.SS "Static Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBprocess_epub\fP (book)" +.br +.ti -1c +.RI "\fBstripTags\fP (source)" +.br +.in -1c +.SS "Public Attributes" + +.in +1c +.ti -1c +.RI "list \fBfile_list\fP = []" +.br +.ti -1c +.RI "\fBopf_regx\fP = re\&.compile(r'\\\&.opf')" +.br +.ti -1c +.RI "\fBcover_regx\fP = re\&.compile(r'\\\&.jpg|\\\&.jpeg|\\\&.png|\\\&.bmp|\\\&.gif')" +.br +.ti -1c +.RI "\fBhtml_regx\fP = re\&.compile(r'\\\&.html')" +.br +.ti -1c +.RI "\fBtitle_sanitization_regx\fP = re\&.compile(r'^(Book )+[0\-9]*')" +.br +.ti -1c +.RI "\fBtitle_sanitization_lvl2_regx\fP" +.br +.ti -1c +.RI "\fBtitle_sanitization_dirs_regx\fP = re\&.compile(r'/')" +.br +.ti -1c +.RI "\fBroot_dir\fP = config\&.root" +.br +.ti -1c +.RI "\fBbook_folder\fP = config\&.book_path" +.br +.ti -1c +.RI "\fBbooks\fP = None" +.br +.ti -1c +.RI "\fBdb_pointer\fP = config\&.catalogue_db" +.br +.ti -1c +.RI "\fBconfig\fP = config" +.br +.in -1c +.SH "Detailed Description" +.PP + +.PP +.nf +Aynchronous overide of library\&.Catalogue, +: TODO : Complete or discard this overide + +.fi +.PP + +.SH "Constructor & Destructor Documentation" +.PP +.SS "src\&.backend\&.lib\&.overide\&.ACatalogue\&.__init__ ( self)" + +.SH "Member Function Documentation" +.PP +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.compare_shelf_current ( self)\fR [inherited]\fP" + +.PP +.nf +Calls storage system, gets list of books stored and compares against files on disk + +.fi +.PP + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.extract_content ( self, book_zip, book)\fR [inherited]\fP" + +.PP +.nf +Opens epub as zip file filters then stores as list any files matching opf_regx + +.fi +.PP + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.extract_cover_html ( self, book_zip, book)\fR [inherited]\fP" + +.PP +.nf +Opens epub as zip file filters then stores as list any files matching html_regx + +.fi +.PP + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.extract_cover_image ( self, book_zip, book)\fR [inherited]\fP" + +.PP +.nf +Opens epub as zip file filters then stores as list any files matching cover_regx + +.fi +.PP + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.extract_metadata_epub ( self, book)\fR [inherited]\fP" + +.PP +.nf +Extract metadata from epub file + +:param book: Dictionary of epub file contents +:returns: Dictionary of book metadata + +.fi +.PP + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.extract_metadata_mobi ( self, book)\fR [inherited]\fP" + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.extract_metadata_pdf ( self, book)\fR [inherited]\fP" + +.PP +.nf +Return extracted metadata +:NOTES: Retrieval of data has been problematic, some pdf's providing +reliable titles that corespond with the actual, and others being +nonsense\&. + +.fi +.PP + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.filter_books ( self)\fR [inherited]\fP" + +.PP +.nf +Calls scan_folder and filters out book files\&. + +:returns self\&._book_list_expanded: json string containing +all book metadata + +.fi +.PP + +.PP +Reimplemented in \fBsrc\&.backend\&.tests\&.library_test\&.Test_Catalogue\fP\&. +.SS "src\&.backend\&.lib\&.overide\&.ACatalogue\&.import_books ( self, ** kwargs)" + +.PP +.nf +Async overide of import_books + +.fi +.PP + +.PP +Reimplemented from \fBsrc\&.backend\&.lib\&.library\&.Catalogue\fP\&. +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.process_by_filetype ( self, book)\fR [inherited]\fP" + +.PP +.nf +Determine books filetype and process\&. +.fi +.PP + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.process_epub ( book)\fR [static]\fP, \fR [inherited]\fP" + +.PP +.nf +Return dictionary of epub file contents +.fi +.PP + +.SS "src\&.backend\&.lib\&.overide\&.ACatalogue\&.scan_folder ( self, _path = \fRNone\fP)" + +.PP +.nf +Scan folder by _path, allows recurisive scanning + +.fi +.PP + +.PP +Reimplemented from \fBsrc\&.backend\&.lib\&.library\&.Catalogue\fP\&. +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.stripTags ( source)\fR [static]\fP, \fR [inherited]\fP" + +.SH "Member Data Documentation" +.PP +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.book_folder = config\&.book_path\fR [inherited]\fP" + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.books = None\fR [inherited]\fP" + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.config = config\fR [inherited]\fP" + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.cover_regx = re\&.compile(r'\\\&.jpg|\\\&.jpeg|\\\&.png|\\\&.bmp|\\\&.gif')\fR [inherited]\fP" + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.db_pointer = config\&.catalogue_db\fR [inherited]\fP" + +.SS "list src\&.backend\&.lib\&.library\&.Catalogue\&.file_list = []\fR [inherited]\fP" + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.html_regx = re\&.compile(r'\\\&.html')\fR [inherited]\fP" + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.opf_regx = re\&.compile(r'\\\&.opf')\fR [inherited]\fP" + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.root_dir = config\&.root\fR [inherited]\fP" + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.title_sanitization_dirs_regx = re\&.compile(r'/')\fR [inherited]\fP" + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.title_sanitization_lvl2_regx\fR [inherited]\fP" +\fBInitial value:\fP +.nf += re\&.compile( + r"^(Book )+[0\-9]*\\W+(\-)") +.PP +.fi + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.title_sanitization_regx = re\&.compile(r'^(Book )+[0\-9]*')\fR [inherited]\fP" + + +.SH "Author" +.PP +Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&. diff --git a/docs/pyShelf/man/man3/src_backend_lib_pyShelf_InitFiles.3 b/docs/pyShelf/man/man3/src_backend_lib_pyShelf_InitFiles.3 new file mode 100644 index 0000000..47c05bc --- /dev/null +++ b/docs/pyShelf/man/man3/src_backend_lib_pyShelf_InitFiles.3 @@ -0,0 +1,46 @@ +.TH "src.backend.lib.pyShelf.InitFiles" 3 "Sat Aug 9 2025 19:53:55" "Version 0.8.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*- +.ad l +.nh +.SH NAME +src.backend.lib.pyShelf.InitFiles +.SH SYNOPSIS +.br +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fB__init__\fP (self, file_array)" +.br +.ti -1c +.RI "\fBCreateFile\fP (self, _pointer)" +.br +.in -1c +.SH "Detailed Description" +.PP + +.PP +.nf +First run file creation operations +.fi +.PP + +.SH "Constructor & Destructor Documentation" +.PP +.SS "src\&.backend\&.lib\&.pyShelf\&.InitFiles\&.__init__ ( self, file_array)" + +.SH "Member Function Documentation" +.PP +.SS "src\&.backend\&.lib\&.pyShelf\&.InitFiles\&.CreateFile ( self, _pointer)" + +.PP +.nf +Checks if file exists and creates it if not + +.fi +.PP + + +.SH "Author" +.PP +Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&. diff --git a/docs/pyShelf/man/man3/src_backend_lib_pyShelf_Server.3 b/docs/pyShelf/man/man3/src_backend_lib_pyShelf_Server.3 new file mode 100644 index 0000000..57a430d --- /dev/null +++ b/docs/pyShelf/man/man3/src_backend_lib_pyShelf_Server.3 @@ -0,0 +1,102 @@ +.TH "src.backend.lib.pyShelf.Server" 3 "Sat Aug 9 2025 19:53:55" "Version 0.8.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*- +.ad l +.nh +.SH NAME +src.backend.lib.pyShelf.Server +.SH SYNOPSIS +.br +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fB__init__\fP (self, root)" +.br +.ti -1c +.RI "\fB__aexit__\fP (self, *args, **kwargs)" +.br +.ti -1c +.RI "\fBinitialize_server\fP (self)" +.br +.ti -1c +.RI "\fBrunImport\fP (self)" +.br +.ti -1c +.RI "\fBsocketio\fP (self, websocket, path)" +.br +.ti -1c +.RI "\fBpong\fP (self)" +.br +.ti -1c +.RI "\fBstart\fP (self)" +.br +.in -1c +.SS "Public Attributes" + +.in +1c +.ti -1c +.RI "\fBroot\fP = root" +.br +.ti -1c +.RI "tuple \fBhost\fP = ('127\&.0\&.0\&.1', 1337)" +.br +.ti -1c +.RI "\fBconfig\fP = \fBConfig\fP(self\&.root)" +.br +.ti -1c +.RI "\fBloop\fP = None" +.br +.ti -1c +.RI "\fBserve\fP = None" +.br +.ti -1c +.RI "\fBsocketio\fP" +.br +.in -1c +.SH "Detailed Description" +.PP + +.PP +.nf +Main Server Container +:TODO: Document this + +.fi +.PP + +.SH "Constructor & Destructor Documentation" +.PP +.SS "src\&.backend\&.lib\&.pyShelf\&.Server\&.__init__ ( self, root)" + +.SH "Member Function Documentation" +.PP +.SS "src\&.backend\&.lib\&.pyShelf\&.Server\&.__aexit__ ( self, * args, ** kwargs)" + +.SS "src\&.backend\&.lib\&.pyShelf\&.Server\&.initialize_server ( self)" + +.SS "src\&.backend\&.lib\&.pyShelf\&.Server\&.pong ( self)" + +.SS "src\&.backend\&.lib\&.pyShelf\&.Server\&.runImport ( self)" + +.SS "src\&.backend\&.lib\&.pyShelf\&.Server\&.socketio ( self, websocket, path)" + +.SS "src\&.backend\&.lib\&.pyShelf\&.Server\&.start ( self)" + +.SH "Member Data Documentation" +.PP +.SS "src\&.backend\&.lib\&.pyShelf\&.Server\&.config = \fBConfig\fP(self\&.root)" + +.SS "tuple src\&.backend\&.lib\&.pyShelf\&.Server\&.host = ('127\&.0\&.0\&.1', 1337)" + +.SS "src\&.backend\&.lib\&.pyShelf\&.Server\&.loop = None" + +.SS "src\&.backend\&.lib\&.pyShelf\&.Server\&.root = root" + +.SS "src\&.backend\&.lib\&.pyShelf\&.Server\&.serve = None" + +.SS "src\&.backend\&.lib\&.pyShelf\&.Server\&.socketio" + + +.SH "Author" +.PP +Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&. diff --git a/docs/pyShelf/man/man3/src_backend_lib_storage.3 b/docs/pyShelf/man/man3/src_backend_lib_storage.3 new file mode 100644 index 0000000..73b4b35 --- /dev/null +++ b/docs/pyShelf/man/man3/src_backend_lib_storage.3 @@ -0,0 +1,27 @@ +.TH "src.backend.lib.storage" 3 "Sat Aug 9 2025 19:53:55" "Version 0.8.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*- +.ad l +.nh +.SH NAME +src.backend.lib.storage +.SH SYNOPSIS +.br +.PP +.SS "Classes" + +.in +1c +.ti -1c +.RI "class \fBStorage\fP" +.br +.in -1c +.SH "Detailed Description" +.PP + +.PP +.nf +Pyshelf's Main Storage Class\&. +.fi +.PP + +.SH "Author" +.PP +Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&. diff --git a/docs/pyShelf/man/man3/src_backend_lib_storage_Storage.3 b/docs/pyShelf/man/man3/src_backend_lib_storage_Storage.3 new file mode 100644 index 0000000..a34d6a4 --- /dev/null +++ b/docs/pyShelf/man/man3/src_backend_lib_storage_Storage.3 @@ -0,0 +1,297 @@ +.TH "src.backend.lib.storage.Storage" 3 "Sat Aug 9 2025 19:53:55" "Version 0.8.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*- +.ad l +.nh +.SH NAME +src.backend.lib.storage.Storage +.SH SYNOPSIS +.br +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fB__init__\fP (self, config)" +.br +.ti -1c +.RI "\fBget_connection_string\fP (self)" +.br +.ti -1c +.RI "\fBcreate_tables\fP (self)" +.br +.ti -1c +.RI "\fBinsert_book\fP (self, book)" +.br +.ti -1c +.RI "\fBbook_paths_list\fP (self)" +.br +.ti -1c +.RI "list() \fBparse_collections_from_path\fP (self, dict() book)" +.br +.ti -1c +.RI "\fBmake_collections\fP (self)" +.br +.ti -1c +.RI "\fBget_books\fP (self, collection=None, skip=None, limit=None)" +.br +.ti -1c +.RI "\fBget_book\fP (self, id)" +.br +.ti -1c +.RI "\fBget_collections\fP (self)" +.br +.ti -1c +.RI "\fBget_collection\fP (self, name)" +.br +.ti -1c +.RI "dict \fBparse_advanced_query\fP (self, str query)" +.br +.ti -1c +.RI "\fBfuzzy_search_books\fP (self, str query, int limit=30)" +.br +.in -1c +.SS "Public Attributes" + +.in +1c +.ti -1c +.RI "\fBconfig\fP = config" +.br +.ti -1c +.RI "\fBsql\fP = self\&.config\&.catalogue_db" +.br +.ti -1c +.RI "\fBuser\fP = self\&.config\&.user" +.br +.ti -1c +.RI "\fBpassword\fP = self\&.config\&.password" +.br +.ti -1c +.RI "\fBdb_host\fP = self\&.config\&.db_host" +.br +.ti -1c +.RI "\fBdb_port\fP = self\&.config\&.db_port" +.br +.ti -1c +.RI "\fBengine\fP" +.br +.in -1c +.SH "Detailed Description" +.PP + +.PP +.nf +Create a new Storage object\&. + +>>> db = Storage(config) + +Parameters +---------- +config : Config() + Main program configuration\&. + +Attributes +---------- +config : Stores configuration +sql : Database Name +user : Database User Name +password : Database Password +db_host : Database Host +db_port : Database Port +engine : sqlalchemy\&.create_engine(url, executor, kw) + +.fi +.PP + +.SH "Constructor & Destructor Documentation" +.PP +.SS "src\&.backend\&.lib\&.storage\&.Storage\&.__init__ ( self, config)" + +.PP +.nf +Initialize storage object\&. +.fi +.PP + +.SH "Member Function Documentation" +.PP +.SS "src\&.backend\&.lib\&.storage\&.Storage\&.book_paths_list ( self)" + +.PP +.nf +Get file paths from database for comparison to system files\&. + +Returns +------- +_result : ScalarResult Object + +.fi +.PP + +.SS "src\&.backend\&.lib\&.storage\&.Storage\&.create_tables ( self)" + +.PP +.nf +Create table structure\&. +.fi +.PP + +.SS "src\&.backend\&.lib\&.storage\&.Storage\&.fuzzy_search_books ( self, str query, int limit = \fR30\fP)" + +.SS "src\&.backend\&.lib\&.storage\&.Storage\&.get_book ( self, id)" + +.PP +.nf +Get book from database\&. + +Parameters +---------- +id : int + Book ID to filter by\&. + +Returns +------- +_result : ScalarResult Object + +.fi +.PP + +.SS "src\&.backend\&.lib\&.storage\&.Storage\&.get_books ( self, collection = \fRNone\fP, skip = \fRNone\fP, limit = \fRNone\fP)" + +.PP +.nf +Get books from database\&. + +Parameters +---------- +collection : int or None + Collection ID to filter by\&. +skip : int or None + Number of records to skip (offset)\&. +limit : int or None + Maximum number of records to return\&. + +.fi +.PP + +.SS "src\&.backend\&.lib\&.storage\&.Storage\&.get_collection ( self, name)" + +.PP +.nf +Get collection from database\&. + +Returns +------- +_result : ScalarResult Object + +.fi +.PP + +.SS "src\&.backend\&.lib\&.storage\&.Storage\&.get_collections ( self)" + +.PP +.nf +Get collections from database\&. + +Returns +------- +_result : ScalarResult Object + +.fi +.PP + +.SS "src\&.backend\&.lib\&.storage\&.Storage\&.get_connection_string ( self)" + +.PP +.nf +Get connection string\&. + +Engine type references config\&.json:DB_ENGINE\&. + +Returns +------- +str : sqlalchemy Connection String + +.fi +.PP + +.SS "src\&.backend\&.lib\&.storage\&.Storage\&.insert_book ( self, book)" + +.PP +.nf +Insert a new book into the database\&. + +Parameters +---------- +book: dict() + Book object to insert\&. + +Returns +------- +bool + True on success False on failure + +.fi +.PP + +.SS "src\&.backend\&.lib\&.storage\&.Storage\&.make_collections ( self)" + +.PP +.nf +Ensure collections exist and link them to books (many-to-many)\&. +.fi +.PP + +.SS " dict src\&.backend\&.lib\&.storage\&.Storage\&.parse_advanced_query ( self, str query)" + +.PP +.nf +Parse a query like 'title:"dark tower" author:king tags:fantasy' +.fi +.PP + +.SS " list() src\&.backend\&.lib\&.storage\&.Storage\&.parse_collections_from_path ( self, dict() book)" + +.PP +.nf +Parse book path's to determine common folder structure\&. + +Stores collections based on shared paths\&. + +Parameters +---------- +book : dict() + Book object to parse\&. + +Returns +------- +collections : list() + List of collections\&. + +.fi +.PP + +.SH "Member Data Documentation" +.PP +.SS "src\&.backend\&.lib\&.storage\&.Storage\&.config = config" + +.SS "src\&.backend\&.lib\&.storage\&.Storage\&.db_host = self\&.config\&.db_host" + +.SS "src\&.backend\&.lib\&.storage\&.Storage\&.db_port = self\&.config\&.db_port" + +.SS "src\&.backend\&.lib\&.storage\&.Storage\&.engine" +\fBInitial value:\fP +.nf += create_engine(self\&.get_connection_string(), + pool_pre_ping=True) +.PP +.fi + +.SS "src\&.backend\&.lib\&.storage\&.Storage\&.password = self\&.config\&.password" + +.SS "src\&.backend\&.lib\&.storage\&.Storage\&.sql = self\&.config\&.catalogue_db" + +.SS "src\&.backend\&.lib\&.storage\&.Storage\&.user = self\&.config\&.user" + + +.SH "Author" +.PP +Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&. diff --git a/docs/pyShelf/man/man3/src_backend_tests_config_test_TestConfig.3 b/docs/pyShelf/man/man3/src_backend_tests_config_test_TestConfig.3 new file mode 100644 index 0000000..b8896f6 --- /dev/null +++ b/docs/pyShelf/man/man3/src_backend_tests_config_test_TestConfig.3 @@ -0,0 +1,46 @@ +.TH "src.backend.tests.config_test.TestConfig" 3 "Sat Aug 9 2025 19:53:55" "Version 0.8.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*- +.ad l +.nh +.SH NAME +src.backend.tests.config_test.TestConfig +.SH SYNOPSIS +.br +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBtest_book_dir\fP (self)" +.br +.ti -1c +.RI "\fBtest_title\fP (self)" +.br +.ti -1c +.RI "\fBtest_version\fP (self)" +.br +.in -1c +.SS "Static Public Attributes" + +.in +1c +.ti -1c +.RI "\fBconfig\fP = \fBConfig\fP(os\&.path\&.abspath(os\&.path\&.curdir))" +.br +.in -1c +.SH "Detailed Description" +.PP +.SH "Member Function Documentation" +.PP +.SS "src\&.backend\&.tests\&.config_test\&.TestConfig\&.test_book_dir ( self)" + +.SS "src\&.backend\&.tests\&.config_test\&.TestConfig\&.test_title ( self)" + +.SS "src\&.backend\&.tests\&.config_test\&.TestConfig\&.test_version ( self)" + +.SH "Member Data Documentation" +.PP +.SS "src\&.backend\&.tests\&.config_test\&.TestConfig\&.config = \fBConfig\fP(os\&.path\&.abspath(os\&.path\&.curdir))\fR [static]\fP" + + +.SH "Author" +.PP +Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&. diff --git a/docs/pyShelf/man/man3/src_backend_tests_library_test_TestCatalogue.3 b/docs/pyShelf/man/man3/src_backend_tests_library_test_TestCatalogue.3 new file mode 100644 index 0000000..debc775 --- /dev/null +++ b/docs/pyShelf/man/man3/src_backend_tests_library_test_TestCatalogue.3 @@ -0,0 +1,41 @@ +.TH "src.backend.tests.library_test.TestCatalogue" 3 "Sat Aug 9 2025 19:53:55" "Version 0.8.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*- +.ad l +.nh +.SH NAME +src.backend.tests.library_test.TestCatalogue +.SH SYNOPSIS +.br +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBtest_filter_books\fP (self)" +.br +.in -1c +.SS "Static Public Attributes" + +.in +1c +.ti -1c +.RI "\fBroot\fP = os\&.path\&.abspath(os\&.path\&.curdir)" +.br +.ti -1c +.RI "\fBconfig\fP = \fBTest_Config\fP()" +.br +.in -1c +.SH "Detailed Description" +.PP +.SH "Member Function Documentation" +.PP +.SS "src\&.backend\&.tests\&.library_test\&.TestCatalogue\&.test_filter_books ( self)" + +.SH "Member Data Documentation" +.PP +.SS "src\&.backend\&.tests\&.library_test\&.TestCatalogue\&.config = \fBTest_Config\fP()\fR [static]\fP" + +.SS "src\&.backend\&.tests\&.library_test\&.TestCatalogue\&.root = os\&.path\&.abspath(os\&.path\&.curdir)\fR [static]\fP" + + +.SH "Author" +.PP +Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&. diff --git a/docs/pyShelf/man/man3/src_backend_tests_library_test_Test_Catalogue.3 b/docs/pyShelf/man/man3/src_backend_tests_library_test_Test_Catalogue.3 new file mode 100644 index 0000000..e0c3150 --- /dev/null +++ b/docs/pyShelf/man/man3/src_backend_tests_library_test_Test_Catalogue.3 @@ -0,0 +1,269 @@ +.TH "src.backend.tests.library_test.Test_Catalogue" 3 "Sat Aug 9 2025 19:53:55" "Version 0.8.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*- +.ad l +.nh +.SH NAME +src.backend.tests.library_test.Test_Catalogue +.SH SYNOPSIS +.br +.PP +.PP +Inherits \fBsrc\&.backend\&.lib\&.library\&.Catalogue\fP\&. +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fB__init__\fP (self)" +.br +.ti -1c +.RI "\fBfilter_books\fP (self)" +.br +.ti -1c +.RI "\fBscan_folder\fP (self, _path=None)" +.br +.ti -1c +.RI "\fBprocess_by_filetype\fP (self, book)" +.br +.ti -1c +.RI "\fBextract_metadata_epub\fP (self, book)" +.br +.ti -1c +.RI "\fBextract_metadata_pdf\fP (self, book)" +.br +.ti -1c +.RI "\fBextract_metadata_mobi\fP (self, book)" +.br +.ti -1c +.RI "\fBextract_content\fP (self, book_zip, book)" +.br +.ti -1c +.RI "\fBextract_cover_html\fP (self, book_zip, book)" +.br +.ti -1c +.RI "\fBextract_cover_image\fP (self, book_zip, book)" +.br +.ti -1c +.RI "\fBcompare_shelf_current\fP (self)" +.br +.ti -1c +.RI "\fBimport_books\fP (self, list=None, **kwargs)" +.br +.in -1c +.SS "Static Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBprocess_epub\fP (book)" +.br +.ti -1c +.RI "\fBstripTags\fP (source)" +.br +.in -1c +.SS "Public Attributes" + +.in +1c +.ti -1c +.RI "str \fBbook_shelf\fP = 'app/' + self\&.book_shelf" +.br +.ti -1c +.RI "list \fBfile_list\fP = []" +.br +.ti -1c +.RI "\fBopf_regx\fP = re\&.compile(r'\\\&.opf')" +.br +.ti -1c +.RI "\fBcover_regx\fP = re\&.compile(r'\\\&.jpg|\\\&.jpeg|\\\&.png|\\\&.bmp|\\\&.gif')" +.br +.ti -1c +.RI "\fBhtml_regx\fP = re\&.compile(r'\\\&.html')" +.br +.ti -1c +.RI "\fBtitle_sanitization_regx\fP = re\&.compile(r'^(Book )+[0\-9]*')" +.br +.ti -1c +.RI "\fBtitle_sanitization_lvl2_regx\fP" +.br +.ti -1c +.RI "\fBtitle_sanitization_dirs_regx\fP = re\&.compile(r'/')" +.br +.ti -1c +.RI "\fBroot_dir\fP = config\&.root" +.br +.ti -1c +.RI "\fBbook_folder\fP = config\&.book_path" +.br +.ti -1c +.RI "\fBbooks\fP = None" +.br +.ti -1c +.RI "\fBdb_pointer\fP = config\&.catalogue_db" +.br +.ti -1c +.RI "\fBconfig\fP = config" +.br +.in -1c +.SH "Detailed Description" +.PP +.SH "Constructor & Destructor Documentation" +.PP +.SS "src\&.backend\&.tests\&.library_test\&.Test_Catalogue\&.__init__ ( self)" + +.SH "Member Function Documentation" +.PP +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.compare_shelf_current ( self)\fR [inherited]\fP" + +.PP +.nf +Calls storage system, gets list of books stored and compares against files on disk + +.fi +.PP + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.extract_content ( self, book_zip, book)\fR [inherited]\fP" + +.PP +.nf +Opens epub as zip file filters then stores as list any files matching opf_regx + +.fi +.PP + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.extract_cover_html ( self, book_zip, book)\fR [inherited]\fP" + +.PP +.nf +Opens epub as zip file filters then stores as list any files matching html_regx + +.fi +.PP + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.extract_cover_image ( self, book_zip, book)\fR [inherited]\fP" + +.PP +.nf +Opens epub as zip file filters then stores as list any files matching cover_regx + +.fi +.PP + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.extract_metadata_epub ( self, book)\fR [inherited]\fP" + +.PP +.nf +Extract metadata from epub file + +:param book: Dictionary of epub file contents +:returns: Dictionary of book metadata + +.fi +.PP + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.extract_metadata_mobi ( self, book)\fR [inherited]\fP" + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.extract_metadata_pdf ( self, book)\fR [inherited]\fP" + +.PP +.nf +Return extracted metadata +:NOTES: Retrieval of data has been problematic, some pdf's providing +reliable titles that corespond with the actual, and others being +nonsense\&. + +.fi +.PP + +.SS "src\&.backend\&.tests\&.library_test\&.Test_Catalogue\&.filter_books ( self)" + +.PP +.nf +Calls scan_folder and filters out book files\&. + +:returns self\&._book_list_expanded: json string containing +all book metadata + +.fi +.PP + +.PP +Reimplemented from \fBsrc\&.backend\&.lib\&.library\&.Catalogue\fP\&. +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.import_books ( self, list = \fRNone\fP, ** kwargs)\fR [inherited]\fP" + +.PP +.nf +Main entry point for import operations\&. +Gets a list of new files via compare_shelf_current\&. +Iterates over list and inserts new books into database\&. + +.fi +.PP + +.PP +Reimplemented in \fBsrc\&.backend\&.lib\&.overide\&.ACatalogue\fP\&. +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.process_by_filetype ( self, book)\fR [inherited]\fP" + +.PP +.nf +Determine books filetype and process\&. +.fi +.PP + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.process_epub ( book)\fR [static]\fP, \fR [inherited]\fP" + +.PP +.nf +Return dictionary of epub file contents +.fi +.PP + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.scan_folder ( self, _path = \fRNone\fP)\fR [inherited]\fP" + +.PP +.nf +Scan folder by _path, allows recurisive scanning + +:param _path: Path to scan + +.fi +.PP + +.PP +Reimplemented in \fBsrc\&.backend\&.lib\&.overide\&.ACatalogue\fP\&. +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.stripTags ( source)\fR [static]\fP, \fR [inherited]\fP" + +.SH "Member Data Documentation" +.PP +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.book_folder = config\&.book_path\fR [inherited]\fP" + +.SS "str src\&.backend\&.tests\&.library_test\&.Test_Catalogue\&.book_shelf = 'app/' + self\&.book_shelf" + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.books = None\fR [inherited]\fP" + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.config = config\fR [inherited]\fP" + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.cover_regx = re\&.compile(r'\\\&.jpg|\\\&.jpeg|\\\&.png|\\\&.bmp|\\\&.gif')\fR [inherited]\fP" + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.db_pointer = config\&.catalogue_db\fR [inherited]\fP" + +.SS "list src\&.backend\&.lib\&.library\&.Catalogue\&.file_list = []\fR [inherited]\fP" + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.html_regx = re\&.compile(r'\\\&.html')\fR [inherited]\fP" + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.opf_regx = re\&.compile(r'\\\&.opf')\fR [inherited]\fP" + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.root_dir = config\&.root\fR [inherited]\fP" + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.title_sanitization_dirs_regx = re\&.compile(r'/')\fR [inherited]\fP" + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.title_sanitization_lvl2_regx\fR [inherited]\fP" +\fBInitial value:\fP +.nf += re\&.compile( + r"^(Book )+[0\-9]*\\W+(\-)") +.PP +.fi + +.SS "src\&.backend\&.lib\&.library\&.Catalogue\&.title_sanitization_regx = re\&.compile(r'^(Book )+[0\-9]*')\fR [inherited]\fP" + + +.SH "Author" +.PP +Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&. diff --git a/docs/pyShelf/man/man3/src_backend_tests_library_test_Test_Config.3 b/docs/pyShelf/man/man3/src_backend_tests_library_test_Test_Config.3 new file mode 100644 index 0000000..d20e391 --- /dev/null +++ b/docs/pyShelf/man/man3/src_backend_tests_library_test_Test_Config.3 @@ -0,0 +1,207 @@ +.TH "src.backend.tests.library_test.Test_Config" 3 "Sat Aug 9 2025 19:53:55" "Version 0.8.0" "pyShelf Open Source Ebook Server" \" -*- nroff -*- +.ad l +.nh +.SH NAME +src.backend.tests.library_test.Test_Config +.SH SYNOPSIS +.br +.PP +.PP +Inherits \fBsrc\&.backend\&.lib\&.config\&.Config\fP\&. +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fB__init__\fP (self)" +.br +.ti -1c +.RI "\fBopen_file\fP (self, root='config\&.json')" +.br +.ti -1c +.RI "\fBinit_config\fP (self)" +.br +.ti -1c +.RI "\fBget_logger\fP (self)" +.br +.in -1c +.SS "Public Attributes" + +.in +1c +.ti -1c +.RI "\fBroot\fP = root" +.br +.ti -1c +.RI "dict \fBconfig_structure\fP" +.br +.ti -1c +.RI "\fBlogger\fP = self\&.get_logger()" +.br +.ti -1c +.RI "\fBbook_path\fP = env\&.get('BOOKPATH', self\&._data['BOOKPATH'])" +.br +.ti -1c +.RI "str \fBTITLE\fP = env\&.get('TITLE', self\&._data['TITLE'])" +.br +.ti -1c +.RI "\fBVERSION\fP = env\&.get('VERSION', self\&._data['VERSION'])" +.br +.ti -1c +.RI "\fBbook_shelf\fP = env\&.get('BOOKSHELF', self\&._data['BOOKSHELF'])" +.br +.ti -1c +.RI "\fBcatalogue_db\fP = env\&.get('DATABASE', self\&._data['DATABASE'])" +.br +.ti -1c +.RI "\fBuser\fP = self\&._data['USER']" +.br +.ti -1c +.RI "\fBpassword\fP = self\&._data['PASSWORD']" +.br +.ti -1c +.RI "\fBdb_host\fP = env\&.get('DB_HOST', self\&._data['DB_HOST'])" +.br +.ti -1c +.RI "\fBdb_port\fP = env\&.get('DB_PORT', self\&._data['DB_PORT'])" +.br +.ti -1c +.RI "list \fBfile_array\fP = [self\&.book_shelf]" +.br +.ti -1c +.RI "bool \fBauto_scan\fP = True" +.br +.ti -1c +.RI "\fBallowed_hosts\fP" +.br +.ti -1c +.RI "\fBdb_engine\fP = env\&.get('DB_ENGINE', self\&._data['DB_ENGINE'])" +.br +.ti -1c +.RI "\fBdb_user\fP = env\&.get('USER', self\&._data['USER'])" +.br +.ti -1c +.RI "\fBdb_pass\fP = env\&.get('PASSWORD', self\&._data['PASSWORD'])" +.br +.ti -1c +.RI "\fBbuild_mode\fP = env\&.get('BUILD_MODE', self\&._data['BUILD_MODE'])" +.br +.in -1c +.SS "Protected Attributes" + +.in +1c +.ti -1c +.RI "str \fB_fp\fP = 'config\&.json'" +.br +.ti -1c +.RI "\fB_cp\fP = Path\&.joinpath(root, self\&._fp)" +.br +.ti -1c +.RI "\fB_data\fP = self\&.init_config()" +.br +.in -1c +.SH "Detailed Description" +.PP +.SH "Constructor & Destructor Documentation" +.PP +.SS "src\&.backend\&.tests\&.library_test\&.Test_Config\&.__init__ ( self)" + +.SH "Member Function Documentation" +.PP +.SS "src\&.backend\&.lib\&.config\&.Config\&.get_logger ( self)\fR [inherited]\fP" + +.PP +.nf +Instantiate logging system\&. +.fi +.PP + +.SS "src\&.backend\&.lib\&.config\&.Config\&.init_config ( self)\fR [inherited]\fP" + +.SS "src\&.backend\&.tests\&.library_test\&.Test_Config\&.open_file ( self, root = \fR'config\&.json'\fP)" + +.PP +.nf +Open config\&.json and reads in configuration options\&. +.fi +.PP + +.PP +Reimplemented from \fBsrc\&.backend\&.lib\&.config\&.Config\fP\&. +.SH "Member Data Documentation" +.PP +.SS "src\&.backend\&.lib\&.config\&.Config\&._cp = Path\&.joinpath(root, self\&._fp)\fR [protected]\fP, \fR [inherited]\fP" + +.SS "src\&.backend\&.lib\&.config\&.Config\&._data = self\&.init_config()\fR [protected]\fP, \fR [inherited]\fP" + +.SS "src\&.backend\&.lib\&.config\&.Config\&._fp = 'config\&.json'\fR [protected]\fP, \fR [inherited]\fP" + +.SS "src\&.backend\&.lib\&.config\&.Config\&.allowed_hosts\fR [inherited]\fP" +\fBInitial value:\fP +.nf += env\&.get("ALLOWED_HOSTS", + self\&._data["ALLOWED_HOSTS"]) +.PP +.fi + +.SS "bool src\&.backend\&.lib\&.config\&.Config\&.auto_scan = True\fR [inherited]\fP" + +.SS "src\&.backend\&.lib\&.config\&.Config\&.book_path = env\&.get('BOOKPATH', self\&._data['BOOKPATH'])\fR [inherited]\fP" + +.SS "src\&.backend\&.lib\&.config\&.Config\&.book_shelf = env\&.get('BOOKSHELF', self\&._data['BOOKSHELF'])\fR [inherited]\fP" + +.SS "src\&.backend\&.lib\&.config\&.Config\&.build_mode = env\&.get('BUILD_MODE', self\&._data['BUILD_MODE'])\fR [inherited]\fP" + +.SS "src\&.backend\&.lib\&.config\&.Config\&.catalogue_db = env\&.get('DATABASE', self\&._data['DATABASE'])\fR [inherited]\fP" + +.SS "src\&.backend\&.lib\&.config\&.Config\&.config_structure\fR [inherited]\fP" +\fBInitial value:\fP +.nf += { + "TITLE": "pyShelf E\-Book Server", + "VERSION": "0\&.7\&.0", + "BOOKPATH": "/mnt/books", + "DB_HOST": "localhost", + "DB_PORT": "5432", + "DB_ENGINE": "sqlite", + "DATABASE": "pyshelf", + "USER": "pyshelf", + "PASSWORD": "pyshelf", + "BOOKSHELF": "data/shelf\&.json", + "ALLOWED_HOSTS": [ + "localhost", + "127\&.0\&.0\&.1", + "[::1]", + "0\&.0\&.0\&.0" + ], + "BUILD_MODE": "development" + } +.PP +.fi + +.SS "src\&.backend\&.lib\&.config\&.Config\&.db_engine = env\&.get('DB_ENGINE', self\&._data['DB_ENGINE'])\fR [inherited]\fP" + +.SS "src\&.backend\&.lib\&.config\&.Config\&.db_host = env\&.get('DB_HOST', self\&._data['DB_HOST'])\fR [inherited]\fP" + +.SS "src\&.backend\&.lib\&.config\&.Config\&.db_pass = env\&.get('PASSWORD', self\&._data['PASSWORD'])\fR [inherited]\fP" + +.SS "src\&.backend\&.lib\&.config\&.Config\&.db_port = env\&.get('DB_PORT', self\&._data['DB_PORT'])\fR [inherited]\fP" + +.SS "src\&.backend\&.lib\&.config\&.Config\&.db_user = env\&.get('USER', self\&._data['USER'])\fR [inherited]\fP" + +.SS "list src\&.backend\&.lib\&.config\&.Config\&.file_array = [self\&.book_shelf]\fR [inherited]\fP" + +.SS "src\&.backend\&.lib\&.config\&.Config\&.logger = self\&.get_logger()\fR [inherited]\fP" + +.SS "src\&.backend\&.lib\&.config\&.Config\&.password = self\&._data['PASSWORD']\fR [inherited]\fP" + +.SS "src\&.backend\&.lib\&.config\&.Config\&.root = root\fR [inherited]\fP" + +.SS "str src\&.backend\&.lib\&.config\&.Config\&.TITLE = env\&.get('TITLE', self\&._data['TITLE'])\fR [inherited]\fP" + +.SS "src\&.backend\&.lib\&.config\&.Config\&.user = self\&._data['USER']\fR [inherited]\fP" + +.SS "src\&.backend\&.lib\&.config\&.Config\&.VERSION = env\&.get('VERSION', self\&._data['VERSION'])\fR [inherited]\fP" + + +.SH "Author" +.PP +Generated automatically by Doxygen for pyShelf Open Source Ebook Server from the source code\&. diff --git a/docs/warn.log b/docs/warn.log new file mode 100644 index 0000000..1abf560 --- /dev/null +++ b/docs/warn.log @@ -0,0 +1,208 @@ +/home/th3r00t/Projects/pyShelf/src/backend/tests/config_test.py:6: warning: Compound src::backend::tests::config_test::TestConfig is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/tests/library_test.py:28: warning: Compound src::backend::tests::library_test::TestCatalogue is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/tests/library_test.py:19: warning: Compound src::backend::tests::library_test::Test_Catalogue is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/tests/library_test.py:8: warning: Compound src::backend::tests::library_test::Test_Config is not documented. +error: Problems running htags. Check your installation +error: USE_HTAGS is YES but htags(1) failed. +/home/th3r00t/Projects/pyShelf/src/frontend/lib/DataHooks.py:10: warning: Member config (variable) of class DataHooks.BookInterface is not documented. +/home/th3r00t/Projects/pyShelf/src/frontend/lib/DataHooks.py:11: warning: Member db (variable) of class DataHooks.BookInterface is not documented. +/home/th3r00t/Projects/pyShelf/src/frontend/lib/FastAPIServer.py:108: warning: Member tojson(obj) (function) of namespace FastAPIServer is not documented. +/home/th3r00t/Projects/pyShelf/src/frontend/lib/FastAPIServer.py:23: warning: Member app (variable) of namespace FastAPIServer is not documented. +/home/th3r00t/Projects/pyShelf/src/frontend/lib/FastAPIServer.py:24: warning: Member STATIC_DIR (variable) of namespace FastAPIServer is not documented. +/home/th3r00t/Projects/pyShelf/src/frontend/lib/FastAPIServer.py:24: warning: Member TEMPLATES_DIR (variable) of namespace FastAPIServer is not documented. +/home/th3r00t/Projects/pyShelf/src/frontend/lib/FastAPIServer.py:25: warning: Member templates (variable) of namespace FastAPIServer is not documented. +/home/th3r00t/Projects/pyShelf/src/frontend/lib/FastAPIServer.py:27: warning: Member origins (variable) of namespace FastAPIServer is not documented. +/home/th3r00t/Projects/pyShelf/src/frontend/lib/FastAPIServer.py:35: warning: Member allow_origins (variable) of namespace FastAPIServer is not documented. +/home/th3r00t/Projects/pyShelf/src/frontend/lib/FastAPIServer.py:36: warning: Member allow_credentials (variable) of namespace FastAPIServer is not documented. +/home/th3r00t/Projects/pyShelf/src/frontend/lib/FastAPIServer.py:37: warning: Member allow_methods (variable) of namespace FastAPIServer is not documented. +/home/th3r00t/Projects/pyShelf/src/frontend/lib/FastAPIServer.py:38: warning: Member allow_headers (variable) of namespace FastAPIServer is not documented. +/home/th3r00t/Projects/pyShelf/src/frontend/lib/FastAPIServer.py:42: warning: parameters of member FastAPIServer.base64decode are not documented +/home/th3r00t/Projects/pyShelf/src/frontend/lib/FastAPIServer.py:42: warning: return type of member FastAPIServer.base64decode is not documented +/home/th3r00t/Projects/pyShelf/src/frontend/lib/FastAPIServer.py:90: warning: parameters of member FastAPIServer.book_tojson are not documented +/home/th3r00t/Projects/pyShelf/src/frontend/lib/FastAPIServer.py:90: warning: return type of member FastAPIServer.book_tojson is not documented +/home/th3r00t/Projects/pyShelf/src/frontend/lib/FastAPIServer.py:66: warning: parameters of member FastAPIServer.books_tojson are not documented +/home/th3r00t/Projects/pyShelf/src/frontend/lib/FastAPIServer.py:66: warning: return type of member FastAPIServer.books_tojson is not documented +/home/th3r00t/Projects/pyShelf/src/frontend/lib/FastAPIServer.py:112: warning: parameters of member FastAPIServer.collections_tojson are not documented +/home/th3r00t/Projects/pyShelf/src/frontend/lib/FastAPIServer.py:112: warning: return type of member FastAPIServer.collections_tojson is not documented +/home/th3r00t/Projects/pyShelf/src/frontend/lib/FastAPIServer.py:61: warning: parameters of member FastAPIServer.convertDateTime are not documented +/home/th3r00t/Projects/pyShelf/src/frontend/lib/FastAPIServer.py:61: warning: return type of member FastAPIServer.convertDateTime is not documented +/home/th3r00t/Projects/pyShelf/src/frontend/lib/FastAPIServer.py:51: warning: parameters of member FastAPIServer.summarize are not documented +/home/th3r00t/Projects/pyShelf/src/frontend/lib/FastAPIServer.py:51: warning: return type of member FastAPIServer.summarize is not documented +:1: warning: parameters of member FastAPIServer.tojson are not documented +/home/th3r00t/Projects/pyShelf/src/frontend/lib/FastAPIServer.py:179: warning: Member index(Request request, int skip=0, int limit=30) (function) of class FastAPIServer.FastAPIServer is not documented. +/home/th3r00t/Projects/pyShelf/src/frontend/lib/FastAPIServer.py:206: warning: Member books(Request request, int skip=0, int limit=10, collection=None) (function) of class FastAPIServer.FastAPIServer is not documented. +/home/th3r00t/Projects/pyShelf/src/frontend/lib/FastAPIServer.py:215: warning: Member book(Request request, int book_id) (function) of class FastAPIServer.FastAPIServer is not documented. +/home/th3r00t/Projects/pyShelf/src/frontend/lib/FastAPIServer.py:222: warning: Member book(Request request, int book_id) (function) of class FastAPIServer.FastAPIServer is not documented. +/home/th3r00t/Projects/pyShelf/src/frontend/lib/FastAPIServer.py:232: warning: Member collections(Request request) (function) of class FastAPIServer.FastAPIServer is not documented. +/home/th3r00t/Projects/pyShelf/src/frontend/lib/FastAPIServer.py:139: warning: Member config (variable) of class FastAPIServer.FastAPIServer is not documented. +/home/th3r00t/Projects/pyShelf/src/frontend/lib/FastAPIServer.py:144: warning: Member fe_config (variable) of class FastAPIServer.FastAPIServer is not documented. +/home/th3r00t/Projects/pyShelf/src/frontend/lib/FastAPIServer.py:146: warning: Member fe_server (variable) of class FastAPIServer.FastAPIServer is not documented. +/home/th3r00t/Projects/pyShelf/src/frontend/lib/FastAPIServer.py:147: warning: Member JSInterface (variable) of class FastAPIServer.FastAPIServer is not documented. +/home/th3r00t/Projects/pyShelf/src/frontend/lib/FastAPIServer.py:138: warning: parameters of member FastAPIServer.FastAPIServer.__init__ are not documented +:1: warning: parameters of member FastAPIServer.FastAPIServer.book are not documented +:1: warning: parameters of member FastAPIServer.FastAPIServer.books are not documented +/home/th3r00t/Projects/pyShelf/src/frontend/lib/FastAPIServer.py:240: warning: parameters of member FastAPIServer.FastAPIServer.collection are not documented +:1: warning: parameters of member FastAPIServer.FastAPIServer.collections are not documented +:1: warning: parameters of member FastAPIServer.FastAPIServer.index are not documented +/home/th3r00t/Projects/pyShelf/src/frontend/lib/FastAPIServer.py:263: warning: parameters of member FastAPIServer.FastAPIServer.search_books_api are not documented +/home/th3r00t/Projects/pyShelf/src/frontend/lib/FastAPIServer.py:173: warning: parameters of member FastAPIServer.FastAPIServer.use_route_names_as_operation_ids are not documented +/home/th3r00t/Projects/pyShelf/src/frontend/lib/FastAPIServer.py:173: warning: return type of member FastAPIServer.FastAPIServer.use_route_names_as_operation_ids is not documented +/home/th3r00t/Projects/pyShelf/src/frontend/lib/objects.py:12: warning: Member package_json (variable) of class objects.JSInterface is not documented. +/home/th3r00t/Projects/pyShelf/src/frontend/lib/objects.py:13: warning: Member config (variable) of class objects.JSInterface is not documented. +/home/th3r00t/Projects/pyShelf/src/frontend/lib/objects.py:11: warning: parameters of member objects.JSInterface.__init__ are not documented +/home/th3r00t/Projects/pyShelf/src/__main__.py:14: warning: Member root (variable) of namespace src.__main__ is not documented. +/home/th3r00t/Projects/pyShelf/src/__main__.py:15: warning: Member config (variable) of namespace src.__main__ is not documented. +/home/th3r00t/Projects/pyShelf/src/__main__.py:16: warning: Member PRG_PATH (variable) of namespace src.__main__ is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/api_hooks.py:10: warning: Member __init__(self) (function) of class src.backend.lib.api_hooks.DuckDuckGo is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/api_hooks.py:40: warning: Member description_result(self, query) (function) of class src.backend.lib.api_hooks.DuckDuckGo is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/api_hooks.py:11: warning: Member url (variable) of class src.backend.lib.api_hooks.DuckDuckGo is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/api_hooks.py:12: warning: Member imageurl (variable) of class src.backend.lib.api_hooks.DuckDuckGo is not documented. +<__init__>:1: warning: parameters of member src.backend.lib.api_hooks.DuckDuckGo.__init__ are not documented +:1: warning: parameters of member src.backend.lib.api_hooks.DuckDuckGo.description_result are not documented +/home/th3r00t/Projects/pyShelf/src/backend/lib/api_hooks.py:15: warning: parameters of member src.backend.lib.api_hooks.DuckDuckGo.image_result are not documented +/home/th3r00t/Projects/pyShelf/src/backend/lib/config.py:101: warning: Member init_config(self) (function) of class src.backend.lib.config.Config is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/config.py:51: warning: Member root (variable) of class src.backend.lib.config.Config is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/config.py:52: warning: Member config_structure (variable) of class src.backend.lib.config.Config is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/config.py:81: warning: Member logger (variable) of class src.backend.lib.config.Config is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/config.py:82: warning: Member book_path (variable) of class src.backend.lib.config.Config is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/config.py:83: warning: Member TITLE (variable) of class src.backend.lib.config.Config is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/config.py:84: warning: Member VERSION (variable) of class src.backend.lib.config.Config is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/config.py:86: warning: Member book_shelf (variable) of class src.backend.lib.config.Config is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/config.py:87: warning: Member catalogue_db (variable) of class src.backend.lib.config.Config is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/config.py:88: warning: Member user (variable) of class src.backend.lib.config.Config is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/config.py:89: warning: Member password (variable) of class src.backend.lib.config.Config is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/config.py:90: warning: Member db_host (variable) of class src.backend.lib.config.Config is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/config.py:91: warning: Member db_port (variable) of class src.backend.lib.config.Config is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/config.py:92: warning: Member file_array (variable) of class src.backend.lib.config.Config is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/config.py:93: warning: Member auto_scan (variable) of class src.backend.lib.config.Config is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/config.py:94: warning: Member allowed_hosts (variable) of class src.backend.lib.config.Config is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/config.py:96: warning: Member db_engine (variable) of class src.backend.lib.config.Config is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/config.py:97: warning: Member db_user (variable) of class src.backend.lib.config.Config is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/config.py:98: warning: Member db_pass (variable) of class src.backend.lib.config.Config is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/config.py:99: warning: Member build_mode (variable) of class src.backend.lib.config.Config is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/config.py:72: warning: Member _fp (variable) of class src.backend.lib.config.Config is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/config.py:74: warning: Member _cp (variable) of class src.backend.lib.config.Config is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/config.py:77: warning: Member _data (variable) of class src.backend.lib.config.Config is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/config.py:50: warning: parameters of member src.backend.lib.config.Config.__init__ are not documented +:1: warning: parameters of member src.backend.lib.config.Config.init_config are not documented +/home/th3r00t/Projects/pyShelf/src/backend/lib/library.py:23: warning: Member __init__(self, config) (function) of class src.backend.lib.library.Catalogue is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/library.py:232: warning: Member extract_metadata_mobi(self, book) (function) of class src.backend.lib.library.Catalogue is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/library.py:228: warning: Member stripTags(source) (function) of class src.backend.lib.library.Catalogue is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/library.py:24: warning: Member file_list (variable) of class src.backend.lib.library.Catalogue is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/library.py:25: warning: Member opf_regx (variable) of class src.backend.lib.library.Catalogue is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/library.py:26: warning: Member cover_regx (variable) of class src.backend.lib.library.Catalogue is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/library.py:27: warning: Member html_regx (variable) of class src.backend.lib.library.Catalogue is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/library.py:28: warning: Member title_sanitization_regx (variable) of class src.backend.lib.library.Catalogue is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/library.py:29: warning: Member title_sanitization_lvl2_regx (variable) of class src.backend.lib.library.Catalogue is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/library.py:31: warning: Member title_sanitization_dirs_regx (variable) of class src.backend.lib.library.Catalogue is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/library.py:32: warning: Member root_dir (variable) of class src.backend.lib.library.Catalogue is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/library.py:33: warning: Member book_folder (variable) of class src.backend.lib.library.Catalogue is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/library.py:34: warning: Member books (variable) of class src.backend.lib.library.Catalogue is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/library.py:35: warning: Member db_pointer (variable) of class src.backend.lib.library.Catalogue is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/library.py:36: warning: Member config (variable) of class src.backend.lib.library.Catalogue is not documented. +<__init__>:1: warning: parameters of member src.backend.lib.library.Catalogue.__init__ are not documented +/home/th3r00t/Projects/pyShelf/src/backend/lib/library.py:283: warning: parameters of member src.backend.lib.library.Catalogue.extract_content are not documented +/home/th3r00t/Projects/pyShelf/src/backend/lib/library.py:290: warning: parameters of member src.backend.lib.library.Catalogue.extract_cover_html are not documented +/home/th3r00t/Projects/pyShelf/src/backend/lib/library.py:297: warning: parameters of member src.backend.lib.library.Catalogue.extract_cover_image are not documented +/home/th3r00t/Projects/pyShelf/src/backend/lib/library.py:103: warning: parameters of member src.backend.lib.library.Catalogue.extract_metadata_epub are not documented +:1: warning: parameters of member src.backend.lib.library.Catalogue.extract_metadata_mobi are not documented +/home/th3r00t/Projects/pyShelf/src/backend/lib/library.py:178: warning: parameters of member src.backend.lib.library.Catalogue.extract_metadata_pdf are not documented +/home/th3r00t/Projects/pyShelf/src/backend/lib/library.py:331: warning: parameters of member src.backend.lib.library.Catalogue.import_books are not documented +/home/th3r00t/Projects/pyShelf/src/backend/lib/library.py:75: warning: parameters of member src.backend.lib.library.Catalogue.process_by_filetype are not documented +/home/th3r00t/Projects/pyShelf/src/backend/lib/library.py:87: warning: parameters of member src.backend.lib.library.Catalogue.process_epub are not documented +/home/th3r00t/Projects/pyShelf/src/backend/lib/library.py:39: warning: parameters of member src.backend.lib.library.Catalogue.scan_folder are not documented +:1: warning: parameters of member src.backend.lib.library.Catalogue.stripTags are not documented +/home/th3r00t/Projects/pyShelf/src/backend/lib/models.py:24: warning: Member id (variable) of class src.backend.lib.models.Book is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/models.py:25: warning: Member title (variable) of class src.backend.lib.models.Book is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/models.py:26: warning: Member author (variable) of class src.backend.lib.models.Book is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/models.py:27: warning: Member categories (variable) of class src.backend.lib.models.Book is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/models.py:28: warning: Member cover (variable) of class src.backend.lib.models.Book is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/models.py:29: warning: Member pages (variable) of class src.backend.lib.models.Book is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/models.py:30: warning: Member progress (variable) of class src.backend.lib.models.Book is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/models.py:31: warning: Member file_name (variable) of class src.backend.lib.models.Book is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/models.py:32: warning: Member description (variable) of class src.backend.lib.models.Book is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/models.py:33: warning: Member date (variable) of class src.backend.lib.models.Book is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/models.py:34: warning: Member rights (variable) of class src.backend.lib.models.Book is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/models.py:35: warning: Member tags (variable) of class src.backend.lib.models.Book is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/models.py:36: warning: Member identifier (variable) of class src.backend.lib.models.Book is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/models.py:37: warning: Member publisher (variable) of class src.backend.lib.models.Book is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/models.py:40: warning: Member book_collections (variable) of class src.backend.lib.models.Book is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/models.py:64: warning: Member id (variable) of class src.backend.lib.models.BookCollection is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/models.py:65: warning: Member book_id (variable) of class src.backend.lib.models.BookCollection is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/models.py:66: warning: Member collection_id (variable) of class src.backend.lib.models.BookCollection is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/models.py:69: warning: Member book (variable) of class src.backend.lib.models.BookCollection is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/models.py:70: warning: Member collection (variable) of class src.backend.lib.models.BookCollection is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/models.py:50: warning: Member id (variable) of class src.backend.lib.models.Collection is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/models.py:51: warning: Member name (variable) of class src.backend.lib.models.Collection is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/models.py:54: warning: Member book_collections (variable) of class src.backend.lib.models.Collection is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/models.py:77: warning: Member id (variable) of class src.backend.lib.models.User is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/models.py:78: warning: Member username (variable) of class src.backend.lib.models.User is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/models.py:79: warning: Member password (variable) of class src.backend.lib.models.User is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/models.py:80: warning: Member email (variable) of class src.backend.lib.models.User is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/models.py:81: warning: Member date_joined (variable) of class src.backend.lib.models.User is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/models.py:84: warning: Member last_login (variable) of class src.backend.lib.models.User is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/models.py:87: warning: Member is_active (variable) of class src.backend.lib.models.User is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/models.py:88: warning: Member is_admin (variable) of class src.backend.lib.models.User is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/models.py:89: warning: Member is_superuser (variable) of class src.backend.lib.models.User is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/overide.py:15: warning: Member __init__(self) (function) of class src.backend.lib.overide.ACatalogue is not documented. +<__init__>:1: warning: parameters of member src.backend.lib.overide.ACatalogue.__init__ are not documented +/home/th3r00t/Projects/pyShelf/src/backend/lib/overide.py:38: warning: parameters of member src.backend.lib.overide.ACatalogue.import_books are not documented +/home/th3r00t/Projects/pyShelf/src/backend/lib/overide.py:19: warning: parameters of member src.backend.lib.overide.ACatalogue.scan_folder are not documented +/home/th3r00t/Projects/pyShelf/src/backend/lib/pyShelf.py:15: warning: Member __init__(self, file_array) (function) of class src.backend.lib.pyShelf.InitFiles is not documented. +<__init__>:1: warning: parameters of member src.backend.lib.pyShelf.InitFiles.__init__ are not documented +/home/th3r00t/Projects/pyShelf/src/backend/lib/pyShelf.py:23: warning: parameters of member src.backend.lib.pyShelf.InitFiles.CreateFile are not documented +/home/th3r00t/Projects/pyShelf/src/backend/lib/pyShelf.py:38: warning: Member __init__(self, root) (function) of class src.backend.lib.pyShelf.Server is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/pyShelf.py:45: warning: Member __aexit__(self, *args, **kwargs) (function) of class src.backend.lib.pyShelf.Server is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/pyShelf.py:48: warning: Member initialize_server(self) (function) of class src.backend.lib.pyShelf.Server is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/pyShelf.py:54: warning: Member runImport(self) (function) of class src.backend.lib.pyShelf.Server is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/pyShelf.py:61: warning: Member socketio(self, websocket, path) (function) of class src.backend.lib.pyShelf.Server is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/pyShelf.py:79: warning: Member pong(self) (function) of class src.backend.lib.pyShelf.Server is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/pyShelf.py:83: warning: Member start(self) (function) of class src.backend.lib.pyShelf.Server is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/pyShelf.py:39: warning: Member root (variable) of class src.backend.lib.pyShelf.Server is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/pyShelf.py:40: warning: Member host (variable) of class src.backend.lib.pyShelf.Server is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/pyShelf.py:41: warning: Member config (variable) of class src.backend.lib.pyShelf.Server is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/pyShelf.py:42: warning: Member loop (variable) of class src.backend.lib.pyShelf.Server is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/pyShelf.py:43: warning: Member serve (variable) of class src.backend.lib.pyShelf.Server is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/pyShelf.py:86: warning: Member socketio (variable) of class src.backend.lib.pyShelf.Server is not documented. +<__init__>:1: warning: parameters of member src.backend.lib.pyShelf.Server.__init__ are not documented +<__aexit__>:1: warning: parameters of member src.backend.lib.pyShelf.Server.__aexit__ are not documented +:1: warning: parameters of member src.backend.lib.pyShelf.Server.initialize_server are not documented +:1: warning: parameters of member src.backend.lib.pyShelf.Server.pong are not documented +:1: warning: parameters of member src.backend.lib.pyShelf.Server.runImport are not documented +:1: warning: parameters of member src.backend.lib.pyShelf.Server.socketio are not documented +:1: warning: parameters of member src.backend.lib.pyShelf.Server.start are not documented +/home/th3r00t/Projects/pyShelf/src/backend/lib/storage.py:297: warning: Member fuzzy_search_books(self, str query, int limit=30) (function) of class src.backend.lib.storage.Storage is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/storage.py:35: warning: Member config (variable) of class src.backend.lib.storage.Storage is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/storage.py:36: warning: Member sql (variable) of class src.backend.lib.storage.Storage is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/storage.py:37: warning: Member user (variable) of class src.backend.lib.storage.Storage is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/storage.py:38: warning: Member password (variable) of class src.backend.lib.storage.Storage is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/storage.py:39: warning: Member db_host (variable) of class src.backend.lib.storage.Storage is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/storage.py:40: warning: Member db_port (variable) of class src.backend.lib.storage.Storage is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/storage.py:41: warning: Member engine (variable) of class src.backend.lib.storage.Storage is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/lib/storage.py:34: warning: parameters of member src.backend.lib.storage.Storage.__init__ are not documented +:1: warning: parameters of member src.backend.lib.storage.Storage.fuzzy_search_books are not documented +/home/th3r00t/Projects/pyShelf/src/backend/lib/storage.py:235: warning: parameters of member src.backend.lib.storage.Storage.get_book are not documented +/home/th3r00t/Projects/pyShelf/src/backend/lib/storage.py:203: warning: parameters of member src.backend.lib.storage.Storage.get_books are not documented +/home/th3r00t/Projects/pyShelf/src/backend/lib/storage.py:265: warning: parameters of member src.backend.lib.storage.Storage.get_collection are not documented +/home/th3r00t/Projects/pyShelf/src/backend/lib/storage.py:69: warning: parameters of member src.backend.lib.storage.Storage.insert_book are not documented +/home/th3r00t/Projects/pyShelf/src/backend/lib/storage.py:278: warning: parameters of member src.backend.lib.storage.Storage.parse_advanced_query are not documented +/home/th3r00t/Projects/pyShelf/src/backend/lib/storage.py:278: warning: return type of member src.backend.lib.storage.Storage.parse_advanced_query is not documented +/home/th3r00t/Projects/pyShelf/src/backend/lib/storage.py:126: warning: parameters of member src.backend.lib.storage.Storage.parse_collections_from_path are not documented +/home/th3r00t/Projects/pyShelf/src/backend/lib/storage.py:126: warning: return type of member src.backend.lib.storage.Storage.parse_collections_from_path is not documented +/home/th3r00t/Projects/pyShelf/src/backend/tests/config_test.py:9: warning: Member test_book_dir(self) (function) of class src.backend.tests.config_test.TestConfig is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/tests/config_test.py:12: warning: Member test_title(self) (function) of class src.backend.tests.config_test.TestConfig is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/tests/config_test.py:15: warning: Member test_version(self) (function) of class src.backend.tests.config_test.TestConfig is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/tests/config_test.py:7: warning: Member config (variable) of class src.backend.tests.config_test.TestConfig is not documented. +:1: warning: parameters of member src.backend.tests.config_test.TestConfig.test_book_dir are not documented +:1: warning: parameters of member src.backend.tests.config_test.TestConfig.test_title are not documented +:1: warning: parameters of member src.backend.tests.config_test.TestConfig.test_version are not documented +/home/th3r00t/Projects/pyShelf/src/backend/tests/library_test.py:20: warning: Member __init__(self) (function) of class src.backend.tests.library_test.Test_Catalogue is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/tests/library_test.py:24: warning: Member book_shelf (variable) of class src.backend.tests.library_test.Test_Catalogue is not documented. +<__init__>:1: warning: parameters of member src.backend.tests.library_test.Test_Catalogue.__init__ are not documented +/home/th3r00t/Projects/pyShelf/src/backend/tests/library_test.py:9: warning: Member __init__(self) (function) of class src.backend.tests.library_test.Test_Config is not documented. +<__init__>:1: warning: parameters of member src.backend.tests.library_test.Test_Config.__init__ are not documented +/home/th3r00t/Projects/pyShelf/src/backend/lib/config.py:120: warning: parameters of member src.backend.tests.library_test.Test_Config.open_file are not documented +/home/th3r00t/Projects/pyShelf/src/backend/tests/library_test.py:32: warning: Member test_filter_books(self) (function) of class src.backend.tests.library_test.TestCatalogue is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/tests/library_test.py:29: warning: Member root (variable) of class src.backend.tests.library_test.TestCatalogue is not documented. +/home/th3r00t/Projects/pyShelf/src/backend/tests/library_test.py:30: warning: Member config (variable) of class src.backend.tests.library_test.TestCatalogue is not documented. +:1: warning: parameters of member src.backend.tests.library_test.TestCatalogue.test_filter_books are not documented