230 lines
4.9 KiB
Python
230 lines
4.9 KiB
Python
![]() |
# Licensed to the Apache Software Foundation (ASF) under one
|
||
|
# or more contributor license agreements. See the NOTICE file
|
||
|
# distributed with this work for additional information
|
||
|
# regarding copyright ownership. The ASF licenses this file
|
||
|
# to you under the Apache License, Version 2.0 (the
|
||
|
# "License"); you may not use this file except in compliance
|
||
|
# with the License. You may obtain a copy of the License at
|
||
|
#
|
||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||
|
#
|
||
|
# Unless required by applicable law or agreed to in writing,
|
||
|
# software distributed under the License is distributed on an
|
||
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||
|
# KIND, either express or implied. See the License for the
|
||
|
# specific language governing permissions and limitations
|
||
|
# under the License.
|
||
|
|
||
|
import gc
|
||
|
import os
|
||
|
import signal
|
||
|
import shutil
|
||
|
import sys
|
||
|
import textwrap
|
||
|
import weakref
|
||
|
|
||
|
import pytest
|
||
|
|
||
|
from pyarrow.util import (doc, _break_traceback_cycle_from_frame,
|
||
|
download_tzdata_on_windows)
|
||
|
from pyarrow.tests.util import disabled_gc
|
||
|
|
||
|
|
||
|
@doc(method="func_a", operation="A")
|
||
|
def func_a(whatever):
|
||
|
"""
|
||
|
This is the {method} method.
|
||
|
|
||
|
It computes {operation}.
|
||
|
"""
|
||
|
pass
|
||
|
|
||
|
|
||
|
@doc(
|
||
|
func_a,
|
||
|
textwrap.dedent(
|
||
|
"""
|
||
|
Examples
|
||
|
--------
|
||
|
|
||
|
>>> func_b()
|
||
|
B
|
||
|
"""
|
||
|
),
|
||
|
method="func_b",
|
||
|
operation="B",
|
||
|
)
|
||
|
def func_b(whatever):
|
||
|
pass
|
||
|
|
||
|
|
||
|
@doc(
|
||
|
func_a,
|
||
|
method="func_c",
|
||
|
operation="C",
|
||
|
)
|
||
|
def func_c(whatever):
|
||
|
"""
|
||
|
Examples
|
||
|
--------
|
||
|
|
||
|
>>> func_c()
|
||
|
C
|
||
|
"""
|
||
|
pass
|
||
|
|
||
|
|
||
|
@doc(func_a, method="func_d", operation="D")
|
||
|
def func_d(whatever):
|
||
|
pass
|
||
|
|
||
|
|
||
|
@doc(func_d, method="func_e", operation="E")
|
||
|
def func_e(whatever):
|
||
|
pass
|
||
|
|
||
|
|
||
|
@doc(method="func_f")
|
||
|
def func_f(whatever):
|
||
|
"""
|
||
|
This is the {method} method.
|
||
|
|
||
|
{{ We can escape curly braces like this. }}
|
||
|
|
||
|
Examples
|
||
|
--------
|
||
|
We should replace curly brace usage in doctests.
|
||
|
|
||
|
>>> dict(x = "x", y = "y")
|
||
|
>>> set((1, 2, 3))
|
||
|
"""
|
||
|
pass
|
||
|
|
||
|
|
||
|
def test_docstring_formatting():
|
||
|
docstr = textwrap.dedent(
|
||
|
"""
|
||
|
This is the func_a method.
|
||
|
|
||
|
It computes A.
|
||
|
"""
|
||
|
)
|
||
|
assert func_a.__doc__ == docstr
|
||
|
|
||
|
|
||
|
def test_docstring_concatenation():
|
||
|
docstr = textwrap.dedent(
|
||
|
"""
|
||
|
This is the func_b method.
|
||
|
|
||
|
It computes B.
|
||
|
|
||
|
Examples
|
||
|
--------
|
||
|
|
||
|
>>> func_b()
|
||
|
B
|
||
|
"""
|
||
|
)
|
||
|
assert func_b.__doc__ == docstr
|
||
|
|
||
|
|
||
|
def test_docstring_append():
|
||
|
docstr = textwrap.dedent(
|
||
|
"""
|
||
|
This is the func_c method.
|
||
|
|
||
|
It computes C.
|
||
|
|
||
|
Examples
|
||
|
--------
|
||
|
|
||
|
>>> func_c()
|
||
|
C
|
||
|
"""
|
||
|
)
|
||
|
assert func_c.__doc__ == docstr
|
||
|
|
||
|
|
||
|
def test_docstring_template_from_callable():
|
||
|
docstr = textwrap.dedent(
|
||
|
"""
|
||
|
This is the func_d method.
|
||
|
|
||
|
It computes D.
|
||
|
"""
|
||
|
)
|
||
|
assert func_d.__doc__ == docstr
|
||
|
|
||
|
|
||
|
def test_inherit_docstring_template_from_callable():
|
||
|
docstr = textwrap.dedent(
|
||
|
"""
|
||
|
This is the func_e method.
|
||
|
|
||
|
It computes E.
|
||
|
"""
|
||
|
)
|
||
|
assert func_e.__doc__ == docstr
|
||
|
|
||
|
|
||
|
def test_escaping_in_docstring():
|
||
|
docstr = textwrap.dedent(
|
||
|
"""
|
||
|
This is the func_f method.
|
||
|
|
||
|
{ We can escape curly braces like this. }
|
||
|
|
||
|
Examples
|
||
|
--------
|
||
|
We should replace curly brace usage in doctests.
|
||
|
|
||
|
>>> dict(x = "x", y = "y")
|
||
|
>>> set((1, 2, 3))
|
||
|
"""
|
||
|
)
|
||
|
assert func_f.__doc__ == docstr
|
||
|
|
||
|
|
||
|
def exhibit_signal_refcycle():
|
||
|
# Put an object in the frame locals and return a weakref to it.
|
||
|
# If `signal.getsignal` has a bug where it creates a reference cycle
|
||
|
# keeping alive the current execution frames, `obj` will not be
|
||
|
# destroyed immediately when this function returns.
|
||
|
obj = set()
|
||
|
signal.getsignal(signal.SIGINT)
|
||
|
return weakref.ref(obj)
|
||
|
|
||
|
|
||
|
def test_signal_refcycle():
|
||
|
# Test possible workaround for https://bugs.python.org/issue42248
|
||
|
with disabled_gc():
|
||
|
wr = exhibit_signal_refcycle()
|
||
|
if wr() is None:
|
||
|
pytest.skip(
|
||
|
"Python version does not have the bug we're testing for")
|
||
|
|
||
|
gc.collect()
|
||
|
with disabled_gc():
|
||
|
wr = exhibit_signal_refcycle()
|
||
|
assert wr() is not None
|
||
|
_break_traceback_cycle_from_frame(sys._getframe(0))
|
||
|
assert wr() is None
|
||
|
|
||
|
|
||
|
@pytest.mark.skipif(sys.platform != "win32",
|
||
|
reason="Timezone database is already provided.")
|
||
|
def test_download_tzdata_on_windows():
|
||
|
tzdata_path = os.path.expandvars(r"%USERPROFILE%\Downloads\tzdata")
|
||
|
|
||
|
# Download timezone database and remove data in case it already exists
|
||
|
if (os.path.exists(tzdata_path)):
|
||
|
shutil.rmtree(tzdata_path)
|
||
|
download_tzdata_on_windows()
|
||
|
|
||
|
# Inspect the folder
|
||
|
assert os.path.exists(tzdata_path)
|
||
|
assert os.path.exists(os.path.join(tzdata_path, "windowsZones.xml"))
|
||
|
assert os.path.exists(os.path.join(tzdata_path, "europe"))
|
||
|
assert 'version' in os.listdir(tzdata_path)
|