| # 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) |