From 186ba01903d92a0e4d9eeeba1f4f5d63c44c079f Mon Sep 17 00:00:00 2001 From: leosocy Date: Fri, 18 Jan 2019 22:36:47 +0800 Subject: [PATCH 1/3] feat: add base model --- .isort.cfg | 2 +- .travis.yml | 71 ----------------------------------- LICENSE | 2 +- Pipfile | 1 - README.md | 2 + app/models/__init__.py | 3 ++ app/models/user.py | 60 +++++++++++++++++++++++++++++ app/tasks.py | 3 ++ app/utils.py | 4 ++ tests/test_api/conftest.py | 3 ++ tests/test_model/__init__.py | 3 ++ tests/test_model/conftest.py | 3 ++ tests/test_model/test_user.py | 3 ++ 13 files changed, 86 insertions(+), 74 deletions(-) delete mode 100644 .travis.yml create mode 100644 app/models/__init__.py create mode 100644 app/models/user.py create mode 100644 app/tasks.py create mode 100644 tests/test_api/conftest.py create mode 100644 tests/test_model/__init__.py create mode 100644 tests/test_model/conftest.py create mode 100644 tests/test_model/test_user.py diff --git a/.isort.cfg b/.isort.cfg index 4af90cd..0c605e1 100644 --- a/.isort.cfg +++ b/.isort.cfg @@ -4,4 +4,4 @@ include_trailing_comma = True force_grid_wrap = 0 combine_as_imports = True line_length=88 -known_third_party = flasgger,flask,peeweext,pytest,werkzeug +known_third_party = flasgger,flask,peewee,peeweext,pytest,werkzeug diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 9654dbb..0000000 --- a/.travis.yml +++ /dev/null @@ -1,71 +0,0 @@ -language: python -sudo: required -python: -- 3.6 -env: - global: - - DOCKER_REGISTRY: "leosocy" - - IMAGE: "${DOCKER_REGISTRY}/anteater" - - IMAGE_TAG: ${IMAGE}:${TRAVIS_COMMIT:0:8} - - DOCKER_IMAGE_CACHE_DIR: ${HOME}/.cache/docker - - PIP_CACHE_DIR: "${HOME}/.cache/pip" - -services: -- docker - -before_cache: -- > - mkdir -p ${DOCKER_IMAGE_CACHE_DIR} && - docker images -a --filter="dangling=false" --format "{{.Repository}}:{{.Tag}} {{.ID}}" | - xargs -n 2 -t sh -c "test -e ${DOCKER_IMAGE_CACHE_DIR}/\$1.tar.gz || - docker save \$0 | gzip -2 > ${DOCKER_IMAGE_CACHE_DIR}/\$1.tar.gz" -cache: - directories: - - ${DOCKER_IMAGE_CACHE_DIR} - - ${PIP_CACHE_DIR} - -stages: -- test_all -- build_image -- deploy - -jobs: - include: - - stage: test_all - name: test all - before_script: - - pip install -i https://mirrors.aliyun.com/pypi/simple pipenv - - pipenv install --dev --ignore-pipfile - script: - - pipenv run style_check - - pipenv run test - after_success: - - pipenv run codecov -t ${CODECOV_TOKEN} - - stage: build_image - name: build_image - if: branch = master - before_install: - - > - if [[ -d ${DOCKER_IMAGE_CACHE_DIR} ]]; then ls ${DOCKER_IMAGE_CACHE_DIR}/*.tar.gz | - xargs -I {file} sh -c "zcat {file} | docker load"; fi - before_script: - - > - echo "${HUB_DOCKER_REGISTRY_PASSWD}" | - docker login -u "${HUB_DOCKER_REGISTRY_USERNAME}" --password-stdin - script: - - docker build -t ${IMAGE_TAG} -f Dockerfile . - - docker push ${IMAGE_TAG} - - stage: build_image - name: build_image_manual - if: branch =~ /^feature.*$/ OR branch =~ /^hotfix.*$/ - before_install: - - > - if [[ -d ${DOCKER_IMAGE_CACHE_DIR} ]]; then ls ${DOCKER_IMAGE_CACHE_DIR}/*.tar.gz | - xargs -I {file} sh -c "zcat {file} | docker load"; fi - before_script: - - > - echo "${HUB_DOCKER_REGISTRY_PASSWD}" | - docker login -u "${HUB_DOCKER_REGISTRY_USERNAME}" --password-stdin - script: - - docker build -t ${IMAGE_TAG} -f Dockerfile-dev . - - docker push ${IMAGE_TAG} diff --git a/LICENSE b/LICENSE index b892656..d3f4f9c 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2018 Leosocy +Copyright (c) 2019 Leosocy Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/Pipfile b/Pipfile index 2c6ba74..a5eb9b7 100644 --- a/Pipfile +++ b/Pipfile @@ -31,7 +31,6 @@ python_version = "3.6" [scripts] style_check = "flake8" test = "pytest tests --strict -vvl --cov=app --cov-report=term-missing --cov-fail-under=90" -server = "gunicorn -c gunicorn.py anteater:app" [pipenv] allow_prereleases = true diff --git a/README.md b/README.md index 7bc094e..db3ceb5 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,8 @@ - Web: Flask - API: RESTful +- DB: MySQL + Redis +- MQ: celery + RabbitMQ ## APIs diff --git a/app/models/__init__.py b/app/models/__init__.py new file mode 100644 index 0000000..090171d --- /dev/null +++ b/app/models/__init__.py @@ -0,0 +1,3 @@ +# Copyright (c) 2019 leosocy. All rights reserved. +# Use of this source code is governed by a MIT-style license +# that can be found in the LICENSE file. diff --git a/app/models/user.py b/app/models/user.py new file mode 100644 index 0000000..ed1f032 --- /dev/null +++ b/app/models/user.py @@ -0,0 +1,60 @@ +# Copyright (c) 2019 leosocy. All rights reserved. +# Use of this source code is governed by a MIT-style license +# that can be found in the LICENSE file. + +import enum + +import peewee as pw + +from app.extensions import pwx +from app.utils import enum2choices + + +@enum.unique +class JobState(enum.IntEnum): + Submitted = 0 + Processing = 1 + ProcessFail = 2 + ProcessSuccess = 3 + + +class UserJobModelMixin(pwx.Model): + id = pw.BigAutoField(primary_key=True) + user_id = pw.BigIntegerField() + src_palm_oss = pw.CharField() + state = pw.SmallIntegerField( + choices=enum2choices(JobState), default=JobState.Submitted + ) + errmsg = pw.CharField(max_length=128, default="") + + @classmethod + def pre_run(cls, palm_image): + # TODO: 上传oss,并返回url + return "" + + @classmethod + def run(cls, user_id, palm_image): + palm_oss = cls.pre_run(palm_image) + job = cls.create(user_id=user_id, src_palm_oss=palm_oss) + job.process() + + def process(self): + raise NotImplementedError + + +class UserDetectionJob(UserJobModelMixin): + score = pw.SmallIntegerField(default=0) # 0-100 + + class Meta: + table_name = "user_detection_jobs" + + def process(self): + pass + + +class UserExtractionJob(UserJobModelMixin): + class Meta: + table_name = "user_extraction_jobs" + + def process(self): + pass diff --git a/app/tasks.py b/app/tasks.py new file mode 100644 index 0000000..090171d --- /dev/null +++ b/app/tasks.py @@ -0,0 +1,3 @@ +# Copyright (c) 2019 leosocy. All rights reserved. +# Use of this source code is governed by a MIT-style license +# that can be found in the LICENSE file. diff --git a/app/utils.py b/app/utils.py index 5187431..8c7112d 100644 --- a/app/utils.py +++ b/app/utils.py @@ -9,3 +9,7 @@ def JsonResponse(data=None, code=200): return Response(json.dumps(data or {}), status=code, mimetype="application/json") + + +def enum2choices(enum): + return tuple((f.value, f.name) for f in enum) diff --git a/tests/test_api/conftest.py b/tests/test_api/conftest.py new file mode 100644 index 0000000..090171d --- /dev/null +++ b/tests/test_api/conftest.py @@ -0,0 +1,3 @@ +# Copyright (c) 2019 leosocy. All rights reserved. +# Use of this source code is governed by a MIT-style license +# that can be found in the LICENSE file. diff --git a/tests/test_model/__init__.py b/tests/test_model/__init__.py new file mode 100644 index 0000000..090171d --- /dev/null +++ b/tests/test_model/__init__.py @@ -0,0 +1,3 @@ +# Copyright (c) 2019 leosocy. All rights reserved. +# Use of this source code is governed by a MIT-style license +# that can be found in the LICENSE file. diff --git a/tests/test_model/conftest.py b/tests/test_model/conftest.py new file mode 100644 index 0000000..090171d --- /dev/null +++ b/tests/test_model/conftest.py @@ -0,0 +1,3 @@ +# Copyright (c) 2019 leosocy. All rights reserved. +# Use of this source code is governed by a MIT-style license +# that can be found in the LICENSE file. diff --git a/tests/test_model/test_user.py b/tests/test_model/test_user.py new file mode 100644 index 0000000..090171d --- /dev/null +++ b/tests/test_model/test_user.py @@ -0,0 +1,3 @@ +# Copyright (c) 2019 leosocy. All rights reserved. +# Use of this source code is governed by a MIT-style license +# that can be found in the LICENSE file. From 7b008bab3a0fa606d19798ed5f323e7f578c6d5e Mon Sep 17 00:00:00 2001 From: leosocy Date: Fri, 1 Feb 2019 23:16:40 +0800 Subject: [PATCH 2/3] feat: add manage to make migration --- Pipfile | 26 +- Pipfile.lock | 562 ++++++++++++++++++++++++++---------- app/api/detection.py | 4 +- app/api/extraction.py | 4 +- app/utils.py | 8 +- configs/default/__init__.py | 6 + configs/default/peewee.py | 6 +- configs/production.py | 14 + configs/testing.py | 6 +- gunicorn.py | 15 +- manage.sh | 55 ++++ 11 files changed, 519 insertions(+), 187 deletions(-) create mode 100644 configs/production.py create mode 100755 manage.sh diff --git a/Pipfile b/Pipfile index a5eb9b7..3b004ab 100644 --- a/Pipfile +++ b/Pipfile @@ -1,28 +1,30 @@ -[[source]] -name = "aliyun" -url = "https://mirrors.aliyun.com/pypi/simple/" -verify_ssl = true - [[source]] name = "pypi" url = "https://pypi.org/simple" verify_ssl = true [dev-packages] -pytest = "*" -pytest-cov = "*" -coverage = "*" +black = "*" +faker = "*" flake8 = "*" -ipython = "*" +flake8-bugbear = "*" +flake8-mypy = "*" +isort = {version = "*",extras = ["pipfile"]} +mypy = ">=0.620" pre-commit = "*" +pytest = "*" +pytest-cov = "*" +seed-isort-config = "*" codecov = "*" [packages] -flask = "*" -gunicorn = "*" +Flask = ">=1.0" +gunicorn = {version = "*",extras = ["gevent"]} flasgger = ">=0.9.2" +orator = ">=0.9.8" peewee = ">=3.8.0" -peeweext = ">=0.7.0" +peeweext = "==0.7.4" +pendulum = "<2.0,>=1.5.0" mysqlclient = "*" [requires] diff --git a/Pipfile.lock b/Pipfile.lock index be0f54c..46b742b 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,18 +1,13 @@ { "_meta": { "hash": { - "sha256": "b370e62f9d6854c8e781d7134fc33d1946dd9f8a2660ca9f822edcb56a961cff" + "sha256": "dcdc7aec38d5c687c963cab7a5ffee0889b111f513b85e28442415a23dd4f1cd" }, "pipfile-spec": 6, "requires": { "python_version": "3.6" }, "sources": [ - { - "name": "aliyun", - "url": "https://mirrors.aliyun.com/pypi/simple/", - "verify_ssl": true - }, { "name": "pypi", "url": "https://pypi.org/simple", @@ -28,12 +23,25 @@ ], "version": "==18.2.0" }, + "backpack": { + "hashes": [ + "sha256:0162cf7b34c810ba4ddbbd32a1e5e804ef96fcf2fea5ce2848aa4950770d3893" + ], + "version": "==0.1" + }, "blinker": { "hashes": [ "sha256:471aee25f3992bd325afa3772f1063dbdbbca947a041b8b89466dc00d606f8b6" ], "version": "==1.4" }, + "cleo": { + "hashes": [ + "sha256:85a63076b72ca376fb06668be1fc7758dc16740b394783d5cc65200c4b32f71b", + "sha256:9b7f79f1aa470a025c0d28c76aa225ee9e65028d32f80032e871aa3500df61b8" + ], + "version": "==0.6.8" + }, "click": { "hashes": [ "sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13", @@ -41,12 +49,19 @@ ], "version": "==7.0" }, + "faker": { + "hashes": [ + "sha256:0184fa252f86214308bb6bed344f96294f2e3528fbffafc727890cf2a86d6027", + "sha256:12e950f6f361c3b959ddf5e99d42cc9f5d89d3082688828d978b11c6029294d0" + ], + "version": "==0.8.18" + }, "flasgger": { "hashes": [ "sha256:db3c211ca78472a71ff8578c069de6e955be04a047bfbc4fab45743d804a0d57", "sha256:e799c77d6b777356a0fc902ced16f4e5f5c518e2d96748da7644bcb59b67153b" ], - "index": "aliyun", + "index": "pypi", "version": "==0.9.2" }, "flask": { @@ -54,17 +69,79 @@ "sha256:2271c0070dbcb5275fad4a82e29f23ab92682dc45f9dfbc22c02ba9b9322ce48", "sha256:a080b744b7e345ccfcbc77954861cb05b3c63786e93f2b3875e0913d44b43f05" ], - "index": "aliyun", + "index": "pypi", "version": "==1.0.2" }, + "gevent": { + "hashes": [ + "sha256:0774babec518a24d9a7231d4e689931f31b332c4517a771e532002614e270a64", + "sha256:0e1e5b73a445fe82d40907322e1e0eec6a6745ca3cea19291c6f9f50117bb7ea", + "sha256:0ff2b70e8e338cf13bedf146b8c29d475e2a544b5d1fe14045aee827c073842c", + "sha256:107f4232db2172f7e8429ed7779c10f2ed16616d75ffbe77e0e0c3fcdeb51a51", + "sha256:14b4d06d19d39a440e72253f77067d27209c67e7611e352f79fe69e0f618f76e", + "sha256:1b7d3a285978b27b469c0ff5fb5a72bcd69f4306dbbf22d7997d83209a8ba917", + "sha256:1eb7fa3b9bd9174dfe9c3b59b7a09b768ecd496debfc4976a9530a3e15c990d1", + "sha256:2711e69788ddb34c059a30186e05c55a6b611cb9e34ac343e69cf3264d42fe1c", + "sha256:28a0c5417b464562ab9842dd1fb0cc1524e60494641d973206ec24d6ec5f6909", + "sha256:3249011d13d0c63bea72d91cec23a9cf18c25f91d1f115121e5c9113d753fa12", + "sha256:44089ed06a962a3a70e96353c981d628b2d4a2f2a75ea5d90f916a62d22af2e8", + "sha256:4bfa291e3c931ff3c99a349d8857605dca029de61d74c6bb82bd46373959c942", + "sha256:50024a1ee2cf04645535c5ebaeaa0a60c5ef32e262da981f4be0546b26791950", + "sha256:53b72385857e04e7faca13c613c07cab411480822ac658d97fd8a4ddbaf715c8", + "sha256:74b7528f901f39c39cdbb50cdf08f1a2351725d9aebaef212a29abfbb06895ee", + "sha256:7d0809e2991c9784eceeadef01c27ee6a33ca09ebba6154317a257353e3af922", + "sha256:896b2b80931d6b13b5d9feba3d4eebc67d5e6ec54f0cf3339d08487d55d93b0e", + "sha256:8d9ec51cc06580f8c21b41fd3f2b3465197ba5b23c00eb7d422b7ae0380510b0", + "sha256:9f7a1e96fec45f70ad364e46de32ccacab4d80de238bd3c2edd036867ccd48ad", + "sha256:ab4dc33ef0e26dc627559786a4fba0c2227f125db85d970abbf85b77506b3f51", + "sha256:d1e6d1f156e999edab069d79d890859806b555ce4e4da5b6418616322f0a3df1", + "sha256:d752bcf1b98174780e2317ada12013d612f05116456133a6acf3e17d43b71f05", + "sha256:e5bcc4270671936349249d26140c267397b7b4b1381f5ec8b13c53c5b53ab6e1" + ], + "version": "==1.4.0" + }, + "greenlet": { + "hashes": [ + "sha256:000546ad01e6389e98626c1367be58efa613fa82a1be98b0c6fc24b563acc6d0", + "sha256:0d48200bc50cbf498716712129eef819b1729339e34c3ae71656964dac907c28", + "sha256:23d12eacffa9d0f290c0fe0c4e81ba6d5f3a5b7ac3c30a5eaf0126bf4deda5c8", + "sha256:37c9ba82bd82eb6a23c2e5acc03055c0e45697253b2393c9a50cef76a3985304", + "sha256:51503524dd6f152ab4ad1fbd168fc6c30b5795e8c70be4410a64940b3abb55c0", + "sha256:8041e2de00e745c0e05a502d6e6db310db7faa7c979b3a5877123548a4c0b214", + "sha256:81fcd96a275209ef117e9ec91f75c731fa18dcfd9ffaa1c0adbdaa3616a86043", + "sha256:853da4f9563d982e4121fed8c92eea1a4594a2299037b3034c3c898cb8e933d6", + "sha256:8b4572c334593d449113f9dc8d19b93b7b271bdbe90ba7509eb178923327b625", + "sha256:9416443e219356e3c31f1f918a91badf2e37acf297e2fa13d24d1cc2380f8fbc", + "sha256:9854f612e1b59ec66804931df5add3b2d5ef0067748ea29dc60f0efdcda9a638", + "sha256:99a26afdb82ea83a265137a398f570402aa1f2b5dfb4ac3300c026931817b163", + "sha256:a19bf883b3384957e4a4a13e6bd1ae3d85ae87f4beb5957e35b0be287f12f4e4", + "sha256:a9f145660588187ff835c55a7d2ddf6abfc570c2651c276d3d4be8a2766db490", + "sha256:ac57fcdcfb0b73bb3203b58a14501abb7e5ff9ea5e2edfa06bb03035f0cff248", + "sha256:bcb530089ff24f6458a81ac3fa699e8c00194208a724b644ecc68422e1111939", + "sha256:beeabe25c3b704f7d56b573f7d2ff88fc99f0138e43480cecdfcaa3b87fe4f87", + "sha256:d634a7ea1fc3380ff96f9e44d8d22f38418c1c381d5fac680b272d7d90883720", + "sha256:d97b0661e1aead761f0ded3b769044bb00ed5d33e1ec865e891a8b128bf7c656" + ], + "markers": "platform_python_implementation == 'CPython'", + "version": "==0.4.15" + }, "gunicorn": { + "extras": [ + "gevent" + ], "hashes": [ "sha256:aa8e0b40b4157b36a5df5e599f45c9c76d6af43845ba3b3b0efe2c70473c2471", "sha256:fa2662097c66f920f53f70621c6c58ca4a3c4d3434205e608e121b5b3b71f4f3" ], - "index": "aliyun", + "index": "pypi", "version": "==19.9.0" }, + "inflection": { + "hashes": [ + "sha256:18ea7fb7a7d152853386523def08736aa8c32636b047ade55f7578c4edeb16ca" + ], + "version": "==0.3.1" + }, "itsdangerous": { "hashes": [ "sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19", @@ -81,10 +158,44 @@ }, "jsonschema": { "hashes": [ - "sha256:a32131e60980cbf9077aa37ead88e952f903690c141eb722154c7d4c50d08487", - "sha256:c2480b09c6431a44d6c5948bd2a882b1c299e125af858725ae0edbe9588b858f" - ], - "version": "==3.0.0a5" + "sha256:683fe7ed58763ea0be572de5aad47cd3cc1297640916f9a8ccd222b287da7d2f", + "sha256:b42d7a292addb57370e6260bcbadb77e00a899fe6ec998c453f45893c41c658b" + ], + "version": "==3.0.0b3" + }, + "lazy-object-proxy": { + "hashes": [ + "sha256:0ce34342b419bd8f018e6666bfef729aec3edf62345a53b537a4dcc115746a33", + "sha256:1b668120716eb7ee21d8a38815e5eb3bb8211117d9a90b0f8e21722c0758cc39", + "sha256:209615b0fe4624d79e50220ce3310ca1a9445fd8e6d3572a896e7f9146bbf019", + "sha256:27bf62cb2b1a2068d443ff7097ee33393f8483b570b475db8ebf7e1cba64f088", + "sha256:27ea6fd1c02dcc78172a82fc37fcc0992a94e4cecf53cb6d73f11749825bd98b", + "sha256:2c1b21b44ac9beb0fc848d3993924147ba45c4ebc24be19825e57aabbe74a99e", + "sha256:2df72ab12046a3496a92476020a1a0abf78b2a7db9ff4dc2036b8dd980203ae6", + "sha256:320ffd3de9699d3892048baee45ebfbbf9388a7d65d832d7e580243ade426d2b", + "sha256:50e3b9a464d5d08cc5227413db0d1c4707b6172e4d4d915c1c70e4de0bbff1f5", + "sha256:5276db7ff62bb7b52f77f1f51ed58850e315154249aceb42e7f4c611f0f847ff", + "sha256:61a6cf00dcb1a7f0c773ed4acc509cb636af2d6337a08f362413c76b2b47a8dd", + "sha256:6ae6c4cb59f199d8827c5a07546b2ab7e85d262acaccaacd49b62f53f7c456f7", + "sha256:7661d401d60d8bf15bb5da39e4dd72f5d764c5aff5a86ef52a042506e3e970ff", + "sha256:7bd527f36a605c914efca5d3d014170b2cb184723e423d26b1fb2fd9108e264d", + "sha256:7cb54db3535c8686ea12e9535eb087d32421184eacc6939ef15ef50f83a5e7e2", + "sha256:7f3a2d740291f7f2c111d86a1c4851b70fb000a6c8883a59660d95ad57b9df35", + "sha256:81304b7d8e9c824d058087dcb89144842c8e0dea6d281c031f59f0acf66963d4", + "sha256:933947e8b4fbe617a51528b09851685138b49d511af0b6c0da2539115d6d4514", + "sha256:94223d7f060301b3a8c09c9b3bc3294b56b2188e7d8179c762a1cda72c979252", + "sha256:ab3ca49afcb47058393b0122428358d2fbe0408cf99f1b58b295cfeb4ed39109", + "sha256:bd6292f565ca46dee4e737ebcc20742e3b5be2b01556dafe169f6c65d088875f", + "sha256:cb924aa3e4a3fb644d0c463cad5bc2572649a6a3f68a7f8e4fbe44aaa6d77e4c", + "sha256:d0fc7a286feac9077ec52a927fc9fe8fe2fabab95426722be4c953c9a8bede92", + "sha256:ddc34786490a6e4ec0a855d401034cbd1242ef186c20d79d2166d6a4bd449577", + "sha256:e34b155e36fa9da7e1b7c738ed7767fc9491a62ec6af70fe9da4a057759edc2d", + "sha256:e5b9e8f6bda48460b7b143c3821b21b452cb3a835e6bbd5dd33aa0c8d3f5137d", + "sha256:e81ebf6c5ee9684be8f2c87563880f93eedd56dd2b6146d8a725b50b7e5adb0f", + "sha256:eb91be369f945f10d3a49f5f9be8b3d0b93a4c2be8f8a5b83b0571b8123e0a7a", + "sha256:f460d1ceb0e4a5dcb2a652db0904224f367c9b3c1470d5a7683c0480e582468b" + ], + "version": "==1.3.1" }, "markupsafe": { "hashes": [ @@ -128,36 +239,78 @@ }, "mysqlclient": { "hashes": [ - "sha256:37496c1181805e4001164a18a4383962901b03c03e148cd165a2619515ccc988" + "sha256:6883a4dd98903bad375c859ead1a480e1245ea3a8d9b038ea2c091c1865ba673", + "sha256:a62220410e26ce2d2ff94dd0138c3ecfb91db634464a9afb4c8e6b50f0a67e00", + "sha256:e1b9f3a8928ddb4985ca3e3c9f2aa81b19e831bbf6fabf5681ee356738dbbbb2" + ], + "index": "pypi", + "version": "==1.4.1" + }, + "orator": { + "hashes": [ + "sha256:0088a81c4b43aa2e405c2532d2ea581da6e26d61d4bfeda44b768d7bbc387290", + "sha256:e81d5c86adbd06d860496602758984b053f26d9087e751517879180c93a9ae86" ], - "index": "aliyun", - "version": "==1.4.0rc3" + "index": "pypi", + "version": "==0.9.8" + }, + "pastel": { + "hashes": [ + "sha256:3108af417ec0fa6d0a620e676ec4f02c839ca13e10611586e5d2174b46aa0bc3", + "sha256:d1fee8079534f99f1805a044fef946d23eee6d6a7cd34292c30e6c16be9a80b9" + ], + "version": "==0.1.0" }, "peewee": { "hashes": [ - "sha256:c80208d6ba2191728654cb5d2e85cd58e7dcad6a2fa1807868dd984ccef2586d" + "sha256:7f8e3f512ee0d4e2d9c2008ea446d69e23c9535466367b991d452825a1ddb654" ], - "index": "aliyun", - "version": "==3.8.1" + "index": "pypi", + "version": "==3.8.2" }, "peeweext": { "hashes": [ - "sha256:51091df89bef280f4f38df9dffe0bbd2e1683859f147f0b7992171ab871a2fb3" + "sha256:fce9f08bd4a2c4fdf4eb84ae7027c689cd3c0fe1566b90e5efc5f98b15a5b1ae" ], - "index": "aliyun", - "version": "==1.0.0" + "index": "pypi", + "version": "==0.7.4" }, "pendulum": { "hashes": [ - "sha256:0f43d963b27e92b04047ce8352e4c277db99f20d0b513df7d0ceafe674a2f727", - "sha256:14e60d26d7400980123dbb6e3f2a90b70d7c18c63742ffe5bd6d6a643f8c6ef1", - "sha256:5035a4e17504814a679f138374269cc7cc514aeac7ba6d9dc020abc224f25dbc", - "sha256:8c0b3d655c1e9205d4dacf42fffc929cde3b19b5fb544a7f7561e6896eb8a000", - "sha256:bfc7b33ae193a204ec0bec12ad0d2d3300cd7e51d91d992da525ba3b28f0d265", - "sha256:cd70b75800439794e1ad8dbfa24838845e171918df81fa98b68d0d5a6f9b8bf2", - "sha256:cf535d36c063575d4752af36df928882b2e0e31541b4482c97d63752785f9fcb" + "sha256:4173ce3e81ad0d9d61dbce86f4286c43a26a398270df6a0a89f501f0c28ad27d", + "sha256:56a347d0457859c84b8cdba161fc37c7df5db9b3becec7881cd770e9d2058b3c", + "sha256:738878168eb26e5446da5d1f7b3312ae993a542061be8882099c00ef4866b1a2", + "sha256:95536b33ae152e3c831eb236c1bf9ac9dcfb3b5b98fdbe8e9e601eab6c373897", + "sha256:c04fcf955e622e97e405e5f6d1b1f4a7adc69d79d82f3609643de69283170d6d", + "sha256:dd6500d27bb7ccc029d497da4f9bd09549bd3c0ea276dad894ea2fdf309e83f3", + "sha256:ddaf97a061eb5e2ae37857a8cb548e074125017855690d20e443ad8d9f31e164", + "sha256:e7df37447824f9af0b58c7915a4caf349926036afd86ad38e7529a6b2f8fc34b", + "sha256:e9732b8bb214fad2c72ddcbfec07542effa8a8b704e174347ede1ff8dc679cce", + "sha256:f4eee1e1735487d9d25cc435c519fd4380cb1f82cde3ebad1efbc2fc30deca5b" + ], + "index": "pypi", + "version": "==1.5.1" + }, + "pyaml": { + "hashes": [ + "sha256:8b70b7cc2afa55dd89d2a31ef8abe4cfb3daa100cd63564f8fd97e6cac6cff5b", + "sha256:b865e4f53a85f4d8a092e7701f759a3237fb3ee8a928627401914aafadc00907" + ], + "version": "==16.12.2" + }, + "pygments": { + "hashes": [ + "sha256:5ffada19f6203563680669ee7f53b64dabbeb100eb51b61996085e99c03b284a", + "sha256:e8218dd399a61674745138520d0d4cf2621d7e032439341bc3f647bff125818d" + ], + "version": "==2.3.1" + }, + "pylev": { + "hashes": [ + "sha256:063910098161199b81e453025653ec53556c1be7165a9b7c50be2f4d57eae1c3", + "sha256:1d29a87beb45ebe1e821e7a3b10da2b6b2f4c79b43f482c2df1a1f748a6e114e" ], - "version": "==2.0.4" + "version": "==1.3.0" }, "pyrsistent": { "hashes": [ @@ -172,6 +325,13 @@ ], "version": "==2.7.5" }, + "pytz": { + "hashes": [ + "sha256:32b0891edff07e28efe91284ed9c31e123d84bea3fd98e1f72be2508f43ef8d9", + "sha256:d5f05e487007e29e03409f9398d074e158d920d36eb82eaf66fb1136b0c5374c" + ], + "version": "==2018.9" + }, "pytzdata": { "hashes": [ "sha256:10c74b0cfc51a9269031f86ecd11096c9c6a141f5bb15a3b8a88f9979f6361e2", @@ -181,13 +341,36 @@ }, "pyyaml": { "hashes": [ - "sha256:254bf6fda2b7c651837acb2c718e213df29d531eebf00edb54743d10bcb694eb", - "sha256:3108529b78577327d15eec243f0ff348a0640b0c3478d67ad7f5648f93bac3e2", - "sha256:3c17fb92c8ba2f525e4b5f7941d850e7a48c3a59b32d331e2502a3cdc6648e76", - "sha256:8d6d96001aa7f0a6a4a95e8143225b5d06e41b1131044913fecb8f85a125714b", - "sha256:c8a88edd93ee29ede719080b2be6cb2333dfee1dccba213b422a9c8e97f2967b" - ], - "version": "==4.2b4" + "sha256:3d7da3009c0f3e783b2c873687652d83b1bbfd5c88e9813fb7e5b03c0dd3108b", + "sha256:3ef3092145e9b70e3ddd2c7ad59bdd0252a94dfe3949721633e41344de00a6bf", + "sha256:40c71b8e076d0550b2e6380bada1f1cd1017b882f7e16f09a65be98e017f211a", + "sha256:558dd60b890ba8fd982e05941927a3911dc409a63dcb8b634feaa0cda69330d3", + "sha256:a7c28b45d9f99102fa092bb213aa12e0aaf9a6a1f5e395d36166639c1f96c3a1", + "sha256:aa7dd4a6a427aed7df6fb7f08a580d68d9b118d90310374716ae90b710280af1", + "sha256:bc558586e6045763782014934bfaf39d48b8ae85a2713117d16c39864085c613", + "sha256:d46d7982b62e0729ad0175a9bc7e10a566fc07b224d2c79fafb5e032727eaa04", + "sha256:d5eef459e30b09f5a098b9cea68bebfeb268697f78d647bd255a085371ac7f3f", + "sha256:e01d3203230e1786cd91ccfdc8f8454c8069c91bee3962ad93b87a4b2860f537", + "sha256:e170a9e6fcfd19021dd29845af83bb79236068bf5fd4df3327c1be18182b2531" + ], + "version": "==3.13" + }, + "simplejson": { + "hashes": [ + "sha256:067a7177ddfa32e1483ba5169ebea1bc2ea27f224853211ca669325648ca5642", + "sha256:2fc546e6af49fb45b93bbe878dea4c48edc34083729c0abd09981fe55bdf7f91", + "sha256:354fa32b02885e6dae925f1b5bbf842c333c1e11ea5453ddd67309dc31fdb40a", + "sha256:37e685986cf6f8144607f90340cff72d36acf654f3653a6c47b84c5c38d00df7", + "sha256:3af610ee72efbe644e19d5eaad575c73fb83026192114e5f6719f4901097fce2", + "sha256:3b919fc9cf508f13b929a9b274c40786036b31ad28657819b3b9ba44ba651f50", + "sha256:3dd289368bbd064974d9a5961101f080e939cbe051e6689a193c99fb6e9ac89b", + "sha256:6c3258ffff58712818a233b9737fe4be943d306c40cf63d14ddc82ba563f483a", + "sha256:75e3f0b12c28945c08f54350d91e624f8dd580ab74fd4f1bbea54bc6b0165610", + "sha256:b1f329139ba647a9548aa05fb95d046b4a677643070dc2afc05fa2e975d09ca5", + "sha256:ee9625fc8ee164902dfbb0ff932b26df112da9f871c32f0f9c1bcf20c350fe2a", + "sha256:fb2530b53c28f0d4d84990e945c2ebb470edb469d63e389bf02ff409012fe7c5" + ], + "version": "==3.16.0" }, "six": { "hashes": [ @@ -196,36 +379,61 @@ ], "version": "==1.12.0" }, + "text-unidecode": { + "hashes": [ + "sha256:5a1375bb2ba7968740508ae38d92e1f889a0832913cb1c447d5e2046061a396d", + "sha256:801e38bd550b943563660a91de8d4b6fa5df60a542be9093f7abf819f86050cc" + ], + "version": "==1.2" + }, + "tzlocal": { + "hashes": [ + "sha256:4ebeb848845ac898da6519b9b31879cf13b6626f7184c496037b818e238f2c4e" + ], + "version": "==1.5.1" + }, "werkzeug": { "hashes": [ "sha256:c3fd7a7d41976d9f44db327260e263132466836cef6f91512889ed60ad26557c", "sha256:d5da73735293558eb1651ee2fddc4d0dedcfa06538b8813a2e20011583c9e49b" ], "version": "==0.14.1" + }, + "wrapt": { + "hashes": [ + "sha256:4aea003270831cceb8a90ff27c4031da6ead7ec1886023b80ce0dfe0adf61533" + ], + "version": "==1.11.1" } }, "develop": { - "appnope": { + "appdirs": { "hashes": [ - "sha256:5b26757dc6f79a3b7dc9fab95359328d5747fcb2409d331ea66d0272b90ab2a0", - "sha256:8b995ffe925347a2138d7ac0fe77155e4311a0ea6d6da4f5128fe4b3cbe5ed71" + "sha256:9e5896d1372858f8dd3344faf4e5014d21849c756c8d5701f78f8a103b372d92", + "sha256:d8b24664561d0d34ddfaec54636d502d7cea6e29c3eaf68f3df6180863e2166e" ], - "markers": "sys_platform == 'darwin'", - "version": "==0.1.0" + "version": "==1.4.3" + }, + "aspy.refactor-imports": { + "hashes": [ + "sha256:ceb44390e6ee0863d7acd5e24429ad12cbfab5dd9924ddb410753945871702f8", + "sha256:f980a46aaed6b9b7f3a9fc78c83ec49e530c37a830d57cacb4511670231d2a52" + ], + "version": "==1.0.2" }, "aspy.yaml": { "hashes": [ - "sha256:04d26279513618f1024e1aba46471db870b3b33aef204c2d09bcf93bea9ba13f", - "sha256:0a77e23fafe7b242068ffc0252cee130d3e509040908fc678d9d1060e7494baa" + "sha256:19dd2ee74f96b72a3096d78be1a872914c70982299cda137725478954870a896", + "sha256:5eaaacd0886e8b581f0e4ff383fb6504720bb2b3c7be17307724246261a41adf" ], - "version": "==1.1.1" + "version": "==1.1.2" }, "atomicwrites": { "hashes": [ - "sha256:0312ad34fcad8fac3704d441f7b317e50af620823353ec657a53e981f92920c0", - "sha256:ec9ae8adaae229e4f8446952d204a3e4b5fdd2d099f9be3aaf556120135fb3ee" + "sha256:03472c30eb2c5d1ba9227e4c2ca66ab8287fbfbbda3888aa93dc2e28fc6811b4", + "sha256:75a9445bac02d8d058d5e1fe689654ba5a6556a1dfd8ce6ec55a0ed79866cfa6" ], - "version": "==1.2.1" + "version": "==1.3.0" }, "attrs": { "hashes": [ @@ -234,12 +442,20 @@ ], "version": "==18.2.0" }, - "backcall": { + "black": { "hashes": [ - "sha256:38ecd85be2c1e78f77fd91700c76e14667dc21e2713b63876c0eb901196e01e4", - "sha256:bbbf4b1e5cd2bdb08f915895b51081c041bac22394fdfcfdfbe9f14b77c08bf2" + "sha256:817243426042db1d36617910df579a54f1afd659adb96fc5032fcf4b36209739", + "sha256:e030a9a28f542debc08acceb273f228ac422798e5215ba2a791a6ddeaaca22a5" ], - "version": "==0.1.0" + "index": "pypi", + "version": "==18.9b0" + }, + "cached-property": { + "hashes": [ + "sha256:3a026f1a54135677e7da5ce819b0c690f156f37976f3e30c5430740725203d7f", + "sha256:9217a59f14a5682da7c4b8829deadbfc194ac22e9908ccf7c8820234e80a1504" + ], + "version": "==1.5.1" }, "certifi": { "hashes": [ @@ -262,12 +478,19 @@ ], "version": "==3.0.4" }, + "click": { + "hashes": [ + "sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13", + "sha256:5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7" + ], + "version": "==7.0" + }, "codecov": { "hashes": [ "sha256:8ed8b7c6791010d359baed66f84f061bba5bd41174bf324c31311e8737602788", "sha256:ae00d68e18d8a20e9c3288ba3875ae03db3a8e892115bf9b83ef20507732bed4" ], - "index": "aliyun", + "index": "pypi", "version": "==2.0.15" }, "coverage": { @@ -302,30 +525,52 @@ "sha256:f95bc54fb6d61b9f9ff09c4ae8ff6a3f5edc937cda3ca36fc937302a7c152bf1", "sha256:fd0f6be53de40683584e5331c341e65a679dbe5ec489a0697cec7c2ef1a48cda" ], - "index": "aliyun", "version": "==5.0a4" }, - "decorator": { + "entrypoints": { + "hashes": [ + "sha256:589f874b313739ad35be6e0cd7efde2a4e9b6fea91edcc34e58ecbb8dbe56d19", + "sha256:c70dd71abe5a8c85e55e12c19bd91ccfeec11a6e99044204511f9ed547d48451" + ], + "version": "==0.3" + }, + "faker": { "hashes": [ - "sha256:2c51dff8ef3c447388fe5e4453d24a2bf128d3a4c32af3fabef1f01c6851ab82", - "sha256:c39efa13fbdeb4506c476c9b3babf6a718da943dab7811c206005a4a956c080c" + "sha256:0184fa252f86214308bb6bed344f96294f2e3528fbffafc727890cf2a86d6027", + "sha256:12e950f6f361c3b959ddf5e99d42cc9f5d89d3082688828d978b11c6029294d0" ], - "version": "==4.3.0" + "version": "==0.8.18" }, "flake8": { "hashes": [ - "sha256:6a35f5b8761f45c5513e3405f110a86bea57982c3b75b766ce7b65217abe1670", - "sha256:c01f8a3963b3571a8e6bd7a4063359aff90749e160778e03817cd9b71c9e07d2" + "sha256:09b9bb539920776da542e67a570a5df96ff933c9a08b62cfae920bcc789e4383", + "sha256:e0f8cd519cfc0072c0ee31add5def09d2b3ef6040b34dc426445c3af9b02163c" + ], + "index": "pypi", + "version": "==3.7.4" + }, + "flake8-bugbear": { + "hashes": [ + "sha256:07b6e769d7f4e168d590f7088eae40f6ddd9fa4952bed31602def65842682c83", + "sha256:0ccf56975f4db1d69dc1cf3598c99d768ebf95d0cad27d76087954aa399b515a" + ], + "index": "pypi", + "version": "==18.8.0" + }, + "flake8-mypy": { + "hashes": [ + "sha256:47120db63aff631ee1f84bac6fe8e64731dc66da3efc1c51f85e15ade4a3ba18", + "sha256:cff009f4250e8391bf48990093cff85802778c345c8449d6498b62efefeebcbc" ], - "index": "aliyun", - "version": "==3.6.0" + "index": "pypi", + "version": "==17.8.0" }, "identify": { "hashes": [ - "sha256:08826e68e39e7de53cc2ddd8f6228a4e463b4bacb20565e5301c3ec690e68d27", - "sha256:2364e24a7699fea0dc910e90740adbab43eef3746eeea4e016029c34123ce66d" + "sha256:0749c74180ef0f6a3874eaa0bf89a6990a523233180e83e6f3c7c27312ac9ba3", + "sha256:1cf14bc0324d83a742f558051db0c2cbe15d8b9ae1c59dfefbe38935f1d1ee31" ], - "version": "==1.1.8" + "version": "==1.2.1" }, "idna": { "hashes": [ @@ -349,27 +594,17 @@ "markers": "python_version < '3.7'", "version": "==1.0.2" }, - "ipython": { - "hashes": [ - "sha256:6a9496209b76463f1dec126ab928919aaf1f55b38beb9219af3fe202f6bbdd12", - "sha256:f69932b1e806b38a7818d9a1e918e5821b685715040b48e59c657b3c7961b742" - ], - "index": "aliyun", - "version": "==7.2.0" - }, - "ipython-genutils": { - "hashes": [ - "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8", - "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8" + "isort": { + "extras": [ + "pipfile" ], - "version": "==0.2.0" - }, - "jedi": { "hashes": [ - "sha256:571702b5bd167911fe9036e5039ba67f820d6502832285cde8c881ab2b2149fd", - "sha256:c8481b5e59d34a5c7c42e98f6625e633f6ef59353abea6437472c7ec2093f191" + "sha256:1153601da39a25b14ddc54955dbbacbb6b2d19135386699e2ad58517953b34af", + "sha256:b9c40e9750f3d77e6e4d441d8b0266cf555e7cdabdcff33c4fd06366ca761ef8", + "sha256:ec9ef8f4a9bc6f71eec99e1806bfa2de401650d996c59330782b89a5555c1497" ], - "version": "==0.13.2" + "index": "pypi", + "version": "==4.3.4" }, "mccabe": { "hashes": [ @@ -386,33 +621,26 @@ ], "version": "==5.0.0" }, - "nodeenv": { - "hashes": [ - "sha256:ad8259494cf1c9034539f6cced78a1da4840a4b157e23640bc4a0c0546b0cb7a" - ], - "version": "==1.3.3" - }, - "parso": { + "mypy": { "hashes": [ - "sha256:35704a43a3c113cce4de228ddb39aab374b8004f4f2407d070b6a2ca784ce8a2", - "sha256:895c63e93b94ac1e1690f5fdd40b65f07c8171e3e53cbd7793b5b96c0e0a7f24" + "sha256:986a7f97808a865405c5fd98fae5ebfa963c31520a56c783df159e9a81e41b3e", + "sha256:cc5df73cc11d35655a8c364f45d07b13c8db82c000def4bd7721be13356533b4" ], - "version": "==0.3.1" + "index": "pypi", + "version": "==0.660" }, - "pexpect": { + "mypy-extensions": { "hashes": [ - "sha256:2a8e88259839571d1251d278476f3eec5db26deb73a70be5ed5dc5435e418aba", - "sha256:3fbd41d4caf27fa4a377bfd16fef87271099463e6fa73e92a52f92dfee5d425b" + "sha256:37e0e956f41369209a3d5f34580150bcacfabaa57b33a15c0b25f4b5725e0812", + "sha256:b16cabe759f55e3409a7d231ebd2841378fb0c27a5d1994719e340e4f429ac3e" ], - "markers": "sys_platform != 'win32'", - "version": "==4.6.0" + "version": "==0.4.1" }, - "pickleshare": { + "nodeenv": { "hashes": [ - "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca", - "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56" + "sha256:ad8259494cf1c9034539f6cced78a1da4840a4b157e23640bc4a0c0546b0cb7a" ], - "version": "==0.7.5" + "version": "==1.3.3" }, "pluggy": { "hashes": [ @@ -426,24 +654,9 @@ "sha256:2cb7a588fdc78e4ec4e624932765e65d285159f4b3425121106cbd9060e40e04", "sha256:74ee5779a17ef540efdf9a832911fe9057b1bb57d5d0152eace6534a228a863b" ], - "index": "aliyun", + "index": "pypi", "version": "==1.14.2" }, - "prompt-toolkit": { - "hashes": [ - "sha256:c1d6aff5252ab2ef391c2fe498ed8c088066f66bc64a8d5c095bbf795d9fec34", - "sha256:d4c47f79b635a0e70b84fdb97ebd9a274203706b1ee5ed44c10da62755cf3ec9", - "sha256:fd17048d8335c1e6d5ee403c3569953ba3eb8555d710bfc548faf0712666ea39" - ], - "version": "==2.0.7" - }, - "ptyprocess": { - "hashes": [ - "sha256:923f299cc5ad920c68f2bc0bc98b75b9f838b93b599941a6b63ddbc2476394c0", - "sha256:d7cc528d76e76342423ca640335bd3633420dc1366f258cb31d05e865ef5ca1f" - ], - "version": "==0.6.0" - }, "py": { "hashes": [ "sha256:bf92637198836372b520efcba9e020c330123be8ce527e535d185ed4b6f45694", @@ -453,50 +666,56 @@ }, "pycodestyle": { "hashes": [ - "sha256:cbc619d09254895b0d12c2c691e237b2e91e9b2ecf5e84c26b35400f93dcfb83", - "sha256:cbfca99bd594a10f674d0cd97a3d802a1fdef635d4361e1a2658de47ed261e3a" + "sha256:95a2219d12372f05704562a14ec30bc76b05a5b297b21a5dfe3f6fac3491ae56", + "sha256:e40a936c9a450ad81df37f549d676d127b1b66000a6c500caa2b085bc0ca976c" ], - "version": "==2.4.0" + "version": "==2.5.0" }, "pyflakes": { "hashes": [ - "sha256:9a7662ec724d0120012f6e29d6248ae3727d821bba522a0e6b356eff19126a49", - "sha256:f661252913bc1dbe7fcfcbf0af0db3f42ab65aabd1a6ca68fe5d466bace94dae" - ], - "version": "==2.0.0" - }, - "pygments": { - "hashes": [ - "sha256:5ffada19f6203563680669ee7f53b64dabbeb100eb51b61996085e99c03b284a", - "sha256:e8218dd399a61674745138520d0d4cf2621d7e032439341bc3f647bff125818d" + "sha256:5e8c00e30c464c99e0b501dc160b13a14af7f27d4dffb529c556e30a159e231d", + "sha256:f277f9ca3e55de669fba45b7393a1449009cff5a37d1af10ebb76c52765269cd" ], - "version": "==2.3.1" + "version": "==2.1.0" }, "pytest": { "hashes": [ - "sha256:41568ea7ecb4a68d7f63837cf65b92ce8d0105e43196ff2b26622995bb3dc4b2", - "sha256:c3c573a29d7c9547fb90217ece8a8843aa0c1328a797e200290dc3d0b4b823be" + "sha256:65aeaa77ae87c7fc95de56285282546cfa9c886dc8e5dc78313db1c25e21bc07", + "sha256:6ac6d467d9f053e95aaacd79f831dbecfe730f419c6c7022cb316b365cd9199d" ], - "index": "aliyun", - "version": "==4.1.1" + "index": "pypi", + "version": "==4.2.0" }, "pytest-cov": { "hashes": [ "sha256:0ab664b25c6aa9716cbf203b17ddb301932383046082c081b9848a0edf5add33", "sha256:230ef817450ab0699c6cc3c9c8f7a829c34674456f2ed8df1fe1d39780f7c87f" ], - "index": "aliyun", + "index": "pypi", "version": "==2.6.1" }, + "python-dateutil": { + "hashes": [ + "sha256:063df5763652e21de43de7d9e00ccf239f953a832941e37be541614732cdfc93", + "sha256:88f9287c0174266bb0d8cedd395cfba9c58e87e5ad86b2ce58859bc11be3cf02" + ], + "version": "==2.7.5" + }, "pyyaml": { "hashes": [ - "sha256:254bf6fda2b7c651837acb2c718e213df29d531eebf00edb54743d10bcb694eb", - "sha256:3108529b78577327d15eec243f0ff348a0640b0c3478d67ad7f5648f93bac3e2", - "sha256:3c17fb92c8ba2f525e4b5f7941d850e7a48c3a59b32d331e2502a3cdc6648e76", - "sha256:8d6d96001aa7f0a6a4a95e8143225b5d06e41b1131044913fecb8f85a125714b", - "sha256:c8a88edd93ee29ede719080b2be6cb2333dfee1dccba213b422a9c8e97f2967b" + "sha256:3d7da3009c0f3e783b2c873687652d83b1bbfd5c88e9813fb7e5b03c0dd3108b", + "sha256:3ef3092145e9b70e3ddd2c7ad59bdd0252a94dfe3949721633e41344de00a6bf", + "sha256:40c71b8e076d0550b2e6380bada1f1cd1017b882f7e16f09a65be98e017f211a", + "sha256:558dd60b890ba8fd982e05941927a3911dc409a63dcb8b634feaa0cda69330d3", + "sha256:a7c28b45d9f99102fa092bb213aa12e0aaf9a6a1f5e395d36166639c1f96c3a1", + "sha256:aa7dd4a6a427aed7df6fb7f08a580d68d9b118d90310374716ae90b710280af1", + "sha256:bc558586e6045763782014934bfaf39d48b8ae85a2713117d16c39864085c613", + "sha256:d46d7982b62e0729ad0175a9bc7e10a566fc07b224d2c79fafb5e032727eaa04", + "sha256:d5eef459e30b09f5a098b9cea68bebfeb268697f78d647bd255a085371ac7f3f", + "sha256:e01d3203230e1786cd91ccfdc8f8454c8069c91bee3962ad93b87a4b2860f537", + "sha256:e170a9e6fcfd19021dd29845af83bb79236068bf5fd4df3327c1be18182b2531" ], - "version": "==4.2b4" + "version": "==3.13" }, "requests": { "hashes": [ @@ -505,6 +724,14 @@ ], "version": "==2.21.0" }, + "seed-isort-config": { + "hashes": [ + "sha256:12b8a1ec6e0e451fdac487f606f6c65093dce1172fb5664e4a1f83bc43c75c7f", + "sha256:387337a33281ee22593b4f9d3238347b9c0177a8b62e83e01242fc37b0eb33a1" + ], + "index": "pypi", + "version": "==1.5.0" + }, "six": { "hashes": [ "sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c", @@ -512,6 +739,13 @@ ], "version": "==1.12.0" }, + "text-unidecode": { + "hashes": [ + "sha256:5a1375bb2ba7968740508ae38d92e1f889a0832913cb1c447d5e2046061a396d", + "sha256:801e38bd550b943563660a91de8d4b6fa5df60a542be9093f7abf819f86050cc" + ], + "version": "==1.2" + }, "toml": { "hashes": [ "sha256:229f81c57791a41d65e399fc06bf0848bab550a9dfd5ed66df18ce5f05e73d5c", @@ -519,12 +753,31 @@ ], "version": "==0.10.0" }, - "traitlets": { - "hashes": [ - "sha256:9c4bd2d267b7153df9152698efb1050a5d84982d3384a37b2c1f7723ba3e7835", - "sha256:c6cb5e6f57c5a9bdaa40fa71ce7b4af30298fbab9ece9815b5d995ab6217c7d9" - ], - "version": "==4.3.2" + "typed-ast": { + "hashes": [ + "sha256:023625bfa9359e29bd6e24cac2a4503495b49761d48a5f1e38333fc4ac4d93fe", + "sha256:07591f7a5fdff50e2e566c4c1e9df545c75d21e27d98d18cb405727ed0ef329c", + "sha256:153e526b0f4ffbfada72d0bb5ffe8574ba02803d2f3a9c605c8cf99dfedd72a2", + "sha256:3ad2bdcd46a4a1518d7376e9f5016d17718a9ed3c6a3f09203d832f6c165de4a", + "sha256:3ea98c84df53ada97ee1c5159bb3bc784bd734231235a1ede14c8ae0775049f7", + "sha256:51a7141ccd076fa561af107cfb7a8b6d06a008d92451a1ac7e73149d18e9a827", + "sha256:52c93cd10e6c24e7ac97e8615da9f224fd75c61770515cb323316c30830ddb33", + "sha256:6344c84baeda3d7b33e157f0b292e4dd53d05ddb57a63f738178c01cac4635c9", + "sha256:64699ca1b3bd5070bdeb043e6d43bc1d0cebe08008548f4a6bee782b0ecce032", + "sha256:74903f2e56bbffe29282ef8a5487d207d10be0f8513b41aff787d954a4cf91c9", + "sha256:7891710dba83c29ee2bd51ecaa82f60f6bede40271af781110c08be134207bf2", + "sha256:91976c56224e26c256a0de0f76d2004ab885a29423737684b4f7ebdd2f46dde2", + "sha256:9bad678a576ecc71f25eba9f1e3fd8d01c28c12a2834850b458428b3e855f062", + "sha256:b4726339a4c180a8b6ad9d8b50d2b6dc247e1b79b38fe2290549c98e82e4fd15", + "sha256:ba36f6aa3f8933edf94ea35826daf92cbb3ec248b89eccdc053d4a815d285357", + "sha256:bbc96bde544fd19e9ef168e4dfa5c3dfe704bfa78128fa76f361d64d6b0f731a", + "sha256:c0c927f1e44469056f7f2dada266c79b577da378bbde3f6d2ada726d131e4824", + "sha256:c0f9a3708008aa59f560fa1bd22385e05b79b8e38e0721a15a8402b089243442", + "sha256:f0bf6f36ff9c5643004171f11d2fdc745aa3953c5aacf2536a0685db9ceb3fb1", + "sha256:f5be39a0146be663cbf210a4d95c3c58b2d7df7b043c9047c5448e358f0550a2", + "sha256:fcd198bf19d9213e5cbf2cde2b9ef20a9856e716f76f9476157f90ae6de06cc6" + ], + "version": "==1.2.0" }, "urllib3": { "hashes": [ @@ -535,17 +788,10 @@ }, "virtualenv": { "hashes": [ - "sha256:34b9ae3742abed2f95d3970acf4d80533261d6061b51160b197f84e5b4c98b4c", - "sha256:fa736831a7b18bd2bfeef746beb622a92509e9733d645952da136b0639cd40cd" - ], - "version": "==16.2.0" - }, - "wcwidth": { - "hashes": [ - "sha256:3df37372226d6e63e1b1e1eda15c594bca98a22d33a23832a90998faa96bc65e", - "sha256:f4ebe71925af7b40a864553f761ed559b43544f8f71746c2d756c7fe788ade7c" + "sha256:58c359370401e0af817fb0070911e599c5fdc836166306b04fd0f278151ed125", + "sha256:729f0bcab430e4ef137646805b5b1d8efbb43fe53d4a0f33328624a84a5121f7" ], - "version": "==0.1.7" + "version": "==16.3.0" }, "zipp": { "hashes": [ diff --git a/app/api/detection.py b/app/api/detection.py index a1bf010..4bba44c 100644 --- a/app/api/detection.py +++ b/app/api/detection.py @@ -17,8 +17,8 @@ def post(self): palm = request.files.get("palm_image") if not palm: # TODO: 创建手掌检测异步任务,获取job_id,异步启动处理 - return JsonResponse(data={"errmsg": "Must provide palm image"}, code=400) - return JsonResponse(data={}) + return JsonResponse(msg="must provide palm image", code=400) + return JsonResponse() class PalmDetectionJobView(MethodView): diff --git a/app/api/extraction.py b/app/api/extraction.py index 111c6e8..a329479 100644 --- a/app/api/extraction.py +++ b/app/api/extraction.py @@ -15,8 +15,8 @@ def post(self): palm = request.files.get("palm_image") if not palm: # TODO: 异步任务提取roi - return JsonResponse(data={"errmsg": "Must provide palm image"}, code=400) - return JsonResponse(data={}) + return JsonResponse(msg="must provide palm image", code=400) + return JsonResponse() class RoiExtractionJobView(MethodView): diff --git a/app/utils.py b/app/utils.py index 8c7112d..160ecca 100644 --- a/app/utils.py +++ b/app/utils.py @@ -7,8 +7,12 @@ from flask import Response -def JsonResponse(data=None, code=200): - return Response(json.dumps(data or {}), status=code, mimetype="application/json") +def JsonResponse(data=None, code=200, msg=None): + if data is not None: + payload = {"objects": data} if isinstance(data, list) else data + else: + payload = {"errors": {}, "msg": msg} if msg else {} + return Response(json.dumps(payload), status=code, mimetype="application/json") def enum2choices(enum): diff --git a/configs/default/__init__.py b/configs/default/__init__.py index 15924b3..6003536 100644 --- a/configs/default/__init__.py +++ b/configs/default/__init__.py @@ -1,4 +1,10 @@ # flake8: noqa +TESTING = False +DEBUG = True + +PROJECT_NAME = "anteater" +TZ = "Asia/Shanghai" + from .swagger import * from .peewee import * diff --git a/configs/default/peewee.py b/configs/default/peewee.py index 5fbfd25..edadd8f 100644 --- a/configs/default/peewee.py +++ b/configs/default/peewee.py @@ -1,11 +1,7 @@ -# Copyright (c) 2019 leosocy. All rights reserved. -# Use of this source code is governed by a MIT-style license -# that can be found in the LICENSE file. - DB_HOST = "mysql" DB_NAME = "anteater" DB_USER = "root" -DB_PASSWORD = "666toor666" +DB_PASSWORD = "toor333666" PW_DB_URL = "mysql+pool://{user}:{password}@{host}/{name}".format( host=DB_HOST, name=DB_NAME, user=DB_USER, password=DB_PASSWORD diff --git a/configs/production.py b/configs/production.py new file mode 100644 index 0000000..6b01e18 --- /dev/null +++ b/configs/production.py @@ -0,0 +1,14 @@ +# flake8: noqa + +import os + +from configs.default import * + +DEBUG = False + +DB_HOST = os.environ["DB_HOST"] +DB_USER = os.environ["DB_USER"] +DB_PASSWORD = os.environ["DB_PASSWORD"] +PW_DB_URL = "mysql+pool://{user}:{password}@{host}/{name}".format( + host=DB_HOST, name=DB_NAME, user=DB_USER, password=DB_PASSWORD +) diff --git a/configs/testing.py b/configs/testing.py index a83f6e0..fc020f0 100644 --- a/configs/testing.py +++ b/configs/testing.py @@ -1,8 +1,6 @@ -# Copyright (c) 2019 leosocy. All rights reserved. -# Use of this source code is governed by a MIT-style license -# that can be found in the LICENSE file. +# flake8: noqa -from configs.default import * # noqa +from configs.default import * TESTING = True diff --git a/gunicorn.py b/gunicorn.py index a03e27a..f603307 100644 --- a/gunicorn.py +++ b/gunicorn.py @@ -5,10 +5,21 @@ import os # logging -loglevel = os.getenv("GUNICORN_LOG_LEVEL", "warning") +if os.environ.get("FLASK_ENV") != "production": + accesslog = "-" +errorlog = "-" +loglevel = os.environ.get("GUNICORN_LOG_LEVEL", "warning") + +# process naming +proc_name = "anteater" # server socket bind = "0.0.0.0:5000" # worker processes -workers = os.getenv("GUNICORN_WORKER_NUM", 4) +workers = int(os.environ.get("GUNICORN_WORKER_NUM", 2)) +# **shouldn't** call `patch_all()` by ourselves when use `gevent` +# https://github.com/benoitc/gunicorn/issues/1056#issuecomment-115409307 +worker_class = "gevent" +threads = int(os.environ.get("GUNICORN_THREAD_NUM", 4)) +keepalive = int(os.environ.get("GUNICORN_KEEPALIVE_TIMEOUT", 30)) diff --git a/manage.sh b/manage.sh new file mode 100755 index 0000000..9d64ef6 --- /dev/null +++ b/manage.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash + +FLASK_ENV=${FLASK_ENV:="development"} + +db_host=${DB_HOST:="mysql"} +db_user=${DB_USER:="root"} +db_password=${DB_PASSWORD:="toor333666"} +db_name=${DB_NAME:="anteater"} +if [ ${FLASK_ENV} == "testing" ]; then + db_name="tarot_test" +fi + + +date_str=$(date +"%Y_%m_%d_%H%M%S") +sql_basename="${date_str}_${FLASK_ENV}_${db_name}" + +function orator_action() { + migrations_path="db/migrations" + case "$Action" in + migrate ) + config_file="configs/${FLASK_ENV}.py" + echo Using config file: ${config_file} + before="${sql_basename}_ddl_before.sql" + mysqldump_action ${before} + PYTHONPATH=`pwd`:`pwd`/protos orator migrate -c ${config_file} -p ${migrations_path} $* + # 即使migrate失败, 也有可能产生部分数据结构的改动 + after="${sql_basename}_ddl_after.sql" + mysqldump_action ${after} + echo "migrate前DDL文件: ${before}" + echo "migrate后DDL文件: ${before}" + echo "migrate前后DDL差异: " + diff ${before} ${after} + ;; + make_migration) + PYTHONPATH=`pwd`:`pwd`/protos orator make:migration -p ${migrations_path} $* ;; + * ) ;; + esac +} + +function mysqldump_action() { + mysqldump ${db_name} -u ${db_user} -h ${db_host} --password=${db_password} -r $* +} + + +Action=$1 +shift + +case "$Action" in + make_migration | migrate ) + orator_action $* ;; + + * ) + echo 'Usage:' + echo './manage.sh make_migration | migrate';; +esac From 3931e2423117f3348653133c310c1c061b1e2b58 Mon Sep 17 00:00:00 2001 From: leosocy Date: Sat, 2 Feb 2019 00:02:07 +0800 Subject: [PATCH 3/3] feat: resume manage --- Pipfile | 11 ++- Pipfile.lock | 250 +++++++++++---------------------------------------- manage.sh | 55 ------------ 3 files changed, 58 insertions(+), 258 deletions(-) delete mode 100755 manage.sh diff --git a/Pipfile b/Pipfile index 3b004ab..5069eb0 100644 --- a/Pipfile +++ b/Pipfile @@ -1,3 +1,8 @@ +[[source]] +name = "aliyun" +url = "https://mirrors.aliyun.com/pypi/simple/" +verify_ssl = true + [[source]] name = "pypi" url = "https://pypi.org/simple" @@ -18,13 +23,11 @@ seed-isort-config = "*" codecov = "*" [packages] -Flask = ">=1.0" +flask = "*" gunicorn = {version = "*",extras = ["gevent"]} flasgger = ">=0.9.2" -orator = ">=0.9.8" peewee = ">=3.8.0" -peeweext = "==0.7.4" -pendulum = "<2.0,>=1.5.0" +peeweext = ">=0.7.0" mysqlclient = "*" [requires] diff --git a/Pipfile.lock b/Pipfile.lock index 46b742b..8fd4182 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,13 +1,18 @@ { "_meta": { "hash": { - "sha256": "dcdc7aec38d5c687c963cab7a5ffee0889b111f513b85e28442415a23dd4f1cd" + "sha256": "97eccbd9aac6fb62ef3ec153a2a666b6d8c4ab9c71475d799b0e628f6541dfae" }, "pipfile-spec": 6, "requires": { "python_version": "3.6" }, "sources": [ + { + "name": "aliyun", + "url": "https://mirrors.aliyun.com/pypi/simple/", + "verify_ssl": true + }, { "name": "pypi", "url": "https://pypi.org/simple", @@ -23,25 +28,12 @@ ], "version": "==18.2.0" }, - "backpack": { - "hashes": [ - "sha256:0162cf7b34c810ba4ddbbd32a1e5e804ef96fcf2fea5ce2848aa4950770d3893" - ], - "version": "==0.1" - }, "blinker": { "hashes": [ "sha256:471aee25f3992bd325afa3772f1063dbdbbca947a041b8b89466dc00d606f8b6" ], "version": "==1.4" }, - "cleo": { - "hashes": [ - "sha256:85a63076b72ca376fb06668be1fc7758dc16740b394783d5cc65200c4b32f71b", - "sha256:9b7f79f1aa470a025c0d28c76aa225ee9e65028d32f80032e871aa3500df61b8" - ], - "version": "==0.6.8" - }, "click": { "hashes": [ "sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13", @@ -49,19 +41,12 @@ ], "version": "==7.0" }, - "faker": { - "hashes": [ - "sha256:0184fa252f86214308bb6bed344f96294f2e3528fbffafc727890cf2a86d6027", - "sha256:12e950f6f361c3b959ddf5e99d42cc9f5d89d3082688828d978b11c6029294d0" - ], - "version": "==0.8.18" - }, "flasgger": { "hashes": [ "sha256:db3c211ca78472a71ff8578c069de6e955be04a047bfbc4fab45743d804a0d57", "sha256:e799c77d6b777356a0fc902ced16f4e5f5c518e2d96748da7644bcb59b67153b" ], - "index": "pypi", + "index": "aliyun", "version": "==0.9.2" }, "flask": { @@ -69,7 +54,7 @@ "sha256:2271c0070dbcb5275fad4a82e29f23ab92682dc45f9dfbc22c02ba9b9322ce48", "sha256:a080b744b7e345ccfcbc77954861cb05b3c63786e93f2b3875e0913d44b43f05" ], - "index": "pypi", + "index": "aliyun", "version": "==1.0.2" }, "gevent": { @@ -89,6 +74,7 @@ "sha256:50024a1ee2cf04645535c5ebaeaa0a60c5ef32e262da981f4be0546b26791950", "sha256:53b72385857e04e7faca13c613c07cab411480822ac658d97fd8a4ddbaf715c8", "sha256:74b7528f901f39c39cdbb50cdf08f1a2351725d9aebaef212a29abfbb06895ee", + "sha256:76378a439e75c0d1381e6ca636e55d4af93c94c58c61e7be2c26d919aced92cb", "sha256:7d0809e2991c9784eceeadef01c27ee6a33ca09ebba6154317a257353e3af922", "sha256:896b2b80931d6b13b5d9feba3d4eebc67d5e6ec54f0cf3339d08487d55d93b0e", "sha256:8d9ec51cc06580f8c21b41fd3f2b3465197ba5b23c00eb7d422b7ae0380510b0", @@ -133,15 +119,9 @@ "sha256:aa8e0b40b4157b36a5df5e599f45c9c76d6af43845ba3b3b0efe2c70473c2471", "sha256:fa2662097c66f920f53f70621c6c58ca4a3c4d3434205e608e121b5b3b71f4f3" ], - "index": "pypi", + "index": "aliyun", "version": "==19.9.0" }, - "inflection": { - "hashes": [ - "sha256:18ea7fb7a7d152853386523def08736aa8c32636b047ade55f7578c4edeb16ca" - ], - "version": "==0.3.1" - }, "itsdangerous": { "hashes": [ "sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19", @@ -163,40 +143,6 @@ ], "version": "==3.0.0b3" }, - "lazy-object-proxy": { - "hashes": [ - "sha256:0ce34342b419bd8f018e6666bfef729aec3edf62345a53b537a4dcc115746a33", - "sha256:1b668120716eb7ee21d8a38815e5eb3bb8211117d9a90b0f8e21722c0758cc39", - "sha256:209615b0fe4624d79e50220ce3310ca1a9445fd8e6d3572a896e7f9146bbf019", - "sha256:27bf62cb2b1a2068d443ff7097ee33393f8483b570b475db8ebf7e1cba64f088", - "sha256:27ea6fd1c02dcc78172a82fc37fcc0992a94e4cecf53cb6d73f11749825bd98b", - "sha256:2c1b21b44ac9beb0fc848d3993924147ba45c4ebc24be19825e57aabbe74a99e", - "sha256:2df72ab12046a3496a92476020a1a0abf78b2a7db9ff4dc2036b8dd980203ae6", - "sha256:320ffd3de9699d3892048baee45ebfbbf9388a7d65d832d7e580243ade426d2b", - "sha256:50e3b9a464d5d08cc5227413db0d1c4707b6172e4d4d915c1c70e4de0bbff1f5", - "sha256:5276db7ff62bb7b52f77f1f51ed58850e315154249aceb42e7f4c611f0f847ff", - "sha256:61a6cf00dcb1a7f0c773ed4acc509cb636af2d6337a08f362413c76b2b47a8dd", - "sha256:6ae6c4cb59f199d8827c5a07546b2ab7e85d262acaccaacd49b62f53f7c456f7", - "sha256:7661d401d60d8bf15bb5da39e4dd72f5d764c5aff5a86ef52a042506e3e970ff", - "sha256:7bd527f36a605c914efca5d3d014170b2cb184723e423d26b1fb2fd9108e264d", - "sha256:7cb54db3535c8686ea12e9535eb087d32421184eacc6939ef15ef50f83a5e7e2", - "sha256:7f3a2d740291f7f2c111d86a1c4851b70fb000a6c8883a59660d95ad57b9df35", - "sha256:81304b7d8e9c824d058087dcb89144842c8e0dea6d281c031f59f0acf66963d4", - "sha256:933947e8b4fbe617a51528b09851685138b49d511af0b6c0da2539115d6d4514", - "sha256:94223d7f060301b3a8c09c9b3bc3294b56b2188e7d8179c762a1cda72c979252", - "sha256:ab3ca49afcb47058393b0122428358d2fbe0408cf99f1b58b295cfeb4ed39109", - "sha256:bd6292f565ca46dee4e737ebcc20742e3b5be2b01556dafe169f6c65d088875f", - "sha256:cb924aa3e4a3fb644d0c463cad5bc2572649a6a3f68a7f8e4fbe44aaa6d77e4c", - "sha256:d0fc7a286feac9077ec52a927fc9fe8fe2fabab95426722be4c953c9a8bede92", - "sha256:ddc34786490a6e4ec0a855d401034cbd1242ef186c20d79d2166d6a4bd449577", - "sha256:e34b155e36fa9da7e1b7c738ed7767fc9491a62ec6af70fe9da4a057759edc2d", - "sha256:e5b9e8f6bda48460b7b143c3821b21b452cb3a835e6bbd5dd33aa0c8d3f5137d", - "sha256:e81ebf6c5ee9684be8f2c87563880f93eedd56dd2b6146d8a725b50b7e5adb0f", - "sha256:eb91be369f945f10d3a49f5f9be8b3d0b93a4c2be8f8a5b83b0571b8123e0a7a", - "sha256:f460d1ceb0e4a5dcb2a652db0904224f367c9b3c1470d5a7683c0480e582468b" - ], - "version": "==1.3.1" - }, "markupsafe": { "hashes": [ "sha256:048ef924c1623740e70204aa7143ec592504045ae4429b59c30054cb31e3c432", @@ -243,74 +189,34 @@ "sha256:a62220410e26ce2d2ff94dd0138c3ecfb91db634464a9afb4c8e6b50f0a67e00", "sha256:e1b9f3a8928ddb4985ca3e3c9f2aa81b19e831bbf6fabf5681ee356738dbbbb2" ], - "index": "pypi", + "index": "aliyun", "version": "==1.4.1" }, - "orator": { - "hashes": [ - "sha256:0088a81c4b43aa2e405c2532d2ea581da6e26d61d4bfeda44b768d7bbc387290", - "sha256:e81d5c86adbd06d860496602758984b053f26d9087e751517879180c93a9ae86" - ], - "index": "pypi", - "version": "==0.9.8" - }, - "pastel": { - "hashes": [ - "sha256:3108af417ec0fa6d0a620e676ec4f02c839ca13e10611586e5d2174b46aa0bc3", - "sha256:d1fee8079534f99f1805a044fef946d23eee6d6a7cd34292c30e6c16be9a80b9" - ], - "version": "==0.1.0" - }, "peewee": { "hashes": [ "sha256:7f8e3f512ee0d4e2d9c2008ea446d69e23c9535466367b991d452825a1ddb654" ], - "index": "pypi", + "index": "aliyun", "version": "==3.8.2" }, "peeweext": { "hashes": [ - "sha256:fce9f08bd4a2c4fdf4eb84ae7027c689cd3c0fe1566b90e5efc5f98b15a5b1ae" + "sha256:34baa912d006ecfb4ae04a93a58076af3fa72f87682b413d4c4c1e09b2e85b18" ], - "index": "pypi", - "version": "==0.7.4" + "index": "aliyun", + "version": "==1.0.1" }, "pendulum": { "hashes": [ - "sha256:4173ce3e81ad0d9d61dbce86f4286c43a26a398270df6a0a89f501f0c28ad27d", - "sha256:56a347d0457859c84b8cdba161fc37c7df5db9b3becec7881cd770e9d2058b3c", - "sha256:738878168eb26e5446da5d1f7b3312ae993a542061be8882099c00ef4866b1a2", - "sha256:95536b33ae152e3c831eb236c1bf9ac9dcfb3b5b98fdbe8e9e601eab6c373897", - "sha256:c04fcf955e622e97e405e5f6d1b1f4a7adc69d79d82f3609643de69283170d6d", - "sha256:dd6500d27bb7ccc029d497da4f9bd09549bd3c0ea276dad894ea2fdf309e83f3", - "sha256:ddaf97a061eb5e2ae37857a8cb548e074125017855690d20e443ad8d9f31e164", - "sha256:e7df37447824f9af0b58c7915a4caf349926036afd86ad38e7529a6b2f8fc34b", - "sha256:e9732b8bb214fad2c72ddcbfec07542effa8a8b704e174347ede1ff8dc679cce", - "sha256:f4eee1e1735487d9d25cc435c519fd4380cb1f82cde3ebad1efbc2fc30deca5b" - ], - "index": "pypi", - "version": "==1.5.1" - }, - "pyaml": { - "hashes": [ - "sha256:8b70b7cc2afa55dd89d2a31ef8abe4cfb3daa100cd63564f8fd97e6cac6cff5b", - "sha256:b865e4f53a85f4d8a092e7701f759a3237fb3ee8a928627401914aafadc00907" + "sha256:0f43d963b27e92b04047ce8352e4c277db99f20d0b513df7d0ceafe674a2f727", + "sha256:14e60d26d7400980123dbb6e3f2a90b70d7c18c63742ffe5bd6d6a643f8c6ef1", + "sha256:5035a4e17504814a679f138374269cc7cc514aeac7ba6d9dc020abc224f25dbc", + "sha256:8c0b3d655c1e9205d4dacf42fffc929cde3b19b5fb544a7f7561e6896eb8a000", + "sha256:bfc7b33ae193a204ec0bec12ad0d2d3300cd7e51d91d992da525ba3b28f0d265", + "sha256:cd70b75800439794e1ad8dbfa24838845e171918df81fa98b68d0d5a6f9b8bf2", + "sha256:cf535d36c063575d4752af36df928882b2e0e31541b4482c97d63752785f9fcb" ], - "version": "==16.12.2" - }, - "pygments": { - "hashes": [ - "sha256:5ffada19f6203563680669ee7f53b64dabbeb100eb51b61996085e99c03b284a", - "sha256:e8218dd399a61674745138520d0d4cf2621d7e032439341bc3f647bff125818d" - ], - "version": "==2.3.1" - }, - "pylev": { - "hashes": [ - "sha256:063910098161199b81e453025653ec53556c1be7165a9b7c50be2f4d57eae1c3", - "sha256:1d29a87beb45ebe1e821e7a3b10da2b6b2f4c79b43f482c2df1a1f748a6e114e" - ], - "version": "==1.3.0" + "version": "==2.0.4" }, "pyrsistent": { "hashes": [ @@ -325,13 +231,6 @@ ], "version": "==2.7.5" }, - "pytz": { - "hashes": [ - "sha256:32b0891edff07e28efe91284ed9c31e123d84bea3fd98e1f72be2508f43ef8d9", - "sha256:d5f05e487007e29e03409f9398d074e158d920d36eb82eaf66fb1136b0c5374c" - ], - "version": "==2018.9" - }, "pytzdata": { "hashes": [ "sha256:10c74b0cfc51a9269031f86ecd11096c9c6a141f5bb15a3b8a88f9979f6361e2", @@ -341,36 +240,13 @@ }, "pyyaml": { "hashes": [ - "sha256:3d7da3009c0f3e783b2c873687652d83b1bbfd5c88e9813fb7e5b03c0dd3108b", - "sha256:3ef3092145e9b70e3ddd2c7ad59bdd0252a94dfe3949721633e41344de00a6bf", - "sha256:40c71b8e076d0550b2e6380bada1f1cd1017b882f7e16f09a65be98e017f211a", - "sha256:558dd60b890ba8fd982e05941927a3911dc409a63dcb8b634feaa0cda69330d3", - "sha256:a7c28b45d9f99102fa092bb213aa12e0aaf9a6a1f5e395d36166639c1f96c3a1", - "sha256:aa7dd4a6a427aed7df6fb7f08a580d68d9b118d90310374716ae90b710280af1", - "sha256:bc558586e6045763782014934bfaf39d48b8ae85a2713117d16c39864085c613", - "sha256:d46d7982b62e0729ad0175a9bc7e10a566fc07b224d2c79fafb5e032727eaa04", - "sha256:d5eef459e30b09f5a098b9cea68bebfeb268697f78d647bd255a085371ac7f3f", - "sha256:e01d3203230e1786cd91ccfdc8f8454c8069c91bee3962ad93b87a4b2860f537", - "sha256:e170a9e6fcfd19021dd29845af83bb79236068bf5fd4df3327c1be18182b2531" - ], - "version": "==3.13" - }, - "simplejson": { - "hashes": [ - "sha256:067a7177ddfa32e1483ba5169ebea1bc2ea27f224853211ca669325648ca5642", - "sha256:2fc546e6af49fb45b93bbe878dea4c48edc34083729c0abd09981fe55bdf7f91", - "sha256:354fa32b02885e6dae925f1b5bbf842c333c1e11ea5453ddd67309dc31fdb40a", - "sha256:37e685986cf6f8144607f90340cff72d36acf654f3653a6c47b84c5c38d00df7", - "sha256:3af610ee72efbe644e19d5eaad575c73fb83026192114e5f6719f4901097fce2", - "sha256:3b919fc9cf508f13b929a9b274c40786036b31ad28657819b3b9ba44ba651f50", - "sha256:3dd289368bbd064974d9a5961101f080e939cbe051e6689a193c99fb6e9ac89b", - "sha256:6c3258ffff58712818a233b9737fe4be943d306c40cf63d14ddc82ba563f483a", - "sha256:75e3f0b12c28945c08f54350d91e624f8dd580ab74fd4f1bbea54bc6b0165610", - "sha256:b1f329139ba647a9548aa05fb95d046b4a677643070dc2afc05fa2e975d09ca5", - "sha256:ee9625fc8ee164902dfbb0ff932b26df112da9f871c32f0f9c1bcf20c350fe2a", - "sha256:fb2530b53c28f0d4d84990e945c2ebb470edb469d63e389bf02ff409012fe7c5" - ], - "version": "==3.16.0" + "sha256:254bf6fda2b7c651837acb2c718e213df29d531eebf00edb54743d10bcb694eb", + "sha256:3108529b78577327d15eec243f0ff348a0640b0c3478d67ad7f5648f93bac3e2", + "sha256:3c17fb92c8ba2f525e4b5f7941d850e7a48c3a59b32d331e2502a3cdc6648e76", + "sha256:8d6d96001aa7f0a6a4a95e8143225b5d06e41b1131044913fecb8f85a125714b", + "sha256:c8a88edd93ee29ede719080b2be6cb2333dfee1dccba213b422a9c8e97f2967b" + ], + "version": "==4.2b4" }, "six": { "hashes": [ @@ -379,31 +255,12 @@ ], "version": "==1.12.0" }, - "text-unidecode": { - "hashes": [ - "sha256:5a1375bb2ba7968740508ae38d92e1f889a0832913cb1c447d5e2046061a396d", - "sha256:801e38bd550b943563660a91de8d4b6fa5df60a542be9093f7abf819f86050cc" - ], - "version": "==1.2" - }, - "tzlocal": { - "hashes": [ - "sha256:4ebeb848845ac898da6519b9b31879cf13b6626f7184c496037b818e238f2c4e" - ], - "version": "==1.5.1" - }, "werkzeug": { "hashes": [ "sha256:c3fd7a7d41976d9f44db327260e263132466836cef6f91512889ed60ad26557c", "sha256:d5da73735293558eb1651ee2fddc4d0dedcfa06538b8813a2e20011583c9e49b" ], "version": "==0.14.1" - }, - "wrapt": { - "hashes": [ - "sha256:4aea003270831cceb8a90ff27c4031da6ead7ec1886023b80ce0dfe0adf61533" - ], - "version": "==1.11.1" } }, "develop": { @@ -447,7 +304,7 @@ "sha256:817243426042db1d36617910df579a54f1afd659adb96fc5032fcf4b36209739", "sha256:e030a9a28f542debc08acceb273f228ac422798e5215ba2a791a6ddeaaca22a5" ], - "index": "pypi", + "index": "aliyun", "version": "==18.9b0" }, "cached-property": { @@ -490,7 +347,7 @@ "sha256:8ed8b7c6791010d359baed66f84f061bba5bd41174bf324c31311e8737602788", "sha256:ae00d68e18d8a20e9c3288ba3875ae03db3a8e892115bf9b83ef20507732bed4" ], - "index": "pypi", + "index": "aliyun", "version": "==2.0.15" }, "coverage": { @@ -536,17 +393,18 @@ }, "faker": { "hashes": [ - "sha256:0184fa252f86214308bb6bed344f96294f2e3528fbffafc727890cf2a86d6027", - "sha256:12e950f6f361c3b959ddf5e99d42cc9f5d89d3082688828d978b11c6029294d0" + "sha256:16342dca4d92bfc83bab6a7daf6650e0ab087605a66bc38f17523fdb01757910", + "sha256:d871ea315b2dcba9138b8344f2c131a76ac62d6227ca39f69b0c889fec97376c" ], - "version": "==0.8.18" + "index": "aliyun", + "version": "==1.0.2" }, "flake8": { "hashes": [ "sha256:09b9bb539920776da542e67a570a5df96ff933c9a08b62cfae920bcc789e4383", "sha256:e0f8cd519cfc0072c0ee31add5def09d2b3ef6040b34dc426445c3af9b02163c" ], - "index": "pypi", + "index": "aliyun", "version": "==3.7.4" }, "flake8-bugbear": { @@ -554,7 +412,7 @@ "sha256:07b6e769d7f4e168d590f7088eae40f6ddd9fa4952bed31602def65842682c83", "sha256:0ccf56975f4db1d69dc1cf3598c99d768ebf95d0cad27d76087954aa399b515a" ], - "index": "pypi", + "index": "aliyun", "version": "==18.8.0" }, "flake8-mypy": { @@ -562,7 +420,7 @@ "sha256:47120db63aff631ee1f84bac6fe8e64731dc66da3efc1c51f85e15ade4a3ba18", "sha256:cff009f4250e8391bf48990093cff85802778c345c8449d6498b62efefeebcbc" ], - "index": "pypi", + "index": "aliyun", "version": "==17.8.0" }, "identify": { @@ -603,7 +461,7 @@ "sha256:b9c40e9750f3d77e6e4d441d8b0266cf555e7cdabdcff33c4fd06366ca761ef8", "sha256:ec9ef8f4a9bc6f71eec99e1806bfa2de401650d996c59330782b89a5555c1497" ], - "index": "pypi", + "index": "aliyun", "version": "==4.3.4" }, "mccabe": { @@ -626,7 +484,7 @@ "sha256:986a7f97808a865405c5fd98fae5ebfa963c31520a56c783df159e9a81e41b3e", "sha256:cc5df73cc11d35655a8c364f45d07b13c8db82c000def4bd7721be13356533b4" ], - "index": "pypi", + "index": "aliyun", "version": "==0.660" }, "mypy-extensions": { @@ -654,7 +512,7 @@ "sha256:2cb7a588fdc78e4ec4e624932765e65d285159f4b3425121106cbd9060e40e04", "sha256:74ee5779a17ef540efdf9a832911fe9057b1bb57d5d0152eace6534a228a863b" ], - "index": "pypi", + "index": "aliyun", "version": "==1.14.2" }, "py": { @@ -683,7 +541,7 @@ "sha256:65aeaa77ae87c7fc95de56285282546cfa9c886dc8e5dc78313db1c25e21bc07", "sha256:6ac6d467d9f053e95aaacd79f831dbecfe730f419c6c7022cb316b365cd9199d" ], - "index": "pypi", + "index": "aliyun", "version": "==4.2.0" }, "pytest-cov": { @@ -691,7 +549,7 @@ "sha256:0ab664b25c6aa9716cbf203b17ddb301932383046082c081b9848a0edf5add33", "sha256:230ef817450ab0699c6cc3c9c8f7a829c34674456f2ed8df1fe1d39780f7c87f" ], - "index": "pypi", + "index": "aliyun", "version": "==2.6.1" }, "python-dateutil": { @@ -703,19 +561,13 @@ }, "pyyaml": { "hashes": [ - "sha256:3d7da3009c0f3e783b2c873687652d83b1bbfd5c88e9813fb7e5b03c0dd3108b", - "sha256:3ef3092145e9b70e3ddd2c7ad59bdd0252a94dfe3949721633e41344de00a6bf", - "sha256:40c71b8e076d0550b2e6380bada1f1cd1017b882f7e16f09a65be98e017f211a", - "sha256:558dd60b890ba8fd982e05941927a3911dc409a63dcb8b634feaa0cda69330d3", - "sha256:a7c28b45d9f99102fa092bb213aa12e0aaf9a6a1f5e395d36166639c1f96c3a1", - "sha256:aa7dd4a6a427aed7df6fb7f08a580d68d9b118d90310374716ae90b710280af1", - "sha256:bc558586e6045763782014934bfaf39d48b8ae85a2713117d16c39864085c613", - "sha256:d46d7982b62e0729ad0175a9bc7e10a566fc07b224d2c79fafb5e032727eaa04", - "sha256:d5eef459e30b09f5a098b9cea68bebfeb268697f78d647bd255a085371ac7f3f", - "sha256:e01d3203230e1786cd91ccfdc8f8454c8069c91bee3962ad93b87a4b2860f537", - "sha256:e170a9e6fcfd19021dd29845af83bb79236068bf5fd4df3327c1be18182b2531" + "sha256:254bf6fda2b7c651837acb2c718e213df29d531eebf00edb54743d10bcb694eb", + "sha256:3108529b78577327d15eec243f0ff348a0640b0c3478d67ad7f5648f93bac3e2", + "sha256:3c17fb92c8ba2f525e4b5f7941d850e7a48c3a59b32d331e2502a3cdc6648e76", + "sha256:8d6d96001aa7f0a6a4a95e8143225b5d06e41b1131044913fecb8f85a125714b", + "sha256:c8a88edd93ee29ede719080b2be6cb2333dfee1dccba213b422a9c8e97f2967b" ], - "version": "==3.13" + "version": "==4.2b4" }, "requests": { "hashes": [ @@ -729,7 +581,7 @@ "sha256:12b8a1ec6e0e451fdac487f606f6c65093dce1172fb5664e4a1f83bc43c75c7f", "sha256:387337a33281ee22593b4f9d3238347b9c0177a8b62e83e01242fc37b0eb33a1" ], - "index": "pypi", + "index": "aliyun", "version": "==1.5.0" }, "six": { diff --git a/manage.sh b/manage.sh deleted file mode 100755 index 9d64ef6..0000000 --- a/manage.sh +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env bash - -FLASK_ENV=${FLASK_ENV:="development"} - -db_host=${DB_HOST:="mysql"} -db_user=${DB_USER:="root"} -db_password=${DB_PASSWORD:="toor333666"} -db_name=${DB_NAME:="anteater"} -if [ ${FLASK_ENV} == "testing" ]; then - db_name="tarot_test" -fi - - -date_str=$(date +"%Y_%m_%d_%H%M%S") -sql_basename="${date_str}_${FLASK_ENV}_${db_name}" - -function orator_action() { - migrations_path="db/migrations" - case "$Action" in - migrate ) - config_file="configs/${FLASK_ENV}.py" - echo Using config file: ${config_file} - before="${sql_basename}_ddl_before.sql" - mysqldump_action ${before} - PYTHONPATH=`pwd`:`pwd`/protos orator migrate -c ${config_file} -p ${migrations_path} $* - # 即使migrate失败, 也有可能产生部分数据结构的改动 - after="${sql_basename}_ddl_after.sql" - mysqldump_action ${after} - echo "migrate前DDL文件: ${before}" - echo "migrate后DDL文件: ${before}" - echo "migrate前后DDL差异: " - diff ${before} ${after} - ;; - make_migration) - PYTHONPATH=`pwd`:`pwd`/protos orator make:migration -p ${migrations_path} $* ;; - * ) ;; - esac -} - -function mysqldump_action() { - mysqldump ${db_name} -u ${db_user} -h ${db_host} --password=${db_password} -r $* -} - - -Action=$1 -shift - -case "$Action" in - make_migration | migrate ) - orator_action $* ;; - - * ) - echo 'Usage:' - echo './manage.sh make_migration | migrate';; -esac