Techdebt: Unpin werkzeug (#5569)
This commit is contained in:
parent
43a3fecbd2
commit
3e60cdf3eb
29
.github/workflows/test_outdated_versions.yml
vendored
29
.github/workflows/test_outdated_versions.yml
vendored
@ -16,7 +16,7 @@ jobs:
|
||||
python-version: [ "3.10" ]
|
||||
responses-version: ["0.13.0", "0.15.0", "0.17.0", "0.19.0", "0.20.0" ]
|
||||
mock-version: [ "3.0.5", "4.0.0", "4.0.3" ]
|
||||
werkzeug-version: ["2.0.1", "2.1.1"]
|
||||
werkzeug-version: ["2.0.1", "2.1.1", "2.2.2"]
|
||||
openapi-spec-validator-version: ["0.4.0", "0.5.0"]
|
||||
|
||||
steps:
|
||||
@ -37,9 +37,36 @@ jobs:
|
||||
pip install -r requirements-dev.txt
|
||||
pip install responses==${{ matrix.responses-version }}
|
||||
pip install mock==${{ matrix.mock-version }}
|
||||
pip install flask==${{ matrix.werkzeug-version }}
|
||||
pip install werkzeug==${{ matrix.werkzeug-version }}
|
||||
pip install openapi-spec-validator==${{ matrix.openapi-spec-validator-version }}
|
||||
|
||||
- name: Run tests
|
||||
run: |
|
||||
pytest -sv tests/test_core ./tests/test_apigateway/test_apigateway_integration.py ./tests/test_s3/test_server.py
|
||||
|
||||
- name: Start MotoServer
|
||||
run: |
|
||||
python setup.py sdist
|
||||
docker run --rm -t --name motoserver -e TEST_SERVER_MODE=true -e AWS_SECRET_ACCESS_KEY=server_secret -e AWS_ACCESS_KEY_ID=server_key -v `pwd`:/moto -p 5000:5000 -v /var/run/docker.sock:/var/run/docker.sock python:3.7-buster /moto/scripts/ci_moto_server.sh &
|
||||
python scripts/ci_wait_for_server.py
|
||||
- name: Test ServerMode/Coverage
|
||||
env:
|
||||
TEST_SERVER_MODE: ${{ true }}
|
||||
run: |
|
||||
pytest -sv tests/test_core tests/test_awslambda tests/test_cloudformation
|
||||
- name: "Stop MotoServer"
|
||||
if: always()
|
||||
run: |
|
||||
mkdir serverlogs
|
||||
pwd
|
||||
ls -la
|
||||
cp server_output.log serverlogs/server_output.log
|
||||
docker stop motoserver
|
||||
- name: Archive TF logs
|
||||
if: always()
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: motoserver
|
||||
path: |
|
||||
serverlogs/*
|
||||
|
@ -19,8 +19,9 @@ url_paths = {
|
||||
"{0}/restapis/(?P<function_id>[^/]+)/resources/(?P<resource_id>[^/]+)/?$": response.resource_individual,
|
||||
"{0}/restapis/(?P<function_id>[^/]+)/resources/(?P<resource_id>[^/]+)/methods/(?P<method_name>[^/]+)/?$": response.resource_methods,
|
||||
r"{0}/restapis/(?P<function_id>[^/]+)/resources/(?P<resource_id>[^/]+)/methods/(?P<method_name>[^/]+)/responses/(?P<status_code>\d+)$": response.resource_method_responses,
|
||||
"{0}/restapis/(?P<function_id>[^/]+)/resources/(?P<resource_id>[^/]+)/methods/(?P<method_name>[^/]+)/integration/?$": response.integrations,
|
||||
r"{0}/restapis/(?P<function_id>[^/]+)/resources/(?P<resource_id>[^/]+)/methods/(?P<method_name>[^/]+)/integration/responses/(?P<status_code>\d+)/?$": response.integration_responses,
|
||||
r"{0}/restapis/(?P<function_id>[^/]+)/resources/(?P<resource_id>[^/]+)/methods/(?P<method_name>[^/]+)/integration$": response.integrations,
|
||||
r"{0}/restapis/(?P<function_id>[^/]+)/resources/(?P<resource_id>[^/]+)/methods/(?P<method_name>[^/]+)/integration/responses/(?P<status_code>\d+)$": response.integration_responses,
|
||||
r"{0}/restapis/(?P<function_id>[^/]+)/resources/(?P<resource_id>[^/]+)/methods/(?P<method_name>[^/]+)/integration/responses/(?P<status_code>\d+)/$": response.integration_responses,
|
||||
"{0}/apikeys$": response.apikeys,
|
||||
"{0}/apikeys/(?P<apikey>[^/]+)": response.apikey_individual,
|
||||
"{0}/usageplans$": response.usage_plans,
|
||||
|
@ -26,7 +26,9 @@ url_paths = {
|
||||
"{0}/v2/apis/(?P<api_id>[^/]+)/routes/(?P<route_id>[^/]+)/routeresponses$": response_v2.route_responses,
|
||||
"{0}/v2/apis/(?P<api_id>[^/]+)/routes/(?P<route_id>[^/]+)/routeresponses/(?P<route_response_id>[^/]+)$": response_v2.route_response,
|
||||
"{0}/v2/apis/(?P<api_id>[^/]+)/routes/(?P<route_id>[^/]+)/requestparameters/(?P<request_parameter>[^/]+)$": response_v2.route_request_parameter,
|
||||
"{0}/v2/tags/(?P<resource_arn>.+)$": response_v2.tags,
|
||||
"{0}/v2/tags/(?P<resource_arn>[^/]+)$": response_v2.tags,
|
||||
"{0}/v2/tags/(?P<resource_arn_pt1>[^/]+)/apis/(?P<resource_arn_pt2>[^/]+)$": response_v2.tags,
|
||||
"{0}/v2/tags/(?P<resource_arn_pt1>[^/]+)/vpclinks/(?P<resource_arn_pt2>[^/]+)$": response_v2.tags,
|
||||
"{0}/v2/vpclinks$": response_v2.vpc_links,
|
||||
"{0}/v2/vpclinks/(?P<vpc_link_id>[^/]+)$": response_v2.vpc_link,
|
||||
}
|
||||
|
@ -16,5 +16,6 @@ url_paths = {
|
||||
"{0}/v1/apis/(?P<api_id>[^/]+)/apikeys/(?P<api_key_id>[^/]+)$": response.api_key_individual,
|
||||
"{0}/v1/apis/(?P<api_id>[^/]+)/schemacreation$": response.schemacreation,
|
||||
"{0}/v1/tags/(?P<resource_arn>.+)$": response.tags,
|
||||
"{0}/v1/tags/(?P<resource_arn_pt1>.+)/(?P<resource_arn_pt2>.+)$": response.tags,
|
||||
"{0}/v1/apis/(?P<api_id>[^/]+)/types/(?P<type_name>.+)$": response.types,
|
||||
}
|
||||
|
@ -5,16 +5,18 @@ url_bases = [r"https?://lambda\.(.+)\.amazonaws\.com"]
|
||||
response = LambdaResponse()
|
||||
|
||||
url_paths = {
|
||||
r"{0}/(?P<api_version>[^/]+)/functions/?$": response.root,
|
||||
r"{0}/(?P<api_version>[^/]+)/functions$": response.root,
|
||||
r"{0}/(?P<api_version>[^/]+)/functions/$": response.root,
|
||||
r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/?$": response.function,
|
||||
r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/aliases$": response.aliases,
|
||||
r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/aliases/(?P<alias_name>[\w_-]+)$": response.alias,
|
||||
r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/versions/?$": response.versions,
|
||||
r"{0}/(?P<api_version>[^/]+)/event-source-mappings/?$": response.event_source_mappings,
|
||||
r"{0}/(?P<api_version>[^/]+)/event-source-mappings/$": response.event_source_mappings,
|
||||
r"{0}/(?P<api_version>[^/]+)/event-source-mappings/(?P<UUID>[\w_-]+)/?$": response.event_source_mapping,
|
||||
r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_-]+)/invocations/?$": response.invoke,
|
||||
r"{0}/(?P<api_version>[^/]+)/functions/(?P<resource_arn>.+)/invocations/?$": response.invoke,
|
||||
r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/invoke-async/?$": response.invoke_async,
|
||||
r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/invoke-async$": response.invoke_async,
|
||||
r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/invoke-async/$": response.invoke_async,
|
||||
r"{0}/(?P<api_version>[^/]+)/tags/(?P<resource_arn>.+)": response.tag,
|
||||
r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/policy/(?P<statement_id>[\w_-]+)$": response.policy,
|
||||
r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/policy/?$": response.policy,
|
||||
@ -23,7 +25,9 @@ url_paths = {
|
||||
r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/code-signing-config$": response.code_signing_config,
|
||||
r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/concurrency/?$": response.function_concurrency,
|
||||
r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/url/?$": response.function_url_config,
|
||||
r"{0}/(?P<api_version>[^/]+)/layers/?$": response.list_layers,
|
||||
r"{0}/(?P<api_version>[^/]+)/layers/(?P<layer_name>[\w_-]+)/versions/?$": response.layers_versions,
|
||||
r"{0}/(?P<api_version>[^/]+)/layers$": response.list_layers,
|
||||
r"{0}/(?P<api_version>[^/]+)/layers/$": response.list_layers,
|
||||
r"{0}/(?P<api_version>[^/]+)/layers/(?P<layer_name>[\w_-]+)/versions$": response.layers_versions,
|
||||
r"{0}/(?P<api_version>[^/]+)/layers/(?P<layer_name>[\w_-]+)/versions/$": response.layers_versions,
|
||||
r"{0}/(?P<api_version>[^/]+)/layers/(?P<layer_name>[\w_-]+)/versions/(?P<layer_version>[\w_-]+)$": response.layers_version,
|
||||
}
|
||||
|
@ -8,6 +8,8 @@ from werkzeug.routing import BaseConverter
|
||||
class RegexConverter(BaseConverter):
|
||||
# http://werkzeug.pocoo.org/docs/routing/#custom-converters
|
||||
|
||||
part_isolating = False
|
||||
|
||||
def __init__(self, url_map, *items):
|
||||
super().__init__(url_map)
|
||||
self.regex = items[0]
|
||||
|
@ -14,5 +14,6 @@ url_paths = {
|
||||
"{0}/v1/apps/(?P<app_id>[^/]+)$": response.app,
|
||||
"{0}/v1/apps/(?P<app_id>[^/]+)/eventstream": response.eventstream,
|
||||
"{0}/v1/apps/(?P<app_id>[^/]+)/settings$": response.app_settings,
|
||||
"{0}/v1/tags/(?P<app_arn>.+)$": response.tags,
|
||||
"{0}/v1/tags/(?P<app_arn>[^/]+)$": response.tags,
|
||||
"{0}/v1/tags/(?P<app_arn_pt_1>[^/]+)/(?P<app_arn_pt_2>[^/]+)$": response.tags,
|
||||
}
|
||||
|
@ -15,8 +15,10 @@ def tag_response2(*args, **kwargs):
|
||||
url_paths = {
|
||||
r"{0}/(?P<api_version>[\d_-]+)/hostedzone$": Route53().list_or_create_hostzone_response,
|
||||
r"{0}/(?P<api_version>[\d_-]+)/hostedzone/(?P<zone_id>[^/]+)$": Route53().get_or_delete_hostzone_response,
|
||||
r"{0}/(?P<api_version>[\d_-]+)/hostedzone/(?P<zone_id>[^/]+)/rrset/?$": Route53().rrset_response,
|
||||
r"{0}/(?P<api_version>[\d_-]+)/hostedzone/(?P<zone_id>[^/]+)/dnssec/?$": Route53().get_dnssec_response,
|
||||
r"{0}/(?P<api_version>[\d_-]+)/hostedzone/(?P<zone_id>[^/]+)/rrset$": Route53().rrset_response,
|
||||
r"{0}/(?P<api_version>[\d_-]+)/hostedzone/(?P<zone_id>[^/]+)/rrset/$": Route53().rrset_response,
|
||||
r"{0}/(?P<api_version>[\d_-]+)/hostedzone/(?P<zone_id>[^/]+)/dnssec$": Route53().get_dnssec_response,
|
||||
r"{0}/(?P<api_version>[\d_-]+)/hostedzone/(?P<zone_id>[^/]+)/dnssec/$": Route53().get_dnssec_response,
|
||||
r"{0}/(?P<api_version>[\d_-]+)/hostedzone/(?P<zone_id>[^/]+)/associatevpc/?$": Route53().associate_vpc_response,
|
||||
r"{0}/(?P<api_version>[\d_-]+)/hostedzone/(?P<zone_id>[^/]+)/disassociatevpc/?$": Route53().disassociate_vpc_response,
|
||||
r"{0}/(?P<api_version>[\d_-]+)/hostedzonesbyname": Route53().list_hosted_zones_by_name_response,
|
||||
|
@ -14,7 +14,8 @@ url_paths = {
|
||||
# subdomain bucket
|
||||
"{0}/$": S3ResponseInstance.bucket_response,
|
||||
# subdomain key of path-based bucket
|
||||
"{0}/(?P<key_or_bucket_name>[^/]+)/?$": S3ResponseInstance.ambiguous_response,
|
||||
"{0}/(?P<key_or_bucket_name>[^/]+)$": S3ResponseInstance.ambiguous_response,
|
||||
"{0}/(?P<key_or_bucket_name>[^/]+)/$": S3ResponseInstance.ambiguous_response,
|
||||
# path-based bucket + key
|
||||
"{0}/(?P<bucket_name_path>[^/]+)/(?P<key_name>.+)": S3ResponseInstance.key_response,
|
||||
# subdomain bucket + key with empty first part of path
|
||||
|
4
setup.py
4
setup.py
@ -32,7 +32,7 @@ install_requires = [
|
||||
"cryptography>=3.3.1",
|
||||
"requests>=2.5",
|
||||
"xmltodict",
|
||||
"werkzeug>=0.5,<2.2.0",
|
||||
"werkzeug>=0.5,!=2.2.0,!=2.2.1",
|
||||
"pytz",
|
||||
"python-dateutil<3.0.0,>=2.1",
|
||||
"responses>=0.13.0",
|
||||
@ -73,7 +73,7 @@ all_extra_deps = [
|
||||
_dep_openapi,
|
||||
_setuptools,
|
||||
]
|
||||
all_server_deps = all_extra_deps + ["flask<2.2.0", "flask-cors"]
|
||||
all_server_deps = all_extra_deps + ["flask!=2.2.0,!=2.2.1", "flask-cors"]
|
||||
|
||||
extras_per_service = {}
|
||||
for service_name in [
|
||||
|
@ -65,8 +65,8 @@ def test_create_custom_lambda_resource():
|
||||
success, logs = wait_for_log_msg(
|
||||
expected_msg="Status code: 200", log_group=log_group_name
|
||||
)
|
||||
with sure.ensure(f"Logs should indicate success: \n{logs}"):
|
||||
success.should.equal(True)
|
||||
assert success, f"Logs should indicate success: \n{logs}"
|
||||
|
||||
# Verify the correct Output was returned
|
||||
outputs = get_outputs(cf, stack_name)
|
||||
outputs.should.have.length_of(1)
|
||||
|
@ -1,9 +1,10 @@
|
||||
import gc
|
||||
import warnings
|
||||
import unittest
|
||||
from functools import wraps
|
||||
from moto import settings
|
||||
from moto.s3 import models as s3model
|
||||
from moto.s3.responses import S3ResponseInstance
|
||||
from unittest import SkipTest, TestCase
|
||||
|
||||
|
||||
def verify_zero_warnings(f):
|
||||
@ -24,13 +25,15 @@ def verify_zero_warnings(f):
|
||||
return wrapped
|
||||
|
||||
|
||||
class TestS3FileHandleClosures(unittest.TestCase):
|
||||
class TestS3FileHandleClosures(TestCase):
|
||||
"""
|
||||
Large Uploads are written to disk for performance reasons
|
||||
These tests verifies that the filehandles are properly closed after specific actions
|
||||
"""
|
||||
|
||||
def setUp(self) -> None:
|
||||
if settings.TEST_SERVER_MODE:
|
||||
raise SkipTest("No point in testing ServerMode, we're not using boto3")
|
||||
self.s3 = s3model.S3Backend("us-west-1", "1234")
|
||||
self.s3.create_bucket("my-bucket", "us-west-1")
|
||||
self.s3.create_bucket("versioned-bucket", "us-west-1")
|
||||
|
Loading…
Reference in New Issue
Block a user