From 59016a5d5d427ffb7a6502e1cca8bcc70c34370d Mon Sep 17 00:00:00 2001 From: palewire Date: Sun, 1 Sep 2024 13:50:38 -0400 Subject: [PATCH] Switch to pytest --- .github/workflows/continuous-deployment.yml | 8 +- Pipfile | 3 + Pipfile.lock | 292 +++++++++++++- tests.py | 403 +++++++++----------- 4 files changed, 482 insertions(+), 224 deletions(-) diff --git a/.github/workflows/continuous-deployment.yml b/.github/workflows/continuous-deployment.yml index 87fcc8f..d0df7a4 100644 --- a/.github/workflows/continuous-deployment.yml +++ b/.github/workflows/continuous-deployment.yml @@ -62,7 +62,7 @@ jobs: - id: install-python-dependencies name: Install Python dependencies - run: pip install requests click python-dateutil pandas + run: pip install requests click python-dateutil pandas pytest pytest-cov pytest-xdist - id: download-data name: Download data @@ -70,7 +70,7 @@ jobs: - id: tests name: Run tests - run: python tests.py + run: pytest -n auto --cov=cpi --cov-report term-missing tests.py - id: update name: Update data @@ -96,7 +96,7 @@ jobs: name: Install Python dependencies run: | $CONDA/bin/conda create -n cpi python=${{ matrix.python }} - $CONDA/bin/conda install -n cpi requests click python-dateutil pandas + $CONDA/bin/conda install -n cpi requests click python-dateutil pandas pytest pytest-cov pytest-xdist - id: download-data name: Download data @@ -104,7 +104,7 @@ jobs: - id: tests name: Run tests - run: $CONDA/bin/conda run -n cpi python tests.py + run: $CONDA/bin/conda run -n cpi pytest -n auto --cov=cpi tests.py --cov-report term-missing tests.py - id: update name: Update data diff --git a/Pipfile b/Pipfile index 61cfbdf..87859ca 100644 --- a/Pipfile +++ b/Pipfile @@ -20,6 +20,9 @@ sphinx = "*" sphinx-autobuild = "*" sphinx-palewire-theme = "*" myst-parser = "*" +pytest = "*" +pytest-cov = "*" +pytest-xdist = "*" [requires] python_version = "3.11" diff --git a/Pipfile.lock b/Pipfile.lock index 4efd592..9bfc83d 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "6d92ef13e577e3db877b1d696fded61d31c78887b08617d6a1377a72eacbf658" + "sha256": "7094d959970f88be355bb5f9df696e3addb2e740f0b38be7b8b604710ac346e6" }, "pipfile-spec": 6, "requires": { @@ -129,6 +129,103 @@ "markers": "python_version >= '3.7'", "version": "==8.1.7" }, + "coverage": { + "extras": [ + "toml" + ], + "hashes": [ + "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca", + "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d", + "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6", + "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989", + "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c", + "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b", + "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223", + "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f", + "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56", + "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3", + "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8", + "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb", + "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388", + "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0", + "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a", + "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8", + "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f", + "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a", + "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962", + "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8", + "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391", + "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc", + "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2", + "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155", + "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb", + "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0", + "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c", + "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a", + "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004", + "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060", + "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232", + "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93", + "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129", + "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163", + "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de", + "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6", + "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23", + "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569", + "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d", + "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778", + "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d", + "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36", + "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a", + "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6", + "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34", + "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704", + "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106", + "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9", + "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862", + "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b", + "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255", + "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16", + "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3", + "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133", + "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb", + "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657", + "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d", + "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca", + "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36", + "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c", + "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e", + "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff", + "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7", + "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5", + "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02", + "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c", + "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df", + "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3", + "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a", + "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959", + "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234", + "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc" + ], + "markers": "python_version >= '3.8'", + "version": "==7.6.1" + }, + "exceptiongroup": { + "hashes": [ + "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b", + "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc" + ], + "markers": "python_version < '3.11'", + "version": "==1.2.2" + }, + "execnet": { + "hashes": [ + "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc", + "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3" + ], + "markers": "python_version >= '3.8'", + "version": "==2.1.1" + }, "idna": { "hashes": [ "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac", @@ -137,6 +234,14 @@ "markers": "python_version >= '3.6'", "version": "==3.8" }, + "iniconfig": { + "hashes": [ + "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", + "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374" + ], + "markers": "python_version >= '3.7'", + "version": "==2.0.0" + }, "numpy": { "hashes": [ "sha256:0123ffdaa88fa4ab64835dcbde75dcdf89c453c922f18dced6e27c90d1d0ec5a", @@ -188,6 +293,14 @@ "markers": "python_version < '3.11'", "version": "==2.0.2" }, + "packaging": { + "hashes": [ + "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", + "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124" + ], + "markers": "python_version >= '3.8'", + "version": "==24.1" + }, "pandas": { "hashes": [ "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863", @@ -224,6 +337,41 @@ "markers": "python_version >= '3.9'", "version": "==2.2.2" }, + "pluggy": { + "hashes": [ + "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", + "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669" + ], + "markers": "python_version >= '3.8'", + "version": "==1.5.0" + }, + "pytest": { + "hashes": [ + "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5", + "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==8.3.2" + }, + "pytest-cov": { + "hashes": [ + "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652", + "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==5.0.0" + }, + "pytest-xdist": { + "hashes": [ + "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7", + "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==3.6.1" + }, "python-dateutil": { "hashes": [ "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", @@ -257,6 +405,14 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.16.0" }, + "tomli": { + "hashes": [ + "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" + ], + "markers": "python_version < '3.11'", + "version": "==2.0.1" + }, "tzdata": { "hashes": [ "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd", @@ -624,6 +780,87 @@ "markers": "python_version >= '3.8'", "version": "==0.2.2" }, + "coverage": { + "extras": [ + "toml" + ], + "hashes": [ + "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca", + "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d", + "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6", + "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989", + "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c", + "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b", + "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223", + "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f", + "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56", + "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3", + "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8", + "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb", + "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388", + "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0", + "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a", + "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8", + "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f", + "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a", + "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962", + "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8", + "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391", + "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc", + "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2", + "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155", + "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb", + "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0", + "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c", + "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a", + "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004", + "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060", + "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232", + "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93", + "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129", + "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163", + "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de", + "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6", + "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23", + "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569", + "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d", + "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778", + "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d", + "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36", + "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a", + "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6", + "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34", + "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704", + "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106", + "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9", + "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862", + "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b", + "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255", + "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16", + "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3", + "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133", + "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb", + "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657", + "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d", + "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca", + "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36", + "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c", + "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e", + "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff", + "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7", + "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5", + "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02", + "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c", + "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df", + "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3", + "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a", + "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959", + "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234", + "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc" + ], + "markers": "python_version >= '3.8'", + "version": "==7.6.1" + }, "debugpy": { "hashes": [ "sha256:0a1029a2869d01cb777216af8c53cda0476875ef02a2b6ff8b2f2c9a4b04176c", @@ -691,6 +928,14 @@ "markers": "python_version < '3.11'", "version": "==1.2.2" }, + "execnet": { + "hashes": [ + "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc", + "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3" + ], + "markers": "python_version >= '3.8'", + "version": "==2.1.1" + }, "executing": { "hashes": [ "sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf", @@ -774,9 +1019,17 @@ "sha256:66f342cc6ac9818fc6ff340576acd24d65ba0b3efabb2b4ac08b598965a4a2f1", "sha256:9a547d3bc3608b025f93d403fdd1aae741c24fbb8314df4b155675742ce303c5" ], - "markers": "python_version < '3.10'", + "markers": "python_version >= '3.8'", "version": "==8.4.0" }, + "iniconfig": { + "hashes": [ + "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", + "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374" + ], + "markers": "python_version >= '3.7'", + "version": "==2.0.0" + }, "ipykernel": { "hashes": [ "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5", @@ -1211,6 +1464,14 @@ "markers": "python_version >= '3.8'", "version": "==4.2.2" }, + "pluggy": { + "hashes": [ + "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", + "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669" + ], + "markers": "python_version >= '3.8'", + "version": "==1.5.0" + }, "pre-commit": { "hashes": [ "sha256:8bb6494d4a20423842e198980c9ecf9f96607a07ea29549e180eef9ae80fe7af", @@ -1290,6 +1551,33 @@ "markers": "python_version >= '3.8'", "version": "==2.18.0" }, + "pytest": { + "hashes": [ + "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5", + "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==8.3.2" + }, + "pytest-cov": { + "hashes": [ + "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652", + "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==5.0.0" + }, + "pytest-xdist": { + "hashes": [ + "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7", + "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==3.6.1" + }, "python-dateutil": { "hashes": [ "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", diff --git a/tests.py b/tests.py index bf01bed..020f671 100644 --- a/tests.py +++ b/tests.py @@ -1,8 +1,7 @@ -#! /usr/bin/env python -import unittest import warnings from datetime import date, datetime +import pytest import numpy as np import pandas as pd from click.testing import CliRunner @@ -12,243 +11,211 @@ from cpi.errors import CPIObjectDoesNotExist -class BaseCPITest(unittest.TestCase): - """ - These global variables change with each data update. - """ +# These global variables change with each data update. +# They will need to be edited when the data changes, which +# happens every month. +LATEST_YEAR = 2023 +LATEST_YEAR_1950_ALL_ITEMS = 1264.323651452282 +LATEST_YEAR_1950_CUSR0000SA0 = 1264.323651452282 +LATEST_MONTH = date(2024, 7, 1) +LATEST_MONTH_1950_ALL_ITEMS = 1338.4680851063831 +LATEST_MONTH_1950_CUSR0000SA0 = 1333.6197362824328 - LATEST_YEAR = 2023 - LATEST_YEAR_1950_ALL_ITEMS = 1264.323651452282 - LATEST_YEAR_1950_CUSR0000SA0 = 1264.323651452282 - LATEST_MONTH = date(2024, 7, 1) - LATEST_MONTH_1950_ALL_ITEMS = 1338.4680851063831 - LATEST_MONTH_1950_CUSR0000SA0 = 1333.6197362824328 +def test_latest_year(): + assert cpi.LATEST_YEAR == LATEST_YEAR -class CPITest(BaseCPITest): - def test_latest_year(self): - self.assertEqual(cpi.LATEST_YEAR, self.LATEST_YEAR) - def test_latest_month(self): - self.assertEqual(cpi.LATEST_MONTH, self.LATEST_MONTH) +def test_latest_month(): + assert cpi.LATEST_MONTH == LATEST_MONTH - def test_get(self): - self.assertEqual(cpi.get(1950), 24.1) - self.assertEqual(cpi.get(date(1950, 1, 1)), 23.5) - self.assertEqual(cpi.get(2000), 172.2) - def test_get_by_kwargs(self): - # "CUUR0000SA0" - self.assertEqual(cpi.get(2000), 172.2) +def test_get(): + assert cpi.get(1950) == 24.1 + assert cpi.get(date(1950, 1, 1)) == 23.5 + assert cpi.get(2000) == 172.2 - # "CUSR0000SA0" - self.assertEqual(cpi.get(date(2000, 1, 1), seasonally_adjusted=True), 169.30) - # ... which doesn't have annual values - with self.assertRaises(CPIObjectDoesNotExist): - cpi.get(2000, seasonally_adjusted=True) - # "CUSR0000SA0E" - # ... which we don't have loaded yet as data - with self.assertRaises(CPIObjectDoesNotExist): - cpi.get(2000, seasonally_adjusted=True, items="Energy") +def test_get_by_kwargs(): + # "CUUR0000SA0" + assert cpi.get(2000) == 172.2 - # "CUURS49ASA0" - self.assertEqual( - cpi.get(2000, area="Los Angeles-Long Beach-Anaheim, CA"), 171.6 - ) - self.assertEqual( - cpi.get(date(2000, 1, 1), area="Los Angeles-Long Beach-Anaheim, CA"), 167.9 - ) + # "CUSR0000SA0" + assert cpi.get(date(2000, 1, 1), seasonally_adjusted=True) == 169.30 + # ... which doesn't have annual values + with pytest.raises(CPIObjectDoesNotExist): + cpi.get(2000, seasonally_adjusted=True) - # "CUURS49ASA0E" - self.assertEqual( - cpi.get(2000, items="Energy", area="Los Angeles-Long Beach-Anaheim, CA"), - 132.0, - ) + # "CUSR0000SA0E" + # ... which we don't have loaded yet as data + with pytest.raises(CPIObjectDoesNotExist): + cpi.get(2000, seasonally_adjusted=True, items="Energy") - # "CUURA421SAT" - self.assertEqual( - cpi.get( - 2000, items="Transportation", area="Los Angeles-Long Beach-Anaheim, CA" - ), - 154.2, - ) + # "CUURS49ASA0" + assert cpi.get(2000, area="Los Angeles-Long Beach-Anaheim, CA") == 171.6 - # "CUURA421SA0E" - self.assertEqual( - cpi.get( - 2000, - items="All items - old base", - area="Los Angeles-Long Beach-Anaheim, CA", - ), - 506.8, - ) + assert cpi.get(date(2000, 1, 1), area="Los Angeles-Long Beach-Anaheim, CA") == 167.9 - def test_get_by_series_id(self): - self.assertEqual(cpi.get(date(1950, 1, 1), series_id="CUSR0000SA0"), 23.51) - - def test_series_list(self): - cpi.series.get_by_id("CUSR0000SA0") - - def test_metadata_lists(self): - self.assertTrue(len(cpi.areas.all()) > 0) - self.assertTrue(len(cpi.periods.all()) > 0) - self.assertTrue(len(cpi.periodicities.all()) > 0) - self.assertTrue(len(cpi.items.all()) > 0) - - def test_series_indexes(self): - # Make sure we can lazy load the full database - for series in cpi.series: - self.assertTrue(len(series.indexes) > 0) - series.latest_month - series.latest_year - series.__str__() - series.__dict__() - for index in series.indexes: - index.__str__() - index.__dict__() - - def test_get_errors(self): - with self.assertRaises(CPIObjectDoesNotExist): - cpi.get(1900) - with self.assertRaises(CPIObjectDoesNotExist): - cpi.get(date(1900, 1, 1)) - with self.assertRaises(CPIObjectDoesNotExist): - cpi.get(1950, series_id="FOOBAR") - - def test_get_value_error(self): - with self.assertRaises(ValueError): - cpi.get(1900.1) - cpi.get(datetime.now()) - cpi.get(3000) - - def test_inflate_years(self): - self.assertEqual(cpi.inflate(100, 1950), self.LATEST_YEAR_1950_ALL_ITEMS) - self.assertEqual( - cpi.inflate(100, 1950, series_id="CUUR0000SA0"), - self.LATEST_YEAR_1950_CUSR0000SA0, - ) - self.assertEqual(cpi.inflate(100, 1950, to=2017), 1017.0954356846472) - self.assertEqual(cpi.inflate(100, 1950, to=1960), 122.82157676348547) - self.assertEqual(cpi.inflate(100.0, 1950, to=1950), 100) + # "CUURS49ASA0E" + assert ( + cpi.get(2000, items="Energy", area="Los Angeles-Long Beach-Anaheim, CA") + == 132.0 + ) - def test_inflate_months(self): - self.assertEqual( - cpi.inflate(100, date(1950, 1, 1)), self.LATEST_MONTH_1950_ALL_ITEMS - ) - self.assertEqual( - cpi.inflate(100, date(1950, 1, 11)), self.LATEST_MONTH_1950_ALL_ITEMS - ) - self.assertEqual( - cpi.inflate(100, datetime(1950, 1, 1)), self.LATEST_MONTH_1950_ALL_ITEMS - ) - self.assertEqual( - cpi.inflate(100, date(1950, 1, 1), to=date(2018, 1, 1)), 1054.7531914893618 - ) - self.assertEqual( - cpi.inflate(100, date(1950, 1, 1), to=date(1960, 1, 1)), 124.68085106382979 - ) + # "CUURA421SAT" + assert ( + cpi.get(2000, items="Transportation", area="Los Angeles-Long Beach-Anaheim, CA") + == 154.2 + ) - def test_inflate_other_series(self): - self.assertEqual( - cpi.inflate(100, date(1950, 1, 1), series_id="CUSR0000SA0"), - self.LATEST_MONTH_1950_CUSR0000SA0, + # "CUURA421SA0E" + assert ( + cpi.get( + 2000, + items="All items - old base", + area="Los Angeles-Long Beach-Anaheim, CA", ) + == 506.8 + ) - def test_deflate(self): - self.assertEqual(cpi.inflate(1017.0954356846472, 2017, to=1950), 100) - self.assertEqual(cpi.inflate(122.82157676348547, 1960, to=1950), 100) - def test_numpy_dtypes(self): - self.assertEqual(cpi.get(np.int64(1950)), cpi.get(1950)) - self.assertEqual( - cpi.inflate(100, np.int32(1950)), - cpi.inflate(100, 1950), - ) - self.assertEqual( - cpi.inflate(100, np.int64(1950), to=np.int64(1960)), - cpi.inflate(100, 1950, to=1960), - ) - self.assertEqual( - cpi.inflate(100, np.int64(1950), to=np.int32(1960)), - cpi.inflate(100, 1950, to=1960), - ) - self.assertEqual( - cpi.inflate(100, np.int64(1950), to=1960), - cpi.inflate(100, 1950, to=1960), - ) - self.assertEqual( - cpi.inflate( - 100, pd.to_datetime("1950-07-01"), to=pd.to_datetime("1960-07-01") - ), - cpi.inflate(100, date(1950, 7, 1), to=date(1960, 7, 1)), - ) +def test_get_by_series_id(): + assert cpi.get(date(1950, 1, 1), series_id="CUSR0000SA0") == 23.51 - def test_mismatch(self): - with self.assertRaises(TypeError): - cpi.inflate(100, 1950, to=date(2000, 1, 1)) - with self.assertRaises(TypeError): - cpi.inflate(100, date(2000, 1, 1), to=1950) - def test_warning(self): - warnings.warn(cpi.StaleDataWarning(), stacklevel=2) +def test_series_list(): + cpi.series.get_by_id("CUSR0000SA0") - def test_pandas(self): - df = pd.read_csv("test.csv") - df["ADJUSTED"] = df.apply( - lambda x: cpi.inflate(x.MEDIAN_HOUSEHOLD_INCOME, x.YEAR), axis=1 - ) - df = df.set_index("YEAR") - self.assertEqual( - cpi.inflate(df.at[1984, "MEDIAN_HOUSEHOLD_INCOME"], 1984), - df.at[1984, "ADJUSTED"], - ) - cpi.series.to_dataframe() - cpi.series.get().to_dataframe() - - -class CliTest(BaseCPITest): - def invoke(self, *args): - runner = CliRunner() - result = runner.invoke(cli.inflate, args) - self.assertEqual(result.exit_code, 0) - string_value = result.output.replace("\n", "") - # Do some rounding to ensure the same results for Python 2 and 3 - return str(round(float(string_value), 7)) - - def test_inflate_years(self): - self.assertEqual( - self.invoke("100", "1950"), str(round(self.LATEST_YEAR_1950_CUSR0000SA0, 7)) - ) - self.assertEqual(self.invoke("100", "1950", "--to", "1960"), "122.8215768") - self.assertEqual(self.invoke("100", "1950", "--to", "1950"), "100.0") - def test_inflate_months(self): - self.assertEqual( - self.invoke("100", "1950-01-01"), - str(round(self.LATEST_MONTH_1950_ALL_ITEMS, 7)), - ) - self.assertEqual( - self.invoke("100", "1950-01-11"), - str(round(self.LATEST_MONTH_1950_ALL_ITEMS, 7)), - ) - self.assertEqual( - self.invoke("100", "1950-01-11", "--to", "1960-01-01"), "124.6808511" - ) - self.assertEqual( - self.invoke("100", "1950-01-01 00:00:00", "--to", "1950-01-01"), "100.0" - ) - self.assertEqual( - self.invoke("100", "1950-01-01", "--to", "2018-01-01"), "1054.7531915" - ) - self.assertEqual( - self.invoke("100", "1950-01-01", "--to", "1960-01-01"), "124.6808511" - ) - self.assertEqual( - self.invoke("100", "1950-01-01", "--series_id", "CUSR0000SA0"), - str(round(self.LATEST_MONTH_1950_CUSR0000SA0, 7)), - ) +def test_metadata_lists(): + assert len(cpi.areas.all()) > 0 + assert len(cpi.periods.all()) > 0 + assert len(cpi.periodicities.all()) > 0 + assert len(cpi.items.all()) > 0 + + +def test_series_indexes(): + # Make sure we can lazy load the full database + for series in cpi.series: + assert len(series.indexes) > 0 + series.latest_month + series.latest_year + series.__str__() + series.__dict__() + for index in series.indexes: + index.__str__() + index.__dict__() + + +def test_get_errors(): + with pytest.raises(CPIObjectDoesNotExist): + cpi.get(1900) + with pytest.raises(CPIObjectDoesNotExist): + cpi.get(date(1900, 1, 1)) + with pytest.raises(CPIObjectDoesNotExist): + cpi.get(1950, series_id="FOOBAR") + +def test_get_value_error(): + with pytest.raises(ValueError): + cpi.get(1900.1) + cpi.get(datetime.now()) + cpi.get(3000) -if __name__ == "__main__": - unittest.main() + +def test_inflate_years(): + assert cpi.inflate(100, 1950) == LATEST_YEAR_1950_ALL_ITEMS + assert ( + cpi.inflate(100, 1950, series_id="CUUR0000SA0") == LATEST_YEAR_1950_CUSR0000SA0 + ) + assert cpi.inflate(100, 1950, to=2017) == 1017.0954356846472 + assert cpi.inflate(100, 1950, to=1960) == 122.82157676348547 + assert cpi.inflate(100.0, 1950, to=1950) == 100 + + +def test_inflate_months(): + assert cpi.inflate(100, date(1950, 1, 1)) == LATEST_MONTH_1950_ALL_ITEMS + assert cpi.inflate(100, date(1950, 1, 11)) == LATEST_MONTH_1950_ALL_ITEMS + assert cpi.inflate(100, datetime(1950, 1, 1)) == LATEST_MONTH_1950_ALL_ITEMS + assert cpi.inflate(100, date(1950, 1, 1), to=date(2018, 1, 1)) == 1054.7531914893618 + assert cpi.inflate(100, date(1950, 1, 1), to=date(1960, 1, 1)) == 124.68085106382979 + + +def test_inflate_other_series(): + assert ( + cpi.inflate(100, date(1950, 1, 1), series_id="CUSR0000SA0") + == LATEST_MONTH_1950_CUSR0000SA0 + ) + + +def test_deflate(): + assert cpi.inflate(1017.0954356846472, 2017, to=1950) == 100 + assert cpi.inflate(122.82157676348547, 1960, to=1950) == 100 + + +def test_numpy_dtypes(): + assert cpi.get(np.int64(1950)) == cpi.get(1950) + assert cpi.inflate(100, np.int32(1950)) == cpi.inflate(100, 1950) + assert cpi.inflate(100, np.int64(1950), to=np.int64(1960)) == cpi.inflate( + 100, 1950, to=1960 + ) + assert cpi.inflate(100, np.int64(1950), to=np.int32(1960)) == cpi.inflate( + 100, 1950, to=1960 + ) + assert cpi.inflate(100, np.int64(1950), to=1960) == cpi.inflate(100, 1950, to=1960) + assert cpi.inflate( + 100, pd.to_datetime("1950-07-01"), to=pd.to_datetime("1960-07-01") + ) == cpi.inflate(100, date(1950, 7, 1), to=date(1960, 7, 1)) + + +def test_mismatch(): + with pytest.raises(TypeError): + cpi.inflate(100, 1950, to=date(2000, 1, 1)) + with pytest.raises(TypeError): + cpi.inflate(100, date(2000, 1, 1), to=1950) + + +def test_warning(): + warnings.warn(cpi.StaleDataWarning(), stacklevel=2) + + +def test_pandas(): + df = pd.read_csv("test.csv") + df["ADJUSTED"] = df.apply( + lambda x: cpi.inflate(x.MEDIAN_HOUSEHOLD_INCOME, x.YEAR), axis=1 + ) + df = df.set_index("YEAR") + assert ( + cpi.inflate(df.at[1984, "MEDIAN_HOUSEHOLD_INCOME"], 1984) + == df.at[1984, "ADJUSTED"] + ) + cpi.series.to_dataframe() + cpi.series.get().to_dataframe() + + +def invoke(*args): + """Invoke the CLI with the given arguments and return the output.""" + runner = CliRunner() + result = runner.invoke(cli.inflate, args) + assert result.exit_code == 0 + string_value = result.output.replace("\n", "") + # Do some rounding to ensure the same results for Python 2 and 3 + return str(round(float(string_value), 7)) + + +def test_cli_inflate_years(): + assert invoke("100", "1950") == str(round(LATEST_YEAR_1950_CUSR0000SA0, 7)) + assert invoke("100", "1950", "--to", "1960") == "122.8215768" + assert invoke("100", "1950", "--to", "1950") == "100.0" + + +def test_cli_inflate_months(): + assert invoke("100", "1950-01-01") == str(round(LATEST_MONTH_1950_ALL_ITEMS, 7)) + assert invoke("100", "1950-01-11") == str(round(LATEST_MONTH_1950_ALL_ITEMS, 7)) + assert invoke("100", "1950-01-11", "--to", "1960-01-01") == "124.6808511" + assert invoke("100", "1950-01-01 00:00:00", "--to", "1950-01-01") == "100.0" + assert invoke("100", "1950-01-01", "--to", "2018-01-01") == "1054.7531915" + assert invoke("100", "1950-01-01", "--to", "1960-01-01") == "124.6808511" + assert invoke("100", "1950-01-01", "--series_id", "CUSR0000SA0") == str( + round(LATEST_MONTH_1950_CUSR0000SA0, 7) + )