Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 12 additions & 8 deletions .github/workflows/tests.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -37,7 +37,7 @@ jobs:
MINIMUM_REQUIREMENTS: [0]
USE_SCIPY: [0]
USE_SDIST: [0]
REFGUIDE_CHECK: [0]
REFGUIDE_CHECK: [1]
PIP_FLAGS: [""]
OPTIONS_NAME: ["default"]
include:
Expand DownExpand Up@@ -105,7 +105,7 @@ jobs:
python -m build --sdist
pip install dist/pyw*.tar.gz -v
elif [ "${REFGUIDE_CHECK}" == "1" ]; then
pip install sphinx numpydoc
pip install sphinx numpydoc scipy-doctest
pip install . -v
else
pip install . -v
Expand All@@ -129,11 +129,13 @@ jobs:
pytest --pyargs pywt
python ../pywt/tests/test_doc.py
elif [ "${REFGUIDE_CHECK}" == "1" ]; then
# Run doctests and check if the refguide contains entries from __all__
python util/refguide_check.py --doctests
# doctest docstrings
pytest --doctest-modules --pyargs pywt -v --doctest-collect=api
# Run Sphinx HTML docs builder, converting warnings to errors
pip install -r util/readthedocs/requirements.txt
sphinx-build -b html -W --keep-going -d _build/doctrees . doc/source doc/build
cd ..
# XXX sphinx build is broken on CI

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is happening here? Debug left-over, or is something actually broken right now? If so, I think three lines can be safely deleted. The separate CI job to build the docs with the ReadTheDocs integration is green.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The RTD job is not building the docs with -W, I guess: python -m sphinx -T -b html -d _build/doctrees -D language=en . $READTHEDOCS_OUTPUT/html. Not that there are any warnings because we're already warning-free.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Indeed, this sphinx-build incantation did not previously run on CI because REFGUIDE-CHECK: [0], and was always broken. There's a standing offer to fix this in a follow-up though :-). #747 (comment)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay thanks, let's do that - offer is appreciated:)

# pip install -r util/readthedocs/requirements.txt
# sphinx-build -b html -W --keep-going -d _build/doctrees . doc/source doc/build
else
pytest --pyargs pywt
fi
Expand DownExpand Up@@ -203,7 +205,7 @@ jobs:
python -m build --sdist
pip install pywavelets* -v
elif [ "${REFGUIDE_CHECK}" == "1" ]; then
pip install sphinx numpydoc
pip install sphinx numpydoc scipy-doctest
pip install . -v
else
pip install . -v
Expand All@@ -221,7 +223,9 @@ jobs:
pytest --pyargs pywt
python ../pywt/tests/test_doc.py
elif [ "${REFGUIDE_CHECK}" == "1" ]; then
python util/refguide_check.py --doctests
# doctests docstrings
pytest --doctest-modules --pyargs pywt -v --doctest-collect=api
pytest --doctest-modules --pyargs pywt.data -v
else
pytest --pyargs pywt
fi
Expand Down
8 changes: 4 additions & 4 deletions pywt/_cwt.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -94,8 +94,8 @@ def cwt(data, scales, wavelet, sampling_period=1., method='conv', axis=-1):
>>> x = np.arange(512)
>>> y = np.sin(2*np.pi*x/32)
>>> coef, freqs=pywt.cwt(y,np.arange(1,129),'gaus1')
>>> plt.matshow(coef) # doctest: +SKIP
>>> plt.show() # doctest: +SKIP
>>> plt.matshow(coef)
>>> plt.show()

>>> import pywt
>>> import numpy as np
Expand All@@ -105,8 +105,8 @@ def cwt(data, scales, wavelet, sampling_period=1., method='conv', axis=-1):
>>> widths = np.arange(1, 31)
>>> cwtmatr, freqs = pywt.cwt(sig, widths, 'mexh')
>>> plt.imshow(cwtmatr, extent=[-1, 1, 1, 31], cmap='PRGn', aspect='auto',
... vmax=abs(cwtmatr).max(), vmin=-abs(cwtmatr).max()) # doctest: +SKIP
>>> plt.show() # doctest: +SKIP
... vmax=abs(cwtmatr).max(), vmin=-abs(cwtmatr).max())
>>> plt.show()
"""

# accept array_like input; make a copy to ensure a contiguous array
Expand Down
32 changes: 12 additions & 20 deletions pywt/_extensions/_pywt.pyx
Original file line numberDiff line numberDiff line change
Expand Up@@ -85,7 +85,7 @@ class _Modes(object):
--------
>>> import pywt
>>> pywt.Modes.modes
['zero', 'constant', 'symmetric', 'reflect', 'periodic', 'smooth', 'periodization', 'antisymmetric', 'antireflect']
['zero', 'constant', 'symmetric', 'periodic', 'smooth', 'periodization', 'reflect', 'antisymmetric', 'antireflect']
>>> # The different ways of passing wavelet and mode parameters
>>> (a, d) = pywt.dwt([1,2,3,4,5,6], 'db2', 'smooth')
>>> (a, d) = pywt.dwt([1,2,3,4,5,6], pywt.Wavelet('db2'), pywt.Modes.smooth)
Expand DownExpand Up@@ -909,34 +909,26 @@ cdef public class ContinuousWavelet [type ContinuousWaveletType, object Continuo
>>> wavelet.upper_bound = ub
>>> wavelet.lower_bound = lb
>>> [psi,xval] = wavelet.wavefun(length=n)
>>> plt.plot(xval,psi) # doctest: +ELLIPSIS
[<matplotlib.lines.Line2D object at ...>]
>>> plt.title("Gaussian Wavelet of order 8") # doctest: +ELLIPSIS
<matplotlib.text.Text object at ...>
>>> plt.show() # doctest: +SKIP
>>> plt.plot(xval,psi)
>>> plt.title("Gaussian Wavelet of order 8")
>>> plt.show()

>>> import pywt
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> import pywt
>>> lb = -5
>>> ub = 5
>>> n = 1000
>>> wavelet = pywt.ContinuousWavelet("cgau4")
>>> wavelet.upper_bound = ub
>>> wavelet.lower_bound = lb
>>> [psi,xval] = wavelet.wavefun(length=n)
>>> plt.subplot(211) # doctest: +ELLIPSIS
<matplotlib.axes._subplots.AxesSubplot object at ...>
>>> plt.plot(xval,np.real(psi)) # doctest: +ELLIPSIS
[<matplotlib.lines.Line2D object at ...>]
>>> plt.title("Real part") # doctest: +ELLIPSIS
<matplotlib.text.Text object at ...>
>>> plt.subplot(212) # doctest: +ELLIPSIS
<matplotlib.axes._subplots.AxesSubplot object at ...>
>>> plt.plot(xval,np.imag(psi)) # doctest: +ELLIPSIS
[<matplotlib.lines.Line2D object at ...>]
>>> plt.title("Imaginary part") # doctest: +ELLIPSIS
<matplotlib.text.Text object at ...>
>>> plt.show() # doctest: +SKIP
>>> fix, (ax1, ax2) = plt.subplots(2, 1)
>>> ax1.plot(xval,np.real(psi))
>>> ax1.set_title("Real part")
>>> ax2.plot(xval,np.imag(psi))
>>> ax2.set_title("Imaginary part")
>>> plt.show()

"""
cdef pywt_index_t output_length "output_length"
Expand Down
5 changes: 3 additions & 2 deletions pywt/_multilevel.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -402,7 +402,7 @@ def wavedecn(data, wavelet, mode='symmetric', level=None, axes=None):
>>> # Levels:
>>> len(coeffs)-1
2
>>> waverecn(coeffs, 'db1') # doctest: +NORMALIZE_WHITESPACE
>>> waverecn(coeffs, 'db1')
array([[[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
Expand DownExpand Up@@ -496,7 +496,7 @@ def waverecn(coeffs, wavelet, mode='symmetric', axes=None):
>>> # Levels:
>>> len(coeffs)-1
2
>>> waverecn(coeffs, 'db1') # doctest: +NORMALIZE_WHITESPACE
>>> waverecn(coeffs, 'db1')
array([[[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
Expand DownExpand Up@@ -1415,6 +1415,7 @@ def fswavedecn(data, wavelet, mode='symmetric', levels=None, axes=None):

Examples
--------
>>> import numpy as np
>>> from pywt import fswavedecn
>>> fs_result = fswavedecn(np.ones((32, 32)), 'sym2', levels=(1, 3))
>>> print(fs_result.detail_keys())
Expand Down
20 changes: 10 additions & 10 deletions pywt/data/_readers.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -36,9 +36,9 @@ def ascent():

>>> import matplotlib.pyplot as plt
>>> plt.gray()
>>> plt.imshow(ascent) # doctest: +ELLIPSIS
>>> plt.imshow(ascent)
<matplotlib.image.AxesImage object at ...>
>>> plt.show() # doctest: +SKIP
>>> plt.show()

"""
with importlib.resources.as_file(_DATADIR.joinpath('ascent.npz')) as f:
Expand DownExpand Up@@ -73,9 +73,9 @@ def aero():

>>> import matplotlib.pyplot as plt
>>> plt.gray()
>>> plt.imshow(aero) # doctest: +ELLIPSIS
>>> plt.imshow(aero)
<matplotlib.image.AxesImage object at ...>
>>> plt.show() # doctest: +SKIP
>>> plt.show()

"""
with importlib.resources.as_file(_DATADIR.joinpath('aero.npz')) as f:
Expand DownExpand Up@@ -121,9 +121,9 @@ def camera():

>>> import matplotlib.pyplot as plt
>>> plt.gray()
>>> plt.imshow(camera) # doctest: +ELLIPSIS
>>> plt.imshow(camera)
<matplotlib.image.AxesImage object at ...>
>>> plt.show() # doctest: +SKIP
>>> plt.show()

"""
with importlib.resources.as_file(_DATADIR.joinpath('camera.npz')) as f:
Expand DownExpand Up@@ -154,9 +154,9 @@ def ecg():
True

>>> import matplotlib.pyplot as plt
>>> plt.plot(ecg) # doctest: +ELLIPSIS
>>> plt.plot(ecg)
[<matplotlib.lines.Line2D object at ...>]
>>> plt.show() # doctest: +SKIP
>>> plt.show()
"""
with importlib.resources.as_file(_DATADIR.joinpath('ecg.npz')) as f:
ecg = np.load(f)['data']
Expand DownExpand Up@@ -192,9 +192,9 @@ def nino():
True

>>> import matplotlib.pyplot as plt
>>> plt.plot(time,sst) # doctest: +ELLIPSIS
>>> plt.plot(time,sst)
[<matplotlib.lines.Line2D object at ...>]
>>> plt.show() # doctest: +SKIP
>>> plt.show()
"""
with importlib.resources.as_file(_DATADIR.joinpath('sst_nino3.npz')) as f:
sst_csv = np.load(f)['data']
Expand Down
5 changes: 3 additions & 2 deletions pywt/data/_wavelab_signals.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -70,8 +70,9 @@ def demo_signal(name='Bumps', n=None):
>>> doppler = pywt.data.demo_signal('doppler', 1024)
>>> available_signals = pywt.data.demo_signal('list')
>>> print(available_signals)


['Blocks', 'Bumps', 'HeaviSine', 'Doppler', 'Ramp', 'HiSine', 'LoSine', 'LinChirp',
'TwoChirp', 'QuadChirp', 'MishMash', 'WernerSorrows', 'HypChirps', 'LinChirps',
'Chirps', 'Gabor', 'sineoneoverx', 'Piece-Regular', 'Piece-Polynomial', 'Riemann']

"""
if name.lower() == 'list':
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 12 additions & 8 deletions .github/workflows/tests.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -37,7 +37,7 @@ jobs:
MINIMUM_REQUIREMENTS: [0]
USE_SCIPY: [0]
USE_SDIST: [0]
REFGUIDE_CHECK: [0]
REFGUIDE_CHECK: [1]
PIP_FLAGS: [""]
OPTIONS_NAME: ["default"]
include:
Expand DownExpand Up@@ -105,7 +105,7 @@ jobs:
python -m build --sdist
pip install dist/pyw*.tar.gz -v
elif [ "${REFGUIDE_CHECK}" == "1" ]; then
pip install sphinx numpydoc
pip install sphinx numpydoc scipy-doctest
pip install . -v
else
pip install . -v
Expand All@@ -129,11 +129,13 @@ jobs:
pytest --pyargs pywt
python ../pywt/tests/test_doc.py
elif [ "${REFGUIDE_CHECK}" == "1" ]; then
# Run doctests and check if the refguide contains entries from __all__
python util/refguide_check.py --doctests
# doctest docstrings
pytest --doctest-modules --pyargs pywt -v --doctest-collect=api
# Run Sphinx HTML docs builder, converting warnings to errors
pip install -r util/readthedocs/requirements.txt
sphinx-build -b html -W --keep-going -d _build/doctrees . doc/source doc/build
cd ..
# XXX sphinx build is broken on CI

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is happening here? Debug left-over, or is something actually broken right now? If so, I think three lines can be safely deleted. The separate CI job to build the docs with the ReadTheDocs integration is green.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The RTD job is not building the docs with -W, I guess: python -m sphinx -T -b html -d _build/doctrees -D language=en . $READTHEDOCS_OUTPUT/html. Not that there are any warnings because we're already warning-free.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Indeed, this sphinx-build incantation did not previously run on CI because REFGUIDE-CHECK: [0], and was always broken. There's a standing offer to fix this in a follow-up though :-). #747 (comment)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay thanks, let's do that - offer is appreciated:)

# pip install -r util/readthedocs/requirements.txt
# sphinx-build -b html -W --keep-going -d _build/doctrees . doc/source doc/build
else
pytest --pyargs pywt
fi
Expand DownExpand Up@@ -203,7 +205,7 @@ jobs:
python -m build --sdist
pip install pywavelets* -v
elif [ "${REFGUIDE_CHECK}" == "1" ]; then
pip install sphinx numpydoc
pip install sphinx numpydoc scipy-doctest
pip install . -v
else
pip install . -v
Expand All@@ -221,7 +223,9 @@ jobs:
pytest --pyargs pywt
python ../pywt/tests/test_doc.py
elif [ "${REFGUIDE_CHECK}" == "1" ]; then
python util/refguide_check.py --doctests
# doctests docstrings
pytest --doctest-modules --pyargs pywt -v --doctest-collect=api
pytest --doctest-modules --pyargs pywt.data -v
else
pytest --pyargs pywt
fi
Expand Down
8 changes: 4 additions & 4 deletions pywt/_cwt.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -94,8 +94,8 @@ def cwt(data, scales, wavelet, sampling_period=1., method='conv', axis=-1):
>>> x = np.arange(512)
>>> y = np.sin(2*np.pi*x/32)
>>> coef, freqs=pywt.cwt(y,np.arange(1,129),'gaus1')
>>> plt.matshow(coef) # doctest: +SKIP
>>> plt.show() # doctest: +SKIP
>>> plt.matshow(coef)
>>> plt.show()

>>> import pywt
>>> import numpy as np
Expand All@@ -105,8 +105,8 @@ def cwt(data, scales, wavelet, sampling_period=1., method='conv', axis=-1):
>>> widths = np.arange(1, 31)
>>> cwtmatr, freqs = pywt.cwt(sig, widths, 'mexh')
>>> plt.imshow(cwtmatr, extent=[-1, 1, 1, 31], cmap='PRGn', aspect='auto',
... vmax=abs(cwtmatr).max(), vmin=-abs(cwtmatr).max()) # doctest: +SKIP
>>> plt.show() # doctest: +SKIP
... vmax=abs(cwtmatr).max(), vmin=-abs(cwtmatr).max())
>>> plt.show()
"""

# accept array_like input; make a copy to ensure a contiguous array
Expand Down
32 changes: 12 additions & 20 deletions pywt/_extensions/_pywt.pyx
Original file line numberDiff line numberDiff line change
Expand Up@@ -85,7 +85,7 @@ class _Modes(object):
--------
>>> import pywt
>>> pywt.Modes.modes
['zero', 'constant', 'symmetric', 'reflect', 'periodic', 'smooth', 'periodization', 'antisymmetric', 'antireflect']
['zero', 'constant', 'symmetric', 'periodic', 'smooth', 'periodization', 'reflect', 'antisymmetric', 'antireflect']
>>> # The different ways of passing wavelet and mode parameters
>>> (a, d) = pywt.dwt([1,2,3,4,5,6], 'db2', 'smooth')
>>> (a, d) = pywt.dwt([1,2,3,4,5,6], pywt.Wavelet('db2'), pywt.Modes.smooth)
Expand DownExpand Up@@ -909,34 +909,26 @@ cdef public class ContinuousWavelet [type ContinuousWaveletType, object Continuo
>>> wavelet.upper_bound = ub
>>> wavelet.lower_bound = lb
>>> [psi,xval] = wavelet.wavefun(length=n)
>>> plt.plot(xval,psi) # doctest: +ELLIPSIS
[<matplotlib.lines.Line2D object at ...>]
>>> plt.title("Gaussian Wavelet of order 8") # doctest: +ELLIPSIS
<matplotlib.text.Text object at ...>
>>> plt.show() # doctest: +SKIP
>>> plt.plot(xval,psi)
>>> plt.title("Gaussian Wavelet of order 8")
>>> plt.show()

>>> import pywt
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> import pywt
>>> lb = -5
>>> ub = 5
>>> n = 1000
>>> wavelet = pywt.ContinuousWavelet("cgau4")
>>> wavelet.upper_bound = ub
>>> wavelet.lower_bound = lb
>>> [psi,xval] = wavelet.wavefun(length=n)
>>> plt.subplot(211) # doctest: +ELLIPSIS
<matplotlib.axes._subplots.AxesSubplot object at ...>
>>> plt.plot(xval,np.real(psi)) # doctest: +ELLIPSIS
[<matplotlib.lines.Line2D object at ...>]
>>> plt.title("Real part") # doctest: +ELLIPSIS
<matplotlib.text.Text object at ...>
>>> plt.subplot(212) # doctest: +ELLIPSIS
<matplotlib.axes._subplots.AxesSubplot object at ...>
>>> plt.plot(xval,np.imag(psi)) # doctest: +ELLIPSIS
[<matplotlib.lines.Line2D object at ...>]
>>> plt.title("Imaginary part") # doctest: +ELLIPSIS
<matplotlib.text.Text object at ...>
>>> plt.show() # doctest: +SKIP
>>> fix, (ax1, ax2) = plt.subplots(2, 1)
>>> ax1.plot(xval,np.real(psi))
>>> ax1.set_title("Real part")
>>> ax2.plot(xval,np.imag(psi))
>>> ax2.set_title("Imaginary part")
>>> plt.show()

"""
cdef pywt_index_t output_length "output_length"
Expand Down
5 changes: 3 additions & 2 deletions pywt/_multilevel.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -402,7 +402,7 @@ def wavedecn(data, wavelet, mode='symmetric', level=None, axes=None):
>>> # Levels:
>>> len(coeffs)-1
2
>>> waverecn(coeffs, 'db1') # doctest: +NORMALIZE_WHITESPACE
>>> waverecn(coeffs, 'db1')
array([[[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
Expand DownExpand Up@@ -496,7 +496,7 @@ def waverecn(coeffs, wavelet, mode='symmetric', axes=None):
>>> # Levels:
>>> len(coeffs)-1
2
>>> waverecn(coeffs, 'db1') # doctest: +NORMALIZE_WHITESPACE
>>> waverecn(coeffs, 'db1')
array([[[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
Expand DownExpand Up@@ -1415,6 +1415,7 @@ def fswavedecn(data, wavelet, mode='symmetric', levels=None, axes=None):

Examples
--------
>>> import numpy as np
>>> from pywt import fswavedecn
>>> fs_result = fswavedecn(np.ones((32, 32)), 'sym2', levels=(1, 3))
>>> print(fs_result.detail_keys())
Expand Down
20 changes: 10 additions & 10 deletions pywt/data/_readers.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -36,9 +36,9 @@ def ascent():

>>> import matplotlib.pyplot as plt
>>> plt.gray()
>>> plt.imshow(ascent) # doctest: +ELLIPSIS
>>> plt.imshow(ascent)
<matplotlib.image.AxesImage object at ...>
>>> plt.show() # doctest: +SKIP
>>> plt.show()

"""
with importlib.resources.as_file(_DATADIR.joinpath('ascent.npz')) as f:
Expand DownExpand Up@@ -73,9 +73,9 @@ def aero():

>>> import matplotlib.pyplot as plt
>>> plt.gray()
>>> plt.imshow(aero) # doctest: +ELLIPSIS
>>> plt.imshow(aero)
<matplotlib.image.AxesImage object at ...>
>>> plt.show() # doctest: +SKIP
>>> plt.show()

"""
with importlib.resources.as_file(_DATADIR.joinpath('aero.npz')) as f:
Expand DownExpand Up@@ -121,9 +121,9 @@ def camera():

>>> import matplotlib.pyplot as plt
>>> plt.gray()
>>> plt.imshow(camera) # doctest: +ELLIPSIS
>>> plt.imshow(camera)
<matplotlib.image.AxesImage object at ...>
>>> plt.show() # doctest: +SKIP
>>> plt.show()

"""
with importlib.resources.as_file(_DATADIR.joinpath('camera.npz')) as f:
Expand DownExpand Up@@ -154,9 +154,9 @@ def ecg():
True

>>> import matplotlib.pyplot as plt
>>> plt.plot(ecg) # doctest: +ELLIPSIS
>>> plt.plot(ecg)
[<matplotlib.lines.Line2D object at ...>]
>>> plt.show() # doctest: +SKIP
>>> plt.show()
"""
with importlib.resources.as_file(_DATADIR.joinpath('ecg.npz')) as f:
ecg = np.load(f)['data']
Expand DownExpand Up@@ -192,9 +192,9 @@ def nino():
True

>>> import matplotlib.pyplot as plt
>>> plt.plot(time,sst) # doctest: +ELLIPSIS
>>> plt.plot(time,sst)
[<matplotlib.lines.Line2D object at ...>]
>>> plt.show() # doctest: +SKIP
>>> plt.show()
"""
with importlib.resources.as_file(_DATADIR.joinpath('sst_nino3.npz')) as f:
sst_csv = np.load(f)['data']
Expand Down
5 changes: 3 additions & 2 deletions pywt/data/_wavelab_signals.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -70,8 +70,9 @@ def demo_signal(name='Bumps', n=None):
>>> doppler = pywt.data.demo_signal('doppler', 1024)
>>> available_signals = pywt.data.demo_signal('list')
>>> print(available_signals)


['Blocks', 'Bumps', 'HeaviSine', 'Doppler', 'Ramp', 'HiSine', 'LoSine', 'LinChirp',
'TwoChirp', 'QuadChirp', 'MishMash', 'WernerSorrows', 'HypChirps', 'LinChirps',
'Chirps', 'Gabor', 'sineoneoverx', 'Piece-Regular', 'Piece-Polynomial', 'Riemann']

"""
if name.lower() == 'list':
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 12 additions & 8 deletions .github/workflows/tests.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -37,7 +37,7 @@ jobs:
MINIMUM_REQUIREMENTS: [0]
USE_SCIPY: [0]
USE_SDIST: [0]
REFGUIDE_CHECK: [0]
REFGUIDE_CHECK: [1]
PIP_FLAGS: [""]
OPTIONS_NAME: ["default"]
include:
Expand DownExpand Up@@ -105,7 +105,7 @@ jobs:
python -m build --sdist
pip install dist/pyw*.tar.gz -v
elif [ "${REFGUIDE_CHECK}" == "1" ]; then
pip install sphinx numpydoc
pip install sphinx numpydoc scipy-doctest
pip install . -v
else
pip install . -v
Expand All@@ -129,11 +129,13 @@ jobs:
pytest --pyargs pywt
python ../pywt/tests/test_doc.py
elif [ "${REFGUIDE_CHECK}" == "1" ]; then
# Run doctests and check if the refguide contains entries from __all__
python util/refguide_check.py --doctests
# doctest docstrings
pytest --doctest-modules --pyargs pywt -v --doctest-collect=api
# Run Sphinx HTML docs builder, converting warnings to errors
pip install -r util/readthedocs/requirements.txt
sphinx-build -b html -W --keep-going -d _build/doctrees . doc/source doc/build
cd ..
# XXX sphinx build is broken on CI

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is happening here? Debug left-over, or is something actually broken right now? If so, I think three lines can be safely deleted. The separate CI job to build the docs with the ReadTheDocs integration is green.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The RTD job is not building the docs with -W, I guess: python -m sphinx -T -b html -d _build/doctrees -D language=en . $READTHEDOCS_OUTPUT/html. Not that there are any warnings because we're already warning-free.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Indeed, this sphinx-build incantation did not previously run on CI because REFGUIDE-CHECK: [0], and was always broken. There's a standing offer to fix this in a follow-up though :-). #747 (comment)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay thanks, let's do that - offer is appreciated:)

# pip install -r util/readthedocs/requirements.txt
# sphinx-build -b html -W --keep-going -d _build/doctrees . doc/source doc/build
else
pytest --pyargs pywt
fi
Expand DownExpand Up@@ -203,7 +205,7 @@ jobs:
python -m build --sdist
pip install pywavelets* -v
elif [ "${REFGUIDE_CHECK}" == "1" ]; then
pip install sphinx numpydoc
pip install sphinx numpydoc scipy-doctest
pip install . -v
else
pip install . -v
Expand All@@ -221,7 +223,9 @@ jobs:
pytest --pyargs pywt
python ../pywt/tests/test_doc.py
elif [ "${REFGUIDE_CHECK}" == "1" ]; then
python util/refguide_check.py --doctests
# doctests docstrings
pytest --doctest-modules --pyargs pywt -v --doctest-collect=api
pytest --doctest-modules --pyargs pywt.data -v
else
pytest --pyargs pywt
fi
Expand Down
8 changes: 4 additions & 4 deletions pywt/_cwt.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -94,8 +94,8 @@ def cwt(data, scales, wavelet, sampling_period=1., method='conv', axis=-1):
>>> x = np.arange(512)
>>> y = np.sin(2*np.pi*x/32)
>>> coef, freqs=pywt.cwt(y,np.arange(1,129),'gaus1')
>>> plt.matshow(coef) # doctest: +SKIP
>>> plt.show() # doctest: +SKIP
>>> plt.matshow(coef)
>>> plt.show()

>>> import pywt
>>> import numpy as np
Expand All@@ -105,8 +105,8 @@ def cwt(data, scales, wavelet, sampling_period=1., method='conv', axis=-1):
>>> widths = np.arange(1, 31)
>>> cwtmatr, freqs = pywt.cwt(sig, widths, 'mexh')
>>> plt.imshow(cwtmatr, extent=[-1, 1, 1, 31], cmap='PRGn', aspect='auto',
... vmax=abs(cwtmatr).max(), vmin=-abs(cwtmatr).max()) # doctest: +SKIP
>>> plt.show() # doctest: +SKIP
... vmax=abs(cwtmatr).max(), vmin=-abs(cwtmatr).max())
>>> plt.show()
"""

# accept array_like input; make a copy to ensure a contiguous array
Expand Down
32 changes: 12 additions & 20 deletions pywt/_extensions/_pywt.pyx
Original file line numberDiff line numberDiff line change
Expand Up@@ -85,7 +85,7 @@ class _Modes(object):
--------
>>> import pywt
>>> pywt.Modes.modes
['zero', 'constant', 'symmetric', 'reflect', 'periodic', 'smooth', 'periodization', 'antisymmetric', 'antireflect']
['zero', 'constant', 'symmetric', 'periodic', 'smooth', 'periodization', 'reflect', 'antisymmetric', 'antireflect']
>>> # The different ways of passing wavelet and mode parameters
>>> (a, d) = pywt.dwt([1,2,3,4,5,6], 'db2', 'smooth')
>>> (a, d) = pywt.dwt([1,2,3,4,5,6], pywt.Wavelet('db2'), pywt.Modes.smooth)
Expand DownExpand Up@@ -909,34 +909,26 @@ cdef public class ContinuousWavelet [type ContinuousWaveletType, object Continuo
>>> wavelet.upper_bound = ub
>>> wavelet.lower_bound = lb
>>> [psi,xval] = wavelet.wavefun(length=n)
>>> plt.plot(xval,psi) # doctest: +ELLIPSIS
[<matplotlib.lines.Line2D object at ...>]
>>> plt.title("Gaussian Wavelet of order 8") # doctest: +ELLIPSIS
<matplotlib.text.Text object at ...>
>>> plt.show() # doctest: +SKIP
>>> plt.plot(xval,psi)
>>> plt.title("Gaussian Wavelet of order 8")
>>> plt.show()

>>> import pywt
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> import pywt
>>> lb = -5
>>> ub = 5
>>> n = 1000
>>> wavelet = pywt.ContinuousWavelet("cgau4")
>>> wavelet.upper_bound = ub
>>> wavelet.lower_bound = lb
>>> [psi,xval] = wavelet.wavefun(length=n)
>>> plt.subplot(211) # doctest: +ELLIPSIS
<matplotlib.axes._subplots.AxesSubplot object at ...>
>>> plt.plot(xval,np.real(psi)) # doctest: +ELLIPSIS
[<matplotlib.lines.Line2D object at ...>]
>>> plt.title("Real part") # doctest: +ELLIPSIS
<matplotlib.text.Text object at ...>
>>> plt.subplot(212) # doctest: +ELLIPSIS
<matplotlib.axes._subplots.AxesSubplot object at ...>
>>> plt.plot(xval,np.imag(psi)) # doctest: +ELLIPSIS
[<matplotlib.lines.Line2D object at ...>]
>>> plt.title("Imaginary part") # doctest: +ELLIPSIS
<matplotlib.text.Text object at ...>
>>> plt.show() # doctest: +SKIP
>>> fix, (ax1, ax2) = plt.subplots(2, 1)
>>> ax1.plot(xval,np.real(psi))
>>> ax1.set_title("Real part")
>>> ax2.plot(xval,np.imag(psi))
>>> ax2.set_title("Imaginary part")
>>> plt.show()

"""
cdef pywt_index_t output_length "output_length"
Expand Down
5 changes: 3 additions & 2 deletions pywt/_multilevel.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -402,7 +402,7 @@ def wavedecn(data, wavelet, mode='symmetric', level=None, axes=None):
>>> # Levels:
>>> len(coeffs)-1
2
>>> waverecn(coeffs, 'db1') # doctest: +NORMALIZE_WHITESPACE
>>> waverecn(coeffs, 'db1')
array([[[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
Expand DownExpand Up@@ -496,7 +496,7 @@ def waverecn(coeffs, wavelet, mode='symmetric', axes=None):
>>> # Levels:
>>> len(coeffs)-1
2
>>> waverecn(coeffs, 'db1') # doctest: +NORMALIZE_WHITESPACE
>>> waverecn(coeffs, 'db1')
array([[[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
Expand DownExpand Up@@ -1415,6 +1415,7 @@ def fswavedecn(data, wavelet, mode='symmetric', levels=None, axes=None):

Examples
--------
>>> import numpy as np
>>> from pywt import fswavedecn
>>> fs_result = fswavedecn(np.ones((32, 32)), 'sym2', levels=(1, 3))
>>> print(fs_result.detail_keys())
Expand Down
20 changes: 10 additions & 10 deletions pywt/data/_readers.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -36,9 +36,9 @@ def ascent():

>>> import matplotlib.pyplot as plt
>>> plt.gray()
>>> plt.imshow(ascent) # doctest: +ELLIPSIS
>>> plt.imshow(ascent)
<matplotlib.image.AxesImage object at ...>
>>> plt.show() # doctest: +SKIP
>>> plt.show()

"""
with importlib.resources.as_file(_DATADIR.joinpath('ascent.npz')) as f:
Expand DownExpand Up@@ -73,9 +73,9 @@ def aero():

>>> import matplotlib.pyplot as plt
>>> plt.gray()
>>> plt.imshow(aero) # doctest: +ELLIPSIS
>>> plt.imshow(aero)
<matplotlib.image.AxesImage object at ...>
>>> plt.show() # doctest: +SKIP
>>> plt.show()

"""
with importlib.resources.as_file(_DATADIR.joinpath('aero.npz')) as f:
Expand DownExpand Up@@ -121,9 +121,9 @@ def camera():

>>> import matplotlib.pyplot as plt
>>> plt.gray()
>>> plt.imshow(camera) # doctest: +ELLIPSIS
>>> plt.imshow(camera)
<matplotlib.image.AxesImage object at ...>
>>> plt.show() # doctest: +SKIP
>>> plt.show()

"""
with importlib.resources.as_file(_DATADIR.joinpath('camera.npz')) as f:
Expand DownExpand Up@@ -154,9 +154,9 @@ def ecg():
True

>>> import matplotlib.pyplot as plt
>>> plt.plot(ecg) # doctest: +ELLIPSIS
>>> plt.plot(ecg)
[<matplotlib.lines.Line2D object at ...>]
>>> plt.show() # doctest: +SKIP
>>> plt.show()
"""
with importlib.resources.as_file(_DATADIR.joinpath('ecg.npz')) as f:
ecg = np.load(f)['data']
Expand DownExpand Up@@ -192,9 +192,9 @@ def nino():
True

>>> import matplotlib.pyplot as plt
>>> plt.plot(time,sst) # doctest: +ELLIPSIS
>>> plt.plot(time,sst)
[<matplotlib.lines.Line2D object at ...>]
>>> plt.show() # doctest: +SKIP
>>> plt.show()
"""
with importlib.resources.as_file(_DATADIR.joinpath('sst_nino3.npz')) as f:
sst_csv = np.load(f)['data']
Expand Down
5 changes: 3 additions & 2 deletions pywt/data/_wavelab_signals.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -70,8 +70,9 @@ def demo_signal(name='Bumps', n=None):
>>> doppler = pywt.data.demo_signal('doppler', 1024)
>>> available_signals = pywt.data.demo_signal('list')
>>> print(available_signals)


['Blocks', 'Bumps', 'HeaviSine', 'Doppler', 'Ramp', 'HiSine', 'LoSine', 'LinChirp',
'TwoChirp', 'QuadChirp', 'MishMash', 'WernerSorrows', 'HypChirps', 'LinChirps',
'Chirps', 'Gabor', 'sineoneoverx', 'Piece-Regular', 'Piece-Polynomial', 'Riemann']

"""
if name.lower() == 'list':
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 12 additions & 8 deletions .github/workflows/tests.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -37,7 +37,7 @@ jobs:
MINIMUM_REQUIREMENTS: [0]
USE_SCIPY: [0]
USE_SDIST: [0]
REFGUIDE_CHECK: [0]
REFGUIDE_CHECK: [1]
PIP_FLAGS: [""]
OPTIONS_NAME: ["default"]
include:
Expand DownExpand Up@@ -105,7 +105,7 @@ jobs:
python -m build --sdist
pip install dist/pyw*.tar.gz -v
elif [ "${REFGUIDE_CHECK}" == "1" ]; then
pip install sphinx numpydoc
pip install sphinx numpydoc scipy-doctest
pip install . -v
else
pip install . -v
Expand All@@ -129,11 +129,13 @@ jobs:
pytest --pyargs pywt
python ../pywt/tests/test_doc.py
elif [ "${REFGUIDE_CHECK}" == "1" ]; then
# Run doctests and check if the refguide contains entries from __all__
python util/refguide_check.py --doctests
# doctest docstrings
pytest --doctest-modules --pyargs pywt -v --doctest-collect=api
# Run Sphinx HTML docs builder, converting warnings to errors
pip install -r util/readthedocs/requirements.txt
sphinx-build -b html -W --keep-going -d _build/doctrees . doc/source doc/build
cd ..
# XXX sphinx build is broken on CI

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is happening here? Debug left-over, or is something actually broken right now? If so, I think three lines can be safely deleted. The separate CI job to build the docs with the ReadTheDocs integration is green.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The RTD job is not building the docs with -W, I guess: python -m sphinx -T -b html -d _build/doctrees -D language=en . $READTHEDOCS_OUTPUT/html. Not that there are any warnings because we're already warning-free.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Indeed, this sphinx-build incantation did not previously run on CI because REFGUIDE-CHECK: [0], and was always broken. There's a standing offer to fix this in a follow-up though :-). #747 (comment)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay thanks, let's do that - offer is appreciated:)

# pip install -r util/readthedocs/requirements.txt
# sphinx-build -b html -W --keep-going -d _build/doctrees . doc/source doc/build
else
pytest --pyargs pywt
fi
Expand DownExpand Up@@ -203,7 +205,7 @@ jobs:
python -m build --sdist
pip install pywavelets* -v
elif [ "${REFGUIDE_CHECK}" == "1" ]; then
pip install sphinx numpydoc
pip install sphinx numpydoc scipy-doctest
pip install . -v
else
pip install . -v
Expand All@@ -221,7 +223,9 @@ jobs:
pytest --pyargs pywt
python ../pywt/tests/test_doc.py
elif [ "${REFGUIDE_CHECK}" == "1" ]; then
python util/refguide_check.py --doctests
# doctests docstrings
pytest --doctest-modules --pyargs pywt -v --doctest-collect=api
pytest --doctest-modules --pyargs pywt.data -v
else
pytest --pyargs pywt
fi
Expand Down
8 changes: 4 additions & 4 deletions pywt/_cwt.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -94,8 +94,8 @@ def cwt(data, scales, wavelet, sampling_period=1., method='conv', axis=-1):
>>> x = np.arange(512)
>>> y = np.sin(2*np.pi*x/32)
>>> coef, freqs=pywt.cwt(y,np.arange(1,129),'gaus1')
>>> plt.matshow(coef) # doctest: +SKIP
>>> plt.show() # doctest: +SKIP
>>> plt.matshow(coef)
>>> plt.show()

>>> import pywt
>>> import numpy as np
Expand All@@ -105,8 +105,8 @@ def cwt(data, scales, wavelet, sampling_period=1., method='conv', axis=-1):
>>> widths = np.arange(1, 31)
>>> cwtmatr, freqs = pywt.cwt(sig, widths, 'mexh')
>>> plt.imshow(cwtmatr, extent=[-1, 1, 1, 31], cmap='PRGn', aspect='auto',
... vmax=abs(cwtmatr).max(), vmin=-abs(cwtmatr).max()) # doctest: +SKIP
>>> plt.show() # doctest: +SKIP
... vmax=abs(cwtmatr).max(), vmin=-abs(cwtmatr).max())
>>> plt.show()
"""

# accept array_like input; make a copy to ensure a contiguous array
Expand Down
32 changes: 12 additions & 20 deletions pywt/_extensions/_pywt.pyx
Original file line numberDiff line numberDiff line change
Expand Up@@ -85,7 +85,7 @@ class _Modes(object):
--------
>>> import pywt
>>> pywt.Modes.modes
['zero', 'constant', 'symmetric', 'reflect', 'periodic', 'smooth', 'periodization', 'antisymmetric', 'antireflect']
['zero', 'constant', 'symmetric', 'periodic', 'smooth', 'periodization', 'reflect', 'antisymmetric', 'antireflect']
>>> # The different ways of passing wavelet and mode parameters
>>> (a, d) = pywt.dwt([1,2,3,4,5,6], 'db2', 'smooth')
>>> (a, d) = pywt.dwt([1,2,3,4,5,6], pywt.Wavelet('db2'), pywt.Modes.smooth)
Expand DownExpand Up@@ -909,34 +909,26 @@ cdef public class ContinuousWavelet [type ContinuousWaveletType, object Continuo
>>> wavelet.upper_bound = ub
>>> wavelet.lower_bound = lb
>>> [psi,xval] = wavelet.wavefun(length=n)
>>> plt.plot(xval,psi) # doctest: +ELLIPSIS
[<matplotlib.lines.Line2D object at ...>]
>>> plt.title("Gaussian Wavelet of order 8") # doctest: +ELLIPSIS
<matplotlib.text.Text object at ...>
>>> plt.show() # doctest: +SKIP
>>> plt.plot(xval,psi)
>>> plt.title("Gaussian Wavelet of order 8")
>>> plt.show()

>>> import pywt
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> import pywt
>>> lb = -5
>>> ub = 5
>>> n = 1000
>>> wavelet = pywt.ContinuousWavelet("cgau4")
>>> wavelet.upper_bound = ub
>>> wavelet.lower_bound = lb
>>> [psi,xval] = wavelet.wavefun(length=n)
>>> plt.subplot(211) # doctest: +ELLIPSIS
<matplotlib.axes._subplots.AxesSubplot object at ...>
>>> plt.plot(xval,np.real(psi)) # doctest: +ELLIPSIS
[<matplotlib.lines.Line2D object at ...>]
>>> plt.title("Real part") # doctest: +ELLIPSIS
<matplotlib.text.Text object at ...>
>>> plt.subplot(212) # doctest: +ELLIPSIS
<matplotlib.axes._subplots.AxesSubplot object at ...>
>>> plt.plot(xval,np.imag(psi)) # doctest: +ELLIPSIS
[<matplotlib.lines.Line2D object at ...>]
>>> plt.title("Imaginary part") # doctest: +ELLIPSIS
<matplotlib.text.Text object at ...>
>>> plt.show() # doctest: +SKIP
>>> fix, (ax1, ax2) = plt.subplots(2, 1)
>>> ax1.plot(xval,np.real(psi))
>>> ax1.set_title("Real part")
>>> ax2.plot(xval,np.imag(psi))
>>> ax2.set_title("Imaginary part")
>>> plt.show()

"""
cdef pywt_index_t output_length "output_length"
Expand Down
5 changes: 3 additions & 2 deletions pywt/_multilevel.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -402,7 +402,7 @@ def wavedecn(data, wavelet, mode='symmetric', level=None, axes=None):
>>> # Levels:
>>> len(coeffs)-1
2
>>> waverecn(coeffs, 'db1') # doctest: +NORMALIZE_WHITESPACE
>>> waverecn(coeffs, 'db1')
array([[[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
Expand DownExpand Up@@ -496,7 +496,7 @@ def waverecn(coeffs, wavelet, mode='symmetric', axes=None):
>>> # Levels:
>>> len(coeffs)-1
2
>>> waverecn(coeffs, 'db1') # doctest: +NORMALIZE_WHITESPACE
>>> waverecn(coeffs, 'db1')
array([[[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
Expand DownExpand Up@@ -1415,6 +1415,7 @@ def fswavedecn(data, wavelet, mode='symmetric', levels=None, axes=None):

Examples
--------
>>> import numpy as np
>>> from pywt import fswavedecn
>>> fs_result = fswavedecn(np.ones((32, 32)), 'sym2', levels=(1, 3))
>>> print(fs_result.detail_keys())
Expand Down
20 changes: 10 additions & 10 deletions pywt/data/_readers.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -36,9 +36,9 @@ def ascent():

>>> import matplotlib.pyplot as plt
>>> plt.gray()
>>> plt.imshow(ascent) # doctest: +ELLIPSIS
>>> plt.imshow(ascent)
<matplotlib.image.AxesImage object at ...>
>>> plt.show() # doctest: +SKIP
>>> plt.show()

"""
with importlib.resources.as_file(_DATADIR.joinpath('ascent.npz')) as f:
Expand DownExpand Up@@ -73,9 +73,9 @@ def aero():

>>> import matplotlib.pyplot as plt
>>> plt.gray()
>>> plt.imshow(aero) # doctest: +ELLIPSIS
>>> plt.imshow(aero)
<matplotlib.image.AxesImage object at ...>
>>> plt.show() # doctest: +SKIP
>>> plt.show()

"""
with importlib.resources.as_file(_DATADIR.joinpath('aero.npz')) as f:
Expand DownExpand Up@@ -121,9 +121,9 @@ def camera():

>>> import matplotlib.pyplot as plt
>>> plt.gray()
>>> plt.imshow(camera) # doctest: +ELLIPSIS
>>> plt.imshow(camera)
<matplotlib.image.AxesImage object at ...>
>>> plt.show() # doctest: +SKIP
>>> plt.show()

"""
with importlib.resources.as_file(_DATADIR.joinpath('camera.npz')) as f:
Expand DownExpand Up@@ -154,9 +154,9 @@ def ecg():
True

>>> import matplotlib.pyplot as plt
>>> plt.plot(ecg) # doctest: +ELLIPSIS
>>> plt.plot(ecg)
[<matplotlib.lines.Line2D object at ...>]
>>> plt.show() # doctest: +SKIP
>>> plt.show()
"""
with importlib.resources.as_file(_DATADIR.joinpath('ecg.npz')) as f:
ecg = np.load(f)['data']
Expand DownExpand Up@@ -192,9 +192,9 @@ def nino():
True

>>> import matplotlib.pyplot as plt
>>> plt.plot(time,sst) # doctest: +ELLIPSIS
>>> plt.plot(time,sst)
[<matplotlib.lines.Line2D object at ...>]
>>> plt.show() # doctest: +SKIP
>>> plt.show()
"""
with importlib.resources.as_file(_DATADIR.joinpath('sst_nino3.npz')) as f:
sst_csv = np.load(f)['data']
Expand Down
5 changes: 3 additions & 2 deletions pywt/data/_wavelab_signals.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -70,8 +70,9 @@ def demo_signal(name='Bumps', n=None):
>>> doppler = pywt.data.demo_signal('doppler', 1024)
>>> available_signals = pywt.data.demo_signal('list')
>>> print(available_signals)


['Blocks', 'Bumps', 'HeaviSine', 'Doppler', 'Ramp', 'HiSine', 'LoSine', 'LinChirp',
'TwoChirp', 'QuadChirp', 'MishMash', 'WernerSorrows', 'HypChirps', 'LinChirps',
'Chirps', 'Gabor', 'sineoneoverx', 'Piece-Regular', 'Piece-Polynomial', 'Riemann']

"""
if name.lower() == 'list':
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 12 additions & 8 deletions .github/workflows/tests.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -37,7 +37,7 @@ jobs:
MINIMUM_REQUIREMENTS: [0]
USE_SCIPY: [0]
USE_SDIST: [0]
REFGUIDE_CHECK: [0]
REFGUIDE_CHECK: [1]
PIP_FLAGS: [""]
OPTIONS_NAME: ["default"]
include:
Expand DownExpand Up@@ -105,7 +105,7 @@ jobs:
python -m build --sdist
pip install dist/pyw*.tar.gz -v
elif [ "${REFGUIDE_CHECK}" == "1" ]; then
pip install sphinx numpydoc
pip install sphinx numpydoc scipy-doctest
pip install . -v
else
pip install . -v
Expand All@@ -129,11 +129,13 @@ jobs:
pytest --pyargs pywt
python ../pywt/tests/test_doc.py
elif [ "${REFGUIDE_CHECK}" == "1" ]; then
# Run doctests and check if the refguide contains entries from __all__
python util/refguide_check.py --doctests
# doctest docstrings
pytest --doctest-modules --pyargs pywt -v --doctest-collect=api
# Run Sphinx HTML docs builder, converting warnings to errors
pip install -r util/readthedocs/requirements.txt
sphinx-build -b html -W --keep-going -d _build/doctrees . doc/source doc/build
cd ..
# XXX sphinx build is broken on CI

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is happening here? Debug left-over, or is something actually broken right now? If so, I think three lines can be safely deleted. The separate CI job to build the docs with the ReadTheDocs integration is green.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The RTD job is not building the docs with -W, I guess: python -m sphinx -T -b html -d _build/doctrees -D language=en . $READTHEDOCS_OUTPUT/html. Not that there are any warnings because we're already warning-free.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Indeed, this sphinx-build incantation did not previously run on CI because REFGUIDE-CHECK: [0], and was always broken. There's a standing offer to fix this in a follow-up though :-). #747 (comment)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay thanks, let's do that - offer is appreciated:)

# pip install -r util/readthedocs/requirements.txt
# sphinx-build -b html -W --keep-going -d _build/doctrees . doc/source doc/build
else
pytest --pyargs pywt
fi
Expand DownExpand Up@@ -203,7 +205,7 @@ jobs:
python -m build --sdist
pip install pywavelets* -v
elif [ "${REFGUIDE_CHECK}" == "1" ]; then
pip install sphinx numpydoc
pip install sphinx numpydoc scipy-doctest
pip install . -v
else
pip install . -v
Expand All@@ -221,7 +223,9 @@ jobs:
pytest --pyargs pywt
python ../pywt/tests/test_doc.py
elif [ "${REFGUIDE_CHECK}" == "1" ]; then
python util/refguide_check.py --doctests
# doctests docstrings
pytest --doctest-modules --pyargs pywt -v --doctest-collect=api
pytest --doctest-modules --pyargs pywt.data -v
else
pytest --pyargs pywt
fi
Expand Down
8 changes: 4 additions & 4 deletions pywt/_cwt.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -94,8 +94,8 @@ def cwt(data, scales, wavelet, sampling_period=1., method='conv', axis=-1):
>>> x = np.arange(512)
>>> y = np.sin(2*np.pi*x/32)
>>> coef, freqs=pywt.cwt(y,np.arange(1,129),'gaus1')
>>> plt.matshow(coef) # doctest: +SKIP
>>> plt.show() # doctest: +SKIP
>>> plt.matshow(coef)
>>> plt.show()

>>> import pywt
>>> import numpy as np
Expand All@@ -105,8 +105,8 @@ def cwt(data, scales, wavelet, sampling_period=1., method='conv', axis=-1):
>>> widths = np.arange(1, 31)
>>> cwtmatr, freqs = pywt.cwt(sig, widths, 'mexh')
>>> plt.imshow(cwtmatr, extent=[-1, 1, 1, 31], cmap='PRGn', aspect='auto',
... vmax=abs(cwtmatr).max(), vmin=-abs(cwtmatr).max()) # doctest: +SKIP
>>> plt.show() # doctest: +SKIP
... vmax=abs(cwtmatr).max(), vmin=-abs(cwtmatr).max())
>>> plt.show()
"""

# accept array_like input; make a copy to ensure a contiguous array
Expand Down
32 changes: 12 additions & 20 deletions pywt/_extensions/_pywt.pyx
Original file line numberDiff line numberDiff line change
Expand Up@@ -85,7 +85,7 @@ class _Modes(object):
--------
>>> import pywt
>>> pywt.Modes.modes
['zero', 'constant', 'symmetric', 'reflect', 'periodic', 'smooth', 'periodization', 'antisymmetric', 'antireflect']
['zero', 'constant', 'symmetric', 'periodic', 'smooth', 'periodization', 'reflect', 'antisymmetric', 'antireflect']
>>> # The different ways of passing wavelet and mode parameters
>>> (a, d) = pywt.dwt([1,2,3,4,5,6], 'db2', 'smooth')
>>> (a, d) = pywt.dwt([1,2,3,4,5,6], pywt.Wavelet('db2'), pywt.Modes.smooth)
Expand DownExpand Up@@ -909,34 +909,26 @@ cdef public class ContinuousWavelet [type ContinuousWaveletType, object Continuo
>>> wavelet.upper_bound = ub
>>> wavelet.lower_bound = lb
>>> [psi,xval] = wavelet.wavefun(length=n)
>>> plt.plot(xval,psi) # doctest: +ELLIPSIS
[<matplotlib.lines.Line2D object at ...>]
>>> plt.title("Gaussian Wavelet of order 8") # doctest: +ELLIPSIS
<matplotlib.text.Text object at ...>
>>> plt.show() # doctest: +SKIP
>>> plt.plot(xval,psi)
>>> plt.title("Gaussian Wavelet of order 8")
>>> plt.show()

>>> import pywt
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> import pywt
>>> lb = -5
>>> ub = 5
>>> n = 1000
>>> wavelet = pywt.ContinuousWavelet("cgau4")
>>> wavelet.upper_bound = ub
>>> wavelet.lower_bound = lb
>>> [psi,xval] = wavelet.wavefun(length=n)
>>> plt.subplot(211) # doctest: +ELLIPSIS
<matplotlib.axes._subplots.AxesSubplot object at ...>
>>> plt.plot(xval,np.real(psi)) # doctest: +ELLIPSIS
[<matplotlib.lines.Line2D object at ...>]
>>> plt.title("Real part") # doctest: +ELLIPSIS
<matplotlib.text.Text object at ...>
>>> plt.subplot(212) # doctest: +ELLIPSIS
<matplotlib.axes._subplots.AxesSubplot object at ...>
>>> plt.plot(xval,np.imag(psi)) # doctest: +ELLIPSIS
[<matplotlib.lines.Line2D object at ...>]
>>> plt.title("Imaginary part") # doctest: +ELLIPSIS
<matplotlib.text.Text object at ...>
>>> plt.show() # doctest: +SKIP
>>> fix, (ax1, ax2) = plt.subplots(2, 1)
>>> ax1.plot(xval,np.real(psi))
>>> ax1.set_title("Real part")
>>> ax2.plot(xval,np.imag(psi))
>>> ax2.set_title("Imaginary part")
>>> plt.show()

"""
cdef pywt_index_t output_length "output_length"
Expand Down
5 changes: 3 additions & 2 deletions pywt/_multilevel.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -402,7 +402,7 @@ def wavedecn(data, wavelet, mode='symmetric', level=None, axes=None):
>>> # Levels:
>>> len(coeffs)-1
2
>>> waverecn(coeffs, 'db1') # doctest: +NORMALIZE_WHITESPACE
>>> waverecn(coeffs, 'db1')
array([[[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
Expand DownExpand Up@@ -496,7 +496,7 @@ def waverecn(coeffs, wavelet, mode='symmetric', axes=None):
>>> # Levels:
>>> len(coeffs)-1
2
>>> waverecn(coeffs, 'db1') # doctest: +NORMALIZE_WHITESPACE
>>> waverecn(coeffs, 'db1')
array([[[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
Expand DownExpand Up@@ -1415,6 +1415,7 @@ def fswavedecn(data, wavelet, mode='symmetric', levels=None, axes=None):

Examples
--------
>>> import numpy as np
>>> from pywt import fswavedecn
>>> fs_result = fswavedecn(np.ones((32, 32)), 'sym2', levels=(1, 3))
>>> print(fs_result.detail_keys())
Expand Down
20 changes: 10 additions & 10 deletions pywt/data/_readers.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -36,9 +36,9 @@ def ascent():

>>> import matplotlib.pyplot as plt
>>> plt.gray()
>>> plt.imshow(ascent) # doctest: +ELLIPSIS
>>> plt.imshow(ascent)
<matplotlib.image.AxesImage object at ...>
>>> plt.show() # doctest: +SKIP
>>> plt.show()

"""
with importlib.resources.as_file(_DATADIR.joinpath('ascent.npz')) as f:
Expand DownExpand Up@@ -73,9 +73,9 @@ def aero():

>>> import matplotlib.pyplot as plt
>>> plt.gray()
>>> plt.imshow(aero) # doctest: +ELLIPSIS
>>> plt.imshow(aero)
<matplotlib.image.AxesImage object at ...>
>>> plt.show() # doctest: +SKIP
>>> plt.show()

"""
with importlib.resources.as_file(_DATADIR.joinpath('aero.npz')) as f:
Expand DownExpand Up@@ -121,9 +121,9 @@ def camera():

>>> import matplotlib.pyplot as plt
>>> plt.gray()
>>> plt.imshow(camera) # doctest: +ELLIPSIS
>>> plt.imshow(camera)
<matplotlib.image.AxesImage object at ...>
>>> plt.show() # doctest: +SKIP
>>> plt.show()

"""
with importlib.resources.as_file(_DATADIR.joinpath('camera.npz')) as f:
Expand DownExpand Up@@ -154,9 +154,9 @@ def ecg():
True

>>> import matplotlib.pyplot as plt
>>> plt.plot(ecg) # doctest: +ELLIPSIS
>>> plt.plot(ecg)
[<matplotlib.lines.Line2D object at ...>]
>>> plt.show() # doctest: +SKIP
>>> plt.show()
"""
with importlib.resources.as_file(_DATADIR.joinpath('ecg.npz')) as f:
ecg = np.load(f)['data']
Expand DownExpand Up@@ -192,9 +192,9 @@ def nino():
True

>>> import matplotlib.pyplot as plt
>>> plt.plot(time,sst) # doctest: +ELLIPSIS
>>> plt.plot(time,sst)
[<matplotlib.lines.Line2D object at ...>]
>>> plt.show() # doctest: +SKIP
>>> plt.show()
"""
with importlib.resources.as_file(_DATADIR.joinpath('sst_nino3.npz')) as f:
sst_csv = np.load(f)['data']
Expand Down
5 changes: 3 additions & 2 deletions pywt/data/_wavelab_signals.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -70,8 +70,9 @@ def demo_signal(name='Bumps', n=None):
>>> doppler = pywt.data.demo_signal('doppler', 1024)
>>> available_signals = pywt.data.demo_signal('list')
>>> print(available_signals)


['Blocks', 'Bumps', 'HeaviSine', 'Doppler', 'Ramp', 'HiSine', 'LoSine', 'LinChirp',
'TwoChirp', 'QuadChirp', 'MishMash', 'WernerSorrows', 'HypChirps', 'LinChirps',
'Chirps', 'Gabor', 'sineoneoverx', 'Piece-Regular', 'Piece-Polynomial', 'Riemann']

"""
if name.lower() == 'list':
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 12 additions & 8 deletions .github/workflows/tests.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -37,7 +37,7 @@ jobs:
MINIMUM_REQUIREMENTS: [0]
USE_SCIPY: [0]
USE_SDIST: [0]
REFGUIDE_CHECK: [0]
REFGUIDE_CHECK: [1]
PIP_FLAGS: [""]
OPTIONS_NAME: ["default"]
include:
Expand DownExpand Up@@ -105,7 +105,7 @@ jobs:
python -m build --sdist
pip install dist/pyw*.tar.gz -v
elif [ "${REFGUIDE_CHECK}" == "1" ]; then
pip install sphinx numpydoc
pip install sphinx numpydoc scipy-doctest
pip install . -v
else
pip install . -v
Expand All@@ -129,11 +129,13 @@ jobs:
pytest --pyargs pywt
python ../pywt/tests/test_doc.py
elif [ "${REFGUIDE_CHECK}" == "1" ]; then
# Run doctests and check if the refguide contains entries from __all__
python util/refguide_check.py --doctests
# doctest docstrings
pytest --doctest-modules --pyargs pywt -v --doctest-collect=api
# Run Sphinx HTML docs builder, converting warnings to errors
pip install -r util/readthedocs/requirements.txt
sphinx-build -b html -W --keep-going -d _build/doctrees . doc/source doc/build
cd ..
# XXX sphinx build is broken on CI

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is happening here? Debug left-over, or is something actually broken right now? If so, I think three lines can be safely deleted. The separate CI job to build the docs with the ReadTheDocs integration is green.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The RTD job is not building the docs with -W, I guess: python -m sphinx -T -b html -d _build/doctrees -D language=en . $READTHEDOCS_OUTPUT/html. Not that there are any warnings because we're already warning-free.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Indeed, this sphinx-build incantation did not previously run on CI because REFGUIDE-CHECK: [0], and was always broken. There's a standing offer to fix this in a follow-up though :-). #747 (comment)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay thanks, let's do that - offer is appreciated:)

# pip install -r util/readthedocs/requirements.txt
# sphinx-build -b html -W --keep-going -d _build/doctrees . doc/source doc/build
else
pytest --pyargs pywt
fi
Expand DownExpand Up@@ -203,7 +205,7 @@ jobs:
python -m build --sdist
pip install pywavelets* -v
elif [ "${REFGUIDE_CHECK}" == "1" ]; then
pip install sphinx numpydoc
pip install sphinx numpydoc scipy-doctest
pip install . -v
else
pip install . -v
Expand All@@ -221,7 +223,9 @@ jobs:
pytest --pyargs pywt
python ../pywt/tests/test_doc.py
elif [ "${REFGUIDE_CHECK}" == "1" ]; then
python util/refguide_check.py --doctests
# doctests docstrings
pytest --doctest-modules --pyargs pywt -v --doctest-collect=api
pytest --doctest-modules --pyargs pywt.data -v
else
pytest --pyargs pywt
fi
Expand Down
8 changes: 4 additions & 4 deletions pywt/_cwt.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -94,8 +94,8 @@ def cwt(data, scales, wavelet, sampling_period=1., method='conv', axis=-1):
>>> x = np.arange(512)
>>> y = np.sin(2*np.pi*x/32)
>>> coef, freqs=pywt.cwt(y,np.arange(1,129),'gaus1')
>>> plt.matshow(coef) # doctest: +SKIP
>>> plt.show() # doctest: +SKIP
>>> plt.matshow(coef)
>>> plt.show()

>>> import pywt
>>> import numpy as np
Expand All@@ -105,8 +105,8 @@ def cwt(data, scales, wavelet, sampling_period=1., method='conv', axis=-1):
>>> widths = np.arange(1, 31)
>>> cwtmatr, freqs = pywt.cwt(sig, widths, 'mexh')
>>> plt.imshow(cwtmatr, extent=[-1, 1, 1, 31], cmap='PRGn', aspect='auto',
... vmax=abs(cwtmatr).max(), vmin=-abs(cwtmatr).max()) # doctest: +SKIP
>>> plt.show() # doctest: +SKIP
... vmax=abs(cwtmatr).max(), vmin=-abs(cwtmatr).max())
>>> plt.show()
"""

# accept array_like input; make a copy to ensure a contiguous array
Expand Down
32 changes: 12 additions & 20 deletions pywt/_extensions/_pywt.pyx
Original file line numberDiff line numberDiff line change
Expand Up@@ -85,7 +85,7 @@ class _Modes(object):
--------
>>> import pywt
>>> pywt.Modes.modes
['zero', 'constant', 'symmetric', 'reflect', 'periodic', 'smooth', 'periodization', 'antisymmetric', 'antireflect']
['zero', 'constant', 'symmetric', 'periodic', 'smooth', 'periodization', 'reflect', 'antisymmetric', 'antireflect']
>>> # The different ways of passing wavelet and mode parameters
>>> (a, d) = pywt.dwt([1,2,3,4,5,6], 'db2', 'smooth')
>>> (a, d) = pywt.dwt([1,2,3,4,5,6], pywt.Wavelet('db2'), pywt.Modes.smooth)
Expand DownExpand Up@@ -909,34 +909,26 @@ cdef public class ContinuousWavelet [type ContinuousWaveletType, object Continuo
>>> wavelet.upper_bound = ub
>>> wavelet.lower_bound = lb
>>> [psi,xval] = wavelet.wavefun(length=n)
>>> plt.plot(xval,psi) # doctest: +ELLIPSIS
[<matplotlib.lines.Line2D object at ...>]
>>> plt.title("Gaussian Wavelet of order 8") # doctest: +ELLIPSIS
<matplotlib.text.Text object at ...>
>>> plt.show() # doctest: +SKIP
>>> plt.plot(xval,psi)
>>> plt.title("Gaussian Wavelet of order 8")
>>> plt.show()

>>> import pywt
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> import pywt
>>> lb = -5
>>> ub = 5
>>> n = 1000
>>> wavelet = pywt.ContinuousWavelet("cgau4")
>>> wavelet.upper_bound = ub
>>> wavelet.lower_bound = lb
>>> [psi,xval] = wavelet.wavefun(length=n)
>>> plt.subplot(211) # doctest: +ELLIPSIS
<matplotlib.axes._subplots.AxesSubplot object at ...>
>>> plt.plot(xval,np.real(psi)) # doctest: +ELLIPSIS
[<matplotlib.lines.Line2D object at ...>]
>>> plt.title("Real part") # doctest: +ELLIPSIS
<matplotlib.text.Text object at ...>
>>> plt.subplot(212) # doctest: +ELLIPSIS
<matplotlib.axes._subplots.AxesSubplot object at ...>
>>> plt.plot(xval,np.imag(psi)) # doctest: +ELLIPSIS
[<matplotlib.lines.Line2D object at ...>]
>>> plt.title("Imaginary part") # doctest: +ELLIPSIS
<matplotlib.text.Text object at ...>
>>> plt.show() # doctest: +SKIP
>>> fix, (ax1, ax2) = plt.subplots(2, 1)
>>> ax1.plot(xval,np.real(psi))
>>> ax1.set_title("Real part")
>>> ax2.plot(xval,np.imag(psi))
>>> ax2.set_title("Imaginary part")
>>> plt.show()

"""
cdef pywt_index_t output_length "output_length"
Expand Down
5 changes: 3 additions & 2 deletions pywt/_multilevel.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -402,7 +402,7 @@ def wavedecn(data, wavelet, mode='symmetric', level=None, axes=None):
>>> # Levels:
>>> len(coeffs)-1
2
>>> waverecn(coeffs, 'db1') # doctest: +NORMALIZE_WHITESPACE
>>> waverecn(coeffs, 'db1')
array([[[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
Expand DownExpand Up@@ -496,7 +496,7 @@ def waverecn(coeffs, wavelet, mode='symmetric', axes=None):
>>> # Levels:
>>> len(coeffs)-1
2
>>> waverecn(coeffs, 'db1') # doctest: +NORMALIZE_WHITESPACE
>>> waverecn(coeffs, 'db1')
array([[[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
Expand DownExpand Up@@ -1415,6 +1415,7 @@ def fswavedecn(data, wavelet, mode='symmetric', levels=None, axes=None):

Examples
--------
>>> import numpy as np
>>> from pywt import fswavedecn
>>> fs_result = fswavedecn(np.ones((32, 32)), 'sym2', levels=(1, 3))
>>> print(fs_result.detail_keys())
Expand Down
20 changes: 10 additions & 10 deletions pywt/data/_readers.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -36,9 +36,9 @@ def ascent():

>>> import matplotlib.pyplot as plt
>>> plt.gray()
>>> plt.imshow(ascent) # doctest: +ELLIPSIS
>>> plt.imshow(ascent)
<matplotlib.image.AxesImage object at ...>
>>> plt.show() # doctest: +SKIP
>>> plt.show()

"""
with importlib.resources.as_file(_DATADIR.joinpath('ascent.npz')) as f:
Expand DownExpand Up@@ -73,9 +73,9 @@ def aero():

>>> import matplotlib.pyplot as plt
>>> plt.gray()
>>> plt.imshow(aero) # doctest: +ELLIPSIS
>>> plt.imshow(aero)
<matplotlib.image.AxesImage object at ...>
>>> plt.show() # doctest: +SKIP
>>> plt.show()

"""
with importlib.resources.as_file(_DATADIR.joinpath('aero.npz')) as f:
Expand DownExpand Up@@ -121,9 +121,9 @@ def camera():

>>> import matplotlib.pyplot as plt
>>> plt.gray()
>>> plt.imshow(camera) # doctest: +ELLIPSIS
>>> plt.imshow(camera)
<matplotlib.image.AxesImage object at ...>
>>> plt.show() # doctest: +SKIP
>>> plt.show()

"""
with importlib.resources.as_file(_DATADIR.joinpath('camera.npz')) as f:
Expand DownExpand Up@@ -154,9 +154,9 @@ def ecg():
True

>>> import matplotlib.pyplot as plt
>>> plt.plot(ecg) # doctest: +ELLIPSIS
>>> plt.plot(ecg)
[<matplotlib.lines.Line2D object at ...>]
>>> plt.show() # doctest: +SKIP
>>> plt.show()
"""
with importlib.resources.as_file(_DATADIR.joinpath('ecg.npz')) as f:
ecg = np.load(f)['data']
Expand DownExpand Up@@ -192,9 +192,9 @@ def nino():
True

>>> import matplotlib.pyplot as plt
>>> plt.plot(time,sst) # doctest: +ELLIPSIS
>>> plt.plot(time,sst)
[<matplotlib.lines.Line2D object at ...>]
>>> plt.show() # doctest: +SKIP
>>> plt.show()
"""
with importlib.resources.as_file(_DATADIR.joinpath('sst_nino3.npz')) as f:
sst_csv = np.load(f)['data']
Expand Down
5 changes: 3 additions & 2 deletions pywt/data/_wavelab_signals.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -70,8 +70,9 @@ def demo_signal(name='Bumps', n=None):
>>> doppler = pywt.data.demo_signal('doppler', 1024)
>>> available_signals = pywt.data.demo_signal('list')
>>> print(available_signals)


['Blocks', 'Bumps', 'HeaviSine', 'Doppler', 'Ramp', 'HiSine', 'LoSine', 'LinChirp',
'TwoChirp', 'QuadChirp', 'MishMash', 'WernerSorrows', 'HypChirps', 'LinChirps',
'Chirps', 'Gabor', 'sineoneoverx', 'Piece-Regular', 'Piece-Polynomial', 'Riemann']

"""
if name.lower() == 'list':
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 12 additions & 8 deletions .github/workflows/tests.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -37,7 +37,7 @@ jobs:
MINIMUM_REQUIREMENTS: [0]
USE_SCIPY: [0]
USE_SDIST: [0]
REFGUIDE_CHECK: [0]
REFGUIDE_CHECK: [1]
PIP_FLAGS: [""]
OPTIONS_NAME: ["default"]
include:
Expand DownExpand Up@@ -105,7 +105,7 @@ jobs:
python -m build --sdist
pip install dist/pyw*.tar.gz -v
elif [ "${REFGUIDE_CHECK}" == "1" ]; then
pip install sphinx numpydoc
pip install sphinx numpydoc scipy-doctest
pip install . -v
else
pip install . -v
Expand All@@ -129,11 +129,13 @@ jobs:
pytest --pyargs pywt
python ../pywt/tests/test_doc.py
elif [ "${REFGUIDE_CHECK}" == "1" ]; then
# Run doctests and check if the refguide contains entries from __all__
python util/refguide_check.py --doctests
# doctest docstrings
pytest --doctest-modules --pyargs pywt -v --doctest-collect=api
# Run Sphinx HTML docs builder, converting warnings to errors
pip install -r util/readthedocs/requirements.txt
sphinx-build -b html -W --keep-going -d _build/doctrees . doc/source doc/build
cd ..
# XXX sphinx build is broken on CI

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is happening here? Debug left-over, or is something actually broken right now? If so, I think three lines can be safely deleted. The separate CI job to build the docs with the ReadTheDocs integration is green.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The RTD job is not building the docs with -W, I guess: python -m sphinx -T -b html -d _build/doctrees -D language=en . $READTHEDOCS_OUTPUT/html. Not that there are any warnings because we're already warning-free.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Indeed, this sphinx-build incantation did not previously run on CI because REFGUIDE-CHECK: [0], and was always broken. There's a standing offer to fix this in a follow-up though :-). #747 (comment)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay thanks, let's do that - offer is appreciated:)

# pip install -r util/readthedocs/requirements.txt
# sphinx-build -b html -W --keep-going -d _build/doctrees . doc/source doc/build
else
pytest --pyargs pywt
fi
Expand DownExpand Up@@ -203,7 +205,7 @@ jobs:
python -m build --sdist
pip install pywavelets* -v
elif [ "${REFGUIDE_CHECK}" == "1" ]; then
pip install sphinx numpydoc
pip install sphinx numpydoc scipy-doctest
pip install . -v
else
pip install . -v
Expand All@@ -221,7 +223,9 @@ jobs:
pytest --pyargs pywt
python ../pywt/tests/test_doc.py
elif [ "${REFGUIDE_CHECK}" == "1" ]; then
python util/refguide_check.py --doctests
# doctests docstrings
pytest --doctest-modules --pyargs pywt -v --doctest-collect=api
pytest --doctest-modules --pyargs pywt.data -v
else
pytest --pyargs pywt
fi
Expand Down
8 changes: 4 additions & 4 deletions pywt/_cwt.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -94,8 +94,8 @@ def cwt(data, scales, wavelet, sampling_period=1., method='conv', axis=-1):
>>> x = np.arange(512)
>>> y = np.sin(2*np.pi*x/32)
>>> coef, freqs=pywt.cwt(y,np.arange(1,129),'gaus1')
>>> plt.matshow(coef) # doctest: +SKIP
>>> plt.show() # doctest: +SKIP
>>> plt.matshow(coef)
>>> plt.show()

>>> import pywt
>>> import numpy as np
Expand All@@ -105,8 +105,8 @@ def cwt(data, scales, wavelet, sampling_period=1., method='conv', axis=-1):
>>> widths = np.arange(1, 31)
>>> cwtmatr, freqs = pywt.cwt(sig, widths, 'mexh')
>>> plt.imshow(cwtmatr, extent=[-1, 1, 1, 31], cmap='PRGn', aspect='auto',
... vmax=abs(cwtmatr).max(), vmin=-abs(cwtmatr).max()) # doctest: +SKIP
>>> plt.show() # doctest: +SKIP
... vmax=abs(cwtmatr).max(), vmin=-abs(cwtmatr).max())
>>> plt.show()
"""

# accept array_like input; make a copy to ensure a contiguous array
Expand Down
32 changes: 12 additions & 20 deletions pywt/_extensions/_pywt.pyx
Original file line numberDiff line numberDiff line change
Expand Up@@ -85,7 +85,7 @@ class _Modes(object):
--------
>>> import pywt
>>> pywt.Modes.modes
['zero', 'constant', 'symmetric', 'reflect', 'periodic', 'smooth', 'periodization', 'antisymmetric', 'antireflect']
['zero', 'constant', 'symmetric', 'periodic', 'smooth', 'periodization', 'reflect', 'antisymmetric', 'antireflect']
>>> # The different ways of passing wavelet and mode parameters
>>> (a, d) = pywt.dwt([1,2,3,4,5,6], 'db2', 'smooth')
>>> (a, d) = pywt.dwt([1,2,3,4,5,6], pywt.Wavelet('db2'), pywt.Modes.smooth)
Expand DownExpand Up@@ -909,34 +909,26 @@ cdef public class ContinuousWavelet [type ContinuousWaveletType, object Continuo
>>> wavelet.upper_bound = ub
>>> wavelet.lower_bound = lb
>>> [psi,xval] = wavelet.wavefun(length=n)
>>> plt.plot(xval,psi) # doctest: +ELLIPSIS
[<matplotlib.lines.Line2D object at ...>]
>>> plt.title("Gaussian Wavelet of order 8") # doctest: +ELLIPSIS
<matplotlib.text.Text object at ...>
>>> plt.show() # doctest: +SKIP
>>> plt.plot(xval,psi)
>>> plt.title("Gaussian Wavelet of order 8")
>>> plt.show()

>>> import pywt
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> import pywt
>>> lb = -5
>>> ub = 5
>>> n = 1000
>>> wavelet = pywt.ContinuousWavelet("cgau4")
>>> wavelet.upper_bound = ub
>>> wavelet.lower_bound = lb
>>> [psi,xval] = wavelet.wavefun(length=n)
>>> plt.subplot(211) # doctest: +ELLIPSIS
<matplotlib.axes._subplots.AxesSubplot object at ...>
>>> plt.plot(xval,np.real(psi)) # doctest: +ELLIPSIS
[<matplotlib.lines.Line2D object at ...>]
>>> plt.title("Real part") # doctest: +ELLIPSIS
<matplotlib.text.Text object at ...>
>>> plt.subplot(212) # doctest: +ELLIPSIS
<matplotlib.axes._subplots.AxesSubplot object at ...>
>>> plt.plot(xval,np.imag(psi)) # doctest: +ELLIPSIS
[<matplotlib.lines.Line2D object at ...>]
>>> plt.title("Imaginary part") # doctest: +ELLIPSIS
<matplotlib.text.Text object at ...>
>>> plt.show() # doctest: +SKIP
>>> fix, (ax1, ax2) = plt.subplots(2, 1)
>>> ax1.plot(xval,np.real(psi))
>>> ax1.set_title("Real part")
>>> ax2.plot(xval,np.imag(psi))
>>> ax2.set_title("Imaginary part")
>>> plt.show()

"""
cdef pywt_index_t output_length "output_length"
Expand Down
5 changes: 3 additions & 2 deletions pywt/_multilevel.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -402,7 +402,7 @@ def wavedecn(data, wavelet, mode='symmetric', level=None, axes=None):
>>> # Levels:
>>> len(coeffs)-1
2
>>> waverecn(coeffs, 'db1') # doctest: +NORMALIZE_WHITESPACE
>>> waverecn(coeffs, 'db1')
array([[[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
Expand DownExpand Up@@ -496,7 +496,7 @@ def waverecn(coeffs, wavelet, mode='symmetric', axes=None):
>>> # Levels:
>>> len(coeffs)-1
2
>>> waverecn(coeffs, 'db1') # doctest: +NORMALIZE_WHITESPACE
>>> waverecn(coeffs, 'db1')
array([[[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
Expand DownExpand Up@@ -1415,6 +1415,7 @@ def fswavedecn(data, wavelet, mode='symmetric', levels=None, axes=None):

Examples
--------
>>> import numpy as np
>>> from pywt import fswavedecn
>>> fs_result = fswavedecn(np.ones((32, 32)), 'sym2', levels=(1, 3))
>>> print(fs_result.detail_keys())
Expand Down
20 changes: 10 additions & 10 deletions pywt/data/_readers.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -36,9 +36,9 @@ def ascent():

>>> import matplotlib.pyplot as plt
>>> plt.gray()
>>> plt.imshow(ascent) # doctest: +ELLIPSIS
>>> plt.imshow(ascent)
<matplotlib.image.AxesImage object at ...>
>>> plt.show() # doctest: +SKIP
>>> plt.show()

"""
with importlib.resources.as_file(_DATADIR.joinpath('ascent.npz')) as f:
Expand DownExpand Up@@ -73,9 +73,9 @@ def aero():

>>> import matplotlib.pyplot as plt
>>> plt.gray()
>>> plt.imshow(aero) # doctest: +ELLIPSIS
>>> plt.imshow(aero)
<matplotlib.image.AxesImage object at ...>
>>> plt.show() # doctest: +SKIP
>>> plt.show()

"""
with importlib.resources.as_file(_DATADIR.joinpath('aero.npz')) as f:
Expand DownExpand Up@@ -121,9 +121,9 @@ def camera():

>>> import matplotlib.pyplot as plt
>>> plt.gray()
>>> plt.imshow(camera) # doctest: +ELLIPSIS
>>> plt.imshow(camera)
<matplotlib.image.AxesImage object at ...>
>>> plt.show() # doctest: +SKIP
>>> plt.show()

"""
with importlib.resources.as_file(_DATADIR.joinpath('camera.npz')) as f:
Expand DownExpand Up@@ -154,9 +154,9 @@ def ecg():
True

>>> import matplotlib.pyplot as plt
>>> plt.plot(ecg) # doctest: +ELLIPSIS
>>> plt.plot(ecg)
[<matplotlib.lines.Line2D object at ...>]
>>> plt.show() # doctest: +SKIP
>>> plt.show()
"""
with importlib.resources.as_file(_DATADIR.joinpath('ecg.npz')) as f:
ecg = np.load(f)['data']
Expand DownExpand Up@@ -192,9 +192,9 @@ def nino():
True

>>> import matplotlib.pyplot as plt
>>> plt.plot(time,sst) # doctest: +ELLIPSIS
>>> plt.plot(time,sst)
[<matplotlib.lines.Line2D object at ...>]
>>> plt.show() # doctest: +SKIP
>>> plt.show()
"""
with importlib.resources.as_file(_DATADIR.joinpath('sst_nino3.npz')) as f:
sst_csv = np.load(f)['data']
Expand Down
5 changes: 3 additions & 2 deletions pywt/data/_wavelab_signals.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -70,8 +70,9 @@ def demo_signal(name='Bumps', n=None):
>>> doppler = pywt.data.demo_signal('doppler', 1024)
>>> available_signals = pywt.data.demo_signal('list')
>>> print(available_signals)


['Blocks', 'Bumps', 'HeaviSine', 'Doppler', 'Ramp', 'HiSine', 'LoSine', 'LinChirp',
'TwoChirp', 'QuadChirp', 'MishMash', 'WernerSorrows', 'HypChirps', 'LinChirps',
'Chirps', 'Gabor', 'sineoneoverx', 'Piece-Regular', 'Piece-Polynomial', 'Riemann']

"""
if name.lower() == 'list':
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 12 additions & 8 deletions .github/workflows/tests.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -37,7 +37,7 @@ jobs:
MINIMUM_REQUIREMENTS: [0]
USE_SCIPY: [0]
USE_SDIST: [0]
REFGUIDE_CHECK: [0]
REFGUIDE_CHECK: [1]
PIP_FLAGS: [""]
OPTIONS_NAME: ["default"]
include:
Expand DownExpand Up@@ -105,7 +105,7 @@ jobs:
python -m build --sdist
pip install dist/pyw*.tar.gz -v
elif [ "${REFGUIDE_CHECK}" == "1" ]; then
pip install sphinx numpydoc
pip install sphinx numpydoc scipy-doctest
pip install . -v
else
pip install . -v
Expand All@@ -129,11 +129,13 @@ jobs:
pytest --pyargs pywt
python ../pywt/tests/test_doc.py
elif [ "${REFGUIDE_CHECK}" == "1" ]; then
# Run doctests and check if the refguide contains entries from __all__
python util/refguide_check.py --doctests
# doctest docstrings
pytest --doctest-modules --pyargs pywt -v --doctest-collect=api
# Run Sphinx HTML docs builder, converting warnings to errors
pip install -r util/readthedocs/requirements.txt
sphinx-build -b html -W --keep-going -d _build/doctrees . doc/source doc/build
cd ..
# XXX sphinx build is broken on CI

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is happening here? Debug left-over, or is something actually broken right now? If so, I think three lines can be safely deleted. The separate CI job to build the docs with the ReadTheDocs integration is green.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The RTD job is not building the docs with -W, I guess: python -m sphinx -T -b html -d _build/doctrees -D language=en . $READTHEDOCS_OUTPUT/html. Not that there are any warnings because we're already warning-free.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Indeed, this sphinx-build incantation did not previously run on CI because REFGUIDE-CHECK: [0], and was always broken. There's a standing offer to fix this in a follow-up though :-). #747 (comment)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay thanks, let's do that - offer is appreciated:)

# pip install -r util/readthedocs/requirements.txt
# sphinx-build -b html -W --keep-going -d _build/doctrees . doc/source doc/build
else
pytest --pyargs pywt
fi
Expand DownExpand Up@@ -203,7 +205,7 @@ jobs:
python -m build --sdist
pip install pywavelets* -v
elif [ "${REFGUIDE_CHECK}" == "1" ]; then
pip install sphinx numpydoc
pip install sphinx numpydoc scipy-doctest
pip install . -v
else
pip install . -v
Expand All@@ -221,7 +223,9 @@ jobs:
pytest --pyargs pywt
python ../pywt/tests/test_doc.py
elif [ "${REFGUIDE_CHECK}" == "1" ]; then
python util/refguide_check.py --doctests
# doctests docstrings
pytest --doctest-modules --pyargs pywt -v --doctest-collect=api
pytest --doctest-modules --pyargs pywt.data -v
else
pytest --pyargs pywt
fi
Expand Down
8 changes: 4 additions & 4 deletions pywt/_cwt.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -94,8 +94,8 @@ def cwt(data, scales, wavelet, sampling_period=1., method='conv', axis=-1):
>>> x = np.arange(512)
>>> y = np.sin(2*np.pi*x/32)
>>> coef, freqs=pywt.cwt(y,np.arange(1,129),'gaus1')
>>> plt.matshow(coef) # doctest: +SKIP
>>> plt.show() # doctest: +SKIP
>>> plt.matshow(coef)
>>> plt.show()

>>> import pywt
>>> import numpy as np
Expand All@@ -105,8 +105,8 @@ def cwt(data, scales, wavelet, sampling_period=1., method='conv', axis=-1):
>>> widths = np.arange(1, 31)
>>> cwtmatr, freqs = pywt.cwt(sig, widths, 'mexh')
>>> plt.imshow(cwtmatr, extent=[-1, 1, 1, 31], cmap='PRGn', aspect='auto',
... vmax=abs(cwtmatr).max(), vmin=-abs(cwtmatr).max()) # doctest: +SKIP
>>> plt.show() # doctest: +SKIP
... vmax=abs(cwtmatr).max(), vmin=-abs(cwtmatr).max())
>>> plt.show()
"""

# accept array_like input; make a copy to ensure a contiguous array
Expand Down
32 changes: 12 additions & 20 deletions pywt/_extensions/_pywt.pyx
Original file line numberDiff line numberDiff line change
Expand Up@@ -85,7 +85,7 @@ class _Modes(object):
--------
>>> import pywt
>>> pywt.Modes.modes
['zero', 'constant', 'symmetric', 'reflect', 'periodic', 'smooth', 'periodization', 'antisymmetric', 'antireflect']
['zero', 'constant', 'symmetric', 'periodic', 'smooth', 'periodization', 'reflect', 'antisymmetric', 'antireflect']
>>> # The different ways of passing wavelet and mode parameters
>>> (a, d) = pywt.dwt([1,2,3,4,5,6], 'db2', 'smooth')
>>> (a, d) = pywt.dwt([1,2,3,4,5,6], pywt.Wavelet('db2'), pywt.Modes.smooth)
Expand DownExpand Up@@ -909,34 +909,26 @@ cdef public class ContinuousWavelet [type ContinuousWaveletType, object Continuo
>>> wavelet.upper_bound = ub
>>> wavelet.lower_bound = lb
>>> [psi,xval] = wavelet.wavefun(length=n)
>>> plt.plot(xval,psi) # doctest: +ELLIPSIS
[<matplotlib.lines.Line2D object at ...>]
>>> plt.title("Gaussian Wavelet of order 8") # doctest: +ELLIPSIS
<matplotlib.text.Text object at ...>
>>> plt.show() # doctest: +SKIP
>>> plt.plot(xval,psi)
>>> plt.title("Gaussian Wavelet of order 8")
>>> plt.show()

>>> import pywt
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> import pywt
>>> lb = -5
>>> ub = 5
>>> n = 1000
>>> wavelet = pywt.ContinuousWavelet("cgau4")
>>> wavelet.upper_bound = ub
>>> wavelet.lower_bound = lb
>>> [psi,xval] = wavelet.wavefun(length=n)
>>> plt.subplot(211) # doctest: +ELLIPSIS
<matplotlib.axes._subplots.AxesSubplot object at ...>
>>> plt.plot(xval,np.real(psi)) # doctest: +ELLIPSIS
[<matplotlib.lines.Line2D object at ...>]
>>> plt.title("Real part") # doctest: +ELLIPSIS
<matplotlib.text.Text object at ...>
>>> plt.subplot(212) # doctest: +ELLIPSIS
<matplotlib.axes._subplots.AxesSubplot object at ...>
>>> plt.plot(xval,np.imag(psi)) # doctest: +ELLIPSIS
[<matplotlib.lines.Line2D object at ...>]
>>> plt.title("Imaginary part") # doctest: +ELLIPSIS
<matplotlib.text.Text object at ...>
>>> plt.show() # doctest: +SKIP
>>> fix, (ax1, ax2) = plt.subplots(2, 1)
>>> ax1.plot(xval,np.real(psi))
>>> ax1.set_title("Real part")
>>> ax2.plot(xval,np.imag(psi))
>>> ax2.set_title("Imaginary part")
>>> plt.show()

"""
cdef pywt_index_t output_length "output_length"
Expand Down
5 changes: 3 additions & 2 deletions pywt/_multilevel.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -402,7 +402,7 @@ def wavedecn(data, wavelet, mode='symmetric', level=None, axes=None):
>>> # Levels:
>>> len(coeffs)-1
2
>>> waverecn(coeffs, 'db1') # doctest: +NORMALIZE_WHITESPACE
>>> waverecn(coeffs, 'db1')
array([[[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
Expand DownExpand Up@@ -496,7 +496,7 @@ def waverecn(coeffs, wavelet, mode='symmetric', axes=None):
>>> # Levels:
>>> len(coeffs)-1
2
>>> waverecn(coeffs, 'db1') # doctest: +NORMALIZE_WHITESPACE
>>> waverecn(coeffs, 'db1')
array([[[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
Expand DownExpand Up@@ -1415,6 +1415,7 @@ def fswavedecn(data, wavelet, mode='symmetric', levels=None, axes=None):

Examples
--------
>>> import numpy as np
>>> from pywt import fswavedecn
>>> fs_result = fswavedecn(np.ones((32, 32)), 'sym2', levels=(1, 3))
>>> print(fs_result.detail_keys())
Expand Down
20 changes: 10 additions & 10 deletions pywt/data/_readers.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -36,9 +36,9 @@ def ascent():

>>> import matplotlib.pyplot as plt
>>> plt.gray()
>>> plt.imshow(ascent) # doctest: +ELLIPSIS
>>> plt.imshow(ascent)
<matplotlib.image.AxesImage object at ...>
>>> plt.show() # doctest: +SKIP
>>> plt.show()

"""
with importlib.resources.as_file(_DATADIR.joinpath('ascent.npz')) as f:
Expand DownExpand Up@@ -73,9 +73,9 @@ def aero():

>>> import matplotlib.pyplot as plt
>>> plt.gray()
>>> plt.imshow(aero) # doctest: +ELLIPSIS
>>> plt.imshow(aero)
<matplotlib.image.AxesImage object at ...>
>>> plt.show() # doctest: +SKIP
>>> plt.show()

"""
with importlib.resources.as_file(_DATADIR.joinpath('aero.npz')) as f:
Expand DownExpand Up@@ -121,9 +121,9 @@ def camera():

>>> import matplotlib.pyplot as plt
>>> plt.gray()
>>> plt.imshow(camera) # doctest: +ELLIPSIS
>>> plt.imshow(camera)
<matplotlib.image.AxesImage object at ...>
>>> plt.show() # doctest: +SKIP
>>> plt.show()

"""
with importlib.resources.as_file(_DATADIR.joinpath('camera.npz')) as f:
Expand DownExpand Up@@ -154,9 +154,9 @@ def ecg():
True

>>> import matplotlib.pyplot as plt
>>> plt.plot(ecg) # doctest: +ELLIPSIS
>>> plt.plot(ecg)
[<matplotlib.lines.Line2D object at ...>]
>>> plt.show() # doctest: +SKIP
>>> plt.show()
"""
with importlib.resources.as_file(_DATADIR.joinpath('ecg.npz')) as f:
ecg = np.load(f)['data']
Expand DownExpand Up@@ -192,9 +192,9 @@ def nino():
True

>>> import matplotlib.pyplot as plt
>>> plt.plot(time,sst) # doctest: +ELLIPSIS
>>> plt.plot(time,sst)
[<matplotlib.lines.Line2D object at ...>]
>>> plt.show() # doctest: +SKIP
>>> plt.show()
"""
with importlib.resources.as_file(_DATADIR.joinpath('sst_nino3.npz')) as f:
sst_csv = np.load(f)['data']
Expand Down
5 changes: 3 additions & 2 deletions pywt/data/_wavelab_signals.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -70,8 +70,9 @@ def demo_signal(name='Bumps', n=None):
>>> doppler = pywt.data.demo_signal('doppler', 1024)
>>> available_signals = pywt.data.demo_signal('list')
>>> print(available_signals)


['Blocks', 'Bumps', 'HeaviSine', 'Doppler', 'Ramp', 'HiSine', 'LoSine', 'LinChirp',
'TwoChirp', 'QuadChirp', 'MishMash', 'WernerSorrows', 'HypChirps', 'LinChirps',
'Chirps', 'Gabor', 'sineoneoverx', 'Piece-Regular', 'Piece-Polynomial', 'Riemann']

"""
if name.lower() == 'list':
Expand Down
Loading