From e6fb5c58d80c4e3ad51a4d797d0ef42a02a6e742 Mon Sep 17 00:00:00 2001 From: Nmeng01 <123509773+Nmeng01@users.noreply.github.com> Date: Thu, 11 Jan 2024 11:22:47 -0500 Subject: [PATCH 1/7] Test commit --- test/data_gen_obj.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/test/data_gen_obj.py b/test/data_gen_obj.py index cee6c1c..380fe40 100644 --- a/test/data_gen_obj.py +++ b/test/data_gen_obj.py @@ -22,9 +22,6 @@ def set_value(self, first_name, last_name): else: self.__value = faker.phone_number() - def get_system(self): - return self.__system - def set_rank(self, num): self.__rank = num From da06280d056542ac2aa5a6c467c730021e6c87db Mon Sep 17 00:00:00 2001 From: Nmeng01 <123509773+Nmeng01@users.noreply.github.com> Date: Sun, 14 Jan 2024 20:32:56 -0500 Subject: [PATCH 2/7] added protobuf functionality --- Pipfile | 3 +- Pipfile.lock | 633 ++++++++++++++----------- test/gen_data.py | 38 ++ test/{data_gen_obj.py => json_rest.py} | 22 - test/protobuf_grpc.proto | 53 +++ test/protobuf_grpc.py | 118 +++++ test/protobuf_grpc_pb2.py | 40 ++ 7 files changed, 603 insertions(+), 304 deletions(-) create mode 100644 test/gen_data.py rename test/{data_gen_obj.py => json_rest.py} (94%) create mode 100644 test/protobuf_grpc.proto create mode 100644 test/protobuf_grpc.py create mode 100644 test/protobuf_grpc_pb2.py diff --git a/Pipfile b/Pipfile index 9c32dc0..2903370 100644 --- a/Pipfile +++ b/Pipfile @@ -13,11 +13,11 @@ fastapi = ">=0.105" brotli-asgi = ">=1.4" hypercorn = ">=0.15" httpx = {version = ">=0.25", extras = ["http2"]} - # Optional production cloud specific packages. # Install using: pipenv install [package] --catgeories cloud_logger cloud_secret # # DON'T install multiple vendors. Install ONLY one. +ujson = "*" [cloud_logger] #infisical = ">=1.2" @@ -29,7 +29,6 @@ httpx = {version = ">=0.25", extras = ["http2"]} #google-cloud-secret-manager = ">=2.16" #boto3 = ">=1.26" #oci = ">=2.104" - # Developement tools. # Install using: pipenv install [package] --dev diff --git a/Pipfile.lock b/Pipfile.lock index 86e7233..ac330c0 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "d198c94e4da000c234ebbe9118c7584f31716ca618142f37b6711ab9ce574afb" + "sha256": "418719773abefdee6e2be5ba6325553514af11491eac817d9f35df63a76415e8" }, "pipfile-spec": 6, "requires": { @@ -26,11 +26,11 @@ }, "anyio": { "hashes": [ - "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780", - "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5" + "sha256:745843b39e829e108e518c489b31dc757de7d2131d53fac32bd8df268227bfee", + "sha256:e1875bb4b4e2de1669f4bc7869b6d3f54231cdced71605e6e64c9be77e3be50f" ], - "markers": "python_version >= '3.7'", - "version": "==3.7.1" + "markers": "python_version >= '3.8'", + "version": "==4.2.0" }, "appdirs": { "hashes": [ @@ -133,6 +133,7 @@ "sha256:e2d6eca4b97af19716af05bbe0d4d79cffb0b0947100c188da9ed089f5b7bc2f" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==1.4.0" }, "certifi": { @@ -145,11 +146,12 @@ }, "fastapi": { "hashes": [ - "sha256:4d12838819aa52af244580675825e750ad67c9df4614f557a769606af902cf22", - "sha256:f19ebf6fdc82a3281d10f2cb4774bdfa90238e3b40af3525a0c09fd08ad1c480" + "sha256:8c77515984cd8e8cfeb58364f8cc7a28f0692088475e2614f7bf03275eba9093", + "sha256:b978095b9ee01a5cf49b19f4bc1ac9b8ca83aa076e770ef8fd9af09a2b88d191" ], "index": "pypi", - "version": "==0.105.0" + "markers": "python_version >= '3.8'", + "version": "==0.109.0" }, "fs": { "hashes": [ @@ -196,19 +198,20 @@ "http2" ], "hashes": [ - "sha256:8b8fcaa0c8ea7b05edd69a094e63a2094c4efcb48129fb757361bc423c0ad9e8", - "sha256:a05d3d052d9b2dfce0e3896636467f8a5342fb2b902c819428e1ac65413ca118" + "sha256:451b55c30d5185ea6b23c2c793abf9bb237d2a7dfb901ced6ff69ad37ec1dfaf", + "sha256:8915f5a3627c4d47b73e8202457cb28f1266982d1159bd5779d86a80c0eab1cd" ], - "index": "pypi", - "version": "==0.25.2" + "markers": "python_version >= '3.8'", + "version": "==0.26.0" }, "hypercorn": { "hashes": [ - "sha256:5008944999612fd188d7a1ca02e89d20065642b89503020ac392dfed11840730", - "sha256:d517f68d5dc7afa9a9d50ecefb0f769f466ebe8c1c18d2c2f447a24e763c9a63" + "sha256:3b17d1dcf4992c1f262d9f9dd799c374125d0b9a8e40e1e2d11e2938b0adfe03", + "sha256:929e45c4acde3fbf7c58edf55336d30a009d2b4cb1f1eb96e6a515d61b663f58" ], "index": "pypi", - "version": "==0.15.0" + "markers": "python_version >= '3.8'", + "version": "==0.16.0" }, "hyperframe": { "hashes": [ @@ -236,122 +239,123 @@ }, "pydantic": { "hashes": [ - "sha256:80c50fb8e3dcecfddae1adbcc00ec5822918490c99ab31f6cf6140ca1c1429f0", - "sha256:ff177ba64c6faf73d7afa2e8cad38fd456c0dbe01c9954e71038001cd15a6edd" + "sha256:b3ef57c62535b0941697cce638c08900d87fcb67e29cfa99e8a68f747f393f7a", + "sha256:d0caf5954bee831b6bfe7e338c32b9e30c85dfe080c843680783ac2b631673b4" ], "index": "pypi", - "version": "==2.5.2" + "markers": "python_version >= '3.7'", + "version": "==2.5.3" }, "pydantic-core": { "hashes": [ - "sha256:038c9f763e650712b899f983076ce783175397c848da04985658e7628cbe873b", - "sha256:074f3d86f081ce61414d2dc44901f4f83617329c6f3ab49d2bc6c96948b2c26b", - "sha256:079206491c435b60778cf2b0ee5fd645e61ffd6e70c47806c9ed51fc75af078d", - "sha256:09b0e985fbaf13e6b06a56d21694d12ebca6ce5414b9211edf6f17738d82b0f8", - "sha256:0f6116a558fd06d1b7c2902d1c4cf64a5bd49d67c3540e61eccca93f41418124", - "sha256:103ef8d5b58596a731b690112819501ba1db7a36f4ee99f7892c40da02c3e189", - "sha256:16e29bad40bcf97aac682a58861249ca9dcc57c3f6be22f506501833ddb8939c", - "sha256:206ed23aecd67c71daf5c02c3cd19c0501b01ef3cbf7782db9e4e051426b3d0d", - "sha256:2248485b0322c75aee7565d95ad0e16f1c67403a470d02f94da7344184be770f", - "sha256:27548e16c79702f1e03f5628589c6057c9ae17c95b4c449de3c66b589ead0520", - "sha256:2d0ae0d8670164e10accbeb31d5ad45adb71292032d0fdb9079912907f0085f4", - "sha256:3128e0bbc8c091ec4375a1828d6118bc20404883169ac95ffa8d983b293611e6", - "sha256:3387277f1bf659caf1724e1afe8ee7dbc9952a82d90f858ebb931880216ea955", - "sha256:34708cc82c330e303f4ce87758828ef6e457681b58ce0e921b6e97937dd1e2a3", - "sha256:35613015f0ba7e14c29ac6c2483a657ec740e5ac5758d993fdd5870b07a61d8b", - "sha256:3ad873900297bb36e4b6b3f7029d88ff9829ecdc15d5cf20161775ce12306f8a", - "sha256:40180930807ce806aa71eda5a5a5447abb6b6a3c0b4b3b1b1962651906484d68", - "sha256:439c9afe34638ace43a49bf72d201e0ffc1a800295bed8420c2a9ca8d5e3dbb3", - "sha256:45e95333b8418ded64745f14574aa9bfc212cb4fbeed7a687b0c6e53b5e188cd", - "sha256:4641e8ad4efb697f38a9b64ca0523b557c7931c5f84e0fd377a9a3b05121f0de", - "sha256:49b08aae5013640a3bfa25a8eebbd95638ec3f4b2eaf6ed82cf0c7047133f03b", - "sha256:4bc536201426451f06f044dfbf341c09f540b4ebdb9fd8d2c6164d733de5e634", - "sha256:4ce601907e99ea5b4adb807ded3570ea62186b17f88e271569144e8cca4409c7", - "sha256:4e40f2bd0d57dac3feb3a3aed50f17d83436c9e6b09b16af271b6230a2915459", - "sha256:4e47a76848f92529879ecfc417ff88a2806438f57be4a6a8bf2961e8f9ca9ec7", - "sha256:513b07e99c0a267b1d954243845d8a833758a6726a3b5d8948306e3fe14675e3", - "sha256:531f4b4252fac6ca476fbe0e6f60f16f5b65d3e6b583bc4d87645e4e5ddde331", - "sha256:57d52fa717ff445cb0a5ab5237db502e6be50809b43a596fb569630c665abddf", - "sha256:59986de5710ad9613ff61dd9b02bdd2f615f1a7052304b79cc8fa2eb4e336d2d", - "sha256:5baab5455c7a538ac7e8bf1feec4278a66436197592a9bed538160a2e7d11e36", - "sha256:5c7d5b5005f177764e96bd584d7bf28d6e26e96f2a541fdddb934c486e36fd59", - "sha256:60b7607753ba62cf0739177913b858140f11b8af72f22860c28eabb2f0a61937", - "sha256:615a0a4bff11c45eb3c1996ceed5bdaa2f7b432425253a7c2eed33bb86d80abc", - "sha256:61ea96a78378e3bd5a0be99b0e5ed00057b71f66115f5404d0dae4819f495093", - "sha256:652c1988019752138b974c28f43751528116bcceadad85f33a258869e641d753", - "sha256:6637560562134b0e17de333d18e69e312e0458ee4455bdad12c37100b7cad706", - "sha256:678265f7b14e138d9a541ddabbe033012a2953315739f8cfa6d754cc8063e8ca", - "sha256:699156034181e2ce106c89ddb4b6504c30db8caa86e0c30de47b3e0654543260", - "sha256:6b9ff467ffbab9110e80e8c8de3bcfce8e8b0fd5661ac44a09ae5901668ba997", - "sha256:6c327e9cd849b564b234da821236e6bcbe4f359a42ee05050dc79d8ed2a91588", - "sha256:6d30226dfc816dd0fdf120cae611dd2215117e4f9b124af8c60ab9093b6e8e71", - "sha256:6e227c40c02fd873c2a73a98c1280c10315cbebe26734c196ef4514776120aeb", - "sha256:6e4d090e73e0725b2904fdbdd8d73b8802ddd691ef9254577b708d413bf3006e", - "sha256:70f4b4851dbb500129681d04cc955be2a90b2248d69273a787dda120d5cf1f69", - "sha256:70f947628e074bb2526ba1b151cee10e4c3b9670af4dbb4d73bc8a89445916b5", - "sha256:774de879d212db5ce02dfbf5b0da9a0ea386aeba12b0b95674a4ce0593df3d07", - "sha256:77fa384d8e118b3077cccfcaf91bf83c31fe4dc850b5e6ee3dc14dc3d61bdba1", - "sha256:79e0a2cdbdc7af3f4aee3210b1172ab53d7ddb6a2d8c24119b5706e622b346d0", - "sha256:7e88f5696153dc516ba6e79f82cc4747e87027205f0e02390c21f7cb3bd8abfd", - "sha256:7f8210297b04e53bc3da35db08b7302a6a1f4889c79173af69b72ec9754796b8", - "sha256:81982d78a45d1e5396819bbb4ece1fadfe5f079335dd28c4ab3427cd95389944", - "sha256:823fcc638f67035137a5cd3f1584a4542d35a951c3cc68c6ead1df7dac825c26", - "sha256:853a2295c00f1d4429db4c0fb9475958543ee80cfd310814b5c0ef502de24dda", - "sha256:88e74ab0cdd84ad0614e2750f903bb0d610cc8af2cc17f72c28163acfcf372a4", - "sha256:8aa1768c151cf562a9992462239dfc356b3d1037cc5a3ac829bb7f3bda7cc1f9", - "sha256:8c8a8812fe6f43a3a5b054af6ac2d7b8605c7bcab2804a8a7d68b53f3cd86e00", - "sha256:95b15e855ae44f0c6341ceb74df61b606e11f1087e87dcb7482377374aac6abe", - "sha256:96581cfefa9123accc465a5fd0cc833ac4d75d55cc30b633b402e00e7ced00a6", - "sha256:9bd18fee0923ca10f9a3ff67d4851c9d3e22b7bc63d1eddc12f439f436f2aada", - "sha256:a33324437018bf6ba1bb0f921788788641439e0ed654b233285b9c69704c27b4", - "sha256:a6a16f4a527aae4f49c875da3cdc9508ac7eef26e7977952608610104244e1b7", - "sha256:a717aef6971208f0851a2420b075338e33083111d92041157bbe0e2713b37325", - "sha256:a71891847f0a73b1b9eb86d089baee301477abef45f7eaf303495cd1473613e4", - "sha256:aae7ea3a1c5bb40c93cad361b3e869b180ac174656120c42b9fadebf685d121b", - "sha256:ab1cdb0f14dc161ebc268c09db04d2c9e6f70027f3b42446fa11c153521c0e88", - "sha256:ab4ea451082e684198636565224bbb179575efc1658c48281b2c866bfd4ddf04", - "sha256:abf058be9517dc877227ec3223f0300034bd0e9f53aebd63cf4456c8cb1e0863", - "sha256:af36f36538418f3806048f3b242a1777e2540ff9efaa667c27da63d2749dbce0", - "sha256:b53e9ad053cd064f7e473a5f29b37fc4cc9dc6d35f341e6afc0155ea257fc911", - "sha256:b7851992faf25eac90bfcb7bfd19e1f5ffa00afd57daec8a0042e63c74a4551b", - "sha256:b9b759b77f5337b4ea024f03abc6464c9f35d9718de01cfe6bae9f2e139c397e", - "sha256:ba39688799094c75ea8a16a6b544eb57b5b0f3328697084f3f2790892510d144", - "sha256:ba6b6b3846cfc10fdb4c971980a954e49d447cd215ed5a77ec8190bc93dd7bc5", - "sha256:bb4c2eda937a5e74c38a41b33d8c77220380a388d689bcdb9b187cf6224c9720", - "sha256:c0b97ec434041827935044bbbe52b03d6018c2897349670ff8fe11ed24d1d4ab", - "sha256:c1452a1acdf914d194159439eb21e56b89aa903f2e1c65c60b9d874f9b950e5d", - "sha256:c2027d05c8aebe61d898d4cffd774840a9cb82ed356ba47a90d99ad768f39789", - "sha256:c2adbe22ab4babbca99c75c5d07aaf74f43c3195384ec07ccbd2f9e3bddaecec", - "sha256:c2d97e906b4ff36eb464d52a3bc7d720bd6261f64bc4bcdbcd2c557c02081ed2", - "sha256:c339dabd8ee15f8259ee0f202679b6324926e5bc9e9a40bf981ce77c038553db", - "sha256:c6eae413494a1c3f89055da7a5515f32e05ebc1a234c27674a6956755fb2236f", - "sha256:c949f04ecad823f81b1ba94e7d189d9dfb81edbb94ed3f8acfce41e682e48cef", - "sha256:c97bee68898f3f4344eb02fec316db93d9700fb1e6a5b760ffa20d71d9a46ce3", - "sha256:ca61d858e4107ce5e1330a74724fe757fc7135190eb5ce5c9d0191729f033209", - "sha256:cb4679d4c2b089e5ef89756bc73e1926745e995d76e11925e3e96a76d5fa51fc", - "sha256:cb774298da62aea5c80a89bd58c40205ab4c2abf4834453b5de207d59d2e1651", - "sha256:ccd4d5702bb90b84df13bd491be8d900b92016c5a455b7e14630ad7449eb03f8", - "sha256:cf9d3fe53b1ee360e2421be95e62ca9b3296bf3f2fb2d3b83ca49ad3f925835e", - "sha256:d2ae91f50ccc5810b2f1b6b858257c9ad2e08da70bf890dee02de1775a387c66", - "sha256:d37f8ec982ead9ba0a22a996129594938138a1503237b87318392a48882d50b7", - "sha256:d81e6987b27bc7d101c8597e1cd2bcaa2fee5e8e0f356735c7ed34368c471550", - "sha256:dcf4e6d85614f7a4956c2de5a56531f44efb973d2fe4a444d7251df5d5c4dcfd", - "sha256:de790a3b5aa2124b8b78ae5faa033937a72da8efe74b9231698b5a1dd9be3405", - "sha256:e47e9a08bcc04d20975b6434cc50bf82665fbc751bcce739d04a3120428f3e27", - "sha256:e60f112ac88db9261ad3a52032ea46388378034f3279c643499edb982536a093", - "sha256:e87fc540c6cac7f29ede02e0f989d4233f88ad439c5cdee56f693cc9c1c78077", - "sha256:eac5c82fc632c599f4639a5886f96867ffced74458c7db61bc9a66ccb8ee3113", - "sha256:ebb4e035e28f49b6f1a7032920bb9a0c064aedbbabe52c543343d39341a5b2a3", - "sha256:ec1e72d6412f7126eb7b2e3bfca42b15e6e389e1bc88ea0069d0cc1742f477c6", - "sha256:ef98ca7d5995a82f43ec0ab39c4caf6a9b994cb0b53648ff61716370eadc43cf", - "sha256:f0cbc7fff06a90bbd875cc201f94ef0ee3929dfbd5c55a06674b60857b8b85ed", - "sha256:f4791cf0f8c3104ac668797d8c514afb3431bc3305f5638add0ba1a5a37e0d88", - "sha256:f5e412d717366e0677ef767eac93566582518fe8be923361a5c204c1a62eaafe", - "sha256:fb2ed8b3fe4bf4506d6dab3b93b83bbc22237e230cba03866d561c3577517d18", - "sha256:fe0a5a1025eb797752136ac8b4fa21aa891e3d74fd340f864ff982d649691867" + "sha256:00646784f6cd993b1e1c0e7b0fdcbccc375d539db95555477771c27555e3c556", + "sha256:00b1087dabcee0b0ffd104f9f53d7d3eaddfaa314cdd6726143af6bc713aa27e", + "sha256:0348b1dc6b76041516e8a854ff95b21c55f5a411c3297d2ca52f5528e49d8411", + "sha256:036137b5ad0cb0004c75b579445a1efccd072387a36c7f217bb8efd1afbe5245", + "sha256:095b707bb287bfd534044166ab767bec70a9bba3175dcdc3371782175c14e43c", + "sha256:0c08de15d50fa190d577e8591f0329a643eeaed696d7771760295998aca6bc66", + "sha256:1302a54f87b5cd8528e4d6d1bf2133b6aa7c6122ff8e9dc5220fbc1e07bffebd", + "sha256:172de779e2a153d36ee690dbc49c6db568d7b33b18dc56b69a7514aecbcf380d", + "sha256:1b027c86c66b8627eb90e57aee1f526df77dc6d8b354ec498be9a757d513b92b", + "sha256:1ce830e480f6774608dedfd4a90c42aac4a7af0a711f1b52f807130c2e434c06", + "sha256:1fd0c1d395372843fba13a51c28e3bb9d59bd7aebfeb17358ffaaa1e4dbbe948", + "sha256:23598acb8ccaa3d1d875ef3b35cb6376535095e9405d91a3d57a8c7db5d29341", + "sha256:24368e31be2c88bd69340fbfe741b405302993242ccb476c5c3ff48aeee1afe0", + "sha256:26a92ae76f75d1915806b77cf459811e772d8f71fd1e4339c99750f0e7f6324f", + "sha256:27e524624eace5c59af499cd97dc18bb201dc6a7a2da24bfc66ef151c69a5f2a", + "sha256:2b8719037e570639e6b665a4050add43134d80b687288ba3ade18b22bbb29dd2", + "sha256:2c5bcf3414367e29f83fd66f7de64509a8fd2368b1edf4351e862910727d3e51", + "sha256:2dbe357bc4ddda078f79d2a36fc1dd0494a7f2fad83a0a684465b6f24b46fe80", + "sha256:2f5fa187bde8524b1e37ba894db13aadd64faa884657473b03a019f625cee9a8", + "sha256:2f6ffc6701a0eb28648c845f4945a194dc7ab3c651f535b81793251e1185ac3d", + "sha256:314ccc4264ce7d854941231cf71b592e30d8d368a71e50197c905874feacc8a8", + "sha256:36026d8f99c58d7044413e1b819a67ca0e0b8ebe0f25e775e6c3d1fabb3c38fb", + "sha256:36099c69f6b14fc2c49d7996cbf4f87ec4f0e66d1c74aa05228583225a07b590", + "sha256:36fa402dcdc8ea7f1b0ddcf0df4254cc6b2e08f8cd80e7010d4c4ae6e86b2a87", + "sha256:370ffecb5316ed23b667d99ce4debe53ea664b99cc37bfa2af47bc769056d534", + "sha256:3860c62057acd95cc84044e758e47b18dcd8871a328ebc8ccdefd18b0d26a21b", + "sha256:399ac0891c284fa8eb998bcfa323f2234858f5d2efca3950ae58c8f88830f145", + "sha256:3a0b5db001b98e1c649dd55afa928e75aa4087e587b9524a4992316fa23c9fba", + "sha256:3dcf1978be02153c6a31692d4fbcc2a3f1db9da36039ead23173bc256ee3b91b", + "sha256:4241204e4b36ab5ae466ecec5c4c16527a054c69f99bba20f6f75232a6a534e2", + "sha256:438027a975cc213a47c5d70672e0d29776082155cfae540c4e225716586be75e", + "sha256:43e166ad47ba900f2542a80d83f9fc65fe99eb63ceec4debec160ae729824052", + "sha256:478e9e7b360dfec451daafe286998d4a1eeaecf6d69c427b834ae771cad4b622", + "sha256:4ce8299b481bcb68e5c82002b96e411796b844d72b3e92a3fbedfe8e19813eab", + "sha256:4f86f1f318e56f5cbb282fe61eb84767aee743ebe32c7c0834690ebea50c0a6b", + "sha256:55a23dcd98c858c0db44fc5c04fc7ed81c4b4d33c653a7c45ddaebf6563a2f66", + "sha256:599c87d79cab2a6a2a9df4aefe0455e61e7d2aeede2f8577c1b7c0aec643ee8e", + "sha256:5aa90562bc079c6c290f0512b21768967f9968e4cfea84ea4ff5af5d917016e4", + "sha256:64634ccf9d671c6be242a664a33c4acf12882670b09b3f163cd00a24cffbd74e", + "sha256:667aa2eac9cd0700af1ddb38b7b1ef246d8cf94c85637cbb03d7757ca4c3fdec", + "sha256:6a31d98c0d69776c2576dda4b77b8e0c69ad08e8b539c25c7d0ca0dc19a50d6c", + "sha256:6af4b3f52cc65f8a0bc8b1cd9676f8c21ef3e9132f21fed250f6958bd7223bed", + "sha256:6c8edaea3089bf908dd27da8f5d9e395c5b4dc092dbcce9b65e7156099b4b937", + "sha256:71d72ca5eaaa8d38c8df16b7deb1a2da4f650c41b58bb142f3fb75d5ad4a611f", + "sha256:72f9a942d739f09cd42fffe5dc759928217649f070056f03c70df14f5770acf9", + "sha256:747265448cb57a9f37572a488a57d873fd96bf51e5bb7edb52cfb37124516da4", + "sha256:75ec284328b60a4e91010c1acade0c30584f28a1f345bc8f72fe8b9e46ec6a96", + "sha256:78d0768ee59baa3de0f4adac9e3748b4b1fffc52143caebddfd5ea2961595277", + "sha256:78ee52ecc088c61cce32b2d30a826f929e1708f7b9247dc3b921aec367dc1b23", + "sha256:7be719e4d2ae6c314f72844ba9d69e38dff342bc360379f7c8537c48e23034b7", + "sha256:7e1f4744eea1501404b20b0ac059ff7e3f96a97d3e3f48ce27a139e053bb370b", + "sha256:7e90d6cc4aad2cc1f5e16ed56e46cebf4877c62403a311af20459c15da76fd91", + "sha256:7ebe3416785f65c28f4f9441e916bfc8a54179c8dea73c23023f7086fa601c5d", + "sha256:7f41533d7e3cf9520065f610b41ac1c76bc2161415955fbcead4981b22c7611e", + "sha256:7f5025db12fc6de7bc1104d826d5aee1d172f9ba6ca936bf6474c2148ac336c1", + "sha256:86c963186ca5e50d5c8287b1d1c9d3f8f024cbe343d048c5bd282aec2d8641f2", + "sha256:86ce5fcfc3accf3a07a729779d0b86c5d0309a4764c897d86c11089be61da160", + "sha256:8a14c192c1d724c3acbfb3f10a958c55a2638391319ce8078cb36c02283959b9", + "sha256:8b93785eadaef932e4fe9c6e12ba67beb1b3f1e5495631419c784ab87e975670", + "sha256:8ed1af8692bd8d2a29d702f1a2e6065416d76897d726e45a1775b1444f5928a7", + "sha256:92879bce89f91f4b2416eba4429c7b5ca22c45ef4a499c39f0c5c69257522c7c", + "sha256:94fc0e6621e07d1e91c44e016cc0b189b48db053061cc22d6298a611de8071bb", + "sha256:982487f8931067a32e72d40ab6b47b1628a9c5d344be7f1a4e668fb462d2da42", + "sha256:9862bf828112e19685b76ca499b379338fd4c5c269d897e218b2ae8fcb80139d", + "sha256:99b14dbea2fdb563d8b5a57c9badfcd72083f6006caf8e126b491519c7d64ca8", + "sha256:9c6a5c79b28003543db3ba67d1df336f253a87d3112dac3a51b94f7d48e4c0e1", + "sha256:a19b794f8fe6569472ff77602437ec4430f9b2b9ec7a1105cfd2232f9ba355e6", + "sha256:a306cdd2ad3a7d795d8e617a58c3a2ed0f76c8496fb7621b6cd514eb1532cae8", + "sha256:a3dde6cac75e0b0902778978d3b1646ca9f438654395a362cb21d9ad34b24acf", + "sha256:a874f21f87c485310944b2b2734cd6d318765bcbb7515eead33af9641816506e", + "sha256:a983cca5ed1dd9a35e9e42ebf9f278d344603bfcb174ff99a5815f953925140a", + "sha256:aca48506a9c20f68ee61c87f2008f81f8ee99f8d7f0104bff3c47e2d148f89d9", + "sha256:b2602177668f89b38b9f84b7b3435d0a72511ddef45dc14446811759b82235a1", + "sha256:b3e5fe4538001bb82e2295b8d2a39356a84694c97cb73a566dc36328b9f83b40", + "sha256:b6ca36c12a5120bad343eef193cc0122928c5c7466121da7c20f41160ba00ba2", + "sha256:b89f4477d915ea43b4ceea6756f63f0288941b6443a2b28c69004fe07fde0d0d", + "sha256:b9a9d92f10772d2a181b5ca339dee066ab7d1c9a34ae2421b2a52556e719756f", + "sha256:c99462ffc538717b3e60151dfaf91125f637e801f5ab008f81c402f1dff0cd0f", + "sha256:cb92f9061657287eded380d7dc455bbf115430b3aa4741bdc662d02977e7d0af", + "sha256:cdee837710ef6b56ebd20245b83799fce40b265b3b406e51e8ccc5b85b9099b7", + "sha256:cf10b7d58ae4a1f07fccbf4a0a956d705356fea05fb4c70608bb6fa81d103cda", + "sha256:d15687d7d7f40333bd8266f3814c591c2e2cd263fa2116e314f60d82086e353a", + "sha256:d5c28525c19f5bb1e09511669bb57353d22b94cf8b65f3a8d141c389a55dec95", + "sha256:d5f916acf8afbcab6bacbb376ba7dc61f845367901ecd5e328fc4d4aef2fcab0", + "sha256:dab03ed811ed1c71d700ed08bde8431cf429bbe59e423394f0f4055f1ca0ea60", + "sha256:db453f2da3f59a348f514cfbfeb042393b68720787bbef2b4c6068ea362c8149", + "sha256:de2a0645a923ba57c5527497daf8ec5df69c6eadf869e9cd46e86349146e5975", + "sha256:dea7fcd62915fb150cdc373212141a30037e11b761fbced340e9db3379b892d4", + "sha256:dfcbebdb3c4b6f739a91769aea5ed615023f3c88cb70df812849aef634c25fbe", + "sha256:dfcebb950aa7e667ec226a442722134539e77c575f6cfaa423f24371bb8d2e94", + "sha256:e0641b506486f0b4cd1500a2a65740243e8670a2549bb02bc4556a83af84ae03", + "sha256:e33b0834f1cf779aa839975f9d8755a7c2420510c0fa1e9fa0497de77cd35d2c", + "sha256:e4ace1e220b078c8e48e82c081e35002038657e4b37d403ce940fa679e57113b", + "sha256:e4cf2d5829f6963a5483ec01578ee76d329eb5caf330ecd05b3edd697e7d768a", + "sha256:e574de99d735b3fc8364cba9912c2bec2da78775eba95cbb225ef7dda6acea24", + "sha256:e646c0e282e960345314f42f2cea5e0b5f56938c093541ea6dbf11aec2862391", + "sha256:e8a5ac97ea521d7bde7621d86c30e86b798cdecd985723c4ed737a2aa9e77d0c", + "sha256:eedf97be7bc3dbc8addcef4142f4b4164066df0c6f36397ae4aaed3eb187d8ab", + "sha256:ef633add81832f4b56d3b4c9408b43d530dfca29e68fb1b797dcb861a2c734cd", + "sha256:f27207e8ca3e5e021e2402ba942e5b4c629718e665c81b8b306f3c8b1ddbb786", + "sha256:f85f3843bdb1fe80e8c206fe6eed7a1caeae897e496542cee499c374a85c6e08", + "sha256:f8e81e4b55930e5ffab4a68db1af431629cf2e4066dbdbfef65348b8ab804ea8", + "sha256:f96ae96a060a8072ceff4cfde89d261837b4294a4f28b84a28765470d502ccc6", + "sha256:fd9e98b408384989ea4ab60206b8e100d8687da18b5c813c11e92fd8212a98e0", + "sha256:ffff855100bc066ff2cd3aa4a60bc9534661816b110f0243e59503ec2df38421" ], "markers": "python_version >= '3.7'", - "version": "==2.14.5" + "version": "==2.14.6" }, "python-dateutil": { "hashes": [ @@ -359,6 +363,7 @@ "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" ], "index": "pypi", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.8.2" }, "python-dotenv": { @@ -367,6 +372,7 @@ "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==1.0.0" }, "pyyaml": { @@ -422,16 +428,16 @@ "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d", "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f" ], - "index": "pypi", + "markers": "python_version >= '3.6'", "version": "==6.0.1" }, "setuptools": { "hashes": [ - "sha256:1e8fdff6797d3865f37397be788a4e3cba233608e9b509382a2777d25ebde7f2", - "sha256:735896e78a4742605974de002ac60562d286fa8051a7e2299445e8e8fbb01aa6" + "sha256:385eb4edd9c9d5c17540511303e39a147ce2fc04bc55289c322b9e5904fe2c05", + "sha256:be1af57fc409f93647f2e8e4573a142ed38724b8cdd389706a867bb4efcf1e78" ], "markers": "python_version >= '3.8'", - "version": "==69.0.2" + "version": "==69.0.3" }, "six": { "hashes": [ @@ -451,11 +457,11 @@ }, "starlette": { "hashes": [ - "sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75", - "sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91" + "sha256:3e2639dac3520e4f58734ed22553f950d3f3cb1001cd2eaac4d57e8cdc5f66bc", + "sha256:50bbbda9baa098e361f398fda0928062abbaf1f54f4fadcbe17c092a01eb9a25" ], - "markers": "python_version >= '3.7'", - "version": "==0.27.0" + "markers": "python_version >= '3.8'", + "version": "==0.35.1" }, "typing-extensions": { "hashes": [ @@ -465,6 +471,78 @@ "markers": "python_version >= '3.8'", "version": "==4.9.0" }, + "ujson": { + "hashes": [ + "sha256:07e0cfdde5fd91f54cd2d7ffb3482c8ff1bf558abf32a8b953a5d169575ae1cd", + "sha256:0b159efece9ab5c01f70b9d10bbb77241ce111a45bc8d21a44c219a2aec8ddfd", + "sha256:0c4d6adb2c7bb9eb7c71ad6f6f612e13b264942e841f8cc3314a21a289a76c4e", + "sha256:10ca3c41e80509fd9805f7c149068fa8dbee18872bbdc03d7cca928926a358d5", + "sha256:20509a8c9f775b3a511e308bbe0b72897ba6b800767a7c90c5cca59d20d7c42c", + "sha256:25fa46e4ff0a2deecbcf7100af3a5d70090b461906f2299506485ff31d9ec437", + "sha256:2a8ea0f55a1396708e564595aaa6696c0d8af532340f477162ff6927ecc46e21", + "sha256:2fbb90aa5c23cb3d4b803c12aa220d26778c31b6e4b7a13a1f49971f6c7d088e", + "sha256:323279e68c195110ef85cbe5edce885219e3d4a48705448720ad925d88c9f851", + "sha256:32bba5870c8fa2a97f4a68f6401038d3f1922e66c34280d710af00b14a3ca562", + "sha256:3382a3ce0ccc0558b1c1668950008cece9bf463ebb17463ebf6a8bfc060dae34", + "sha256:37ef92e42535a81bf72179d0e252c9af42a4ed966dc6be6967ebfb929a87bc60", + "sha256:3b23bbb46334ce51ddb5dded60c662fbf7bb74a37b8f87221c5b0fec1ec6454b", + "sha256:473fb8dff1d58f49912323d7cb0859df5585cfc932e4b9c053bf8cf7f2d7c5c4", + "sha256:4a566e465cb2fcfdf040c2447b7dd9718799d0d90134b37a20dff1e27c0e9096", + "sha256:4e35d7885ed612feb6b3dd1b7de28e89baaba4011ecdf995e88be9ac614765e9", + "sha256:506a45e5fcbb2d46f1a51fead991c39529fc3737c0f5d47c9b4a1d762578fc30", + "sha256:5635b78b636a54a86fdbf6f027e461aa6c6b948363bdf8d4fbb56a42b7388320", + "sha256:5ca35f484622fd208f55041b042d9d94f3b2c9c5add4e9af5ee9946d2d30db01", + "sha256:60718f1720a61560618eff3b56fd517d107518d3c0160ca7a5a66ac949c6cf1c", + "sha256:63fb2e6599d96fdffdb553af0ed3f76b85fda63281063f1cb5b1141a6fcd0617", + "sha256:6974b3a7c17bbf829e6c3bfdc5823c67922e44ff169851a755eab79a3dd31ec0", + "sha256:6adef377ed583477cf005b58c3025051b5faa6b8cc25876e594afbb772578f21", + "sha256:6bbd91a151a8f3358c29355a491e915eb203f607267a25e6ab10531b3b157c5e", + "sha256:6eecbd09b316cea1fd929b1e25f70382917542ab11b692cb46ec9b0a26c7427f", + "sha256:70e06849dfeb2548be48fdd3ceb53300640bc8100c379d6e19d78045e9c26120", + "sha256:7309d063cd392811acc49b5016728a5e1b46ab9907d321ebbe1c2156bc3c0b99", + "sha256:779a2a88c53039bebfbccca934430dabb5c62cc179e09a9c27a322023f363e0d", + "sha256:7a365eac66f5aa7a7fdf57e5066ada6226700884fc7dce2ba5483538bc16c8c5", + "sha256:7b1c0991c4fe256f5fdb19758f7eac7f47caac29a6c57d0de16a19048eb86bad", + "sha256:7cc7e605d2aa6ae6b7321c3ae250d2e050f06082e71ab1a4200b4ae64d25863c", + "sha256:829a69d451a49c0de14a9fecb2a2d544a9b2c884c2b542adb243b683a6f15908", + "sha256:829b824953ebad76d46e4ae709e940bb229e8999e40881338b3cc94c771b876c", + "sha256:82b5a56609f1235d72835ee109163c7041b30920d70fe7dac9176c64df87c164", + "sha256:89cc92e73d5501b8a7f48575eeb14ad27156ad092c2e9fc7e3cf949f07e75532", + "sha256:8ba7cac47dd65ff88571eceeff48bf30ed5eb9c67b34b88cb22869b7aa19600d", + "sha256:8fc2aa18b13d97b3c8ccecdf1a3c405f411a6e96adeee94233058c44ff92617d", + "sha256:9ac92d86ff34296f881e12aa955f7014d276895e0e4e868ba7fddebbde38e378", + "sha256:9d302bd17989b6bd90d49bade66943c78f9e3670407dbc53ebcf61271cadc399", + "sha256:9f21315f51e0db8ee245e33a649dd2d9dce0594522de6f278d62f15f998e050e", + "sha256:a6d3f10eb8ccba4316a6b5465b705ed70a06011c6f82418b59278fbc919bef6f", + "sha256:a807ae73c46ad5db161a7e883eec0fbe1bebc6a54890152ccc63072c4884823b", + "sha256:ab71bf27b002eaf7d047c54a68e60230fbd5cd9da60de7ca0aa87d0bccead8fa", + "sha256:b048aa93eace8571eedbd67b3766623e7f0acbf08ee291bef7d8106210432427", + "sha256:b28407cfe315bd1b34f1ebe65d3bd735d6b36d409b334100be8cdffae2177b2f", + "sha256:b5964ea916edfe24af1f4cc68488448fbb1ec27a3ddcddc2b236da575c12c8ae", + "sha256:b68a0caab33f359b4cbbc10065c88e3758c9f73a11a65a91f024b2e7a1257106", + "sha256:ba0823cb70866f0d6a4ad48d998dd338dce7314598721bc1b7986d054d782dfd", + "sha256:bd4ea86c2afd41429751d22a3ccd03311c067bd6aeee2d054f83f97e41e11d8f", + "sha256:bdf7fc21a03bafe4ba208dafa84ae38e04e5d36c0e1c746726edf5392e9f9f36", + "sha256:c4eec2ddc046360d087cf35659c7ba0cbd101f32035e19047013162274e71fcf", + "sha256:cdcb02cabcb1e44381221840a7af04433c1dc3297af76fde924a50c3054c708c", + "sha256:d0fd2eba664a22447102062814bd13e63c6130540222c0aa620701dd01f4be81", + "sha256:d581db9db9e41d8ea0b2705c90518ba623cbdc74f8d644d7eb0d107be0d85d9c", + "sha256:dc80f0f5abf33bd7099f7ac94ab1206730a3c0a2d17549911ed2cb6b7aa36d2d", + "sha256:e015122b337858dba5a3dc3533af2a8fc0410ee9e2374092f6a5b88b182e9fcc", + "sha256:e208d3bf02c6963e6ef7324dadf1d73239fb7008491fdf523208f60be6437402", + "sha256:e2f909bc08ce01f122fd9c24bc6f9876aa087188dfaf3c4116fe6e4daf7e194f", + "sha256:f0cb4a7814940ddd6619bdce6be637a4b37a8c4760de9373bac54bb7b229698b", + "sha256:f4b3917296630a075e04d3d07601ce2a176479c23af838b6cf90a2d6b39b0d95", + "sha256:f69f16b8f1c69da00e38dc5f2d08a86b0e781d0ad3e4cc6a13ea033a439c4844", + "sha256:f833c529e922577226a05bc25b6a8b3eb6c4fb155b72dd88d33de99d53113124", + "sha256:f91719c6abafe429c1a144cfe27883eace9fb1c09a9c5ef1bcb3ae80a3076a4e", + "sha256:ff741a5b4be2d08fceaab681c9d4bc89abf3c9db600ab435e20b9b6d4dfef12e", + "sha256:ffdfebd819f492e48e4f31c97cb593b9c1a8251933d8f8972e81697f00326ff1" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==5.9.0" + }, "wsproto": { "hashes": [ "sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065", @@ -477,11 +555,11 @@ "develop": { "anyio": { "hashes": [ - "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780", - "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5" + "sha256:745843b39e829e108e518c489b31dc757de7d2131d53fac32bd8df268227bfee", + "sha256:e1875bb4b4e2de1669f4bc7869b6d3f54231cdced71605e6e64c9be77e3be50f" ], - "markers": "python_version >= '3.7'", - "version": "==3.7.1" + "markers": "python_version >= '3.8'", + "version": "==4.2.0" }, "bandit": { "hashes": [ @@ -489,6 +567,7 @@ "sha256:72ce7bc9741374d96fb2f1c9a8960829885f1243ffde743de70a19cee353e8f3" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==1.7.6" }, "certifi": { @@ -515,71 +594,64 @@ "markers": "python_version >= '3.7'", "version": "==8.1.7" }, - "colorama": { - "hashes": [ - "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", - "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" - ], - "markers": "platform_system == 'Windows'", - "version": "==0.4.6" - }, "coverage": { "hashes": [ - "sha256:007a7e49831cfe387473e92e9ff07377f6121120669ddc39674e7244350a6a29", - "sha256:1191270b06ecd68b1d00897b2daddb98e1719f63750969614ceb3438228c088e", - "sha256:1367aa411afb4431ab58fd7ee102adb2665894d047c490649e86219327183134", - "sha256:1f0f8f0c497eb9c9f18f21de0750c8d8b4b9c7000b43996a094290b59d0e7523", - "sha256:222b038f08a7ebed1e4e78ccf3c09a1ca4ac3da16de983e66520973443b546bc", - "sha256:243576944f7c1a1205e5cd658533a50eba662c74f9be4c050d51c69bd4532936", - "sha256:2e9223a18f51d00d3ce239c39fc41410489ec7a248a84fab443fbb39c943616c", - "sha256:307aecb65bb77cbfebf2eb6e12009e9034d050c6c69d8a5f3f737b329f4f15fb", - "sha256:31c0b1b8b5a4aebf8fcd227237fc4263aa7fa0ddcd4d288d42f50eff18b0bac4", - "sha256:3b15e03b8ee6a908db48eccf4e4e42397f146ab1e91c6324da44197a45cb9132", - "sha256:3c854c1d2c7d3e47f7120b560d1a30c1ca221e207439608d27bc4d08fd4aeae8", - "sha256:475de8213ed95a6b6283056d180b2442eee38d5948d735cd3d3b52b86dd65b92", - "sha256:50c472c1916540f8b2deef10cdc736cd2b3d1464d3945e4da0333862270dcb15", - "sha256:593efa42160c15c59ee9b66c5f27a453ed3968718e6e58431cdfb2d50d5ad284", - "sha256:65d716b736f16e250435473c5ca01285d73c29f20097decdbb12571d5dfb2c94", - "sha256:733537a182b5d62184f2a72796eb6901299898231a8e4f84c858c68684b25a70", - "sha256:757453848c18d7ab5d5b5f1827293d580f156f1c2c8cef45bfc21f37d8681069", - "sha256:79c32f875fd7c0ed8d642b221cf81feba98183d2ff14d1f37a1bbce6b0347d9f", - "sha256:7f3bad1a9313401ff2964e411ab7d57fb700a2d5478b727e13f156c8f89774a0", - "sha256:7fbf3f5756e7955174a31fb579307d69ffca91ad163467ed123858ce0f3fd4aa", - "sha256:811ca7373da32f1ccee2927dc27dc523462fd30674a80102f86c6753d6681bc6", - "sha256:89400aa1752e09f666cc48708eaa171eef0ebe3d5f74044b614729231763ae69", - "sha256:8c944cf1775235c0857829c275c777a2c3e33032e544bcef614036f337ac37bb", - "sha256:9437a4074b43c177c92c96d051957592afd85ba00d3e92002c8ef45ee75df438", - "sha256:9e17d9cb06c13b4f2ef570355fa45797d10f19ca71395910b249e3f77942a837", - "sha256:9ede881c7618f9cf93e2df0421ee127afdfd267d1b5d0c59bcea771cf160ea4a", - "sha256:a1f76cfc122c9e0f62dbe0460ec9cc7696fc9a0293931a33b8870f78cf83a327", - "sha256:a2ac4245f18057dfec3b0074c4eb366953bca6787f1ec397c004c78176a23d56", - "sha256:a702e66483b1fe602717020a0e90506e759c84a71dbc1616dd55d29d86a9b91f", - "sha256:ad2453b852a1316c8a103c9c970db8fbc262f4f6b930aa6c606df9b2766eee06", - "sha256:af75cf83c2d57717a8493ed2246d34b1f3398cb8a92b10fd7a1858cad8e78f59", - "sha256:afdcc10c01d0db217fc0a64f58c7edd635b8f27787fea0a3054b856a6dff8717", - "sha256:c59a3e59fb95e6d72e71dc915e6d7fa568863fad0a80b33bc7b82d6e9f844973", - "sha256:cad9afc1644b979211989ec3ff7d82110b2ed52995c2f7263e7841c846a75348", - "sha256:d299d379b676812e142fb57662a8d0d810b859421412b4d7af996154c00c31bb", - "sha256:d31650d313bd90d027f4be7663dfa2241079edd780b56ac416b56eebe0a21aab", - "sha256:d874434e0cb7b90f7af2b6e3309b0733cde8ec1476eb47db148ed7deeb2a9494", - "sha256:db0338c4b0951d93d547e0ff8d8ea340fecf5885f5b00b23be5aa99549e14cfd", - "sha256:df04c64e58df96b4427db8d0559e95e2df3138c9916c96f9f6a4dd220db2fdb7", - "sha256:e995efb191f04b01ced307dbd7407ebf6e6dc209b528d75583277b10fd1800ee", - "sha256:eda7f6e92358ac9e1717ce1f0377ed2b9320cea070906ece4e5c11d172a45a39", - "sha256:ee453085279df1bac0996bc97004771a4a052b1f1e23f6101213e3796ff3cb85", - "sha256:ee6621dccce8af666b8c4651f9f43467bfbf409607c604b840b78f4ff3619aeb", - "sha256:eee5e741b43ea1b49d98ab6e40f7e299e97715af2488d1c77a90de4a663a86e2", - "sha256:f3bfd2c2f0e5384276e12b14882bf2c7621f97c35320c3e7132c156ce18436a1", - "sha256:f501e36ac428c1b334c41e196ff6bd550c0353c7314716e80055b1f0a32ba394", - "sha256:f9191be7af41f0b54324ded600e8ddbcabea23e1e8ba419d9a53b241dece821d", - "sha256:fbd8a5fe6c893de21a3c6835071ec116d79334fbdf641743332e442a3466f7ea", - "sha256:fc200cec654311ca2c3f5ab3ce2220521b3d4732f68e1b1e79bef8fcfc1f2b97", - "sha256:ff4800783d85bff132f2cc7d007426ec698cdce08c3062c8d501ad3f4ea3d16c", - "sha256:ffb0eacbadb705c0a6969b0adf468f126b064f3362411df95f6d4f31c40d31c1", - "sha256:fff0b2f249ac642fd735f009b8363c2b46cf406d3caec00e4deeb79b5ff39b40" + "sha256:04387a4a6ecb330c1878907ce0dc04078ea72a869263e53c72a1ba5bbdf380ca", + "sha256:0676cd0ba581e514b7f726495ea75aba3eb20899d824636c6f59b0ed2f88c471", + "sha256:0e8d06778e8fbffccfe96331a3946237f87b1e1d359d7fbe8b06b96c95a5407a", + "sha256:0eb3c2f32dabe3a4aaf6441dde94f35687224dfd7eb2a7f47f3fd9428e421058", + "sha256:109f5985182b6b81fe33323ab4707011875198c41964f014579cf82cebf2bb85", + "sha256:13eaf476ec3e883fe3e5fe3707caeb88268a06284484a3daf8250259ef1ba143", + "sha256:164fdcc3246c69a6526a59b744b62e303039a81e42cfbbdc171c91a8cc2f9446", + "sha256:26776ff6c711d9d835557ee453082025d871e30b3fd6c27fcef14733f67f0590", + "sha256:26f66da8695719ccf90e794ed567a1549bb2644a706b41e9f6eae6816b398c4a", + "sha256:29f3abe810930311c0b5d1a7140f6395369c3db1be68345638c33eec07535105", + "sha256:316543f71025a6565677d84bc4df2114e9b6a615aa39fb165d697dba06a54af9", + "sha256:36b0ea8ab20d6a7564e89cb6135920bc9188fb5f1f7152e94e8300b7b189441a", + "sha256:3cc9d4bc55de8003663ec94c2f215d12d42ceea128da8f0f4036235a119c88ac", + "sha256:485e9f897cf4856a65a57c7f6ea3dc0d4e6c076c87311d4bc003f82cfe199d25", + "sha256:5040148f4ec43644702e7b16ca864c5314ccb8ee0751ef617d49aa0e2d6bf4f2", + "sha256:51456e6fa099a8d9d91497202d9563a320513fcf59f33991b0661a4a6f2ad450", + "sha256:53d7d9158ee03956e0eadac38dfa1ec8068431ef8058fe6447043db1fb40d932", + "sha256:5a10a4920def78bbfff4eff8a05c51be03e42f1c3735be42d851f199144897ba", + "sha256:5b14b4f8760006bfdb6e08667af7bc2d8d9bfdb648351915315ea17645347137", + "sha256:5b2ccb7548a0b65974860a78c9ffe1173cfb5877460e5a229238d985565574ae", + "sha256:697d1317e5290a313ef0d369650cfee1a114abb6021fa239ca12b4849ebbd614", + "sha256:6ae8c9d301207e6856865867d762a4b6fd379c714fcc0607a84b92ee63feff70", + "sha256:707c0f58cb1712b8809ece32b68996ee1e609f71bd14615bd8f87a1293cb610e", + "sha256:74775198b702868ec2d058cb92720a3c5a9177296f75bd97317c787daf711505", + "sha256:756ded44f47f330666843b5781be126ab57bb57c22adbb07d83f6b519783b870", + "sha256:76f03940f9973bfaee8cfba70ac991825611b9aac047e5c80d499a44079ec0bc", + "sha256:79287fd95585ed36e83182794a57a46aeae0b64ca53929d1176db56aacc83451", + "sha256:799c8f873794a08cdf216aa5d0531c6a3747793b70c53f70e98259720a6fe2d7", + "sha256:7d360587e64d006402b7116623cebf9d48893329ef035278969fa3bbf75b697e", + "sha256:80b5ee39b7f0131ebec7968baa9b2309eddb35b8403d1869e08f024efd883566", + "sha256:815ac2d0f3398a14286dc2cea223a6f338109f9ecf39a71160cd1628786bc6f5", + "sha256:83c2dda2666fe32332f8e87481eed056c8b4d163fe18ecc690b02802d36a4d26", + "sha256:846f52f46e212affb5bcf131c952fb4075b55aae6b61adc9856222df89cbe3e2", + "sha256:936d38794044b26c99d3dd004d8af0035ac535b92090f7f2bb5aa9c8e2f5cd42", + "sha256:9864463c1c2f9cb3b5db2cf1ff475eed2f0b4285c2aaf4d357b69959941aa555", + "sha256:995ea5c48c4ebfd898eacb098164b3cc826ba273b3049e4a889658548e321b43", + "sha256:a1526d265743fb49363974b7aa8d5899ff64ee07df47dd8d3e37dcc0818f09ed", + "sha256:a56de34db7b7ff77056a37aedded01b2b98b508227d2d0979d373a9b5d353daa", + "sha256:a7c97726520f784239f6c62506bc70e48d01ae71e9da128259d61ca5e9788516", + "sha256:b8e99f06160602bc64da35158bb76c73522a4010f0649be44a4e167ff8555952", + "sha256:bb1de682da0b824411e00a0d4da5a784ec6496b6850fdf8c865c1d68c0e318dd", + "sha256:bf477c355274a72435ceb140dc42de0dc1e1e0bf6e97195be30487d8eaaf1a09", + "sha256:bf635a52fc1ea401baf88843ae8708591aa4adff875e5c23220de43b1ccf575c", + "sha256:bfd5db349d15c08311702611f3dccbef4b4e2ec148fcc636cf8739519b4a5c0f", + "sha256:c530833afc4707fe48524a44844493f36d8727f04dcce91fb978c414a8556cc6", + "sha256:cc6d65b21c219ec2072c1293c505cf36e4e913a3f936d80028993dd73c7906b1", + "sha256:cd3c1e4cb2ff0083758f09be0f77402e1bdf704adb7f89108007300a6da587d0", + "sha256:cfd2a8b6b0d8e66e944d47cdec2f47c48fef2ba2f2dff5a9a75757f64172857e", + "sha256:d0ca5c71a5a1765a0f8f88022c52b6b8be740e512980362f7fdbb03725a0d6b9", + "sha256:e7defbb9737274023e2d7af02cac77043c86ce88a907c58f42b580a97d5bcca9", + "sha256:e9d1bf53c4c8de58d22e0e956a79a5b37f754ed1ffdbf1a260d9dcfa2d8a325e", + "sha256:ea81d8f9691bb53f4fb4db603203029643caffc82bf998ab5b59ca05560f4c06" ], "index": "pypi", - "version": "==7.3.3" + "markers": "python_version >= '3.8'", + "version": "==7.4.0" }, "distlib": { "hashes": [ @@ -598,11 +670,12 @@ }, "faker": { "hashes": [ - "sha256:2d8a350e952225a145307d7461881c44a1c9320e90fbe8bd903d5947f133f3ec", - "sha256:ff61cca42547795bee8a11319792a8fee6d0f0cd191e831f7f3050c5851fcd8a" + "sha256:2c2b7a8e55368defd718226bd5b48ef31b2d082c2900ccb4200987e433be500e", + "sha256:fab78f435d27fa7bd109b095eea3504477e4149051c903fd63f11ce252e3d9b7" ], "index": "pypi", - "version": "==21.0.0" + "markers": "python_version >= '3.8'", + "version": "==22.2.0" }, "filelock": { "hashes": [ @@ -622,11 +695,11 @@ }, "gitpython": { "hashes": [ - "sha256:22b126e9ffb671fdd0c129796343a02bf67bf2994b35449ffc9321aa755e18a4", - "sha256:cf14627d5a8049ffbf49915732e5eddbe8134c3bdb9d476e6182b676fc573f8a" + "sha256:c36b6634d069b3f719610175020a9aed919421c87552185b085e04fbbdb10b7c", + "sha256:ed66e624884f76df22c8e16066d567aaa5a37d5b5fa19db2c6df6f7156db9048" ], "markers": "python_version >= '3.7'", - "version": "==3.1.40" + "version": "==3.1.41" }, "h11": { "hashes": [ @@ -638,11 +711,12 @@ }, "hatch": { "hashes": [ - "sha256:9db69439726e013b091834831621aa9f0e5fe3c12df215e0ef18c709a0e74f95", - "sha256:fdc574184dcb1d52a63a3cfd08431bf674ad3be2fd7316cbf5fb6d4bdbc3032f" + "sha256:21e0da436f3c491f7f50d1b691a55c1fb9c1185b905726407641b33e8d5a37e9", + "sha256:77462d9f1fd3c161ebaa7afc51f62b3f1392375e1d3a0cd23dba4cd996bd1cec" ], "index": "pypi", - "version": "==1.8.1" + "markers": "python_version >= '3.8'", + "version": "==1.9.1" }, "hatchling": { "hashes": [ @@ -665,11 +739,11 @@ "http2" ], "hashes": [ - "sha256:8b8fcaa0c8ea7b05edd69a094e63a2094c4efcb48129fb757361bc423c0ad9e8", - "sha256:a05d3d052d9b2dfce0e3896636467f8a5342fb2b902c819428e1ac65413ca118" + "sha256:451b55c30d5185ea6b23c2c793abf9bb237d2a7dfb901ced6ff69ad37ec1dfaf", + "sha256:8915f5a3627c4d47b73e8202457cb28f1266982d1159bd5779d86a80c0eab1cd" ], - "index": "pypi", - "version": "==0.25.2" + "markers": "python_version >= '3.8'", + "version": "==0.26.0" }, "hyperlink": { "hashes": [ @@ -696,11 +770,11 @@ }, "importlib-metadata": { "hashes": [ - "sha256:7fc841f8b8332803464e5dc1c63a2e59121f46ca186c0e2e182e80bf8c1319f7", - "sha256:d97503976bb81f40a193d41ee6570868479c69d5068651eb039c40d850c59d67" + "sha256:4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e", + "sha256:f238736bb06590ae52ac1fab06a3a9ef1d8dce2b7a35b5ab329371d6c8f5d2cc" ], "markers": "python_version < '3.12'", - "version": "==7.0.0" + "version": "==7.0.1" }, "iniconfig": { "hashes": [ @@ -744,44 +818,45 @@ }, "more-itertools": { "hashes": [ - "sha256:626c369fa0eb37bac0291bce8259b332fd59ac792fa5497b59837309cd5b114a", - "sha256:64e0735fcfdc6f3464ea133afe8ea4483b1c5fe3a3d69852e6503b43a0b222e6" + "sha256:686b06abe565edfab151cb8fd385a05651e1fdf8f0a14191e4439283421f8684", + "sha256:8fccb480c43d3e99a00087634c06dd02b0d50fbf088b380de5a41a015ec239e1" ], "markers": "python_version >= '3.8'", - "version": "==10.1.0" + "version": "==10.2.0" }, "mypy": { "hashes": [ - "sha256:12cce78e329838d70a204293e7b29af9faa3ab14899aec397798a4b41be7f340", - "sha256:1484b8fa2c10adf4474f016e09d7a159602f3239075c7bf9f1627f5acf40ad49", - "sha256:204e0d6de5fd2317394a4eff62065614c4892d5a4d1a7ee55b765d7a3d9e3f82", - "sha256:2643d145af5292ee956aa0a83c2ce1038a3bdb26e033dadeb2f7066fb0c9abce", - "sha256:2c6e4464ed5f01dc44dc9821caf67b60a4e5c3b04278286a85c067010653a0eb", - "sha256:2f7f6985d05a4e3ce8255396df363046c28bea790e40617654e91ed580ca7c51", - "sha256:31902408f4bf54108bbfb2e35369877c01c95adc6192958684473658c322c8a5", - "sha256:40716d1f821b89838589e5b3106ebbc23636ffdef5abc31f7cd0266db936067e", - "sha256:4b901927f16224d0d143b925ce9a4e6b3a758010673eeded9b748f250cf4e8f7", - "sha256:4fc3d14ee80cd22367caaaf6e014494415bf440980a3045bf5045b525680ac33", - "sha256:5cf3f0c5ac72139797953bd50bc6c95ac13075e62dbfcc923571180bebb662e9", - "sha256:6dbdec441c60699288adf051f51a5d512b0d818526d1dcfff5a41f8cd8b4aaf1", - "sha256:72cf32ce7dd3562373f78bd751f73c96cfb441de147cc2448a92c1a308bd0ca6", - "sha256:75aa828610b67462ffe3057d4d8a4112105ed211596b750b53cbfe182f44777a", - "sha256:75c4d2a6effd015786c87774e04331b6da863fc3fc4e8adfc3b40aa55ab516fe", - "sha256:78e25b2fd6cbb55ddfb8058417df193f0129cad5f4ee75d1502248e588d9e0d7", - "sha256:84860e06ba363d9c0eeabd45ac0fde4b903ad7aa4f93cd8b648385a888e23200", - "sha256:8c5091ebd294f7628eb25ea554852a52058ac81472c921150e3a61cdd68f75a7", - "sha256:944bdc21ebd620eafefc090cdf83158393ec2b1391578359776c00de00e8907a", - "sha256:9c7ac372232c928fff0645d85f273a726970c014749b924ce5710d7d89763a28", - "sha256:d9b338c19fa2412f76e17525c1b4f2c687a55b156320acb588df79f2e6fa9fea", - "sha256:ee5d62d28b854eb61889cde4e1dbc10fbaa5560cb39780c3995f6737f7e82120", - "sha256:f2c2521a8e4d6d769e3234350ba7b65ff5d527137cdcde13ff4d99114b0c8e7d", - "sha256:f6efc9bd72258f89a3816e3a98c09d36f079c223aa345c659622f056b760ab42", - "sha256:f7c5d642db47376a0cc130f0de6d055056e010debdaf0707cd2b0fc7e7ef30ea", - "sha256:fcb6d9afb1b6208b4c712af0dafdc650f518836065df0d4fb1d800f5d6773db2", - "sha256:fcd2572dd4519e8a6642b733cd3a8cfc1ef94bafd0c1ceed9c94fe736cb65b6a" + "sha256:028cf9f2cae89e202d7b6593cd98db6759379f17a319b5faf4f9978d7084cdc6", + "sha256:2afecd6354bbfb6e0160f4e4ad9ba6e4e003b767dd80d85516e71f2e955ab50d", + "sha256:2b5b6c721bd4aabaadead3a5e6fa85c11c6c795e0c81a7215776ef8afc66de02", + "sha256:42419861b43e6962a649068a61f4a4839205a3ef525b858377a960b9e2de6e0d", + "sha256:42c6680d256ab35637ef88891c6bd02514ccb7e1122133ac96055ff458f93fc3", + "sha256:485a8942f671120f76afffff70f259e1cd0f0cfe08f81c05d8816d958d4577d3", + "sha256:4c886c6cce2d070bd7df4ec4a05a13ee20c0aa60cb587e8d1265b6c03cf91da3", + "sha256:4e6d97288757e1ddba10dd9549ac27982e3e74a49d8d0179fc14d4365c7add66", + "sha256:4ef4be7baf08a203170f29e89d79064463b7fc7a0908b9d0d5114e8009c3a259", + "sha256:51720c776d148bad2372ca21ca29256ed483aa9a4cdefefcef49006dff2a6835", + "sha256:52825b01f5c4c1c4eb0db253ec09c7aa17e1a7304d247c48b6f3599ef40db8bd", + "sha256:538fd81bb5e430cc1381a443971c0475582ff9f434c16cd46d2c66763ce85d9d", + "sha256:5c1538c38584029352878a0466f03a8ee7547d7bd9f641f57a0f3017a7c905b8", + "sha256:6ff8b244d7085a0b425b56d327b480c3b29cafbd2eff27316a004f9a7391ae07", + "sha256:7178def594014aa6c35a8ff411cf37d682f428b3b5617ca79029d8ae72f5402b", + "sha256:720a5ca70e136b675af3af63db533c1c8c9181314d207568bbe79051f122669e", + "sha256:7f1478736fcebb90f97e40aff11a5f253af890c845ee0c850fe80aa060a267c6", + "sha256:855fe27b80375e5c5878492f0729540db47b186509c98dae341254c8f45f42ae", + "sha256:8963b83d53ee733a6e4196954502b33567ad07dfd74851f32be18eb932fb1cb9", + "sha256:9261ed810972061388918c83c3f5cd46079d875026ba97380f3e3978a72f503d", + "sha256:99b00bc72855812a60d253420d8a2eae839b0afa4938f09f4d2aa9bb4654263a", + "sha256:ab3c84fa13c04aeeeabb2a7f67a25ef5d77ac9d6486ff33ded762ef353aa5592", + "sha256:afe3fe972c645b4632c563d3f3eff1cdca2fa058f730df2b93a35e3b0c538218", + "sha256:d19c413b3c07cbecf1f991e2221746b0d2a9410b59cb3f4fb9557f0365a1a817", + "sha256:df9824ac11deaf007443e7ed2a4a26bebff98d2bc43c6da21b2b64185da011c4", + "sha256:e46f44b54ebddbeedbd3d5b289a893219065ef805d95094d16a0af6630f5d410", + "sha256:f5ac9a4eeb1ec0f1ccdc6f326bcdb464de5f80eb07fb38b5ddd7b0de6bc61e55" ], "index": "pypi", - "version": "==1.7.1" + "markers": "python_version >= '3.8'", + "version": "==1.8.0" }, "mypy-extensions": { "hashes": [ @@ -860,6 +935,7 @@ "sha256:d30bad9abf165f7785c15a21a1f46da7d0677cb00ee7ff4c579fd38922efe15d" ], "index": "pypi", + "markers": "python_version >= '3.9'", "version": "==3.6.0" }, "ptyprocess": { @@ -879,11 +955,12 @@ }, "pytest": { "hashes": [ - "sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac", - "sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5" + "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280", + "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8" ], "index": "pypi", - "version": "==7.4.3" + "markers": "python_version >= '3.7'", + "version": "==7.4.4" }, "python-dateutil": { "hashes": [ @@ -891,6 +968,7 @@ "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" ], "index": "pypi", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.8.2" }, "python-dotenv": { @@ -899,16 +977,9 @@ "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==1.0.0" }, - "pywin32-ctypes": { - "hashes": [ - "sha256:3426e063bdd5fd4df74a14fa3cf80a0b42845a87e1d1e81f6549f9daec593a60", - "sha256:bf490a1a709baf35d688fe0ecf980ed4de11d2b3e37b51e5442587a75d9957e7" - ], - "markers": "sys_platform == 'win32'", - "version": "==0.2.2" - }, "pyyaml": { "hashes": [ "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5", @@ -962,7 +1033,7 @@ "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d", "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f" ], - "index": "pypi", + "markers": "python_version >= '3.6'", "version": "==6.0.1" }, "rich": { @@ -975,34 +1046,35 @@ }, "ruff": { "hashes": [ - "sha256:05ffe9dbd278965271252704eddb97b4384bf58b971054d517decfbf8c523f05", - "sha256:5daaeaf00ae3c1efec9742ff294b06c3a2a9db8d3db51ee4851c12ad385cda30", - "sha256:7d076717c67b34c162da7c1a5bda16ffc205e0e0072c03745275e7eab888719f", - "sha256:7de792582f6e490ae6aef36a58d85df9f7a0cfd1b0d4fe6b4fb51803a3ac96fa", - "sha256:a05b0ddd7ea25495e4115a43125e8a7ebed0aa043c3d432de7e7d6e8e8cd6448", - "sha256:aa8ee4f8440023b0a6c3707f76cadce8657553655dcbb5fc9b2f9bb9bee389f6", - "sha256:b6a21ab023124eafb7cef6d038f835cb1155cd5ea798edd8d9eb2f8b84be07d9", - "sha256:bd8ee69b02e7bdefe1e5da2d5b6eaaddcf4f90859f00281b2333c0e3a0cc9cd6", - "sha256:c8e3255afd186c142eef4ec400d7826134f028a85da2146102a1172ecc7c3696", - "sha256:ce697c463458555027dfb194cb96d26608abab920fa85213deb5edf26e026664", - "sha256:db6cedd9ffed55548ab313ad718bc34582d394e27a7875b4b952c2d29c001b26", - "sha256:e49fbdfe257fa41e5c9e13c79b9e79a23a79bd0e40b9314bc53840f520c2c0b3", - "sha256:e6f08ca730f4dc1b76b473bdf30b1b37d42da379202a059eae54ec7fc1fbcfed", - "sha256:f35960b02df6b827c1b903091bb14f4b003f6cf102705efc4ce78132a0aa5af3", - "sha256:f41f692f1691ad87f51708b823af4bb2c5c87c9248ddd3191c8f088e66ce590a", - "sha256:f7ee467677467526cfe135eab86a40a0e8db43117936ac4f9b469ce9cdb3fb62", - "sha256:ff78a7583020da124dd0deb835ece1d87bb91762d40c514ee9b67a087940528b" + "sha256:226b517f42d59a543d6383cfe03cccf0091e3e0ed1b856c6824be03d2a75d3b6", + "sha256:2f59bcf5217c661254bd6bc42d65a6fd1a8b80c48763cb5c2293295babd945dd", + "sha256:5f0312ba1061e9b8c724e9a702d3c8621e3c6e6c2c9bd862550ab2951ac75c16", + "sha256:6bbbc3042075871ec17f28864808540a26f0f79a4478c357d3e3d2284e832998", + "sha256:7a36fa90eb12208272a858475ec43ac811ac37e91ef868759770b71bdabe27b6", + "sha256:9a1600942485c6e66119da294c6294856b5c86fd6df591ce293e4a4cc8e72989", + "sha256:9ebb40442f7b531e136d334ef0851412410061e65d61ca8ce90d894a094feb22", + "sha256:9fb6b3b86450d4ec6a6732f9f60c4406061b6851c4b29f944f8c9d91c3611c7a", + "sha256:a623349a505ff768dad6bd57087e2461be8db58305ebd5577bd0e98631f9ae69", + "sha256:b13ba5d7156daaf3fd08b6b993360a96060500aca7e307d95ecbc5bb47a69296", + "sha256:dcaab50e278ff497ee4d1fe69b29ca0a9a47cd954bb17963628fa417933c6eb1", + "sha256:e261f1baed6291f434ffb1d5c6bd8051d1c2a26958072d38dfbec39b3dda7352", + "sha256:e3fd36e0d48aeac672aa850045e784673449ce619afc12823ea7868fcc41d8ba", + "sha256:e6894b00495e00c27b6ba61af1fc666f17de6140345e5ef27dd6e08fb987259d", + "sha256:ee3febce7863e231a467f90e681d3d89210b900d49ce88723ce052c8761be8c7", + "sha256:f57de973de4edef3ad3044d6a50c02ad9fc2dff0d88587f25f1a48e3f72edf5e", + "sha256:f988746e3c3982bea7f824c8fa318ce7f538c4dfefec99cd09c8770bd33e6539" ], "index": "pypi", - "version": "==0.1.8" + "markers": "python_version >= '3.7'", + "version": "==0.1.13" }, "setuptools": { "hashes": [ - "sha256:1e8fdff6797d3865f37397be788a4e3cba233608e9b509382a2777d25ebde7f2", - "sha256:735896e78a4742605974de002ac60562d286fa8051a7e2299445e8e8fbb01aa6" + "sha256:385eb4edd9c9d5c17540511303e39a147ce2fc04bc55289c322b9e5904fe2c05", + "sha256:be1af57fc409f93647f2e8e4573a142ed38724b8cdd389706a867bb4efcf1e78" ], "markers": "python_version >= '3.8'", - "version": "==69.0.2" + "version": "==69.0.3" }, "shellingham": { "hashes": [ @@ -1070,10 +1142,10 @@ }, "trove-classifiers": { "hashes": [ - "sha256:02307750cbbac2b3d13078662f8a5bf077732bf506e9c33c97204b7f68f3699e", - "sha256:ff8f7fd82c7932113b46e7ef6742c70091cc63640c8c65db00d91f2e940b9514" + "sha256:3c1ff4deb10149c7e39ede6e5bbc107def64362ef1ee7590ec98d71fb92f1b6a", + "sha256:6e36caf430ff6485c4b57a4c6b364a13f6a898d16b9417c6c37467e59c14b05a" ], - "version": "==2023.11.29" + "version": "==2024.1.8" }, "typing-extensions": { "hashes": [ @@ -1105,6 +1177,7 @@ "sha256:568a4176db7468d0157817ae3bb1847a19f1ddc629849af487f9d3b279bff77d" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==2.10" }, "zipp": { diff --git a/test/gen_data.py b/test/gen_data.py new file mode 100644 index 0000000..812515a --- /dev/null +++ b/test/gen_data.py @@ -0,0 +1,38 @@ +from json_rest import Patient +from ujson import dumps +from enum import Enum +import sys +from protobuf_grpc import generate_patients + + +class Format(Enum): + Json = 1 + Protobuf = 2 + + def __repr__(self): + return self.value + + def __str__(self): + return str(self.value) + + +def main(size, data_format: Format): + curr_size = 0 + patient_list = [] + while curr_size < size: + p = Patient() + p.generate_names() + p.generate_telecoms() + p.generate_addresses() + p.generate_contacts() + patient_list.append(p) + curr_size += sys.getsizeof(p) + match data_format: + case Format.Json: + return dumps([p.ret_dict() for p in patient_list]) + case Format.Protobuf: + return len(generate_patients(size).all_patients) + + +if __name__ == '__main__': + print(main(2048, Format.Protobuf)) diff --git a/test/data_gen_obj.py b/test/json_rest.py similarity index 94% rename from test/data_gen_obj.py rename to test/json_rest.py index 380fe40..31d85cd 100644 --- a/test/data_gen_obj.py +++ b/test/json_rest.py @@ -1,9 +1,7 @@ from faker import Faker import datetime from dateutil.relativedelta import relativedelta -import sys import random -from json import dumps class Telecom: @@ -154,23 +152,3 @@ def ret_dict(self): for c in self.__contacts] } return p_dict - - -def main(size): - curr_size = 0 - patient_list = [] - while curr_size < size: - p = Patient() - p.generate_names() - p.generate_telecoms() - p.generate_addresses() - p.generate_contacts() - patient_list.append(p) - print(dumps(p.ret_dict(), indent=4)) - curr_size += sys.getsizeof(p) - - return patient_list - - -if __name__ == '__main__': - print(main(128)) diff --git a/test/protobuf_grpc.proto b/test/protobuf_grpc.proto new file mode 100644 index 0000000..590f23b --- /dev/null +++ b/test/protobuf_grpc.proto @@ -0,0 +1,53 @@ +syntax = 'proto2'; + +message Name { + optional string use = 1; + optional string text = 2; + optional string given = 3; + optional string family = 4; + optional string active = 5; +} + +message Telecom { + optional string system = 1; + optional string value = 2; + optional string use = 3; + optional int32 rank = 4; + optional string active = 5; +} + +message Address { + optional string use = 1; + optional string type = 2; + optional string text = 3; + optional string line = 4; + optional string city = 5; + optional string state = 6; + optional string zipcode = 7; + optional string country = 8; + map period = 9; +} + +message Contact { + optional string relation = 1; + optional Name name = 2; + optional Telecom telecom = 3; + optional Address address = 4; +} + +message Patient { + optional int32 id = 1; + optional bool active = 2; + repeated Name names = 3; + repeated Telecom telecoms = 4; + optional string gender = 5; + optional string birth_date = 6; + optional string deceased_on = 7; + repeated Address addresses = 8; + optional string marital_status = 9; + repeated Contact contacts = 10; +} + +message Patients { + repeated Patient all_patients = 1; +} diff --git a/test/protobuf_grpc.py b/test/protobuf_grpc.py new file mode 100644 index 0000000..ed26a7c --- /dev/null +++ b/test/protobuf_grpc.py @@ -0,0 +1,118 @@ +import protobuf_grpc_pb2 as pb2 +from faker import Faker +import datetime +from dateutil.relativedelta import relativedelta +import random +import sys + + +def generate_name(full_name, birth_date): + faker = Faker('en_US') + name = pb2.Name() + name.use = faker.word(ext_word_list=['usual', 'official', 'temp', 'nickname', 'anonymous', 'old', 'maiden']) + name.text = full_name + name.given = full_name.split(' ')[0] + name.family = full_name.split(' ')[1] + name.active = faker.date_between(start_date=datetime.datetime.strptime(birth_date, '%m/%d/%Y')).strftime('%m/%d/%Y') + return name + + +def generate_telecom(birth_date, given, family): + faker = Faker('en_US') + contact_point = pb2.Telecom() + contact_point.system = faker.word(ext_word_list=['phone', 'fax', 'email', 'sms']) + contact_point.use = faker.word(ext_word_list=['home', 'work', 'temp', 'old', 'mobile']) + contact_point.rank = 0 # set in gen_patient() + contact_point.active = faker.date_between(start_date=datetime.datetime.strptime(birth_date, + '%m/%d/%Y')).strftime('%m/%d/%Y') + if contact_point.system == 'email': + contact_point.value = f'{given}{family}@{faker.domain_name()}' + else: + contact_point.value = faker.phone_number() + return contact_point + + +def generate_address(birth_date): + faker = Faker('en_US') + address = pb2.Address() + address.use = faker.word(ext_word_list=['home', 'work', 'temp', 'old', 'billing']) + address.type = faker.word(ext_word_list=['postal', 'physical', 'both']) + address.line = faker.street_address() + address.city = faker.city() + address.state = faker.word(ext_word_list=["AL", "AK", "AZ", "AR", "CA", "CO", "CT", "DE", "FL", "GA", "HI", + "ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME", "MD", "MA", "MI", + "MN", "MS", "MO", "MT", "NE", "NV", "NH", "NJ", "NM", "NY", "NC", + "ND", "OH", "OK", "OR", "PA", "RI", "SC", "SD", "TN", "TX", "UT", + "VT", "VA", "WA", "WV", "WI", "WY"]) + address.zipcode = faker.postcode() + address.country = 'USA' + address.period['start'] = faker.date_between(start_date=datetime.datetime.strptime(birth_date, + '%m/%d/%Y')).strftime('%m/%d/%Y') + address.period['end'] = '' if address.use in ['home', 'work', 'billing'] else faker.date_between( + start_date=datetime.datetime.strptime(address.period['start'], '%m/%d/%Y') + + relativedelta(years=1)).strftime('%m/%d/%Y') + address.text = f'{address.line} {address.city}, {address.state} {address.zipcode} {address.country}' + return address + + +def generate_contact(): + faker = Faker('en_US') + contact = pb2.Contact() + contact.relation = faker.word(ext_word_list=['emergency', 'family', 'guardian', 'friend', 'partner', 'work', + 'caregiver', 'agent', 'guarantor', 'parent']) + name = faker.name() + birth_date = faker.date_of_birth(minimum_age=18, maximum_age=100).strftime('%m/%d/%Y') + contact.name.CopyFrom(generate_name(name, birth_date)) + contact.telecom.CopyFrom(generate_telecom(birth_date, name.split(' ')[0], name.split(' ')[1])) + contact.address.CopyFrom(generate_address(birth_date)) + return contact + + +def generate_patients(size): + curr_size = 0 + patients = pb2.Patients() + while curr_size < size: + faker = Faker('en_US') + # Define preliminary patient attributes using faker + patient = pb2.Patient() + patient.id = faker.pyint(min_value=11111, max_value=99999) + patient.active = faker.boolean(chance_of_getting_true=90) + patient.gender = faker.word(ext_word_list=['Male', 'Female', 'Non-binary', 'Other']) + patient.birth_date = faker.date_of_birth(minimum_age=18, maximum_age=100).strftime('%m/%d/%Y') + patient.deceased_on = (faker.date_between(start_date=datetime.date.today()-relativedelta(years=10)).strftime( + '%m/%d/%Y') if datetime.datetime.strptime(patient.birth_date, '%m/%d/%Y') + < datetime.datetime.today()-relativedelta(years=65) and + faker.boolean(chance_of_getting_true=15) else '') + patient.marital_status = faker.word(ext_word_list=['Married', 'Single', 'Separated', 'Divorced', 'Widowed']) + + # Set the maximum number of items for each repeated object + max_names = 3 + max_contact_points = 2 + max_addresses = 2 + max_contacts = 4 + + # Generate repeated Name objects + for x in range(random.randint(1, max_names)): + if patient.gender == 'Non-Binary' or patient.gender == 'Other': + full_name = faker.name_nonbinary() + else: + full_name = faker.name_male() if patient.gender == 'Male' else faker.name_female() + patient.names.append(generate_name(full_name, patient.birth_date)) + # Generate repeated Telecom objects + for x in range(random.randint(1, max_contact_points)): + given = patient.names[random.randint(0, len(patient.names)-1)].given + family = patient.names[random.randint(0, len(patient.names)-1)].family + contact_point = generate_telecom(patient.birth_date, given, family) + contact_point.rank = x + patient.telecoms.append(contact_point) + # Generate repeated Address objects + for x in range(random.randint(1, max_addresses)): + patient.addresses.append(generate_address(patient.birth_date)) + # Generate repeated Contact objects + for x in range(random.randint(1, max_contacts)): + patient.contacts.append(generate_contact()) + # Update and keep track of size of patients + patients.all_patients.append(patient) + curr_size += sys.getsizeof(patient) + + return patients diff --git a/test/protobuf_grpc_pb2.py b/test/protobuf_grpc_pb2.py new file mode 100644 index 0000000..0df1356 --- /dev/null +++ b/test/protobuf_grpc_pb2.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: protobuf_grpc.proto +# Protobuf Python Version: 4.25.2 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x13protobuf_grpc.proto\"P\n\x04Name\x12\x0b\n\x03use\x18\x01 \x01(\t\x12\x0c\n\x04text\x18\x02 \x01(\t\x12\r\n\x05given\x18\x03 \x01(\t\x12\x0e\n\x06\x66\x61mily\x18\x04 \x01(\t\x12\x0e\n\x06\x61\x63tive\x18\x05 \x01(\t\"S\n\x07Telecom\x12\x0e\n\x06system\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\x12\x0b\n\x03use\x18\x03 \x01(\t\x12\x0c\n\x04rank\x18\x04 \x01(\x05\x12\x0e\n\x06\x61\x63tive\x18\x05 \x01(\t\"\xd4\x01\n\x07\x41\x64\x64ress\x12\x0b\n\x03use\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t\x12\x0c\n\x04line\x18\x04 \x01(\t\x12\x0c\n\x04\x63ity\x18\x05 \x01(\t\x12\r\n\x05state\x18\x06 \x01(\t\x12\x0f\n\x07zipcode\x18\x07 \x01(\t\x12\x0f\n\x07\x63ountry\x18\x08 \x01(\t\x12$\n\x06period\x18\t \x03(\x0b\x32\x14.Address.PeriodEntry\x1a-\n\x0bPeriodEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"f\n\x07\x43ontact\x12\x10\n\x08relation\x18\x01 \x01(\t\x12\x13\n\x04name\x18\x02 \x01(\x0b\x32\x05.Name\x12\x19\n\x07telecom\x18\x03 \x01(\x0b\x32\x08.Telecom\x12\x19\n\x07\x61\x64\x64ress\x18\x04 \x01(\x0b\x32\x08.Address\"\xe1\x01\n\x07Patient\x12\n\n\x02id\x18\x01 \x01(\x05\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x14\n\x05names\x18\x03 \x03(\x0b\x32\x05.Name\x12\x1a\n\x08telecoms\x18\x04 \x03(\x0b\x32\x08.Telecom\x12\x0e\n\x06gender\x18\x05 \x01(\t\x12\x12\n\nbirth_date\x18\x06 \x01(\t\x12\x13\n\x0b\x64\x65\x63\x65\x61sed_on\x18\x07 \x01(\t\x12\x1b\n\taddresses\x18\x08 \x03(\x0b\x32\x08.Address\x12\x16\n\x0emarital_status\x18\t \x01(\t\x12\x1a\n\x08\x63ontacts\x18\n \x03(\x0b\x32\x08.Contact\"*\n\x08Patients\x12\x1e\n\x0c\x61ll_patients\x18\x01 \x03(\x0b\x32\x08.Patient') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'protobuf_grpc_pb2', _globals) +if _descriptor._USE_C_DESCRIPTORS == False: + DESCRIPTOR._options = None + _globals['_ADDRESS_PERIODENTRY']._options = None + _globals['_ADDRESS_PERIODENTRY']._serialized_options = b'8\001' + _globals['_NAME']._serialized_start=23 + _globals['_NAME']._serialized_end=103 + _globals['_TELECOM']._serialized_start=105 + _globals['_TELECOM']._serialized_end=188 + _globals['_ADDRESS']._serialized_start=191 + _globals['_ADDRESS']._serialized_end=403 + _globals['_ADDRESS_PERIODENTRY']._serialized_start=358 + _globals['_ADDRESS_PERIODENTRY']._serialized_end=403 + _globals['_CONTACT']._serialized_start=405 + _globals['_CONTACT']._serialized_end=507 + _globals['_PATIENT']._serialized_start=510 + _globals['_PATIENT']._serialized_end=735 + _globals['_PATIENTS']._serialized_start=737 + _globals['_PATIENTS']._serialized_end=779 +# @@protoc_insertion_point(module_scope) From 78a1332af2d5b690b7904888d46689b68dbecb29 Mon Sep 17 00:00:00 2001 From: Nmeng01 <123509773+Nmeng01@users.noreply.github.com> Date: Sun, 14 Jan 2024 20:40:12 -0500 Subject: [PATCH 3/7] return data rather than length --- test/gen_data.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/gen_data.py b/test/gen_data.py index 812515a..b6e4ebb 100644 --- a/test/gen_data.py +++ b/test/gen_data.py @@ -31,8 +31,8 @@ def main(size, data_format: Format): case Format.Json: return dumps([p.ret_dict() for p in patient_list]) case Format.Protobuf: - return len(generate_patients(size).all_patients) + return generate_patients(size).all_patients if __name__ == '__main__': - print(main(2048, Format.Protobuf)) + print(main(128, Format.Protobuf)) From 1d5133512d791ab651bde7fe1cb67e71479ee14b Mon Sep 17 00:00:00 2001 From: Nmeng01 <123509773+Nmeng01@users.noreply.github.com> Date: Thu, 18 Jan 2024 14:37:17 -0500 Subject: [PATCH 4/7] move data generation to separate package --- .DS_Store | Bin 0 -> 6148 bytes .idea/.gitignore | 3 +++ .idea/encodings.xml | 6 ++++++ .idea/gRPC-vs-REST.iml | 12 ++++++++++++ .idea/inspectionProfiles/profiles_settings.xml | 6 ++++++ .idea/misc.xml | 4 ++++ .idea/modules.xml | 8 ++++++++ .idea/vcs.xml | 6 ++++++ patient_data/__init__.py | 0 {test => patient_data}/gen_data.py | 0 {test => patient_data}/json_rest.py | 0 {test => patient_data}/protobuf_grpc.proto | 0 {test => patient_data}/protobuf_grpc.py | 0 {test => patient_data}/protobuf_grpc_pb2.py | 0 14 files changed, 45 insertions(+) create mode 100644 .DS_Store create mode 100644 .idea/.gitignore create mode 100644 .idea/encodings.xml create mode 100644 .idea/gRPC-vs-REST.iml create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 patient_data/__init__.py rename {test => patient_data}/gen_data.py (100%) rename {test => patient_data}/json_rest.py (100%) rename {test => patient_data}/protobuf_grpc.proto (100%) rename {test => patient_data}/protobuf_grpc.py (100%) rename {test => patient_data}/protobuf_grpc_pb2.py (100%) diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..28c57517642aed863af24e0fc2e2d8709a48dbd4 GIT binary patch literal 6148 zcmeHKyH3ME5S#@UL1|J_-Y@V6rzm_uegI*U0tFdiQ_#8Nx0!t)1sy0I1?)%eJD)D z8n`&xr-O@)0K|^81&?i(AQmNvHE?kx!w{DeT`DnRh|9^BsH=gCqst*Nd`R3`VnPwS zJNGYE4ylg0rUU7~R|j + + + + + diff --git a/.idea/gRPC-vs-REST.iml b/.idea/gRPC-vs-REST.iml new file mode 100644 index 0000000..292aeb0 --- /dev/null +++ b/.idea/gRPC-vs-REST.iml @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..cc5462d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..70bb778 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..3306640 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..5ace414 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/patient_data/__init__.py b/patient_data/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/test/gen_data.py b/patient_data/gen_data.py similarity index 100% rename from test/gen_data.py rename to patient_data/gen_data.py diff --git a/test/json_rest.py b/patient_data/json_rest.py similarity index 100% rename from test/json_rest.py rename to patient_data/json_rest.py diff --git a/test/protobuf_grpc.proto b/patient_data/protobuf_grpc.proto similarity index 100% rename from test/protobuf_grpc.proto rename to patient_data/protobuf_grpc.proto diff --git a/test/protobuf_grpc.py b/patient_data/protobuf_grpc.py similarity index 100% rename from test/protobuf_grpc.py rename to patient_data/protobuf_grpc.py diff --git a/test/protobuf_grpc_pb2.py b/patient_data/protobuf_grpc_pb2.py similarity index 100% rename from test/protobuf_grpc_pb2.py rename to patient_data/protobuf_grpc_pb2.py From a6ae9af68c27e53caf68a6d3774a9efe8f86a4ff Mon Sep 17 00:00:00 2001 From: Nmeng01 <123509773+Nmeng01@users.noreply.github.com> Date: Mon, 29 Jan 2024 14:37:35 -0500 Subject: [PATCH 5/7] implemented dataclass and faker seed --- patient_data/gen_data.py | 135 ++++++++++++++++++++++++-- patient_data/json_rest.py | 154 ------------------------------ patient_data/patient_dataclass.py | 56 +++++++++++ patient_data/protobuf_grpc.proto | 41 ++++---- patient_data/protobuf_grpc.py | 152 +++++++++++------------------ patient_data/protobuf_grpc_pb2.py | 20 ++-- 6 files changed, 268 insertions(+), 290 deletions(-) delete mode 100644 patient_data/json_rest.py create mode 100644 patient_data/patient_dataclass.py diff --git a/patient_data/gen_data.py b/patient_data/gen_data.py index b6e4ebb..e4a68e3 100644 --- a/patient_data/gen_data.py +++ b/patient_data/gen_data.py @@ -1,10 +1,78 @@ -from json_rest import Patient +import random +from faker import Faker from ujson import dumps from enum import Enum import sys -from protobuf_grpc import generate_patients +from datetime import date +from dateutil.relativedelta import relativedelta +import protobuf_grpc as proto +import patient_dataclass as pd +from dataclasses import asdict +faker = Faker('en_US') + +# Method to create a fake name +def generate_name(seed, birth_date, gender=''): + Faker.seed(seed) + if gender == 'Non-Binary' or gender == 'Other': + full_name = faker.name_nonbinary() + elif gender == 'Male': + full_name = faker.name_male() + elif gender == 'Female': + full_name = faker.name_female() + else: + full_name = faker.name() + n = pd.Name( + faker.word(ext_word_list=['usual', 'official', 'temp', 'nickname', 'anonymous', 'old', 'maiden']), + full_name, + full_name.split(' ')[0], + full_name.split(' ')[1], + faker.date_between(start_date=birth_date) + ) + + return n + + +# Method to create a fake telecom +def generate_telecom(seed, rank, birth_date, names): + Faker.seed(seed) + t = pd.Telecom( + faker.word(ext_word_list=['phone', 'fax', 'email', 'sms']), + faker.word(ext_word_list=['home', 'work', 'temp', 'old', 'mobile']), + rank, + faker.date_between(start_date=birth_date) + ) + if t.system == 'email': + t.value = f'{names[random.randint(0, len(names) - 1)].given}' \ + f'{names[random.randint(0, len(names) - 1)].family}@{faker.domain_name()}' + else: + t.value = faker.phone_number() + + return t + + +# Method to create a fake address +def generate_address(seed, birth_date): + Faker.seed(seed) + a = pd.Address( + faker.word(ext_word_list=['home', 'work', 'temp', 'old', 'billing']), + faker.word(ext_word_list=['postal', 'physical', 'both']), + faker.street_address(), + faker.city(), + faker.state(), + faker.postcode(), + 'USA', + faker.date_between(start_date=birth_date), + ) + a.text = f'{a.line} {a.city}, {a.state} {a.zipcode} {a.country}' + if a.use in ['temp', 'old']: + a.period_end = faker.date_between(start_date=a.period_start + relativedelta(years=1)) + + return a + + +# Format class for ease of selecting data format class Format(Enum): Json = 1 Protobuf = 2 @@ -17,21 +85,70 @@ def __str__(self): def main(size, data_format: Format): + # Set-up curr_size = 0 + seed = 1 patient_list = [] + + # Set the maximum number of items for each repeated dataclass + max_names = 3 + max_telecoms = 2 + max_addresses = 2 + max_contacts = 4 + + # Generate patients while curr_size < size: - p = Patient() - p.generate_names() - p.generate_telecoms() - p.generate_addresses() - p.generate_contacts() + Faker.seed(seed) + random.seed(seed) + p = pd.Patient( + faker.pyint(min_value=11111, max_value=99999), + faker.boolean(chance_of_getting_true=90), + faker.word(ext_word_list=['Male', 'Female', 'Non-binary', 'Other']), + faker.date_of_birth(minimum_age=18, maximum_age=100), + faker.word(ext_word_list=['Married', 'Single', 'Separated', 'Divorced', 'Widowed']) + ) + + # Find date of death if applicable + if p.birth_date < date.today() - relativedelta(years=65) and \ + faker.boolean(chance_of_getting_true=15): + p.deceased_on = faker.date_between(start_date=date.today()-relativedelta(years=10)).strftime('%m/%d/%Y') + + # Generate names + for x in range(random.randint(1, max_names)): + seed += 1 + p.names.append(generate_name(seed, p.birth_date, p.gender)) + + # Generate telecoms + for x in range(random.randint(1, max_telecoms)): + seed += 1 + p.telecoms.append(generate_telecom(seed, x+1, p.birth_date, p.names)) + + # Generate addresses + for x in range(random.randint(1, max_addresses)): + seed += 1 + p.addresses.append(generate_address(seed, p.birth_date)) + # Generate contacts + for x in range(random.randint(1, max_contacts)): + c_birth_date = faker.date_of_birth(minimum_age=18, maximum_age=100) + c = pd.Contact( + faker.word(ext_word_list=['emergency', 'family', 'guardian', 'friend', 'partner', 'work', + 'caregiver', 'agent', 'guarantor', 'parent']), + generate_name(seed+1, c_birth_date), + generate_address(seed+1, c_birth_date) + ) + seed += 3 + c.telecom = generate_telecom(seed, 1, c_birth_date, [c.name]) + p.contacts.append(c) + # Add patient to list and keep track of size patient_list.append(p) curr_size += sys.getsizeof(p) + seed += 1 + match data_format: case Format.Json: - return dumps([p.ret_dict() for p in patient_list]) + return dumps([asdict(p) for p in patient_list], indent=4, default=str) case Format.Protobuf: - return generate_patients(size).all_patients + return proto.generate_patients(patient_list).all_patients if __name__ == '__main__': diff --git a/patient_data/json_rest.py b/patient_data/json_rest.py deleted file mode 100644 index 31d85cd..0000000 --- a/patient_data/json_rest.py +++ /dev/null @@ -1,154 +0,0 @@ -from faker import Faker -import datetime -from dateutil.relativedelta import relativedelta -import random - - -class Telecom: - def __init__(self, birth_date=datetime.date(2000, 1, 1)): - faker = Faker('en_US') - self.__system = faker.word(ext_word_list=['phone', 'fax', 'email', 'sms']) - self.__value = '' - self.__use = faker.word(ext_word_list=['home', 'work', 'temp', 'old', 'mobile']) - self.__rank = 0 - self.__active = faker.date_between(start_date=birth_date).strftime('%m/%d/%Y') - - def set_value(self, first_name, last_name): - faker = Faker('en_US') - if self.__system == 'email': - self.__value = f'{first_name}{last_name}@{faker.domain_name()}' - else: - self.__value = faker.phone_number() - - def set_rank(self, num): - self.__rank = num - - def ret_dict(self): - return {'System': self.__system, - 'Value': self.__value, - 'Use': self.__use, - 'Rank': self.__rank, - 'Active Since': self.__active} - - -class Address: - def __init__(self, birth_date=datetime.date(2000, 1, 1)): - faker = Faker('en_US') - self.__use = faker.word(ext_word_list=['home', 'work', 'temp', 'old', 'billing']) - self.__type = faker.word(ext_word_list=['postal', 'physical', 'both']) - self.__text = '' - self.__line = faker.street_address() - self.__city = faker.city() - self.__state = faker.word(ext_word_list=["AL", "AK", "AZ", "AR", "CA", "CO", "CT", "DE", "FL", "GA", "HI", - "ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME", "MD", "MA", "MI", - "MN", "MS", "MO", "MT", "NE", "NV", "NH", "NJ", "NM", "NY", "NC", - "ND", "OH", "OK", "OR", "PA", "RI", "SC", "SD", "TN", "TX", "UT", - "VT", "VA", "WA", "WV", "WI", "WY"]) - self.__zipcode = faker.postcode() - self.__country = 'USA' - self.__period = {'start': faker.date_between(start_date=birth_date), 'end': ''} - - def set_text(self): - self.__text = f'{self.__line} {self.__city}, {self.__state} {self.__zipcode} {self.__country}' - - def set_end_date(self): - faker = Faker('en_US') - if self.__use in ['home', 'work', 'billing']: - self.__period['end'] = '' - else: - self.__period['end'] = faker.date_between( - start_date=self.__period['start'] + relativedelta(years=1)) - - def ret_dict(self): - return {'Use': self.__use, - 'Type': self.__type, - 'Text': self.__text, - 'Line': self.__line, - 'City': self.__city, - 'State': self.__state, - 'Zipcode': self.__zipcode, - 'Country': self.__country, - 'Period': f'{self.__period["start"]} - {self.__period["end"]}'} - - -class Patient: - def __init__(self): - faker = Faker('en_US') - self.__id = faker.pyint(min_value=11111, max_value=99999) - self.__active = faker.boolean(chance_of_getting_true=90) - self.__names = [] - self.__telecoms = [] - self.__gender = faker.word(ext_word_list=['Male', 'Female', 'Non-binary', 'Other']) - self.__birth_date = faker.date_of_birth(minimum_age=18, maximum_age=100) - self.__deceased_on = (faker.date_between(start_date=datetime.date.today()-relativedelta(years=10)) - if self.__birth_date < datetime.date.today()-relativedelta(years=65) and - faker.boolean(chance_of_getting_true=15) else '') - self.__addresses = [] - self.__marital_status = faker.word(ext_word_list=['Married', 'Single', 'Separated', 'Divorced', 'Widowed']) - self.__contacts = [] - - def generate_names(self, max_names=3): - faker = Faker('en_US') - for x in range(random.randint(1, max_names)): - if self.__gender == 'Non-Binary' or self.__gender == 'Other': - full_name = faker.name_nonbinary() - else: - full_name = faker.name_male() if self.__gender == 'Male' else faker.name_female() - name = { - 'use': faker.word(ext_word_list=['usual', 'official', 'temp', 'nickname', 'anonymous', 'old', 'maiden']), - 'text': full_name, - 'given': full_name.split(' ')[0], - 'family': full_name.split(' ')[1], - 'active': faker.date_between(start_date=self.__birth_date).strftime('%m/%d/%Y') - } - self.__names.append(name) - - def generate_telecoms(self, max_contact_points=3): - for x in range(random.randint(1, max_contact_points)): - contact_point = Telecom(birth_date=self.__birth_date) - contact_point.set_value(self.__names[random.randint(0, len(self.__names)-1)]['given'], - self.__names[random.randint(0, len(self.__names)-1)]['family']) - contact_point.set_rank(x) - self.__telecoms.append(contact_point) - - def generate_addresses(self, max_addresses=3): - for x in range(random.randint(1, max_addresses)): - address = Address(birth_date=self.__birth_date) - address.set_text() - address.set_end_date() - self.__addresses.append(address) - - def generate_contacts(self, max_contacts=3): - faker = Faker('en_US') - for x in range(random.randint(1, max_contacts)): - contact = { - 'relation': faker.word(ext_word_list=['emergency', 'family', 'guardian', 'friend', 'partner', 'work', - 'caregiver', 'agent', 'guarantor', 'parent']), - 'name': faker.name(), - 'telecom': Telecom(), - 'address': Address() - } - contact['telecom'].set_value(contact['name'].split(' ')[0], contact['name'].split(' ')[1]) - contact['telecom'].set_rank(x) - contact['address'].set_text() - contact['address'].set_end_date() - self.__contacts.append(contact) - - def ret_dict(self): - p_dict = { - 'ID': self.__id, - 'Active': self.__active, - 'Names': self.__names, - 'Telecoms': [t.ret_dict() for t in self.__telecoms], - 'Gender': self.__gender, - 'Date of Birth': self.__birth_date.strftime('%m/%d/%Y'), - 'Deceased Date': self.__deceased_on.strftime('%m/%d/%Y') if self.__deceased_on != '' else self.__deceased_on, - 'Addresses': [a.ret_dict() for a in self.__addresses], - 'Marital Status': self.__marital_status, - 'Contacts': [{'Relation': c["relation"], - 'Name': c["name"] , - 'Telecom': c["telecom"].ret_dict(), - 'Address': c["address"].ret_dict()} - for c in self.__contacts] - } - return p_dict diff --git a/patient_data/patient_dataclass.py b/patient_data/patient_dataclass.py new file mode 100644 index 0000000..79cfea5 --- /dev/null +++ b/patient_data/patient_dataclass.py @@ -0,0 +1,56 @@ +from dataclasses import dataclass, field +from datetime import date + + +@dataclass +class Name: + use: str + text: str + given: str + family: str + active: date + + +@dataclass +class Telecom: + system: str + use: str + rank: int + active: date + value: str = field(default='') + + +@dataclass +class Address: + use: str + type: str + line: str + city: str + state: str + zipcode: str + country: str + period_start: date + text: str = field(default='') + period_end: date = field(default=None) + + +@dataclass +class Contact: + relation: str + name: Name + address: Address + telecom: Telecom = field(default=Telecom) + + +@dataclass +class Patient: + id: int + active: bool + gender: str + birth_date: date + marital_status: str + deceased_on: str = field(default='') + names: list[Name] = field(default_factory=list) + telecoms: list[Telecom] = field(default_factory=list) + addresses: list[Address] = field(default_factory=list) + contacts: list[Contact] = field(default_factory=list) diff --git a/patient_data/protobuf_grpc.proto b/patient_data/protobuf_grpc.proto index 590f23b..06706c1 100644 --- a/patient_data/protobuf_grpc.proto +++ b/patient_data/protobuf_grpc.proto @@ -10,41 +10,42 @@ message Name { message Telecom { optional string system = 1; - optional string value = 2; - optional string use = 3; - optional int32 rank = 4; - optional string active = 5; + optional string use = 2; + optional int32 rank = 3; + optional string active = 4; + optional string value = 5; } message Address { optional string use = 1; optional string type = 2; - optional string text = 3; - optional string line = 4; - optional string city = 5; - optional string state = 6; - optional string zipcode = 7; - optional string country = 8; - map period = 9; + optional string line = 3; + optional string city = 4; + optional string state = 5; + optional string zipcode = 6; + optional string country = 7; + optional string period_start = 8; + optional string text = 9; + optional string period_end = 10; } message Contact { optional string relation = 1; optional Name name = 2; - optional Telecom telecom = 3; - optional Address address = 4; + optional Address address = 3; + optional Telecom telecom = 4; } message Patient { optional int32 id = 1; optional bool active = 2; - repeated Name names = 3; - repeated Telecom telecoms = 4; - optional string gender = 5; - optional string birth_date = 6; - optional string deceased_on = 7; - repeated Address addresses = 8; - optional string marital_status = 9; + optional string gender = 3; + optional string birth_date = 4; + optional string marital_status = 5; + optional string deceased_on = 6; + repeated Name names = 7; + repeated Telecom telecoms = 8; + repeated Address addresses = 9; repeated Contact contacts = 10; } diff --git a/patient_data/protobuf_grpc.py b/patient_data/protobuf_grpc.py index ed26a7c..b249196 100644 --- a/patient_data/protobuf_grpc.py +++ b/patient_data/protobuf_grpc.py @@ -1,118 +1,80 @@ -import protobuf_grpc_pb2 as pb2 -from faker import Faker import datetime -from dateutil.relativedelta import relativedelta -import random -import sys +import protobuf_grpc_pb2 as pb2 +import patient_dataclass as pd -def generate_name(full_name, birth_date): - faker = Faker('en_US') +def generate_name(n: pd.Name): name = pb2.Name() - name.use = faker.word(ext_word_list=['usual', 'official', 'temp', 'nickname', 'anonymous', 'old', 'maiden']) - name.text = full_name - name.given = full_name.split(' ')[0] - name.family = full_name.split(' ')[1] - name.active = faker.date_between(start_date=datetime.datetime.strptime(birth_date, '%m/%d/%Y')).strftime('%m/%d/%Y') + name.use = n.use + name.text = n.text + name.given = n.given + name.family = n.family + name.active = n.active.strftime('%m/%d/%Y') return name -def generate_telecom(birth_date, given, family): - faker = Faker('en_US') +def generate_telecom(t: pd.Telecom): contact_point = pb2.Telecom() - contact_point.system = faker.word(ext_word_list=['phone', 'fax', 'email', 'sms']) - contact_point.use = faker.word(ext_word_list=['home', 'work', 'temp', 'old', 'mobile']) - contact_point.rank = 0 # set in gen_patient() - contact_point.active = faker.date_between(start_date=datetime.datetime.strptime(birth_date, - '%m/%d/%Y')).strftime('%m/%d/%Y') - if contact_point.system == 'email': - contact_point.value = f'{given}{family}@{faker.domain_name()}' - else: - contact_point.value = faker.phone_number() + contact_point.system = t.system + contact_point.use = t.use + contact_point.rank = t.rank + contact_point.active = t.active.strftime('%m/%d/%Y') + contact_point.value = t.value return contact_point -def generate_address(birth_date): - faker = Faker('en_US') +def generate_address(a: pd.Address): address = pb2.Address() - address.use = faker.word(ext_word_list=['home', 'work', 'temp', 'old', 'billing']) - address.type = faker.word(ext_word_list=['postal', 'physical', 'both']) - address.line = faker.street_address() - address.city = faker.city() - address.state = faker.word(ext_word_list=["AL", "AK", "AZ", "AR", "CA", "CO", "CT", "DE", "FL", "GA", "HI", - "ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME", "MD", "MA", "MI", - "MN", "MS", "MO", "MT", "NE", "NV", "NH", "NJ", "NM", "NY", "NC", - "ND", "OH", "OK", "OR", "PA", "RI", "SC", "SD", "TN", "TX", "UT", - "VT", "VA", "WA", "WV", "WI", "WY"]) - address.zipcode = faker.postcode() - address.country = 'USA' - address.period['start'] = faker.date_between(start_date=datetime.datetime.strptime(birth_date, - '%m/%d/%Y')).strftime('%m/%d/%Y') - address.period['end'] = '' if address.use in ['home', 'work', 'billing'] else faker.date_between( - start_date=datetime.datetime.strptime(address.period['start'], '%m/%d/%Y') - + relativedelta(years=1)).strftime('%m/%d/%Y') - address.text = f'{address.line} {address.city}, {address.state} {address.zipcode} {address.country}' + address.use = a.use + address.type = a.type + address.line = a.line + address.city = a.city + address.state = a.state + address.zipcode = a.zipcode + address.country = a.country + address.period_start = a.period_start.strftime('%m/%d/%Y') + address.text = a.text + address.period_end = a.period_end.strftime('%m/%d/%Y') if isinstance(a.period_end, datetime.date) else '' return address -def generate_contact(): - faker = Faker('en_US') +def generate_contact(c: pd.Contact): contact = pb2.Contact() - contact.relation = faker.word(ext_word_list=['emergency', 'family', 'guardian', 'friend', 'partner', 'work', - 'caregiver', 'agent', 'guarantor', 'parent']) - name = faker.name() - birth_date = faker.date_of_birth(minimum_age=18, maximum_age=100).strftime('%m/%d/%Y') - contact.name.CopyFrom(generate_name(name, birth_date)) - contact.telecom.CopyFrom(generate_telecom(birth_date, name.split(' ')[0], name.split(' ')[1])) - contact.address.CopyFrom(generate_address(birth_date)) + contact.relation = c.relation + contact.name.CopyFrom(generate_name(c.name)) + contact.address.CopyFrom(generate_address(c.address)) + contact.telecom.CopyFrom(generate_telecom(c.telecom)) return contact -def generate_patients(size): - curr_size = 0 - patients = pb2.Patients() - while curr_size < size: - faker = Faker('en_US') - # Define preliminary patient attributes using faker - patient = pb2.Patient() - patient.id = faker.pyint(min_value=11111, max_value=99999) - patient.active = faker.boolean(chance_of_getting_true=90) - patient.gender = faker.word(ext_word_list=['Male', 'Female', 'Non-binary', 'Other']) - patient.birth_date = faker.date_of_birth(minimum_age=18, maximum_age=100).strftime('%m/%d/%Y') - patient.deceased_on = (faker.date_between(start_date=datetime.date.today()-relativedelta(years=10)).strftime( - '%m/%d/%Y') if datetime.datetime.strptime(patient.birth_date, '%m/%d/%Y') - < datetime.datetime.today()-relativedelta(years=65) and - faker.boolean(chance_of_getting_true=15) else '') - patient.marital_status = faker.word(ext_word_list=['Married', 'Single', 'Separated', 'Divorced', 'Widowed']) +def generate_patient(p: pd.Patient): + patient = pb2.Patient() + patient.id = p.id + patient.active = p.active + patient.gender = p.gender + patient.birth_date = p.birth_date.strftime('%m/%d/%Y') + patient.deceased_on = p.deceased_on + patient.marital_status = p.marital_status - # Set the maximum number of items for each repeated object - max_names = 3 - max_contact_points = 2 - max_addresses = 2 - max_contacts = 4 + # Generate repeated Name objects + for n in p.names: + patient.names.append(generate_name(n)) + # Generate repeated Telecom objects + for t in p.telecoms: + patient.telecoms.append(generate_telecom(t)) + # Generate repeated Address objects + for a in p.addresses: + patient.addresses.append(generate_address(a)) + # Generate repeated Contact objects + for c in p.contacts: + patient.contacts.append(generate_contact(c)) - # Generate repeated Name objects - for x in range(random.randint(1, max_names)): - if patient.gender == 'Non-Binary' or patient.gender == 'Other': - full_name = faker.name_nonbinary() - else: - full_name = faker.name_male() if patient.gender == 'Male' else faker.name_female() - patient.names.append(generate_name(full_name, patient.birth_date)) - # Generate repeated Telecom objects - for x in range(random.randint(1, max_contact_points)): - given = patient.names[random.randint(0, len(patient.names)-1)].given - family = patient.names[random.randint(0, len(patient.names)-1)].family - contact_point = generate_telecom(patient.birth_date, given, family) - contact_point.rank = x - patient.telecoms.append(contact_point) - # Generate repeated Address objects - for x in range(random.randint(1, max_addresses)): - patient.addresses.append(generate_address(patient.birth_date)) - # Generate repeated Contact objects - for x in range(random.randint(1, max_contacts)): - patient.contacts.append(generate_contact()) - # Update and keep track of size of patients - patients.all_patients.append(patient) - curr_size += sys.getsizeof(patient) + return patient + + +def generate_patients(patient_list: list[pd.Patient]): + patients = pb2.Patients() + for p in patient_list: + patients.all_patients.append(generate_patient(p)) return patients diff --git a/patient_data/protobuf_grpc_pb2.py b/patient_data/protobuf_grpc_pb2.py index 0df1356..e3ce526 100644 --- a/patient_data/protobuf_grpc_pb2.py +++ b/patient_data/protobuf_grpc_pb2.py @@ -14,27 +14,23 @@ -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x13protobuf_grpc.proto\"P\n\x04Name\x12\x0b\n\x03use\x18\x01 \x01(\t\x12\x0c\n\x04text\x18\x02 \x01(\t\x12\r\n\x05given\x18\x03 \x01(\t\x12\x0e\n\x06\x66\x61mily\x18\x04 \x01(\t\x12\x0e\n\x06\x61\x63tive\x18\x05 \x01(\t\"S\n\x07Telecom\x12\x0e\n\x06system\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\x12\x0b\n\x03use\x18\x03 \x01(\t\x12\x0c\n\x04rank\x18\x04 \x01(\x05\x12\x0e\n\x06\x61\x63tive\x18\x05 \x01(\t\"\xd4\x01\n\x07\x41\x64\x64ress\x12\x0b\n\x03use\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t\x12\x0c\n\x04line\x18\x04 \x01(\t\x12\x0c\n\x04\x63ity\x18\x05 \x01(\t\x12\r\n\x05state\x18\x06 \x01(\t\x12\x0f\n\x07zipcode\x18\x07 \x01(\t\x12\x0f\n\x07\x63ountry\x18\x08 \x01(\t\x12$\n\x06period\x18\t \x03(\x0b\x32\x14.Address.PeriodEntry\x1a-\n\x0bPeriodEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"f\n\x07\x43ontact\x12\x10\n\x08relation\x18\x01 \x01(\t\x12\x13\n\x04name\x18\x02 \x01(\x0b\x32\x05.Name\x12\x19\n\x07telecom\x18\x03 \x01(\x0b\x32\x08.Telecom\x12\x19\n\x07\x61\x64\x64ress\x18\x04 \x01(\x0b\x32\x08.Address\"\xe1\x01\n\x07Patient\x12\n\n\x02id\x18\x01 \x01(\x05\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x14\n\x05names\x18\x03 \x03(\x0b\x32\x05.Name\x12\x1a\n\x08telecoms\x18\x04 \x03(\x0b\x32\x08.Telecom\x12\x0e\n\x06gender\x18\x05 \x01(\t\x12\x12\n\nbirth_date\x18\x06 \x01(\t\x12\x13\n\x0b\x64\x65\x63\x65\x61sed_on\x18\x07 \x01(\t\x12\x1b\n\taddresses\x18\x08 \x03(\x0b\x32\x08.Address\x12\x16\n\x0emarital_status\x18\t \x01(\t\x12\x1a\n\x08\x63ontacts\x18\n \x03(\x0b\x32\x08.Contact\"*\n\x08Patients\x12\x1e\n\x0c\x61ll_patients\x18\x01 \x03(\x0b\x32\x08.Patient') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x13protobuf_grpc.proto\"P\n\x04Name\x12\x0b\n\x03use\x18\x01 \x01(\t\x12\x0c\n\x04text\x18\x02 \x01(\t\x12\r\n\x05given\x18\x03 \x01(\t\x12\x0e\n\x06\x66\x61mily\x18\x04 \x01(\t\x12\x0e\n\x06\x61\x63tive\x18\x05 \x01(\t\"S\n\x07Telecom\x12\x0e\n\x06system\x18\x01 \x01(\t\x12\x0b\n\x03use\x18\x02 \x01(\t\x12\x0c\n\x04rank\x18\x03 \x01(\x05\x12\x0e\n\x06\x61\x63tive\x18\x04 \x01(\t\x12\r\n\x05value\x18\x05 \x01(\t\"\xa9\x01\n\x07\x41\x64\x64ress\x12\x0b\n\x03use\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\t\x12\x0c\n\x04line\x18\x03 \x01(\t\x12\x0c\n\x04\x63ity\x18\x04 \x01(\t\x12\r\n\x05state\x18\x05 \x01(\t\x12\x0f\n\x07zipcode\x18\x06 \x01(\t\x12\x0f\n\x07\x63ountry\x18\x07 \x01(\t\x12\x14\n\x0cperiod_start\x18\x08 \x01(\t\x12\x0c\n\x04text\x18\t \x01(\t\x12\x12\n\nperiod_end\x18\n \x01(\t\"f\n\x07\x43ontact\x12\x10\n\x08relation\x18\x01 \x01(\t\x12\x13\n\x04name\x18\x02 \x01(\x0b\x32\x05.Name\x12\x19\n\x07\x61\x64\x64ress\x18\x03 \x01(\x0b\x32\x08.Address\x12\x19\n\x07telecom\x18\x04 \x01(\x0b\x32\x08.Telecom\"\xe1\x01\n\x07Patient\x12\n\n\x02id\x18\x01 \x01(\x05\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x0e\n\x06gender\x18\x03 \x01(\t\x12\x12\n\nbirth_date\x18\x04 \x01(\t\x12\x16\n\x0emarital_status\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65\x63\x65\x61sed_on\x18\x06 \x01(\t\x12\x14\n\x05names\x18\x07 \x03(\x0b\x32\x05.Name\x12\x1a\n\x08telecoms\x18\x08 \x03(\x0b\x32\x08.Telecom\x12\x1b\n\taddresses\x18\t \x03(\x0b\x32\x08.Address\x12\x1a\n\x08\x63ontacts\x18\n \x03(\x0b\x32\x08.Contact\"*\n\x08Patients\x12\x1e\n\x0c\x61ll_patients\x18\x01 \x03(\x0b\x32\x08.Patient') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'protobuf_grpc_pb2', _globals) if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None - _globals['_ADDRESS_PERIODENTRY']._options = None - _globals['_ADDRESS_PERIODENTRY']._serialized_options = b'8\001' _globals['_NAME']._serialized_start=23 _globals['_NAME']._serialized_end=103 _globals['_TELECOM']._serialized_start=105 _globals['_TELECOM']._serialized_end=188 _globals['_ADDRESS']._serialized_start=191 - _globals['_ADDRESS']._serialized_end=403 - _globals['_ADDRESS_PERIODENTRY']._serialized_start=358 - _globals['_ADDRESS_PERIODENTRY']._serialized_end=403 - _globals['_CONTACT']._serialized_start=405 - _globals['_CONTACT']._serialized_end=507 - _globals['_PATIENT']._serialized_start=510 - _globals['_PATIENT']._serialized_end=735 - _globals['_PATIENTS']._serialized_start=737 - _globals['_PATIENTS']._serialized_end=779 + _globals['_ADDRESS']._serialized_end=360 + _globals['_CONTACT']._serialized_start=362 + _globals['_CONTACT']._serialized_end=464 + _globals['_PATIENT']._serialized_start=467 + _globals['_PATIENT']._serialized_end=692 + _globals['_PATIENTS']._serialized_start=694 + _globals['_PATIENTS']._serialized_end=736 # @@protoc_insertion_point(module_scope) From 6227d5379512a587f45b0a78a10dce89963a4cd7 Mon Sep 17 00:00:00 2001 From: Nmeng01 <123509773+Nmeng01@users.noreply.github.com> Date: Mon, 29 Jan 2024 19:58:54 -0500 Subject: [PATCH 6/7] modify .gitignore --- .gitignore | 589 ++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 510 insertions(+), 79 deletions(-) diff --git a/.gitignore b/.gitignore index 476d884..9f418ed 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,121 @@ -# SEE: https://github.com/github/gitignore/blob/main/Python.gitignore -# +### OSX ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### PyCharm ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# Generated files +.idea/**/contentModel.xml +.idea/ + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### PyCharm Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +.idea/**/sonarlint/ + +# SonarQube Plugin +.idea/**/sonarIssues.xml + +# Markdown Navigator plugin +.idea/**/markdown-navigator.xml +.idea/**/markdown-navigator/ + +### Python ### # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] @@ -22,6 +138,7 @@ parts/ sdist/ var/ wheels/ +pip-wheel-metadata/ share/python-wheels/ *.egg-info/ .installed.cfg @@ -48,25 +165,13 @@ htmlcov/ nosetests.xml coverage.xml *.cover -*.py,cover .hypothesis/ .pytest_cache/ -cover/ # Translations *.mo *.pot -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - # Scrapy stuff: .scrapy @@ -74,20 +179,13 @@ instance/ docs/_build/ # PyBuilder -.pybuilder/ target/ -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - # pyenv -# For a library or package, you might want to ignore these files since the code is -# intended to run in multiple environments; otherwise, check them in: -#.python-version +.python-version + +# poetry +.venv # pipenv # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. @@ -96,40 +194,12 @@ ipython_config.py # install all needed dependencies. #Pipfile.lock -# poetry -# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. -# This is especially recommended for binary packages to ensure reproducibility, and is more -# commonly ignored for libraries. -# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control -#poetry.lock - -# pdm -# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. -#pdm.lock -# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it -# in version control. -# https://pdm.fming.dev/#use-with-ide -.pdm.toml - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm -__pypackages__/ - -# Celery stuff +# celery beat schedule file celerybeat-schedule -celerybeat.pid # SageMath parsed files *.sage.py -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - # Spyder project settings .spyderproject .spyproject @@ -137,6 +207,11 @@ venv.bak/ # Rope project settings .ropeproject +# Mr Developer +.mr.developer.cfg +.project +.pydevproject + # mkdocs documentation /site @@ -148,35 +223,391 @@ dmypy.json # Pyre type checker .pyre/ -# pytype static type analyzer -.pytype/ - -# Cython debug symbols -cython_debug/ +# Plugins +.secrets.baseline -# PyCharm -# JetBrains specific template is maintained in a separate JetBrains.gitignore that can -# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore -# and can be added to the global gitignore or merged into this file. For a more nuclear -# option (not recommended) you can uncomment the following to ignore the entire idea folder. -# .idea/ -.idea/**/workspace.xml -.idea/**/tasks.xml -.idea/**/usage.statistics.xml -.idea/**/dictionaries -.idea/**/shelf - -# VS Code -# SEE: https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore +### VisualStudioCode ### +.vscode/ .vscode/* -!.vscode/settings.json !.vscode/tasks.json !.vscode/launch.json !.vscode/extensions.json -!.vscode/*.code-snippets -# Local History for Visual Studio Code -.history/ +### VisualStudioCode Patch ### +# Ignore all local history of files +.history + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +### VisualStudio ### +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb -# Built Visual Studio Code Extensions -*.vsix +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ From b4dbc86549c175eba4a0e6218d9010ed355bcc17 Mon Sep 17 00:00:00 2001 From: Nmeng01 Date: Tue, 6 Feb 2024 11:05:04 -0500 Subject: [PATCH 7/7] create makefile --- Makefile | 8 +++++++ patient_data/protobuf_grpc_pb2.py | 36 ------------------------------- 2 files changed, 8 insertions(+), 36 deletions(-) create mode 100644 Makefile delete mode 100644 patient_data/protobuf_grpc_pb2.py diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..144a211 --- /dev/null +++ b/Makefile @@ -0,0 +1,8 @@ +# Variables +PYTHON := python +PYTHONPATH := `pwd` + +# Protobuf +.PHONY: protoc +protoc: + protoc -I=./patient_data/ --python_out=./patient_data/ ./patient_data/protobuf_grpc.proto diff --git a/patient_data/protobuf_grpc_pb2.py b/patient_data/protobuf_grpc_pb2.py deleted file mode 100644 index e3ce526..0000000 --- a/patient_data/protobuf_grpc_pb2.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: protobuf_grpc.proto -# Protobuf Python Version: 4.25.2 -"""Generated protocol buffer code.""" -from google.protobuf import descriptor as _descriptor -from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x13protobuf_grpc.proto\"P\n\x04Name\x12\x0b\n\x03use\x18\x01 \x01(\t\x12\x0c\n\x04text\x18\x02 \x01(\t\x12\r\n\x05given\x18\x03 \x01(\t\x12\x0e\n\x06\x66\x61mily\x18\x04 \x01(\t\x12\x0e\n\x06\x61\x63tive\x18\x05 \x01(\t\"S\n\x07Telecom\x12\x0e\n\x06system\x18\x01 \x01(\t\x12\x0b\n\x03use\x18\x02 \x01(\t\x12\x0c\n\x04rank\x18\x03 \x01(\x05\x12\x0e\n\x06\x61\x63tive\x18\x04 \x01(\t\x12\r\n\x05value\x18\x05 \x01(\t\"\xa9\x01\n\x07\x41\x64\x64ress\x12\x0b\n\x03use\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\t\x12\x0c\n\x04line\x18\x03 \x01(\t\x12\x0c\n\x04\x63ity\x18\x04 \x01(\t\x12\r\n\x05state\x18\x05 \x01(\t\x12\x0f\n\x07zipcode\x18\x06 \x01(\t\x12\x0f\n\x07\x63ountry\x18\x07 \x01(\t\x12\x14\n\x0cperiod_start\x18\x08 \x01(\t\x12\x0c\n\x04text\x18\t \x01(\t\x12\x12\n\nperiod_end\x18\n \x01(\t\"f\n\x07\x43ontact\x12\x10\n\x08relation\x18\x01 \x01(\t\x12\x13\n\x04name\x18\x02 \x01(\x0b\x32\x05.Name\x12\x19\n\x07\x61\x64\x64ress\x18\x03 \x01(\x0b\x32\x08.Address\x12\x19\n\x07telecom\x18\x04 \x01(\x0b\x32\x08.Telecom\"\xe1\x01\n\x07Patient\x12\n\n\x02id\x18\x01 \x01(\x05\x12\x0e\n\x06\x61\x63tive\x18\x02 \x01(\x08\x12\x0e\n\x06gender\x18\x03 \x01(\t\x12\x12\n\nbirth_date\x18\x04 \x01(\t\x12\x16\n\x0emarital_status\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65\x63\x65\x61sed_on\x18\x06 \x01(\t\x12\x14\n\x05names\x18\x07 \x03(\x0b\x32\x05.Name\x12\x1a\n\x08telecoms\x18\x08 \x03(\x0b\x32\x08.Telecom\x12\x1b\n\taddresses\x18\t \x03(\x0b\x32\x08.Address\x12\x1a\n\x08\x63ontacts\x18\n \x03(\x0b\x32\x08.Contact\"*\n\x08Patients\x12\x1e\n\x0c\x61ll_patients\x18\x01 \x03(\x0b\x32\x08.Patient') - -_globals = globals() -_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'protobuf_grpc_pb2', _globals) -if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR._options = None - _globals['_NAME']._serialized_start=23 - _globals['_NAME']._serialized_end=103 - _globals['_TELECOM']._serialized_start=105 - _globals['_TELECOM']._serialized_end=188 - _globals['_ADDRESS']._serialized_start=191 - _globals['_ADDRESS']._serialized_end=360 - _globals['_CONTACT']._serialized_start=362 - _globals['_CONTACT']._serialized_end=464 - _globals['_PATIENT']._serialized_start=467 - _globals['_PATIENT']._serialized_end=692 - _globals['_PATIENTS']._serialized_start=694 - _globals['_PATIENTS']._serialized_end=736 -# @@protoc_insertion_point(module_scope)