diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 0000000..28c5751
Binary files /dev/null and b/.DS_Store differ
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/
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..26d3352
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000..1085555
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
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/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/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/patient_data/__init__.py b/patient_data/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/patient_data/gen_data.py b/patient_data/gen_data.py
new file mode 100644
index 0000000..e4a68e3
--- /dev/null
+++ b/patient_data/gen_data.py
@@ -0,0 +1,155 @@
+import random
+from faker import Faker
+from ujson import dumps
+from enum import Enum
+import sys
+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
+
+ def __repr__(self):
+ return self.value
+
+ def __str__(self):
+ return str(self.value)
+
+
+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:
+ 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([asdict(p) for p in patient_list], indent=4, default=str)
+ case Format.Protobuf:
+ return proto.generate_patients(patient_list).all_patients
+
+
+if __name__ == '__main__':
+ print(main(128, Format.Protobuf))
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
new file mode 100644
index 0000000..06706c1
--- /dev/null
+++ b/patient_data/protobuf_grpc.proto
@@ -0,0 +1,54 @@
+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 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 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 Address address = 3;
+ optional Telecom telecom = 4;
+}
+
+message Patient {
+ optional int32 id = 1;
+ optional bool active = 2;
+ 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;
+}
+
+message Patients {
+ repeated Patient all_patients = 1;
+}
diff --git a/patient_data/protobuf_grpc.py b/patient_data/protobuf_grpc.py
new file mode 100644
index 0000000..b249196
--- /dev/null
+++ b/patient_data/protobuf_grpc.py
@@ -0,0 +1,80 @@
+import datetime
+import protobuf_grpc_pb2 as pb2
+import patient_dataclass as pd
+
+
+def generate_name(n: pd.Name):
+ name = pb2.Name()
+ 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(t: pd.Telecom):
+ contact_point = pb2.Telecom()
+ 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(a: pd.Address):
+ address = pb2.Address()
+ 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(c: pd.Contact):
+ contact = pb2.Contact()
+ 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_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
+
+ # 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))
+
+ 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/test/data_gen_obj.py b/test/data_gen_obj.py
deleted file mode 100644
index cee6c1c..0000000
--- a/test/data_gen_obj.py
+++ /dev/null
@@ -1,179 +0,0 @@
-from faker import Faker
-import datetime
-from dateutil.relativedelta import relativedelta
-import sys
-import random
-from json import dumps
-
-
-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 get_system(self):
- return self.__system
-
- 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
-
-
-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))