fresco 3.5.0__py3-none-any.whl → 3.7.0__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.
fresco/util/urls.py CHANGED
@@ -23,15 +23,17 @@ from typing import List
23
23
  from urllib.parse import quote_plus
24
24
  from urllib.parse import urlparse
25
25
  from urllib.parse import urlunparse
26
+ from urllib.parse import urlencode
27
+ from urllib.parse import parse_qsl
26
28
  import posixpath
27
29
  import re
28
30
  import typing as t
29
31
 
30
- import fresco
32
+ from fresco.defaults import DEFAULT_CHARSET
31
33
  from fresco.multidict import MultiDict
32
34
  from fresco.types import QuerySpec
33
35
 
34
- __all__ = "join_path", "url_join", "strip_trailing_slashes", "normpath"
36
+ __all__ = "join_path", "url_join", "strip_trailing_slashes", "normpath", "add_query"
35
37
 
36
38
 
37
39
  def join_path(a, b):
@@ -174,13 +176,13 @@ def make_query(
174
176
  data: QuerySpec = [],
175
177
  separator: str = "&",
176
178
  charset: t.Optional[str] = None,
177
- **kwargs,
179
+ **kwargs: t.Any,
178
180
  ) -> str:
179
181
  """
180
182
  Return a query string formed from the given dictionary data.
181
183
 
182
184
  If no encoding is given, unicode values are encoded using the character set
183
- specified by ``fresco.DEFAULT_CHARSET``.
185
+ specified by ``fresco.defaults.DEFAULT_CHARSET``.
184
186
 
185
187
  Basic usage::
186
188
 
@@ -210,46 +212,48 @@ def make_query(
210
212
  :param charset: encoding to be used for unicode values
211
213
  :rtype: str
212
214
  """
213
- items: t.Iterable[t.Tuple[str, t.Any]]
215
+ items: t.Iterable[tuple[str, t.Any]]
214
216
  if isinstance(data, MultiDict):
215
217
  items = data.allitems()
216
218
  elif isinstance(data, Mapping):
217
- items = data.items()
219
+ items = data.items() # type: ignore
218
220
  else:
219
221
  items = data
220
222
  if kwargs:
221
223
  items = chain(items, kwargs.items())
222
224
 
223
225
  if charset is None:
224
- charset = fresco.DEFAULT_CHARSET
226
+ charset = DEFAULT_CHARSET
225
227
 
226
- pairs: List[str] = []
228
+ pairs: list[str] = []
227
229
  append = pairs.append
228
230
  for k, v in items:
229
231
  if isinstance(v, (str, bytes)):
230
232
  append(f"{quote_plus(k, charset)}={quote_plus(v, charset)}")
233
+ elif v is None:
234
+ pass
231
235
  elif hasattr(v, "__iter__"):
232
236
  for v in v:
233
237
  append(f"{quote_plus(k, charset)}={quote_plus(str(v), charset)}")
234
- elif v is not None:
238
+ else:
235
239
  append(f"{quote_plus(k, charset)}={quote_plus(str(v), charset)}")
236
240
  return separator.join(pairs)
237
241
 
238
242
 
239
243
  def _qs_frag(key, value, charset=None):
240
- """\
244
+ """
241
245
  Return a fragment of a query string in the format 'key=value'::
242
246
 
243
247
  >>> _qs_frag('search-by', 'author, editor')
244
248
  'search-by=author%2C+editor'
245
249
 
246
250
  If no encoding is specified, unicode values are encoded using the character
247
- set specified by ``fresco.DEFAULT_CHARSET``.
251
+ set specified by ``fresco.defaults.DEFAULT_CHARSET``.
248
252
 
249
253
  :rtype: str
250
254
  """
251
255
  if charset is None:
252
- charset = fresco.DEFAULT_CHARSET
256
+ charset = DEFAULT_CHARSET
253
257
 
254
258
  key = str(key).encode(charset)
255
259
  value = str(value).encode(charset)
@@ -327,3 +331,31 @@ def is_safe_url(
327
331
  or (scheme == "" and netloc == "")
328
332
  or (scheme == "" and netloc in allowed_hosts)
329
333
  )
334
+
335
+
336
+ def add_query(
337
+ url: str,
338
+ data: t.Union[t.Sequence[tuple[str, t.Any]], t.Mapping[str, t.Any]] = [],
339
+ **kwargs: t.Any,
340
+ ) -> str:
341
+ """
342
+ Return the given URL with the given query data appended
343
+
344
+ :param url:
345
+ The base URL
346
+ :param data:
347
+ Optional data items, supplied either as a mapping or list of (key,
348
+ value) tuples
349
+ :param kwargs:
350
+ Query data supplied as keyword arguments
351
+ """
352
+ parsed = urlparse(url)
353
+ return urlunparse(
354
+ parsed._replace(
355
+ query=urlencode(
356
+ parse_qsl(parsed.query)
357
+ + list(dict(data).items())
358
+ + list(kwargs.items())
359
+ )
360
+ )
361
+ )
fresco/util/wsgi.py CHANGED
@@ -22,15 +22,16 @@ from io import BytesIO
22
22
  from urllib.parse import unquote
23
23
  from urllib.parse import urlparse
24
24
  from typing import List
25
- from typing import Optional
26
- from typing import Tuple
25
+ import typing as t
27
26
  import sys
28
27
 
29
- from fresco.typing import ExcInfoTuple
30
- from fresco.typing import HeaderList
31
- from fresco.typing import WSGICallable
28
+ from fresco.types import WSGIApplication
29
+ from fresco.types import WriteCallable
30
+ from fresco.types import OptionalExcInfo
31
+ from fresco.types import HeaderList
32
32
 
33
33
  logger = logging.getLogger(__name__)
34
+ T = t.TypeVar("T")
34
35
 
35
36
 
36
37
  __all__ = [
@@ -102,7 +103,6 @@ REQUEST_HEADER_NAMES = {
102
103
  "dnt": "DNT",
103
104
  "x_forwarded_for": "X-Forwarded-For",
104
105
  "x_forwarded_host": "X-Forwarded-Host",
105
- "x_forwarded_host": "X-Forwarded-Host",
106
106
  "x_forwarded_proto": "X-Forwarded-Proto",
107
107
  "front_end_https": "Front-End-Https",
108
108
  "x_http_method_override": "X-Http-Method-Override",
@@ -245,8 +245,8 @@ class StartResponseWrapper(object):
245
245
  self.exc_info = None
246
246
 
247
247
 
248
- class ClosingIterator(object):
249
- """\
248
+ class ClosingIterator(t.Generic[T]):
249
+ """
250
250
  Wrap a WSGI iterator to allow additional close functions to be called on
251
251
  application exit.
252
252
 
@@ -275,7 +275,7 @@ class ClosingIterator(object):
275
275
 
276
276
  __slots__ = ("_iterable", "_next", "_close_funcs", "_closed")
277
277
 
278
- def __init__(self, iterable, *close_funcs):
278
+ def __init__(self, iterable: t.Iterable[T], *close_funcs: t.Callable[[], None]):
279
279
  """
280
280
  Initialize a ``ClosingIterator`` to wrap iterable ``iterable``, and
281
281
  call any functions listed in ``*close_funcs`` on the instance's
@@ -406,19 +406,20 @@ def make_environ(url="/", environ=None, wsgi_input=b"", **kwargs):
406
406
 
407
407
 
408
408
  def apply_request(
409
- request, wsgicallable: WSGICallable
410
- ) -> Tuple[str, HeaderList, Optional[ExcInfoTuple], List[bytes]]:
409
+ request, wsgicallable: WSGIApplication
410
+ ) -> tuple[str, HeaderList, OptionalExcInfo, list[bytes]]:
411
411
  """
412
412
  Execute ``wsgicallable`` with the given request, exhaust and close the
413
413
  content iterator and return the result.
414
414
  """
415
415
 
416
- _start_response_result: List[Tuple[str, HeaderList, Optional[ExcInfoTuple]]] = []
416
+ _start_response_result: list[tuple[str, HeaderList, OptionalExcInfo]] = []
417
417
 
418
418
  def start_response(
419
- status: str, headers: HeaderList, exc_info: Optional[ExcInfoTuple] = None
420
- ):
419
+ status: str, headers: HeaderList, exc_info: OptionalExcInfo = None
420
+ ) -> WriteCallable:
421
421
  _start_response_result.append((status, headers, exc_info))
422
+ return lambda s: None
422
423
 
423
424
  contentiter = wsgicallable(request.environ, start_response)
424
425
  assert len(_start_response_result) == 1
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: fresco
3
- Version: 3.5.0
3
+ Version: 3.7.0
4
4
  Summary: A Web/WSGI micro-framework
5
5
  Author-email: Oliver Cope <oliver@redgecko.org>
6
6
  License: Apache
@@ -16,6 +16,7 @@ Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
16
16
  Classifier: Topic :: Internet :: WWW/HTTP :: WSGI
17
17
  Description-Content-Type: text/x-rst
18
18
  License-File: LICENSE.txt
19
+ Dynamic: license-file
19
20
 
20
21
  Fresco, a web micro-framework for Python
21
22
  ========================================
@@ -0,0 +1,58 @@
1
+ fresco/__init__.py,sha256=Jo5gW2Xce2hmtXhfaXXJR4aBW1KFYb0Murx2JfIo_E8,3537
2
+ fresco/cookie.py,sha256=Qnx8yOjU4LUJ1fqi7YvqbhAA01rCsclJGl_fxI68slw,7055
3
+ fresco/core.py,sha256=bqGDgm4OH46j6HqnC5nJyn9n1dQw-I1ntUY8dIpeO_M,26988
4
+ fresco/decorators.py,sha256=JL4MlsJz4RWRAuOCCB3fx3rtd-E1CvwO2MD7bf94yHM,3324
5
+ fresco/defaults.py,sha256=YStD4MPcCtq-fREFoupSaAS0SY8lH1oEnKDONlR86zs,26
6
+ fresco/exceptions.py,sha256=KE-LoYUGnho6KltzkU6cnm9vUiUhAiDIjPqn5ba-YCA,4410
7
+ fresco/middleware.py,sha256=TH1I5NthLDwnOdluOSFpP_9SQQYhYqh-8lGuAXT74dc,4811
8
+ fresco/multidict.py,sha256=lKRpSP1XNghLp2-i5cXPfPQxuoJclHpNkWk91F4GI1o,13152
9
+ fresco/options.py,sha256=X66xZV45vWIyQR2GwFTLgV2QGoXOfLhHURWQ_edoxmY,17024
10
+ fresco/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
+ fresco/request.py,sha256=XJ9SJAe9zILfWt-YB4zxjIrjECrLYzyxjZ9xk8h4tAw,30024
12
+ fresco/requestcontext.py,sha256=_AJ7DMT5vlIO4Uc-WlRsYJdRge4WRO7ygibKImOS0iM,3601
13
+ fresco/response.py,sha256=ilJ_Wbp7LVP1E6bXp0iAy1o6D0hboXtpLvm2ZCmUGmk,37277
14
+ fresco/routeargs.py,sha256=E-LQutqg6AojtagZojF7NeMjFBk9joRNMGo842IMTBk,10598
15
+ fresco/routing.py,sha256=r_vPD1xc7brOrbw1iO0X2IP7WX5wlIWlcXwcNndU1ZY,61259
16
+ fresco/static.py,sha256=rNQz_8-PVhSGup_w-HycqatLEbFes7VSlnNQ0rz24pU,2529
17
+ fresco/subrequests.py,sha256=fOG9Bd3w9Ova0S3qv5ssxQ_otrSxaFcKG7TOy6CxNCg,11068
18
+ fresco/types.py,sha256=PbXppEcckX4ohU8npteU1mCkHOuXQxrnqxk1RNEFXkE,797
19
+ fresco/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
+ fresco/tests/fixtures.py,sha256=eyo2zPivB3fItDkrJqWnOCvIS_A1q1JEhT4AutAB--o,1871
21
+ fresco/tests/test_cookie.py,sha256=HTLmNCjcPoZDeFnZAzY3lJPeduzgU4mi9C-74eSQCec,2171
22
+ fresco/tests/test_core.py,sha256=-eibrVd8UqPqTvcar54kt24m6_lX3mxXR8L7v-WDrWw,34003
23
+ fresco/tests/test_decorators.py,sha256=VFXHo1gm2jldQXeaEF3NNo5fnpdJ-LXc8-vNymPJKTQ,1480
24
+ fresco/tests/test_exceptions.py,sha256=R0Tn86m33iTKecZ69TgH4CqY9XSFP0FsLMH10O5Jth8,973
25
+ fresco/tests/test_middleware.py,sha256=D_sWfX-w3bhItOm54nB_cuYPGoWopISvZCFIuMX68cU,3137
26
+ fresco/tests/test_multidict.py,sha256=uIa1cu5DMAukX2nLOjTiB12oh0icBeSPfsUnqsu85m0,7577
27
+ fresco/tests/test_options.py,sha256=394MLLTyf4vmfkUyqQ8EGIiTTJsQh7P9M6eta2wgUbw,12764
28
+ fresco/tests/test_request.py,sha256=wGDwxCZMbzyGgQJwM2Nlsf0ogcGenXN3srO8dQEhE24,16777
29
+ fresco/tests/test_requestcontext.py,sha256=t8hm-lzIk85ryb3sdlpVoPQyLDWpCjB86dg8nVG1yRw,3115
30
+ fresco/tests/test_response.py,sha256=MrhHIDg81pJlTeEcn2rGtU-i59s1KzEccF81u4Up6xs,8934
31
+ fresco/tests/test_routeargs.py,sha256=VMWUbrXegTLN9Tx2AcrpbjAAEaxAANzkcy02SmpFOmY,8162
32
+ fresco/tests/test_routing.py,sha256=NBBJ6UcsdSoUAFNgUtCC0lEEeKB6JxS8XyrUeef25M8,40018
33
+ fresco/tests/test_static.py,sha256=y73dqzE2flpACQ_dvNhDzk_WlvNQfkhYF_8YY4MMGDo,4686
34
+ fresco/tests/test_subrequests.py,sha256=7rluJnw-elXRXfrzvAQvGBHRBU93zwnL827mTxBGd3Y,7909
35
+ fresco/tests/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
+ fresco/tests/util/form_data.py,sha256=TalOuv4BGM3JNrf14tE47o9wAwZ7jA1CvRDnGJFifno,10570
37
+ fresco/tests/util/test_common.py,sha256=NvKX8KIAUki7b2kDLILWqARbOQmR3XyInLlbcwFEhiU,1117
38
+ fresco/tests/util/test_http.py,sha256=mdHDc-4m9sMNkEgHToIsgFuSSXQzNUcYSehPehYvJYo,10748
39
+ fresco/tests/util/test_security.py,sha256=MtpDDKyDhAeRT766Lt3peOv4Jj55TM1lvJk1_5TKaes,1492
40
+ fresco/tests/util/test_urls.py,sha256=U12T9MlP7zCpf-ufoyaZI5nAswi0xCSBOxHjHB2K_0I,8320
41
+ fresco/tests/util/test_wsgi.py,sha256=VsHUCo8yck_40nsYm-H-M0R8QYEE8JcboeGPbcrzsO0,3038
42
+ fresco/util/__init__.py,sha256=mJkaZzvYgBnxsBAGv8y_P1yzonHqWgw6VF2Zs4rmJEA,7
43
+ fresco/util/cache.py,sha256=0xINmBecCYo3h5-zU_yRyJeWmROygE3pO9w9Y3ZONcs,1661
44
+ fresco/util/common.py,sha256=8lvrjhELvYsUWxu7DZi1OJcUOFk2ILYndNsnaS0IqjM,1258
45
+ fresco/util/contentencodings.py,sha256=cCP-nSlXiBAZWoJdlnrQREi9jYRu8UY327bQdfBNlkg,5527
46
+ fresco/util/file.py,sha256=Vp7qJTo9RouUeHq25ExyBGkGTHuW-9Q7D_0GB54DFe8,1383
47
+ fresco/util/http.py,sha256=hxMKjF6FWvugDvToRqSscDhCD1KdVY1bmV4Unwd_Uhs,22672
48
+ fresco/util/io.py,sha256=xxwDNJOcewY8lAR4Ce3cmB_zlrys8JGsESgwGWE198Y,1289
49
+ fresco/util/object.py,sha256=FjYNfPHzvBqq1rn0Y6As-2AVZ_SZOjH-lrSy4EbYmHY,370
50
+ fresco/util/security.py,sha256=nXEdoCak_2c4OA1L1wGwhZygS22s2fzwR0Kp-DdwKZg,1058
51
+ fresco/util/textproc.py,sha256=e5jLTofKCqdm6_Fy8XOyR43AJr5APtL59Kd8cNA9PrQ,2309
52
+ fresco/util/urls.py,sha256=V6-s2WgeARkEcuzpwqtiM8ebOXe5-mNUKOJ8N9LNBHA,10051
53
+ fresco/util/wsgi.py,sha256=RYw4KeOUjzzPOL_HhEtgLyCngofjMdAT8BTLOSKU6KA,13021
54
+ fresco-3.7.0.dist-info/licenses/LICENSE.txt,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
55
+ fresco-3.7.0.dist-info/METADATA,sha256=bqLRh85Q1K4S3Orlpyl-1vUXemvnWGrx1Y-qKtymOI0,1571
56
+ fresco-3.7.0.dist-info/WHEEL,sha256=0CuiUZ_p9E4cD6NyLD6UG80LBXYyiSYZOKDm5lp32xk,91
57
+ fresco-3.7.0.dist-info/top_level.txt,sha256=p_1aMce5Shjq9fIfdbB-aN8wCDhjF_iYnn98bUebbII,7
58
+ fresco-3.7.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.8.1)
2
+ Generator: setuptools (80.3.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
fresco/typing.py DELETED
@@ -1,17 +0,0 @@
1
- from types import TracebackType
2
- from typing import Any
3
- from typing import Callable
4
- from typing import Iterable
5
-
6
- HeaderList = list[tuple[str, str]]
7
- HeadersList = HeaderList
8
- WSGIEnviron = dict[str, Any]
9
- StartResponse = Callable[[str, HeaderList], None]
10
- WSGICallable = Callable[
11
- [
12
- WSGIEnviron,
13
- StartResponse,
14
- ],
15
- Iterable[bytes]
16
- ]
17
- ExcInfoTuple = tuple[type, BaseException, TracebackType]
@@ -1,58 +0,0 @@
1
- fresco/__init__.py,sha256=qd3y9P7W77xtuDx9WtYQt7wIHeRNUobog6zq8W4J-zg,3520
2
- fresco/cookie.py,sha256=Qnx8yOjU4LUJ1fqi7YvqbhAA01rCsclJGl_fxI68slw,7055
3
- fresco/core.py,sha256=kBf_JY8wqvBSQzxP0pFUr0sOnvUoDltittL-5xDUlC8,26611
4
- fresco/decorators.py,sha256=84NUpRJ-M7GK6wDl42bmCRSvgoWzCsy1huyvGnSAPPw,3232
5
- fresco/exceptions.py,sha256=KE-LoYUGnho6KltzkU6cnm9vUiUhAiDIjPqn5ba-YCA,4410
6
- fresco/middleware.py,sha256=XMpakA1YMZJqwHQyyxgw6TFhecDRTrUSSeNLDEkY8qA,4808
7
- fresco/multidict.py,sha256=0CaNNIcFnZ1hLk3NExhNvjc_BtK4zVB26L9gP_7MeNM,13362
8
- fresco/options.py,sha256=gzFzTv6vib16WazRxT1s2xD91f8IRfCGKijx3BbE1gU,15163
9
- fresco/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
- fresco/request.py,sha256=dC7pMg-4Kxa6PcqaaWFL4JviANQotuBjoKwlxZYywRY,27048
11
- fresco/requestcontext.py,sha256=P-SkKJkKLYVqNiR2zwooRROnSnE2VMj2P2-eD5DW5Qg,3504
12
- fresco/response.py,sha256=ADKHbtAGyhwtaUJxB7m_1nqVdZRKUryebmG4FDUjZVY,37072
13
- fresco/routeargs.py,sha256=dxNlqbQ1FrgIY6OCFzcEMdZ0OVyjlMQdQGLmUJgdPYU,10176
14
- fresco/routing.py,sha256=BfUaC9xD9BL_RqRPMIkMNOdLbhbSgzWSJWooktRoeqc,60515
15
- fresco/static.py,sha256=9SKQ3P1YFTP45Qiic-ycvkpKRvqIURp1XSzPazTmYLI,2513
16
- fresco/subrequests.py,sha256=zQlKJRZJVbfkxc0cQp3qoBFZH9pPFq77DgnYAJJvgAI,11052
17
- fresco/types.py,sha256=UHITRMDoS90s2zV2wNpqLFhRWESfaBAMuQnL4c21mqY,106
18
- fresco/typing.py,sha256=uQWLElgVCJSZ3X2OkGNu-1ihmPvytyqSLguPB6tm-Pc,412
19
- fresco/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
- fresco/tests/fixtures.py,sha256=eyo2zPivB3fItDkrJqWnOCvIS_A1q1JEhT4AutAB--o,1871
21
- fresco/tests/test_cookie.py,sha256=HTLmNCjcPoZDeFnZAzY3lJPeduzgU4mi9C-74eSQCec,2171
22
- fresco/tests/test_core.py,sha256=lniN-UslszeRAuWlbBU536LDGTo8Hp2nb8kLebXvim0,34019
23
- fresco/tests/test_decorators.py,sha256=VFXHo1gm2jldQXeaEF3NNo5fnpdJ-LXc8-vNymPJKTQ,1480
24
- fresco/tests/test_exceptions.py,sha256=R0Tn86m33iTKecZ69TgH4CqY9XSFP0FsLMH10O5Jth8,973
25
- fresco/tests/test_middleware.py,sha256=D_sWfX-w3bhItOm54nB_cuYPGoWopISvZCFIuMX68cU,3137
26
- fresco/tests/test_multidict.py,sha256=uDwDYII0dvVxaEyDO85zRTWlIWw3LO3StzYemJVm0E0,7565
27
- fresco/tests/test_options.py,sha256=zKJveuxTz4HL9NeQYwe8qaki8WQw65ghhW3cLnXfaVI,11659
28
- fresco/tests/test_request.py,sha256=hoANrergrohlAeTbQufDMfIbvYURsPyPjCxOVKz7bVo,16389
29
- fresco/tests/test_requestcontext.py,sha256=t8hm-lzIk85ryb3sdlpVoPQyLDWpCjB86dg8nVG1yRw,3115
30
- fresco/tests/test_response.py,sha256=MrhHIDg81pJlTeEcn2rGtU-i59s1KzEccF81u4Up6xs,8934
31
- fresco/tests/test_routeargs.py,sha256=VMWUbrXegTLN9Tx2AcrpbjAAEaxAANzkcy02SmpFOmY,8162
32
- fresco/tests/test_routing.py,sha256=DkHP518f6UVAuG2pNVAyoyEcc2ej8T-Kw-moqkMB9gI,39851
33
- fresco/tests/test_static.py,sha256=y73dqzE2flpACQ_dvNhDzk_WlvNQfkhYF_8YY4MMGDo,4686
34
- fresco/tests/test_subrequests.py,sha256=7rluJnw-elXRXfrzvAQvGBHRBU93zwnL827mTxBGd3Y,7909
35
- fresco/tests/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
- fresco/tests/util/form_data.py,sha256=TalOuv4BGM3JNrf14tE47o9wAwZ7jA1CvRDnGJFifno,10570
37
- fresco/tests/util/test_common.py,sha256=NvKX8KIAUki7b2kDLILWqARbOQmR3XyInLlbcwFEhiU,1117
38
- fresco/tests/util/test_http.py,sha256=VYcrxKisRhI19AvuZWLuJGdpZo-IN19y4gDUKwuFy0I,10803
39
- fresco/tests/util/test_security.py,sha256=MtpDDKyDhAeRT766Lt3peOv4Jj55TM1lvJk1_5TKaes,1492
40
- fresco/tests/util/test_urls.py,sha256=xKiE6oq0bB-9u8kNYlMQmeCwuAKr1KLQovB-i24wKVQ,7643
41
- fresco/tests/util/test_wsgi.py,sha256=VsHUCo8yck_40nsYm-H-M0R8QYEE8JcboeGPbcrzsO0,3038
42
- fresco/util/__init__.py,sha256=mJkaZzvYgBnxsBAGv8y_P1yzonHqWgw6VF2Zs4rmJEA,7
43
- fresco/util/cache.py,sha256=EjzF9EzzDw4U4coOykkJEgh_8HMDpwhEbYKBo_TeOZQ,1609
44
- fresco/util/common.py,sha256=8lvrjhELvYsUWxu7DZi1OJcUOFk2ILYndNsnaS0IqjM,1258
45
- fresco/util/contentencodings.py,sha256=cCP-nSlXiBAZWoJdlnrQREi9jYRu8UY327bQdfBNlkg,5527
46
- fresco/util/file.py,sha256=Vp7qJTo9RouUeHq25ExyBGkGTHuW-9Q7D_0GB54DFe8,1383
47
- fresco/util/http.py,sha256=6LSzCxr8avha3rRwsU8kUrkHWnQTuOw49mfi1PSBEgo,22199
48
- fresco/util/io.py,sha256=xxwDNJOcewY8lAR4Ce3cmB_zlrys8JGsESgwGWE198Y,1289
49
- fresco/util/object.py,sha256=FjYNfPHzvBqq1rn0Y6As-2AVZ_SZOjH-lrSy4EbYmHY,370
50
- fresco/util/security.py,sha256=nXEdoCak_2c4OA1L1wGwhZygS22s2fzwR0Kp-DdwKZg,1058
51
- fresco/util/textproc.py,sha256=e5jLTofKCqdm6_Fy8XOyR43AJr5APtL59Kd8cNA9PrQ,2309
52
- fresco/util/urls.py,sha256=aaVovLyXNlVoGviiLN94ImqXf-LTQs_xooEIyi3LBc4,9195
53
- fresco/util/wsgi.py,sha256=gllmrw9um9ecs_sFxXy-Uwh7M9YAdcBNw33S63AhB8E,12967
54
- fresco-3.5.0.dist-info/LICENSE.txt,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
55
- fresco-3.5.0.dist-info/METADATA,sha256=mL1SE-OBfPOlYjc7YBSbt6ftilgaol-pUNAYqt3k0A0,1549
56
- fresco-3.5.0.dist-info/WHEEL,sha256=nn6H5-ilmfVryoAQl3ZQ2l8SH5imPWFpm1A5FgEuFV4,91
57
- fresco-3.5.0.dist-info/top_level.txt,sha256=p_1aMce5Shjq9fIfdbB-aN8wCDhjF_iYnn98bUebbII,7
58
- fresco-3.5.0.dist-info/RECORD,,