diff --git a/Pipfile b/Pipfile index 1ffc1b0..d09f38c 100644 --- a/Pipfile +++ b/Pipfile @@ -10,6 +10,7 @@ cairocffi = ">1.7.0" libgutenberg = {file = ".", editable = true} [dev-packages] +pytest = "*" [requires] python_version = ">=3.7" diff --git a/Pipfile.lock b/Pipfile.lock index 55da086..619f1ec 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "e487e6bd30753ecbe02322dc8991b78f364f6bafcb5907569f704ecc206e37f9" + "sha256": "39987836069d54889e224555719a9591baf83326b42d8b11f04a22af51d3c775" }, "pipfile-spec": 6, "requires": { @@ -424,5 +424,116 @@ "version": "==4.16.0" } }, - "develop": {} + "develop": { + "exceptiongroup": { + "hashes": [ + "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", + "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598" + ], + "markers": "python_version >= '3.7'", + "version": "==1.3.1" + }, + "iniconfig": { + "hashes": [ + "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", + "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760" + ], + "markers": "python_version >= '3.8'", + "version": "==2.1.0" + }, + "packaging": { + "hashes": [ + "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", + "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c" + ], + "markers": "python_version >= '3.9'", + "version": "==26.3" + }, + "pluggy": { + "hashes": [ + "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", + "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746" + ], + "markers": "python_version >= '3.9'", + "version": "==1.6.0" + }, + "pygments": { + "hashes": [ + "sha256:2363c69b61c4a97c838da3b130dcd6468f4848992b21a82f2a63ec34377137d9", + "sha256:610ca751c9bc2492b38eb9a38a7fbc93edbbb2d7182edaf34e66ae493dee5c8c" + ], + "markers": "python_version >= '3.9'", + "version": "==2.21.0" + }, + "pytest": { + "hashes": [ + "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", + "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79" + ], + "index": "pypi", + "markers": "python_version >= '3.9'", + "version": "==8.4.2" + }, + "tomli": { + "hashes": [ + "sha256:01f520d4f53ef97964a240a035ec2a869fe1a37dde002b57ebc4417a27ccd853", + "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", + "sha256:136443dbd7e1dee43c68ac2694fde36b2849865fa258d39bf822c10e8068eac5", + "sha256:1d8591993e228b0c930c4bb0db464bdad97b3289fb981255d6c9a41aedc84b2d", + "sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd", + "sha256:2c1c351919aca02858f740c6d33adea0c5deea37f9ecca1cc1ef9e884a619d26", + "sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54", + "sha256:3d48a93ee1c9b79c04bb38772ee1b64dcf18ff43085896ea460ca8dec96f35f6", + "sha256:47149d5bd38761ac8be13a84864bf0b7b70bc051806bc3669ab1cbc56216b23c", + "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a", + "sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd", + "sha256:504aa796fe0569bb43171066009ead363de03675276d2d121ac1a4572397870f", + "sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5", + "sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9", + "sha256:559db847dc486944896521f68d8190be1c9e719fced785720d2216fe7022b662", + "sha256:5a881ab208c0baf688221f8cecc5401bd291d67e38a1ac884d6736cbcd8247e9", + "sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1", + "sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585", + "sha256:5ee18d9ebdb417e384b58fe414e8d6af9f4e7a0ae761519fb50f721de398dd4e", + "sha256:7008df2e7655c495dd12d2a4ad038ff878d4ca4b81fccaf82b714e07eae4402c", + "sha256:734e20b57ba95624ecf1841e72b53f6e186355e216e5412de414e3c51e5e3c41", + "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", + "sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085", + "sha256:7f94b27a62cfad8496c8d2513e1a222dd446f095fca8987fceef261225538a15", + "sha256:88dceee75c2c63af144e456745e10101eb67361050196b0b6af5d717254dddf7", + "sha256:8a650c2dbafa08d42e51ba0b62740dae4ecb9338eefa093aa5c78ceb546fcd5c", + "sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36", + "sha256:96481a5786729fd470164b47cdb3e0e58062a496f455ee41b4403be77cb5a076", + "sha256:a120733b01c45e9a0c34aeef92bf0cf1d56cfe81ed9d47d562f9ed591a9828ac", + "sha256:b1d22e6e9387bf4739fbe23bfa80e93f6b0373a7f1b96c6227c32bef95a4d7a8", + "sha256:b8c198f8c1805dc42708689ed6864951fd2494f924149d3e4bce7710f8eb5232", + "sha256:c2541745709bad0264b7d4705ad453b76ccd191e64aa6f0fc66b69a293a45ece", + "sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a", + "sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897", + "sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d", + "sha256:d4d8fe59808a54658fcc0160ecfb1b30f9089906c50b23bcb4c69eddc19ec2b4", + "sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917", + "sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396", + "sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a", + "sha256:ec9bfaf3ad2df51ace80688143a6a4ebc09a248f6ff781a9945e51937008fcbc", + "sha256:ede3e6487c5ef5d28634ba3f31f989030ad6af71edfb0055cbbd14189ff240ba", + "sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f", + "sha256:f758f1b9299d059cc3f6546ae2af89670cb1c4d48ea29c3cacc4fe7de3058257", + "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30", + "sha256:fd0409a3653af6c147209d267a0e4243f0ae46b011aa978b1080359fddc9b6cf", + "sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9", + "sha256:ff2983983d34813c1aeb0fa89091e76c3a22889ee83ab27c5eeb45100560c049" + ], + "markers": "python_version >= '3.8'", + "version": "==2.4.1" + }, + "typing-extensions": { + "hashes": [ + "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", + "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5" + ], + "markers": "python_version >= '3.9'", + "version": "==4.16.0" + } + } } diff --git a/README.md b/README.md index 0693159..cc9b014 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,37 @@ # libgutenberg Common files used by Project Gutenberg python projects. -# installation +# Installation -`pipenv install libgutenberg` -`pipenv install 'libgutenberg[covers]'` for cover generation -`pipenv install 'libgutenberg[postgres]'` for use with postgres +Install with the package manager of your choice -- `pipenv` or `pip`. -or +```bash +pip install libgutenberg +pip install 'libgutenberg[covers]' # for cover generation +pip install 'libgutenberg[postgres]' # for use with postgres +``` -`pip install libgutenberg` -`pip install 'libgutenberg[covers]'` for cover generation -`pip install 'libgutenberg[postgres]'` for use with postgres +Depending on your system configuration, you might need to install `psycopg2-binary'. -Depending on your system configuration, you might need to use pip or pipenv to install -`pipenv install psycopg2-binary' +Cover generation with `cairocffi` may require some system packages, see: +https://doc.courtbouillon.org/cairocffi/stable/overview.html#installing-cffi -cover generation may require some system packages; see +`cffi` depends on `pycparser` which should be installed as a dependency, but if +it isn't for some reason: `pip install pycparser` will fix it. - +# Development + +`pipenv` will install the package as an editable package and is the easiest +way to get it set up: + +```bash +pipenv install --python $(which python3) +pipenv shell +``` + +To run tests: +```bash +pipenv shell +source test_env.sh +pytest +``` diff --git a/libgutenberg/tests/test_files.py b/libgutenberg/tests/test_files.py index 4997793..9188905 100755 --- a/libgutenberg/tests/test_files.py +++ b/libgutenberg/tests/test_files.py @@ -1,13 +1,13 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- +import os import unittest from libgutenberg import GutenbergDatabase from libgutenberg import GutenbergFiles from libgutenberg.DublinCoreMapping import DublinCoreObject -from libgutenberg.DBUtils import check_session, ebook_exists -from libgutenberg.GutenbergFiles import store_file_in_database, PUBLIC, FILES, FTP +from libgutenberg.GutenbergFiles import store_file_in_database from libgutenberg.Models import Book, File global db_exists @@ -31,10 +31,13 @@ def test_guess_filetype(self): @unittest.skipIf(not db_exists, 'database not configured') def test_file_save_and_read(self): - ''' Make sure there's a file at /Users/Shared/Documents/pg/dev/html/files/99999/99999.txt - and that FILES is set in .env ''' - - self.assertEqual(FILES, '/Users/Shared/Documents/pg/dev/html/files/') + # TODO: get this file checked into the repo -- don't rely on it on + # the file system + + filepath = '/Users/Shared/Documents/pg/dev/html/files/' + if not os.path.exists(filepath): + self.skipTest(f"{filepath} doesn't exist to load book from") + book = self.dc.load_or_create_book(99999) store_file_in_database(99999, '/Users/Shared/Documents/pg/dev/html/files/99999/99999.txt', None, diff --git a/test env b/test_env.sh similarity index 100% rename from test env rename to test_env.sh