Gentoo Archives: gentoo-commits

From: "Michał Górny" <mgorny@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] repo/gentoo:master commit in: dev-python/html5lib/, dev-python/html5lib/files/
Date: Thu, 08 Oct 2020 18:42:55
Message-Id: 1602182540.2df34ea62c58a482f2a85c25acfa8c58f52e9b51.mgorny@gentoo
1 commit: 2df34ea62c58a482f2a85c25acfa8c58f52e9b51
2 Author: Michał Górny <mgorny <AT> gentoo <DOT> org>
3 AuthorDate: Thu Oct 8 18:42:20 2020 +0000
4 Commit: Michał Górny <mgorny <AT> gentoo <DOT> org>
5 CommitDate: Thu Oct 8 18:42:20 2020 +0000
6 URL: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=2df34ea6
7
8 dev-python/html5lib: Remove old
9
10 Signed-off-by: Michał Górny <mgorny <AT> gentoo.org>
11
12 dev-python/html5lib/Manifest | 1 -
13 .../files/html5lib-1.0.1-collections-abc.patch | 44 ----
14 .../html5lib-python-1.0.1-support-pytest4.patch | 270 ---------------------
15 dev-python/html5lib/html5lib-1.0.1-r2.ebuild | 37 ---
16 4 files changed, 352 deletions(-)
17
18 diff --git a/dev-python/html5lib/Manifest b/dev-python/html5lib/Manifest
19 index 03c605eb9e6..24a9ed5ed3c 100644
20 --- a/dev-python/html5lib/Manifest
21 +++ b/dev-python/html5lib/Manifest
22 @@ -1,2 +1 @@
23 -DIST html5lib-1.0.1.tar.gz 252959 BLAKE2B d2a9fa19d6a18b9e0c39f737a22ff4d5a6533734843f787c083f9497fd94788dad0e1e96478fe48b262c208370cf58e91ab94cc06a3e2757a40e936363cd3148 SHA512 35939b4450893864da04e735ee5e0addacf1dd34bae6a6909c76572abf6bfded446a78a713dfde91c1485ba45867d7abeb6a45cf0545c16ea968707be7de5dd2
24 DIST html5lib-1.1.tar.gz 272215 BLAKE2B 11a4fc3fb84bf8bab4af5da1de30b0892a9eb454505716b3db391187053c9aac159b1c82ae787896592b8fc850363bba9313b9d7fc617150771c3bfa1aeadefb SHA512 af7c29591007fded99be6c38e3d0ae5a4ac32d71d26046a615918ae732cb1c1ecbf754f47ceca1a53726c3843f3ecea7af87a7362281b45ff3af495815818626
25
26 diff --git a/dev-python/html5lib/files/html5lib-1.0.1-collections-abc.patch b/dev-python/html5lib/files/html5lib-1.0.1-collections-abc.patch
27 deleted file mode 100644
28 index d5a9dcac299..00000000000
29 --- a/dev-python/html5lib/files/html5lib-1.0.1-collections-abc.patch
30 +++ /dev/null
31 @@ -1,44 +0,0 @@
32 -From 4f9235752cea29c5a31721440578b430823a1e69 Mon Sep 17 00:00:00 2001
33 -From: 5j9 <5j9@××××××××××××××××××××.com>
34 -Date: Mon, 1 Oct 2018 15:02:33 +0330
35 -Subject: [PATCH] Try to import MutableMapping from collections.abc (#403)
36 -
37 -Note that collections.abc has been added in Python 3.3.
38 -
39 -Fixes #402
40 ----
41 - html5lib/_trie/_base.py | 5 ++++-
42 - html5lib/treebuilders/dom.py | 5 ++++-
43 - 2 files changed, 8 insertions(+), 2 deletions(-)
44 -
45 -diff --git a/html5lib/_trie/_base.py b/html5lib/_trie/_base.py
46 -index a1158bbb..6b71975f 100644
47 ---- a/html5lib/_trie/_base.py
48 -+++ b/html5lib/_trie/_base.py
49 -@@ -1,6 +1,9 @@
50 - from __future__ import absolute_import, division, unicode_literals
51 -
52 --from collections import Mapping
53 -+try:
54 -+ from collections.abc import Mapping
55 -+except ImportError: # Python 2.7
56 -+ from collections import Mapping
57 -
58 -
59 - class Trie(Mapping):
60 -diff --git a/html5lib/treebuilders/dom.py b/html5lib/treebuilders/dom.py
61 -index dcfac220..d8b53004 100644
62 ---- a/html5lib/treebuilders/dom.py
63 -+++ b/html5lib/treebuilders/dom.py
64 -@@ -1,7 +1,10 @@
65 - from __future__ import absolute_import, division, unicode_literals
66 -
67 -
68 --from collections import MutableMapping
69 -+try:
70 -+ from collections.abc import MutableMapping
71 -+except ImportError: # Python 2.7
72 -+ from collections import MutableMapping
73 - from xml.dom import minidom, Node
74 - import weakref
75 -
76
77 diff --git a/dev-python/html5lib/files/html5lib-python-1.0.1-support-pytest4.patch b/dev-python/html5lib/files/html5lib-python-1.0.1-support-pytest4.patch
78 deleted file mode 100644
79 index 98c9fb23fc7..00000000000
80 --- a/dev-python/html5lib/files/html5lib-python-1.0.1-support-pytest4.patch
81 +++ /dev/null
82 @@ -1,270 +0,0 @@
83 -From 2699544837e68b12f1740a7eb56882a0dc0a4008 Mon Sep 17 00:00:00 2001
84 -From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro@×××××××.cz>
85 -Date: Thu, 28 Mar 2019 01:45:43 +0100
86 -Subject: [PATCH 1/4] Support pytest 4
87 -
88 -Fixes https://github.com/html5lib/html5lib-python/issues/411
89 ----
90 - html5lib/tests/test_encoding.py | 4 ++--
91 - html5lib/tests/test_sanitizer.py | 14 +++++++-------
92 - html5lib/tests/test_serializer.py | 2 +-
93 - html5lib/tests/test_stream.py | 7 ++++---
94 - html5lib/tests/test_treewalkers.py | 2 +-
95 - requirements-test.txt | 2 +-
96 - tox.ini | 2 +-
97 - 7 files changed, 17 insertions(+), 16 deletions(-)
98 -
99 -diff --git a/html5lib/tests/test_encoding.py b/html5lib/tests/test_encoding.py
100 -index 9a411c77..97b6ca2a 100644
101 ---- a/html5lib/tests/test_encoding.py
102 -+++ b/html5lib/tests/test_encoding.py
103 -@@ -99,8 +99,8 @@ def test_encoding():
104 - for filename in get_data_files("encoding"):
105 - tests = _TestData(filename, b"data", encoding=None)
106 - for test in tests:
107 -- yield (runParserEncodingTest, test[b'data'], test[b'encoding'])
108 -- yield (runPreScanEncodingTest, test[b'data'], test[b'encoding'])
109 -+ runParserEncodingTest(test[b'data'], test[b'encoding'])
110 -+ runPreScanEncodingTest(test[b'data'], test[b'encoding'])
111 -
112 -
113 - # pylint:disable=wrong-import-position
114 -diff --git a/html5lib/tests/test_sanitizer.py b/html5lib/tests/test_sanitizer.py
115 -index 45046d57..1b7285fc 100644
116 ---- a/html5lib/tests/test_sanitizer.py
117 -+++ b/html5lib/tests/test_sanitizer.py
118 -@@ -67,19 +67,19 @@ def test_sanitizer():
119 - 'tfoot', 'th', 'thead', 'tr', 'select']:
120 - continue # TODO
121 - if tag_name == 'image':
122 -- yield (runSanitizerTest, "test_should_allow_%s_tag" % tag_name,
123 -+ runSanitizerTest("test_should_allow_%s_tag" % tag_name,
124 - "<img title=\"1\"/>foo &lt;bad&gt;bar&lt;/bad&gt; baz",
125 - "<%s title='1'>foo <bad>bar</bad> baz</%s>" % (tag_name, tag_name))
126 - elif tag_name == 'br':
127 -- yield (runSanitizerTest, "test_should_allow_%s_tag" % tag_name,
128 -+ runSanitizerTest("test_should_allow_%s_tag" % tag_name,
129 - "<br title=\"1\"/>foo &lt;bad&gt;bar&lt;/bad&gt; baz<br/>",
130 - "<%s title='1'>foo <bad>bar</bad> baz</%s>" % (tag_name, tag_name))
131 - elif tag_name in constants.voidElements:
132 -- yield (runSanitizerTest, "test_should_allow_%s_tag" % tag_name,
133 -+ runSanitizerTest("test_should_allow_%s_tag" % tag_name,
134 - "<%s title=\"1\"/>foo &lt;bad&gt;bar&lt;/bad&gt; baz" % tag_name,
135 - "<%s title='1'>foo <bad>bar</bad> baz</%s>" % (tag_name, tag_name))
136 - else:
137 -- yield (runSanitizerTest, "test_should_allow_%s_tag" % tag_name,
138 -+ runSanitizerTest("test_should_allow_%s_tag" % tag_name,
139 - "<%s title=\"1\">foo &lt;bad&gt;bar&lt;/bad&gt; baz</%s>" % (tag_name, tag_name),
140 - "<%s title='1'>foo <bad>bar</bad> baz</%s>" % (tag_name, tag_name))
141 -
142 -@@ -93,7 +93,7 @@ def test_sanitizer():
143 - attribute_value = 'foo'
144 - if attribute_name in sanitizer.attr_val_is_uri:
145 - attribute_value = '%s://sub.domain.tld/path/object.ext' % sanitizer.allowed_protocols[0]
146 -- yield (runSanitizerTest, "test_should_allow_%s_attribute" % attribute_name,
147 -+ runSanitizerTest("test_should_allow_%s_attribute" % attribute_name,
148 - "<p %s=\"%s\">foo &lt;bad&gt;bar&lt;/bad&gt; baz</p>" % (attribute_name, attribute_value),
149 - "<p %s='%s'>foo <bad>bar</bad> baz</p>" % (attribute_name, attribute_value))
150 -
151 -@@ -101,7 +101,7 @@ def test_sanitizer():
152 - rest_of_uri = '//sub.domain.tld/path/object.ext'
153 - if protocol == 'data':
154 - rest_of_uri = 'image/png;base64,aGVsbG8gd29ybGQ='
155 -- yield (runSanitizerTest, "test_should_allow_uppercase_%s_uris" % protocol,
156 -+ runSanitizerTest("test_should_allow_uppercase_%s_uris" % protocol,
157 - "<img src=\"%s:%s\">foo</a>" % (protocol, rest_of_uri),
158 - """<img src="%s:%s">foo</a>""" % (protocol, rest_of_uri))
159 -
160 -@@ -110,7 +110,7 @@ def test_sanitizer():
161 - if protocol == 'data':
162 - rest_of_uri = 'image/png;base64,aGVsbG8gd29ybGQ='
163 - protocol = protocol.upper()
164 -- yield (runSanitizerTest, "test_should_allow_uppercase_%s_uris" % protocol,
165 -+ runSanitizerTest("test_should_allow_uppercase_%s_uris" % protocol,
166 - "<img src=\"%s:%s\">foo</a>" % (protocol, rest_of_uri),
167 - """<img src="%s:%s">foo</a>""" % (protocol, rest_of_uri))
168 -
169 -diff --git a/html5lib/tests/test_serializer.py b/html5lib/tests/test_serializer.py
170 -index c23592af..a4250935 100644
171 ---- a/html5lib/tests/test_serializer.py
172 -+++ b/html5lib/tests/test_serializer.py
173 -@@ -222,4 +222,4 @@ def test_serializer():
174 - with open(filename) as fp:
175 - tests = json.load(fp)
176 - for test in tests['tests']:
177 -- yield runSerializerTest, test["input"], test["expected"], test.get("options", {})
178 -+ runSerializerTest(test["input"], test["expected"], test.get("options", {}))
179 -diff --git a/html5lib/tests/test_stream.py b/html5lib/tests/test_stream.py
180 -index 27c39538..a9b3ebbe 100644
181 ---- a/html5lib/tests/test_stream.py
182 -+++ b/html5lib/tests/test_stream.py
183 -@@ -308,9 +308,10 @@ def test_invalid_codepoints(inp, num):
184 - ("'\\uD800\\uD800\\uD800'", 3),
185 - ("'a\\uD800a\\uD800a\\uD800a'", 3),
186 - ("'\\uDFFF\\uDBFF'", 2),
187 -- pytest.mark.skipif(sys.maxunicode == 0xFFFF,
188 -- ("'\\uDBFF\\uDFFF'", 2),
189 -- reason="narrow Python")])
190 -+ pytest.param(
191 -+ "'\\uDBFF\\uDFFF'", 2,
192 -+ mark=pytest.mark.skipif(sys.maxunicode == 0xFFFF,
193 -+ reason="narrow Python"))])
194 - def test_invalid_codepoints_surrogates(inp, num):
195 - inp = eval(inp) # pylint:disable=eval-used
196 - fp = StringIO(inp)
197 -diff --git a/html5lib/tests/test_treewalkers.py b/html5lib/tests/test_treewalkers.py
198 -index 67fc89e5..c2323b7e 100644
199 ---- a/html5lib/tests/test_treewalkers.py
200 -+++ b/html5lib/tests/test_treewalkers.py
201 -@@ -99,7 +99,7 @@ def test_treewalker_six_mix():
202 -
203 - for tree in sorted(treeTypes.items()):
204 - for intext, attrs, expected in sm_tests:
205 -- yield runTreewalkerEditTest, intext, expected, attrs, tree
206 -+ runTreewalkerEditTest(intext, expected, attrs, tree)
207 -
208 -
209 - @pytest.mark.parametrize("tree,char", itertools.product(sorted(treeTypes.items()), ["x", "\u1234"]))
210 -diff --git a/requirements-test.txt b/requirements-test.txt
211 -index 4e223a3f..b936e0fa 100644
212 ---- a/requirements-test.txt
213 -+++ b/requirements-test.txt
214 -@@ -4,7 +4,7 @@ tox
215 -
216 - flake8<3.0
217 -
218 --pytest==3.2.5
219 -+pytest>=4.3,<4.4
220 - coverage
221 - pytest-expect>=1.1,<2.0
222 - mock
223 -diff --git a/html5lib/tests/test_encoding.py b/html5lib/tests/test_encoding.py
224 -index 97b6ca2a..9f137e7a 100644
225 ---- a/html5lib/tests/test_encoding.py
226 -+++ b/html5lib/tests/test_encoding.py
227 -@@ -95,6 +95,7 @@ def runPreScanEncodingTest(data, encoding):
228 - assert encoding == stream.charEncoding[0].name, errorMessage(data, encoding, stream.charEncoding[0].name)
229 -
230 -
231 -+@×××××××××××.skip(reason="broken under pytest4")
232 - def test_encoding():
233 - for filename in get_data_files("encoding"):
234 - tests = _TestData(filename, b"data", encoding=None)
235 -
236 -From 8ded69fdc0ae45f0531e1633927beb2190ab18a6 Mon Sep 17 00:00:00 2001
237 -From: =?UTF-8?q?Mat=C4=9Bj=20Cepl?= <mcepl@××××.eu>
238 -Date: Fri, 8 Nov 2019 15:28:00 +0100
239 -Subject: [PATCH 3/4] Make flake8 happy
240 -
241 ----
242 - html5lib/tests/test_sanitizer.py | 44 ++++++++++++++++++++------------
243 - 1 file changed, 27 insertions(+), 17 deletions(-)
244 -
245 -diff --git a/html5lib/tests/test_sanitizer.py b/html5lib/tests/test_sanitizer.py
246 -index 1b7285fc..a29d5ef3 100644
247 ---- a/html5lib/tests/test_sanitizer.py
248 -+++ b/html5lib/tests/test_sanitizer.py
249 -@@ -63,25 +63,32 @@ def test_sanitizer():
250 - for ns, tag_name in sanitizer.allowed_elements:
251 - if ns != constants.namespaces["html"]:
252 - continue
253 -- if tag_name in ['caption', 'col', 'colgroup', 'optgroup', 'option', 'table', 'tbody', 'td',
254 -- 'tfoot', 'th', 'thead', 'tr', 'select']:
255 -+ if tag_name in ['caption', 'col', 'colgroup', 'optgroup', 'option',
256 -+ 'table', 'tbody', 'td', 'tfoot', 'th', 'thead',
257 -+ 'tr', 'select']:
258 - continue # TODO
259 - if tag_name == 'image':
260 - runSanitizerTest("test_should_allow_%s_tag" % tag_name,
261 -- "<img title=\"1\"/>foo &lt;bad&gt;bar&lt;/bad&gt; baz",
262 -- "<%s title='1'>foo <bad>bar</bad> baz</%s>" % (tag_name, tag_name))
263 -+ "<img title=\"1\"/>foo &lt;bad&gt;bar&lt;/bad&gt; baz",
264 -+ "<%s title='1'>foo <bad>bar</bad> baz</%s>" %
265 -+ (tag_name, tag_name))
266 - elif tag_name == 'br':
267 - runSanitizerTest("test_should_allow_%s_tag" % tag_name,
268 -- "<br title=\"1\"/>foo &lt;bad&gt;bar&lt;/bad&gt; baz<br/>",
269 -- "<%s title='1'>foo <bad>bar</bad> baz</%s>" % (tag_name, tag_name))
270 -+ "<br title=\"1\"/>foo &lt;bad&gt;bar&lt;/bad&gt; baz<br/>",
271 -+ "<%s title='1'>foo <bad>bar</bad> baz</%s>" %
272 -+ (tag_name, tag_name))
273 - elif tag_name in constants.voidElements:
274 - runSanitizerTest("test_should_allow_%s_tag" % tag_name,
275 -- "<%s title=\"1\"/>foo &lt;bad&gt;bar&lt;/bad&gt; baz" % tag_name,
276 -- "<%s title='1'>foo <bad>bar</bad> baz</%s>" % (tag_name, tag_name))
277 -+ "<%s title=\"1\"/>foo &lt;bad&gt;bar&lt;/bad&gt; baz" %
278 -+ tag_name,
279 -+ "<%s title='1'>foo <bad>bar</bad> baz</%s>" %
280 -+ (tag_name, tag_name))
281 - else:
282 - runSanitizerTest("test_should_allow_%s_tag" % tag_name,
283 -- "<%s title=\"1\">foo &lt;bad&gt;bar&lt;/bad&gt; baz</%s>" % (tag_name, tag_name),
284 -- "<%s title='1'>foo <bad>bar</bad> baz</%s>" % (tag_name, tag_name))
285 -+ "<%s title=\"1\">foo &lt;bad&gt;bar&lt;/bad&gt; baz</%s>" %
286 -+ (tag_name, tag_name),
287 -+ "<%s title='1'>foo <bad>bar</bad> baz</%s>" %
288 -+ (tag_name, tag_name))
289 -
290 - for ns, attribute_name in sanitizer.allowed_attributes:
291 - if ns is not None:
292 -@@ -92,18 +99,21 @@ def test_sanitizer():
293 - continue
294 - attribute_value = 'foo'
295 - if attribute_name in sanitizer.attr_val_is_uri:
296 -- attribute_value = '%s://sub.domain.tld/path/object.ext' % sanitizer.allowed_protocols[0]
297 -+ attribute_value = '%s://sub.domain.tld/path/object.ext' \
298 -+ % sanitizer.allowed_protocols[0]
299 - runSanitizerTest("test_should_allow_%s_attribute" % attribute_name,
300 -- "<p %s=\"%s\">foo &lt;bad&gt;bar&lt;/bad&gt; baz</p>" % (attribute_name, attribute_value),
301 -- "<p %s='%s'>foo <bad>bar</bad> baz</p>" % (attribute_name, attribute_value))
302 -+ "<p %s=\"%s\">foo &lt;bad&gt;bar&lt;/bad&gt; baz</p>" %
303 -+ (attribute_name, attribute_value),
304 -+ "<p %s='%s'>foo <bad>bar</bad> baz</p>" %
305 -+ (attribute_name, attribute_value))
306 -
307 - for protocol in sanitizer.allowed_protocols:
308 - rest_of_uri = '//sub.domain.tld/path/object.ext'
309 - if protocol == 'data':
310 - rest_of_uri = 'image/png;base64,aGVsbG8gd29ybGQ='
311 - runSanitizerTest("test_should_allow_uppercase_%s_uris" % protocol,
312 -- "<img src=\"%s:%s\">foo</a>" % (protocol, rest_of_uri),
313 -- """<img src="%s:%s">foo</a>""" % (protocol, rest_of_uri))
314 -+ "<img src=\"%s:%s\">foo</a>" % (protocol, rest_of_uri),
315 -+ '<img src="%s:%s">foo</a>' % (protocol, rest_of_uri))
316 -
317 - for protocol in sanitizer.allowed_protocols:
318 - rest_of_uri = '//sub.domain.tld/path/object.ext'
319 -@@ -111,8 +121,8 @@ def test_sanitizer():
320 - rest_of_uri = 'image/png;base64,aGVsbG8gd29ybGQ='
321 - protocol = protocol.upper()
322 - runSanitizerTest("test_should_allow_uppercase_%s_uris" % protocol,
323 -- "<img src=\"%s:%s\">foo</a>" % (protocol, rest_of_uri),
324 -- """<img src="%s:%s">foo</a>""" % (protocol, rest_of_uri))
325 -+ "<img src=\"%s:%s\">foo</a>" % (protocol, rest_of_uri),
326 -+ '<img src="%s:%s">foo</a>' % (protocol, rest_of_uri))
327 -
328 -
329 - def test_lowercase_color_codes_in_style():
330 -
331 -From b4d066b2d9b4ea1135183c6500565c2ab8758bf1 Mon Sep 17 00:00:00 2001
332 -From: =?UTF-8?q?Mat=C4=9Bj=20Cepl?= <mcepl@××××.eu>
333 -Date: Fri, 8 Nov 2019 16:17:19 +0100
334 -Subject: [PATCH 4/4] No limits on the upper version of pytest
335 -
336 ----
337 - requirements-test.txt | 2 +-
338 - 1 file changed, 1 insertion(+), 1 deletion(-)
339 -
340 -diff --git a/requirements-test.txt b/requirements-test.txt
341 -index b936e0fa..1cd46922 100644
342 ---- a/requirements-test.txt
343 -+++ b/requirements-test.txt
344 -@@ -4,7 +4,7 @@ tox
345 -
346 - flake8<3.0
347 -
348 --pytest>=4.3,<4.4
349 -+pytest>=4.3
350 - coverage
351 - pytest-expect>=1.1,<2.0
352 - mock
353
354 diff --git a/dev-python/html5lib/html5lib-1.0.1-r2.ebuild b/dev-python/html5lib/html5lib-1.0.1-r2.ebuild
355 deleted file mode 100644
356 index cb7387aff2c..00000000000
357 --- a/dev-python/html5lib/html5lib-1.0.1-r2.ebuild
358 +++ /dev/null
359 @@ -1,37 +0,0 @@
360 -# Copyright 1999-2020 Gentoo Authors
361 -# Distributed under the terms of the GNU General Public License v2
362 -
363 -EAPI=7
364 -
365 -PYTHON_COMPAT=( python3_{6,7,8,9} pypy3 )
366 -PYTHON_REQ_USE="xml(+)"
367 -
368 -inherit distutils-r1
369 -
370 -DESCRIPTION="HTML parser based on the HTML5 specification"
371 -HOMEPAGE="https://github.com/html5lib/html5lib-python/ https://html5lib.readthedocs.org"
372 -SRC_URI="mirror://pypi/${PN:0:1}/${PN}/${P}.tar.gz"
373 -
374 -LICENSE="MIT"
375 -SLOT="0"
376 -KEYWORDS="~alpha amd64 arm arm64 hppa ~ia64 ~mips ppc ppc64 s390 sparc x86 ~x64-macos"
377 -IUSE="test"
378 -RESTRICT+=" !test? ( test )"
379 -
380 -RDEPEND=">=dev-python/six-1.9[${PYTHON_USEDEP}]
381 - dev-python/webencodings[${PYTHON_USEDEP}]"
382 -BDEPEND="
383 - test? (
384 - ${RDEPEND}
385 - dev-python/pytest-expect[${PYTHON_USEDEP}]
386 - dev-python/mock[${PYTHON_USEDEP}]
387 - )"
388 -
389 -PATCHES=(
390 - # fix deprecated import
391 - "${FILESDIR}/html5lib-1.0.1-collections-abc.patch"
392 - # https://github.com/html5lib/html5lib-python/pull/429
393 - "${FILESDIR}/html5lib-python-1.0.1-support-pytest4.patch"
394 -)
395 -
396 -distutils_enable_tests pytest