proarrow-0.4.0.0: tools/haddock/test_interfaces.py
"""Regression checks for interface collection in checkout and unpacked CI layouts."""
import json
from pathlib import Path
import tempfile
import unittest
from interfaces import check_index, collect
class InterfacesTest(unittest.TestCase):
def setUp(self):
self.temp = tempfile.TemporaryDirectory()
self.addCleanup(self.temp.cleanup)
self.project = Path(self.temp.name)
(self.project / 'cabal.project').write_text('packages: unpacked/proarrow-0.3.0.0\n')
def prepare(self, location, builddir='dist-newstyle'):
package = self.project / location
(package / 'docs').mkdir(parents=True)
entries = []
for component, subdir, relative, contents in (
('lib', '', 'doc/html/proarrow/proarrow.haddock', b'main interface'),
('lib:testing', 'l/testing', 'doc/html/proarrow/testing/testing.haddock', b'testing interface'),
):
dist = self.project / builddir / 'build/platform/compiler/proarrow-0.3.0.0' / subdir
interface = dist / relative
interface.parent.mkdir(parents=True)
interface.write_bytes(contents)
entries.append({'pkg-name': 'proarrow', 'component-name': component,
'pkg-src': {'path': str(package)}, 'dist-dir': str(dist)})
cache = self.project / builddir / 'cache'
cache.mkdir()
(cache / 'plan.json').write_text(json.dumps({'install-plan': entries}))
return package
def assert_interfaces(self, package):
self.assertEqual((package / 'docs/proarrow.haddock').read_bytes(), b'main interface')
self.assertEqual((package / 'docs/testing.haddock').read_bytes(), b'testing interface')
def test_checkout(self):
package = self.prepare('proarrow')
collect(package, Path('dist-newstyle'))
self.assert_interfaces(package)
def test_unpacked_ci(self):
package = self.prepare('unpacked/proarrow-0.3.0.0')
self.assertFalse((package.parent / 'dist-newstyle').exists())
collect(package, Path('dist-newstyle'))
self.assert_interfaces(package)
def test_custom_builddir_ignores_stale_interfaces(self):
package = self.prepare('proarrow', 'dist-9103')
stale = self.project / 'dist-newstyle/build/old'
stale.mkdir(parents=True)
(stale / 'proarrow.haddock').write_bytes(b'stale interface from another compiler')
collect(package, Path('dist-9103'))
self.assert_interfaces(package)
def test_missing_interface_fails(self):
package = self.prepare('unpacked/proarrow-0.3.0.0')
next((self.project / 'dist-newstyle/build').rglob('testing.haddock')).unlink()
with self.assertRaises(FileNotFoundError):
collect(package, Path('dist-newstyle'))
def test_combined_index(self):
index = self.project / 'index.html'
index.write_text('<p class="caption">proarrow-0.3.0.0</p>'
'<p class="caption">proarrow:testing-0.3.0.0</p>')
check_index(index)
def test_testing_only_index_fails_even_with_main_library_links(self):
index = self.project / 'index.html'
index.write_text('<p class="caption">proarrow:testing-0.3.0.0</p>'
'<a href="Proarrow.html">Start here</a>'
'<a href="Proarrow-Core.html">Core</a>')
with self.assertRaises(ValueError):
check_index(index)
if __name__ == '__main__':
unittest.main()