diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index dfe0d9f5..4e99d769 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -26,75 +26,3 @@ jobs: run: | python setup.py sdist bdist_wheel twine upload dist/* - feedstock: - needs: build - runs-on: ubuntu-latest - steps: - - name: Set up Python 3.8 - uses: actions/setup-python@v1 - with: - python-version: 3.8 - - name: Checkout flask-restx code - uses: actions/checkout@v2 - with: - path: base - - name: Checkout flask-restx-feedstock code - uses: actions/checkout@v2 - with: - repository: python-restx/flask-restx-feedstock.git - path: feedstock - token: ${{ secrets.BOT_TOKEN }} - - name: Set Variables - id: vars - run: | - echo "::set-output name=version::$(echo ${{ github.ref }} | cut -d'/' -f3)" - - name: Create a release branch - run: | - cd feedstock - git remote add forge https://github.com/conda-forge/flask-restx-feedstock.git - git fetch forge - git checkout forge/master -b release-${{ steps.vars.outputs.version }} - - name: Update meta.yml - shell: python - run: | - from http import client - from pkg_resources import parse_requirements - import re - VERSION = "${{ steps.vars.outputs.version }}" - with open("feedstock/recipe/meta.yaml") as f: - meta = f.read() - requirements = [] - with open("base/requirements/install.pip") as f: - for req in parse_requirements(f): - name = req.project_name - versions = ",".join(["".join(spec) for spec in req.specs]) - if versions: - name += " " + versions - requirements.append(name) - requirements = '"' + '", "'.join(requirements) + '"' - conn = client.HTTPSConnection("pypi.org") - conn.request("GET", "/simple/flask-restx/") - resp = conn.getresponse() - content = str(resp.read(), "utf-8") - conn.close() - m = re.findall(r'flask-restx-%s.tar.gz#sha256=([A-Za-z0-9]+)"' % VERSION, content) - if not m: - raise Exception("sha256 not found in: %s" % content) - sha256 = m[0] - meta = re.sub(r'({% set version = )".+"( %})', r'\1"%s"\2' % VERSION, meta) - meta = re.sub(r'({% set sha256 = )".+"( %})', r'\1"%s"\2' % sha256, meta) - meta = re.sub(r"({% set requirements = \[).+(] %})", r"\1%s\2" % requirements, meta) - meta = re.sub(r"(number:) \d+", r"\1 0", meta) - with open("feedstock/recipe/meta.yaml", "w") as f: - f.write(meta) - - name: Push - run: | - cd feedstock - git config user.name "${{ secrets.BOT_USERNAME }}" - git config user.email "python.restx.bot@gmail.com" - git add recipe/meta.yaml - git commit -m"Release version ${{ steps.vars.outputs.version }}" - git push origin release-${{ steps.vars.outputs.version }} - - name: Create Pull Request - run: | - curl --fail -u ${{ secrets.BOT_USERNAME }}:${{ secrets.BOT_TOKEN }} https://api.github.com/repos/conda-forge/flask-restx-feedstock/pulls -d '{"title": "Release version ${{ steps.vars.outputs.version }}", "head": "python-restx:release-${{ steps.vars.outputs.version }}", "base": "master", "maintainer_can_modify": true}' diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 798834ed..8f47784f 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -25,6 +25,19 @@ Releases prior to 0.3.0 were “best effort” filled out, but are missing some info. If you see your contribution missing info, please open a PR on the Changelog! +.. _section-0.5.1: +0.5.1 +----- + +.. _bug_fixes-0.5.1 + +Bug Fixes +~~~~~~~~~ + +:: + + * Optimize email regex (#372) [kevinbackhouse] + .. _section-0.5.0: 0.5.0 ----- diff --git a/examples/zoo_app/requirements.txt b/examples/zoo_app/requirements.txt index a72bb41d..4ba87b60 100644 --- a/examples/zoo_app/requirements.txt +++ b/examples/zoo_app/requirements.txt @@ -2,7 +2,7 @@ aniso8601==9.0.1 attrs==21.2.0 click==7.1.2 Flask==1.1.4 -flask-restx==0.4.0 +flask-restx==0.5.1 itsdangerous==1.1.0 Jinja2==2.11.3 jsonschema==3.2.0 diff --git a/flask_restx/__about__.py b/flask_restx/__about__.py index 1a9fbad8..c3c42221 100644 --- a/flask_restx/__about__.py +++ b/flask_restx/__about__.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -__version__ = "0.5.1.dev" +__version__ = "0.5.2.dev" __description__ = ( "Fully featured framework for fast, easy and documented API development with Flask" ) diff --git a/flask_restx/api.py b/flask_restx/api.py index 60157088..f89deeb8 100644 --- a/flask_restx/api.py +++ b/flask_restx/api.py @@ -106,6 +106,7 @@ class Api(object): :param url_scheme: If set to a string (e.g. http, https), then the specs_url and base_url will explicitly use this scheme regardless of how the application is deployed. This is necessary for some deployments behind a reverse proxy. + :param str default_swagger_filename: The default swagger filename. """ def __init__( @@ -136,6 +137,7 @@ def __init__( serve_challenge_on_401=False, format_checker=None, url_scheme=None, + default_swagger_filename="swagger.json", **kwargs ): self.version = version @@ -166,6 +168,7 @@ def __init__( self._refresolver = None self.format_checker = format_checker self.namespaces = [] + self.default_swagger_filename = default_swagger_filename self.ns_paths = dict() @@ -308,7 +311,7 @@ def _register_specs(self, app_or_blueprint): app_or_blueprint, SwaggerView, self.default_namespace, - "/swagger.json", + "/" + self.default_swagger_filename, endpoint=endpoint, resource_class_args=(self,), ) diff --git a/flask_restx/inputs.py b/flask_restx/inputs.py index b05532f3..9c76d8a0 100644 --- a/flask_restx/inputs.py +++ b/flask_restx/inputs.py @@ -48,7 +48,7 @@ def my_type(value): email_regex = re.compile( - r"^" "(?P[^@]*[^@.])" r"@" r"(?P[^@]+(?:\.[^@]+)*)" r"$", + r"^" "(?P[^@]*[^@.])" r"@" r"(?P[^@\.]+(?:\.[^@\.]+)*)" r"$", re.IGNORECASE, ) diff --git a/tests/test_inputs.py b/tests/test_inputs.py index 5a0133bc..9e705684 100644 --- a/tests/test_inputs.py +++ b/tests/test_inputs.py @@ -584,6 +584,8 @@ def test_valid_value_default(self, value): "me@::1", "me@200.8.9.10", "me@2001:db8:85a3::8a2e:370:7334", + "foo@bar.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?" + + ".?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?@", ], ) def test_invalid_value_default(self, value): diff --git a/tests/test_swagger.py b/tests/test_swagger.py index f52748a9..8b7af715 100644 --- a/tests/test_swagger.py +++ b/tests/test_swagger.py @@ -3323,3 +3323,25 @@ def get(self): path = data["paths"]["/with-parser/"] assert "parameters" not in path + + def test_nondefault_swagger_filename(self, app, client): + api = restx.Api(doc="/doc/test", default_swagger_filename="test.json") + ns = restx.Namespace("ns1") + + @ns.route("/test1") + class Ns(restx.Resource): + @ns.doc("Docs") + def get(self): + pass + + api.add_namespace(ns) + api.init_app(app) + + resp = client.get("/test.json") + assert resp.status_code == 200 + assert resp.content_type == "application/json" + resp = client.get("/doc/test") + assert resp.status_code == 200 + assert resp.content_type == "text/html; charset=utf-8" + resp = client.get("/ns1/test1") + assert resp.status_code == 200