moto 4.2.3.dev38__py2.py3-none-any.whl → 4.2.3.dev40__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
moto/__init__.py CHANGED
@@ -212,7 +212,7 @@ mock_all = MockAll
212
212
  # logging.getLogger('boto').setLevel(logging.CRITICAL)
213
213
 
214
214
  __title__ = "moto"
215
- __version__ = "4.2.3.dev38"
215
+ __version__ = "4.2.3.dev40"
216
216
 
217
217
 
218
218
  try:
moto/cognitoidp/models.py CHANGED
@@ -382,7 +382,7 @@ DEFAULT_USER_POOL_CONFIG: Dict[str, Any] = {
382
382
 
383
383
  class CognitoIdpUserPool(BaseModel):
384
384
 
385
- MAX_ID_LENGTH = 56
385
+ MAX_ID_LENGTH = 55
386
386
 
387
387
  def __init__(
388
388
  self, account_id: str, region: str, name: str, extended_config: Dict[str, Any]
moto/elbv2/exceptions.py CHANGED
@@ -184,3 +184,8 @@ class InvalidStatusCodeActionTypeError(ELBClientError):
184
184
  class InvalidLoadBalancerActionException(ELBClientError):
185
185
  def __init__(self, msg: str):
186
186
  super().__init__("InvalidLoadBalancerAction", msg)
187
+
188
+
189
+ class ValidationError(ELBClientError):
190
+ def __init__(self, msg: str):
191
+ super().__init__("ValidationError", msg)
moto/elbv2/models.py CHANGED
@@ -35,6 +35,7 @@ from .exceptions import (
35
35
  InvalidModifyRuleArgumentsError,
36
36
  InvalidStatusCodeActionTypeError,
37
37
  InvalidLoadBalancerActionException,
38
+ ValidationError,
38
39
  )
39
40
 
40
41
  ALLOWED_ACTIONS = [
@@ -79,42 +80,49 @@ class FakeTargetGroup(CloudFormationModel):
79
80
  healthcheck_port: Optional[str] = None,
80
81
  healthcheck_path: Optional[str] = None,
81
82
  healthcheck_interval_seconds: Optional[str] = None,
82
- healthcheck_timeout_seconds: Optional[int] = None,
83
+ healthcheck_timeout_seconds: Optional[str] = None,
83
84
  healthcheck_enabled: Optional[str] = None,
84
85
  healthy_threshold_count: Optional[str] = None,
85
86
  unhealthy_threshold_count: Optional[str] = None,
86
87
  matcher: Optional[Dict[str, Any]] = None,
87
88
  target_type: Optional[str] = None,
89
+ ip_address_type: Optional[str] = None,
88
90
  ):
89
91
  # TODO: default values differs when you add Network Load balancer
90
92
  self.name = name
91
93
  self.arn = arn
92
94
  self.vpc_id = vpc_id
93
- self.protocol = protocol
94
- self.protocol_version = protocol_version or "HTTP1"
95
+ if target_type == "lambda":
96
+ self.protocol = None
97
+ self.protocol_version = None
98
+ elif target_type == "alb":
99
+ self.protocol = "TCP"
100
+ self.protocol_version = None
101
+ else:
102
+ self.protocol = protocol
103
+ self.protocol_version = protocol_version
95
104
  self.port = port
96
105
  self.healthcheck_protocol = healthcheck_protocol or self.protocol
97
- self.healthcheck_port = healthcheck_port
106
+ self.healthcheck_port = healthcheck_port or "traffic-port"
98
107
  self.healthcheck_path = healthcheck_path
99
- self.healthcheck_interval_seconds = healthcheck_interval_seconds or 30
100
- self.healthcheck_timeout_seconds = healthcheck_timeout_seconds
101
- if not healthcheck_timeout_seconds:
102
- # Default depends on protocol
103
- if protocol in ["TCP", "TLS"]:
104
- self.healthcheck_timeout_seconds = 6
105
- elif protocol in ["HTTP", "HTTPS", "GENEVE"]:
106
- self.healthcheck_timeout_seconds = 5
107
- else:
108
- self.healthcheck_timeout_seconds = 30
109
- self.healthcheck_enabled = healthcheck_enabled
110
- self.healthy_threshold_count = healthy_threshold_count or 5
111
- self.unhealthy_threshold_count = unhealthy_threshold_count or 2
108
+ self.healthcheck_interval_seconds = healthcheck_interval_seconds or "30"
109
+ self.healthcheck_timeout_seconds = healthcheck_timeout_seconds or "10"
110
+ self.ip_address_type = (
111
+ ip_address_type or "ipv4" if self.protocol != "GENEVE" else None
112
+ )
113
+ self.healthcheck_enabled = (
114
+ healthcheck_enabled.lower() == "true"
115
+ if healthcheck_enabled in ["true", "false"]
116
+ else True
117
+ )
118
+ self.healthy_threshold_count = healthy_threshold_count or "5"
119
+ self.unhealthy_threshold_count = unhealthy_threshold_count or "2"
112
120
  self.load_balancer_arns: List[str] = []
113
121
  if self.healthcheck_protocol != "TCP":
114
122
  self.matcher: Dict[str, Any] = matcher or {"HttpCode": "200"}
115
- self.healthcheck_path = self.healthcheck_path or "/"
123
+ self.healthcheck_path = self.healthcheck_path
116
124
  self.healthcheck_port = self.healthcheck_port or str(self.port)
117
- self.target_type = target_type
125
+ self.target_type = target_type or "instance"
118
126
 
119
127
  self.attributes = {
120
128
  "deregistration_delay.timeout_seconds": 300,
@@ -1030,6 +1038,9 @@ Member must satisfy regular expression pattern: {expression}"
1030
1038
  )
1031
1039
 
1032
1040
  def create_target_group(self, name: str, **kwargs: Any) -> FakeTargetGroup:
1041
+ protocol = kwargs.get("protocol")
1042
+ target_type = kwargs.get("target_type")
1043
+
1033
1044
  if len(name) > 32:
1034
1045
  raise InvalidTargetGroupNameError(
1035
1046
  f"Target group name '{name}' cannot be longer than '32' characters"
@@ -1080,6 +1091,124 @@ Member must satisfy regular expression pattern: {expression}"
1080
1091
  "HttpCode must be like 200 | 200-399 | 200,201 ...",
1081
1092
  )
1082
1093
 
1094
+ if target_type in ("instance", "ip", "alb"):
1095
+ for param in ("protocol", "port", "vpc_id"):
1096
+ if not kwargs.get(param):
1097
+ param = "VPC ID" if param == "vpc_id" else param.lower()
1098
+ raise ValidationError(f"A {param} must be specified")
1099
+
1100
+ if kwargs.get("vpc_id"):
1101
+ from moto.ec2.exceptions import InvalidVPCIdError
1102
+
1103
+ try:
1104
+ self.ec2_backend.get_vpc(kwargs.get("vpc_id"))
1105
+ except InvalidVPCIdError:
1106
+ raise ValidationError(
1107
+ f"The VPC ID '{kwargs.get('vpc_id')}' is not found"
1108
+ )
1109
+
1110
+ kwargs_patch = {}
1111
+
1112
+ conditions: Dict[str, Any] = {
1113
+ "target_lambda": {
1114
+ "healthcheck_interval_seconds": 35,
1115
+ "healthcheck_timeout_seconds": 30,
1116
+ "unhealthy_threshold_count": 2,
1117
+ "healthcheck_enabled": "false",
1118
+ "healthcheck_path": "/",
1119
+ },
1120
+ "target_alb": {
1121
+ "healthcheck_protocol": "HTTP",
1122
+ "healthcheck_path": "/",
1123
+ "healthcheck_timeout_seconds": 6,
1124
+ "matcher": {"HttpCode": "200-399"},
1125
+ },
1126
+ "protocol_GENEVE": {
1127
+ "healthcheck_interval_seconds": 10,
1128
+ "healthcheck_port": 80,
1129
+ "healthcheck_timeout_seconds": 5,
1130
+ "healthcheck_protocol": "TCP",
1131
+ "unhealthy_threshold_count": 2,
1132
+ },
1133
+ "protocol_HTTP_HTTPS": {
1134
+ "healthcheck_timeout_seconds": 5,
1135
+ "protocol_version": "HTTP1",
1136
+ "healthcheck_path": "/",
1137
+ "unhealthy_threshold_count": 2,
1138
+ "healthcheck_interval_seconds": 30,
1139
+ },
1140
+ "protocol_TCP": {
1141
+ "healthcheck_timeout_seconds": 10,
1142
+ },
1143
+ "protocol_TCP_TCP_UDP_UDP_TLS": {
1144
+ "healthcheck_protocol": "TCP",
1145
+ "unhealthy_threshold_count": 2,
1146
+ "healthcheck_interval_seconds": 30,
1147
+ },
1148
+ }
1149
+
1150
+ if target_type == "lambda":
1151
+ kwargs_patch.update(
1152
+ {k: kwargs.get(k) or v for k, v in conditions["target_lambda"].items()}
1153
+ )
1154
+
1155
+ if protocol == "GENEVE":
1156
+ kwargs_patch.update(
1157
+ {
1158
+ k: kwargs.get(k) or v
1159
+ for k, v in conditions["protocol_GENEVE"].items()
1160
+ }
1161
+ )
1162
+
1163
+ if protocol in ("HTTP", "HTTPS"):
1164
+ kwargs_patch.update(
1165
+ {
1166
+ k: kwargs.get(k) or v
1167
+ for k, v in conditions["protocol_HTTP_HTTPS"].items()
1168
+ }
1169
+ )
1170
+
1171
+ if protocol == "TCP":
1172
+ kwargs_patch.update(
1173
+ {k: kwargs.get(k) or v for k, v in conditions["protocol_TCP"].items()}
1174
+ )
1175
+
1176
+ if protocol in ("TCP", "TCP_UDP", "UDP", "TLS"):
1177
+ kwargs_patch.update(
1178
+ {
1179
+ k: kwargs.get(k) or v
1180
+ for k, v in conditions["protocol_TCP_TCP_UDP_UDP_TLS"].items()
1181
+ }
1182
+ )
1183
+
1184
+ if target_type == "alb":
1185
+ kwargs_patch.update(
1186
+ {k: kwargs.get(k) or v for k, v in conditions["target_alb"].items()}
1187
+ )
1188
+
1189
+ kwargs.update(kwargs_patch)
1190
+
1191
+ healthcheck_timeout_seconds = int(
1192
+ str(kwargs.get("healthcheck_timeout_seconds") or "10")
1193
+ )
1194
+ healthcheck_interval_seconds = int(
1195
+ str(kwargs.get("healthcheck_interval_seconds") or "30")
1196
+ )
1197
+
1198
+ if (
1199
+ healthcheck_timeout_seconds is not None
1200
+ and healthcheck_interval_seconds is not None
1201
+ ):
1202
+
1203
+ if healthcheck_interval_seconds < healthcheck_timeout_seconds:
1204
+ raise ValidationError(
1205
+ "Health check interval must be greater than the timeout."
1206
+ )
1207
+ if healthcheck_interval_seconds == healthcheck_timeout_seconds:
1208
+ raise ValidationError(
1209
+ f"Health check timeout '{healthcheck_timeout_seconds}' must be smaller than the interval '{healthcheck_interval_seconds}'"
1210
+ )
1211
+
1083
1212
  arn = make_arn_for_target_group(
1084
1213
  account_id=self.account_id, name=name, region_name=self.region_name
1085
1214
  )
@@ -1524,11 +1653,11 @@ Member must satisfy regular expression pattern: {expression}"
1524
1653
  health_check_port: Optional[str] = None,
1525
1654
  health_check_path: Optional[str] = None,
1526
1655
  health_check_interval: Optional[str] = None,
1527
- health_check_timeout: Optional[int] = None,
1656
+ health_check_timeout: Optional[str] = None,
1528
1657
  healthy_threshold_count: Optional[str] = None,
1529
1658
  unhealthy_threshold_count: Optional[str] = None,
1530
1659
  http_codes: Optional[str] = None,
1531
- health_check_enabled: Optional[str] = None,
1660
+ health_check_enabled: Optional[bool] = None,
1532
1661
  ) -> FakeTargetGroup:
1533
1662
  target_group = self.target_groups.get(arn)
1534
1663
  if target_group is None:
moto/elbv2/responses.py CHANGED
@@ -185,7 +185,7 @@ class ELBV2Response(BaseResponse):
185
185
  name = params.get("Name")
186
186
  vpc_id = params.get("VpcId")
187
187
  protocol = params.get("Protocol")
188
- protocol_version = params.get("ProtocolVersion", "HTTP1")
188
+ protocol_version = params.get("ProtocolVersion")
189
189
  port = params.get("Port")
190
190
  healthcheck_protocol = self._get_param("HealthCheckProtocol")
191
191
  healthcheck_port = self._get_param("HealthCheckPort")
@@ -196,7 +196,8 @@ class ELBV2Response(BaseResponse):
196
196
  healthy_threshold_count = self._get_param("HealthyThresholdCount")
197
197
  unhealthy_threshold_count = self._get_param("UnhealthyThresholdCount")
198
198
  matcher = params.get("Matcher")
199
- target_type = params.get("TargetType")
199
+ target_type = params.get("TargetType", "instance")
200
+ ip_address_type = params.get("IpAddressType")
200
201
  tags = params.get("Tags")
201
202
 
202
203
  target_group = self.elbv2_backend.create_target_group(
@@ -214,6 +215,7 @@ class ELBV2Response(BaseResponse):
214
215
  healthy_threshold_count=healthy_threshold_count,
215
216
  unhealthy_threshold_count=unhealthy_threshold_count,
216
217
  matcher=matcher,
218
+ ip_address_type=ip_address_type,
217
219
  target_type=target_type,
218
220
  tags=tags,
219
221
  )
@@ -797,6 +799,9 @@ CREATE_TARGET_GROUP_TEMPLATE = """<CreateTargetGroupResponse xmlns="http://elast
797
799
  <TargetGroupName>{{ target_group.name }}</TargetGroupName>
798
800
  {% if target_group.protocol %}
799
801
  <Protocol>{{ target_group.protocol }}</Protocol>
802
+ {% if target_group.protocol_version %}
803
+ <ProtocolVersion>{{ target_group.protocol_version }}</ProtocolVersion>
804
+ {% endif %}
800
805
  {% endif %}
801
806
  {% if target_group.port %}
802
807
  <Port>{{ target_group.port }}</Port>
@@ -804,14 +809,22 @@ CREATE_TARGET_GROUP_TEMPLATE = """<CreateTargetGroupResponse xmlns="http://elast
804
809
  {% if target_group.vpc_id %}
805
810
  <VpcId>{{ target_group.vpc_id }}</VpcId>
806
811
  {% endif %}
807
- <HealthCheckProtocol>{{ target_group.healthcheck_protocol }}</HealthCheckProtocol>
808
- {% if target_group.healthcheck_port %}<HealthCheckPort>{{ target_group.healthcheck_port }}</HealthCheckPort>{% endif %}
812
+ {% if target_group.healthcheck_enabled %}
813
+ {% if target_group.healthcheck_port %}
814
+ <HealthCheckPort>{{ target_group.healthcheck_port }}</HealthCheckPort>
815
+ {% endif %}
816
+ {% if target_group.healthcheck_protocol %}
817
+ <HealthCheckProtocol>{{ target_group.healthcheck_protocol or "None" }}</HealthCheckProtocol>
818
+ {% endif %}
819
+ {% endif %}
820
+ {% if target_group.healthcheck_path %}
809
821
  <HealthCheckPath>{{ target_group.healthcheck_path or '' }}</HealthCheckPath>
822
+ {% endif %}
810
823
  <HealthCheckIntervalSeconds>{{ target_group.healthcheck_interval_seconds }}</HealthCheckIntervalSeconds>
811
824
  <HealthCheckTimeoutSeconds>{{ target_group.healthcheck_timeout_seconds }}</HealthCheckTimeoutSeconds>
812
- <HealthCheckEnabled>{{ target_group.healthcheck_enabled and 'true' or 'false' }}</HealthCheckEnabled>
813
825
  <HealthyThresholdCount>{{ target_group.healthy_threshold_count }}</HealthyThresholdCount>
814
826
  <UnhealthyThresholdCount>{{ target_group.unhealthy_threshold_count }}</UnhealthyThresholdCount>
827
+ <HealthCheckEnabled>{{ target_group.healthcheck_enabled and 'true' or 'false' }}</HealthCheckEnabled>
815
828
  {% if target_group.matcher %}
816
829
  <Matcher>
817
830
  <HttpCode>{{ target_group.matcher['HttpCode'] }}</HttpCode>
@@ -820,6 +833,9 @@ CREATE_TARGET_GROUP_TEMPLATE = """<CreateTargetGroupResponse xmlns="http://elast
820
833
  {% if target_group.target_type %}
821
834
  <TargetType>{{ target_group.target_type }}</TargetType>
822
835
  {% endif %}
836
+ {% if target_group.ip_address_type %}
837
+ <IpAddressType>{{ target_group.ip_address_type }}</IpAddressType>
838
+ {% endif %}
823
839
  </member>
824
840
  </TargetGroups>
825
841
  </CreateTargetGroupResult>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: moto
3
- Version: 4.2.3.dev38
3
+ Version: 4.2.3.dev40
4
4
  Home-page: https://github.com/getmoto/moto
5
5
  Author: Steve Pulec
6
6
  Author-email: "spulec@gmail.com"
@@ -1,4 +1,4 @@
1
- moto/__init__.py,sha256=O6Iwj77Bq81Ezq9hXmOwwUFfR3B5K0KXx3sYFQgP-PY,9689
1
+ moto/__init__.py,sha256=Qs1JD-D6sozRzxBPqtcEeWotwt7a7Wyzr5XnbwATjwU,9689
2
2
  moto/backend_index.py,sha256=JDpbrcbt5e30v7D8c5IsxbqIDUXTvm4OuClX6V81cJU,10707
3
3
  moto/backends.py,sha256=rC9WUMUUWmVmX7ZEfXpVKAQAw6oI8qYobCEPxP2Zv9U,1805
4
4
  moto/server.py,sha256=cp8kIe5jVOm7Z2BlNN2AMbTfrRvLBEKSb4mt7O8nu34,2858
@@ -141,7 +141,7 @@ moto/cognitoidentity/urls.py,sha256=EwCPmD-_m_fiyl0DB82Vhti3VZVpHliimAiGDf5pWyk,
141
141
  moto/cognitoidentity/utils.py,sha256=1jFH2hB04ko1_GdYAB2Ep16VZdW8w-zdy5jb2RLHsyo,143
142
142
  moto/cognitoidp/__init__.py,sha256=nXdnouroOSIuf-0yhvI5GnlajxxsTBDSXbJikUL1jdY,136
143
143
  moto/cognitoidp/exceptions.py,sha256=1a49SBkGGauDhTlPlSOCNG16L1jVr0Hv5LNVJhuIfGc,1959
144
- moto/cognitoidp/models.py,sha256=nlQ5OTwPFKQ9mrtZTNYeDBs0NRqhOUa_Ge9hpYC-IeU,85271
144
+ moto/cognitoidp/models.py,sha256=vaKE7SeVH9eDYUkJ8Hum6s2TSnyyboR9h17hsLC-oCQ,85271
145
145
  moto/cognitoidp/responses.py,sha256=N3w_kAevofO2mx07JIFtyFOltPqkRVdp8uUYR7gsbYY,25932
146
146
  moto/cognitoidp/urls.py,sha256=UlZawfAU4mnnmmhj66NmfrS8X90hTGij_v1NeSLHqgY,358
147
147
  moto/cognitoidp/utils.py,sha256=XJqIe9VGZfHezk7muTbHq1Zzypayaa2xPQ-Js02Y73U,3122
@@ -501,9 +501,9 @@ moto/elb/policies.py,sha256=bf0iqARBMJSb1ImJfmTNcwpieK7skjHG8YzAfgGdVsQ,1008
501
501
  moto/elb/responses.py,sha256=MP_ustVXguy12pQCiJzFh9RsmMUm9lO6n10uW7XFbII,37696
502
502
  moto/elb/urls.py,sha256=K5tFLDrGEUW6Lgw3dAdLdSl_Cf7V68CmQmRndoVZTvU,1336
503
503
  moto/elbv2/__init__.py,sha256=eQgbAgmbB0p4cfE2UMmjtIikZ8RsPKRG-yO1edhQ9ws,163
504
- moto/elbv2/exceptions.py,sha256=Fy7EsSs6aAqU4JphH7LWv_8o-rPM0WtxgLoFzuKWafo,5578
505
- moto/elbv2/models.py,sha256=jMRf_vxribHadrYxak-QaA5UdY3KPFukFA3Mgz_kXuU,70121
506
- moto/elbv2/responses.py,sha256=QuIxclRO0l2DjnbpzF4f_lkujYZGMiEULictxUe2lno,68565
504
+ moto/elbv2/exceptions.py,sha256=9HpyVzkZoY9PiLqfULupx0dr5Mv4onMD-KARVtr_r0o,5702
505
+ moto/elbv2/models.py,sha256=o46_6jbfeB_jPmj3pwoEViiTjRK7KyEMUKyMG_DFrX4,74689
506
+ moto/elbv2/responses.py,sha256=nyxg68e1sax9CpgFwfan05EJ6tPf1kGiKhSKh1JF7Q8,69189
507
507
  moto/elbv2/urls.py,sha256=eXzExA_20VjvnCuz0IqYemrQUBrKoAGkgYNYj7opHhE,164
508
508
  moto/elbv2/utils.py,sha256=5M0qRxrOzTFCRJeVD1MvCZmzwP1kv2Skg5tFmScN01A,388
509
509
  moto/emr/__init__.py,sha256=ZYtiZrbIc9PUyTSHWJFgILS0hO3QSHj--cPyOSJfnz8,155
@@ -1034,10 +1034,10 @@ moto/xray/mock_client.py,sha256=nYl8JVJbl3OY-tnUafkVOG4K4-cFm5bsft3Hxo7fKwI,3809
1034
1034
  moto/xray/models.py,sha256=0QL6nmhpVVwAiyi9aw4pBwVTRhqPW9oIy2uwPDhPKug,11179
1035
1035
  moto/xray/responses.py,sha256=p2xsg2-P9h_1DCyuBC7GenmC5L64tXAX6a-XCb2j5-o,6316
1036
1036
  moto/xray/urls.py,sha256=R6T3gMwobWipukWcC1DQ36CU1Rjt6oqBDoe-7HqaIZU,393
1037
- moto-4.2.3.dev38.dist-info/AUTHORS.md,sha256=dDUhasV8HGSkzb7zj7a0b3alnqY0P1LPOyOUNoo8Mpo,2976
1038
- moto-4.2.3.dev38.dist-info/LICENSE,sha256=8S75_TlqE-kIeGMLG0-rRxxu2ct6SM8quyUWKBYyIY4,10834
1039
- moto-4.2.3.dev38.dist-info/METADATA,sha256=cJsifhp56QQ3zhcqPBQ0-I5HjviSRNXjIglaFL44geU,12102
1040
- moto-4.2.3.dev38.dist-info/WHEEL,sha256=iYlv5fX357PQyRT2o6tw1bN-YcKFFHKqB_LwHO5wP-g,110
1041
- moto-4.2.3.dev38.dist-info/entry_points.txt,sha256=aPovbZuFXCwt8_m2vcolpH4Qr3rOF3yXeRElP9Zkauo,49
1042
- moto-4.2.3.dev38.dist-info/top_level.txt,sha256=TETRKAPcAAvoZDkSkwQiZtTSr-1gzaEAXVm9FmZKj8s,5
1043
- moto-4.2.3.dev38.dist-info/RECORD,,
1037
+ moto-4.2.3.dev40.dist-info/AUTHORS.md,sha256=dDUhasV8HGSkzb7zj7a0b3alnqY0P1LPOyOUNoo8Mpo,2976
1038
+ moto-4.2.3.dev40.dist-info/LICENSE,sha256=8S75_TlqE-kIeGMLG0-rRxxu2ct6SM8quyUWKBYyIY4,10834
1039
+ moto-4.2.3.dev40.dist-info/METADATA,sha256=cg6qBPaW1cRyB7342pyL2ld9fElkKOBTgFK_6Eqj3OE,12102
1040
+ moto-4.2.3.dev40.dist-info/WHEEL,sha256=iYlv5fX357PQyRT2o6tw1bN-YcKFFHKqB_LwHO5wP-g,110
1041
+ moto-4.2.3.dev40.dist-info/entry_points.txt,sha256=aPovbZuFXCwt8_m2vcolpH4Qr3rOF3yXeRElP9Zkauo,49
1042
+ moto-4.2.3.dev40.dist-info/top_level.txt,sha256=TETRKAPcAAvoZDkSkwQiZtTSr-1gzaEAXVm9FmZKj8s,5
1043
+ moto-4.2.3.dev40.dist-info/RECORD,,