nbval
nbval copied to clipboard
Many tests fail on FreeBSD
========================================================================================== FAILURES ==========================================================================================
___________________________________________________________________________________ test_collection_nbval ____________________________________________________________________________________
testdir = <Testdir local('/tmp/pytest-of-yuri/pytest-8/test_collection_nbval0')>
def test_collection_nbval(testdir):
# Write notebook to test dir
> _write_nb(sources, os.path.join(str(testdir.tmpdir), 'test_collection.ipynb'))
/disk-samsung/freebsd-ports/devel/py-nbval/work-py39/nbval-0.9.6/tests/test_collect.py:44:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/disk-samsung/freebsd-ports/devel/py-nbval/work-py39/nbval-0.9.6/tests/test_collect.py:21: in _write_nb
nb = _build_nb(sources)
/disk-samsung/freebsd-ports/devel/py-nbval/work-py39/nbval-0.9.6/tests/test_collect.py:14: in _build_nb
nb = nbformat.v4.new_notebook()
/usr/local/lib/python3.9/site-packages/nbformat/v4/nbbase.py:170: in new_notebook
validate(nb)
/usr/local/lib/python3.9/site-packages/nbformat/v4/nbbase.py:40: in validate
return validate_orig(node, ref=ref, version=nbformat)
/usr/local/lib/python3.9/site-packages/nbformat/validator.py:494: in validate
for error in iter_validate(
/usr/local/lib/python3.9/site-packages/nbformat/validator.py:612: in iter_validate
validator = get_validator(version, version_minor, relax_add_props=relax_add_props)
/usr/local/lib/python3.9/site-packages/nbformat/validator.py:65: in get_validator
schema_json = _get_schema_json(v, version=version, version_minor=version_minor)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
v = <module 'nbformat.v4' from '/usr/local/lib/python3.9/site-packages/nbformat/v4/__init__.py'>, version = 4, version_minor = 5
def _get_schema_json(v, version=None, version_minor=None):
"""
Gets the json schema from a given imported library and nbformat version.
"""
if (version, version_minor) in v.nbformat_schema:
schema_path = os.path.join(
os.path.dirname(v.__file__), v.nbformat_schema[(version, version_minor)]
)
elif version_minor > v.nbformat_minor:
# load the latest schema
schema_path = os.path.join(os.path.dirname(v.__file__), v.nbformat_schema[(None, None)])
else:
raise AttributeError("Cannot find appropriate nbformat schema file.")
> with open(schema_path) as f:
E FileNotFoundError: [Errno 2] No such file or directory: '/usr/local/lib/python3.9/site-packages/nbformat/v4/nbformat.v4.5.schema.json'
/usr/local/lib/python3.9/site-packages/nbformat/validator.py:104: FileNotFoundError
_________________________________________________________________________________ test_collection_nbval_lax __________________________________________________________________________________
testdir = <Testdir local('/tmp/pytest-of-yuri/pytest-8/test_collection_nbval_lax0')>
def test_collection_nbval_lax(testdir):
# Write notebook to test dir
> _write_nb(sources, os.path.join(str(testdir.tmpdir), 'test_collection.ipynb'))
/disk-samsung/freebsd-ports/devel/py-nbval/work-py39/nbval-0.9.6/tests/test_collect.py:60:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/disk-samsung/freebsd-ports/devel/py-nbval/work-py39/nbval-0.9.6/tests/test_collect.py:21: in _write_nb
nb = _build_nb(sources)
/disk-samsung/freebsd-ports/devel/py-nbval/work-py39/nbval-0.9.6/tests/test_collect.py:14: in _build_nb
nb = nbformat.v4.new_notebook()
/usr/local/lib/python3.9/site-packages/nbformat/v4/nbbase.py:170: in new_notebook
validate(nb)
/usr/local/lib/python3.9/site-packages/nbformat/v4/nbbase.py:40: in validate
return validate_orig(node, ref=ref, version=nbformat)
/usr/local/lib/python3.9/site-packages/nbformat/validator.py:494: in validate
for error in iter_validate(
/usr/local/lib/python3.9/site-packages/nbformat/validator.py:612: in iter_validate
validator = get_validator(version, version_minor, relax_add_props=relax_add_props)
/usr/local/lib/python3.9/site-packages/nbformat/validator.py:65: in get_validator
schema_json = _get_schema_json(v, version=version, version_minor=version_minor)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
v = <module 'nbformat.v4' from '/usr/local/lib/python3.9/site-packages/nbformat/v4/__init__.py'>, version = 4, version_minor = 5
def _get_schema_json(v, version=None, version_minor=None):
"""
Gets the json schema from a given imported library and nbformat version.
"""
if (version, version_minor) in v.nbformat_schema:
schema_path = os.path.join(
os.path.dirname(v.__file__), v.nbformat_schema[(version, version_minor)]
)
elif version_minor > v.nbformat_minor:
# load the latest schema
schema_path = os.path.join(os.path.dirname(v.__file__), v.nbformat_schema[(None, None)])
else:
raise AttributeError("Cannot find appropriate nbformat schema file.")
> with open(schema_path) as f:
E FileNotFoundError: [Errno 2] No such file or directory: '/usr/local/lib/python3.9/site-packages/nbformat/v4/nbformat.v4.5.schema.json'
/usr/local/lib/python3.9/site-packages/nbformat/validator.py:104: FileNotFoundError
_______________________________________________________________________________________ test_coverage ________________________________________________________________________________________
testdir = <Testdir local('/tmp/pytest-of-yuri/pytest-8/test_coverage0')>
def test_coverage(testdir):
testdir.makepyfile(
# Setup file to cover:
lib="""
def mysum(a, b):
return a + b
def myprod(a, b):
return a * b
""",
# Setup python file to cover mysum function
test_lib="""
import lib
def test_sum():
assert lib.mysum(1, 3) == 4
assert lib.mysum("cat", "dog") == "catdog"
assert lib.mysum(1.5, 2) == 3.5
""",
)
# Setup notebook to cover myprod function
> nb = build_nb([
"import lib",
"lib.myprod(1, 3)",
"lib.myprod(2.5, 2.5)",
"lib.myprod(2, 'cat')"
], mark_run=True)
/disk-samsung/freebsd-ports/devel/py-nbval/work-py39/nbval-0.9.6/tests/test_coverage.py:35:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/disk-samsung/freebsd-ports/devel/py-nbval/work-py39/nbval-0.9.6/tests/utils.py:8: in build_nb
nb = nbformat.v4.new_notebook()
/usr/local/lib/python3.9/site-packages/nbformat/v4/nbbase.py:170: in new_notebook
validate(nb)
/usr/local/lib/python3.9/site-packages/nbformat/v4/nbbase.py:40: in validate
return validate_orig(node, ref=ref, version=nbformat)
/usr/local/lib/python3.9/site-packages/nbformat/validator.py:494: in validate
for error in iter_validate(
/usr/local/lib/python3.9/site-packages/nbformat/validator.py:612: in iter_validate
validator = get_validator(version, version_minor, relax_add_props=relax_add_props)
/usr/local/lib/python3.9/site-packages/nbformat/validator.py:65: in get_validator
schema_json = _get_schema_json(v, version=version, version_minor=version_minor)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
v = <module 'nbformat.v4' from '/usr/local/lib/python3.9/site-packages/nbformat/v4/__init__.py'>, version = 4, version_minor = 5
def _get_schema_json(v, version=None, version_minor=None):
"""
Gets the json schema from a given imported library and nbformat version.
"""
if (version, version_minor) in v.nbformat_schema:
schema_path = os.path.join(
os.path.dirname(v.__file__), v.nbformat_schema[(version, version_minor)]
)
elif version_minor > v.nbformat_minor:
# load the latest schema
schema_path = os.path.join(os.path.dirname(v.__file__), v.nbformat_schema[(None, None)])
else:
raise AttributeError("Cannot find appropriate nbformat schema file.")
> with open(schema_path) as f:
E FileNotFoundError: [Errno 2] No such file or directory: '/usr/local/lib/python3.9/site-packages/nbformat/v4/nbformat.v4.5.schema.json'
/usr/local/lib/python3.9/site-packages/nbformat/validator.py:104: FileNotFoundError
__________________________________________________________________________________ test_conf_ignore_stderr ___________________________________________________________________________________
testdir = <Testdir local('/tmp/pytest-of-yuri/pytest-8/test_conf_ignore_stderr0')>
def test_conf_ignore_stderr(testdir):
# Setup test config
testdir.makeconftest(_ignore_stderr_code)
# Setup notebook with stream outputs
> nb = build_nb([
"import sys",
"sys.stdout.write('test\\n')",
"sys.stderr.write('error output\\n')",
"sys.stdout.write('test\\n')\nsys.stderr.write('error output\\n')",
], mark_run=True)
/disk-samsung/freebsd-ports/devel/py-nbval/work-py39/nbval-0.9.6/tests/test_ignore.py:24:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/disk-samsung/freebsd-ports/devel/py-nbval/work-py39/nbval-0.9.6/tests/utils.py:8: in build_nb
nb = nbformat.v4.new_notebook()
/usr/local/lib/python3.9/site-packages/nbformat/v4/nbbase.py:170: in new_notebook
validate(nb)
/usr/local/lib/python3.9/site-packages/nbformat/v4/nbbase.py:40: in validate
return validate_orig(node, ref=ref, version=nbformat)
/usr/local/lib/python3.9/site-packages/nbformat/validator.py:494: in validate
for error in iter_validate(
/usr/local/lib/python3.9/site-packages/nbformat/validator.py:612: in iter_validate
validator = get_validator(version, version_minor, relax_add_props=relax_add_props)
/usr/local/lib/python3.9/site-packages/nbformat/validator.py:65: in get_validator
schema_json = _get_schema_json(v, version=version, version_minor=version_minor)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
v = <module 'nbformat.v4' from '/usr/local/lib/python3.9/site-packages/nbformat/v4/__init__.py'>, version = 4, version_minor = 5
def _get_schema_json(v, version=None, version_minor=None):
"""
Gets the json schema from a given imported library and nbformat version.
"""
if (version, version_minor) in v.nbformat_schema:
schema_path = os.path.join(
os.path.dirname(v.__file__), v.nbformat_schema[(version, version_minor)]
)
elif version_minor > v.nbformat_minor:
# load the latest schema
schema_path = os.path.join(os.path.dirname(v.__file__), v.nbformat_schema[(None, None)])
else:
raise AttributeError("Cannot find appropriate nbformat schema file.")
> with open(schema_path) as f:
E FileNotFoundError: [Errno 2] No such file or directory: '/usr/local/lib/python3.9/site-packages/nbformat/v4/nbformat.v4.5.schema.json'
/usr/local/lib/python3.9/site-packages/nbformat/validator.py:104: FileNotFoundError
_______________________________________________________________________________________ test_timeouts ________________________________________________________________________________________
testdir = <Testdir local('/tmp/pytest-of-yuri/pytest-8/test_timeouts0')>
def test_timeouts(testdir):
# This test uses the testdir fixture from pytester, which is useful for
# testing pytest plugins. It writes a notebook to a temporary dir
# and then runs pytest.
# Note: The test and the notebook are defined together in order to
# emphasize the close dependence of the test on the structure and
# content of the notebook
# Setup notebook to test:
sources = [
# In [1]:
"from time import sleep",
# In [2]:
"for i in range(100000):\n" +
" sleep(1)\n" +
"myvar = 5",
# In [3]:
"a = 5",
# In [4]:
"print(myvar)",
# In [5]:
"import signal\n" +
"signal.signal(signal.SIGINT, signal.SIG_IGN)\n" +
"for i in range(1000):\n" +
" sleep(100)",
# In [6]:
"b = 5",
]
> nb = build_nb(sources)
/disk-samsung/freebsd-ports/devel/py-nbval/work-py39/nbval-0.9.6/tests/test_timeouts.py:42:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/disk-samsung/freebsd-ports/devel/py-nbval/work-py39/nbval-0.9.6/tests/utils.py:8: in build_nb
nb = nbformat.v4.new_notebook()
/usr/local/lib/python3.9/site-packages/nbformat/v4/nbbase.py:170: in new_notebook
validate(nb)
/usr/local/lib/python3.9/site-packages/nbformat/v4/nbbase.py:40: in validate
return validate_orig(node, ref=ref, version=nbformat)
/usr/local/lib/python3.9/site-packages/nbformat/validator.py:494: in validate
for error in iter_validate(
/usr/local/lib/python3.9/site-packages/nbformat/validator.py:612: in iter_validate
validator = get_validator(version, version_minor, relax_add_props=relax_add_props)
/usr/local/lib/python3.9/site-packages/nbformat/validator.py:65: in get_validator
schema_json = _get_schema_json(v, version=version, version_minor=version_minor)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
v = <module 'nbformat.v4' from '/usr/local/lib/python3.9/site-packages/nbformat/v4/__init__.py'>, version = 4, version_minor = 5
def _get_schema_json(v, version=None, version_minor=None):
"""
Gets the json schema from a given imported library and nbformat version.
"""
if (version, version_minor) in v.nbformat_schema:
schema_path = os.path.join(
os.path.dirname(v.__file__), v.nbformat_schema[(version, version_minor)]
)
elif version_minor > v.nbformat_minor:
# load the latest schema
schema_path = os.path.join(os.path.dirname(v.__file__), v.nbformat_schema[(None, None)])
else:
raise AttributeError("Cannot find appropriate nbformat schema file.")
> with open(schema_path) as f:
E FileNotFoundError: [Errno 2] No such file or directory: '/usr/local/lib/python3.9/site-packages/nbformat/v4/nbformat.v4.5.schema.json'
/usr/local/lib/python3.9/site-packages/nbformat/validator.py:104: FileNotFoundError
__________________________ test_print[/disk-samsung/freebsd-ports/devel/py-nbval/work-py39/nbval-0.9.6/tests/ipynb-test-samples/test-latex-pass-correctouput.ipynb] __________________________
filename = '/disk-samsung/freebsd-ports/devel/py-nbval/work-py39/nbval-0.9.6/tests/ipynb-test-samples/test-latex-pass-correctouput.ipynb', correctoutcome = 'pass'
@pytest.mark.parametrize("filename, correctoutcome", testdata, ids=testnames)
def test_print(filename, correctoutcome):
command = ["py.test", "--nbval", "-v", "--current-env", filename]
print("Starting parametrized test with filename={}, correctoutcome={}"
.format(filename, correctoutcome))
print("Command about to execute is '{}'".format(command))
if os.name == 'nt':
exitcode = subprocess.call(command, shell=True)
else:
exitcode = subprocess.call(command)
if correctoutcome == 'pass':
if exitcode != 0:
> raise AssertionError("Tests failed on ipynb (expected pass)")
E AssertionError: Tests failed on ipynb (expected pass)
tests/test_unit_tests_in_notebooks.py:68: AssertionError
------------------------------------------------------------------------------------ Captured stdout call ------------------------------------------------------------------------------------
Starting parametrized test with filename=/disk-samsung/freebsd-ports/devel/py-nbval/work-py39/nbval-0.9.6/tests/ipynb-test-samples/test-latex-pass-correctouput.ipynb, correctoutcome=pass
Command about to execute is '['py.test', '--nbval', '-v', '--current-env', '/disk-samsung/freebsd-ports/devel/py-nbval/work-py39/nbval-0.9.6/tests/ipynb-test-samples/test-latex-pass-correctouput.ipynb']'
------------------------------------------------------------------------------------ Captured stderr call ------------------------------------------------------------------------------------
ERROR: usage: py.test [options] [file_or_dir] [file_or_dir] [...]
py.test: error: unrecognized arguments: --nbval --current-env
inifile: None
rootdir: /disk-samsung/freebsd-ports/devel/py-nbval/work-py39/nbval-0.9.6
______________________ test_print[/disk-samsung/freebsd-ports/devel/py-nbval/work-py39/nbval-0.9.6/tests/ipynb-test-samples/test-latex-pass-failsbutignoreoutput.ipynb] ______________________
filename = '/disk-samsung/freebsd-ports/devel/py-nbval/work-py39/nbval-0.9.6/tests/ipynb-test-samples/test-latex-pass-failsbutignoreoutput.ipynb', correctoutcome = 'pass'
@pytest.mark.parametrize("filename, correctoutcome", testdata, ids=testnames)
def test_print(filename, correctoutcome):
command = ["py.test", "--nbval", "-v", "--current-env", filename]
print("Starting parametrized test with filename={}, correctoutcome={}"
.format(filename, correctoutcome))
print("Command about to execute is '{}'".format(command))
if os.name == 'nt':
exitcode = subprocess.call(command, shell=True)
else:
exitcode = subprocess.call(command)
if correctoutcome == 'pass':
if exitcode != 0:
> raise AssertionError("Tests failed on ipynb (expected pass)")
E AssertionError: Tests failed on ipynb (expected pass)
tests/test_unit_tests_in_notebooks.py:68: AssertionError
------------------------------------------------------------------------------------ Captured stdout call ------------------------------------------------------------------------------------
Starting parametrized test with filename=/disk-samsung/freebsd-ports/devel/py-nbval/work-py39/nbval-0.9.6/tests/ipynb-test-samples/test-latex-pass-failsbutignoreoutput.ipynb, correctoutcome=pass
Command about to execute is '['py.test', '--nbval', '-v', '--current-env', '/disk-samsung/freebsd-ports/devel/py-nbval/work-py39/nbval-0.9.6/tests/ipynb-test-samples/test-latex-pass-failsbutignoreoutput.ipynb']'
------------------------------------------------------------------------------------ Captured stderr call ------------------------------------------------------------------------------------
ERROR: usage: py.test [options] [file_or_dir] [file_or_dir] [...]
py.test: error: unrecognized arguments: --nbval --current-env
inifile: None
rootdir: /disk-samsung/freebsd-ports/devel/py-nbval/work-py39/nbval-0.9.6
___________________ test_print[/disk-samsung/freebsd-ports/devel/py-nbval/work-py39/nbval-0.9.6/tests/ipynb-test-samples/test-stream-pass-missing-unexecuted-output.ipynb] ___________________
filename = '/disk-samsung/freebsd-ports/devel/py-nbval/work-py39/nbval-0.9.6/tests/ipynb-test-samples/test-stream-pass-missing-unexecuted-output.ipynb', correctoutcome = 'pass'
@pytest.mark.parametrize("filename, correctoutcome", testdata, ids=testnames)
def test_print(filename, correctoutcome):
command = ["py.test", "--nbval", "-v", "--current-env", filename]
print("Starting parametrized test with filename={}, correctoutcome={}"
.format(filename, correctoutcome))
print("Command about to execute is '{}'".format(command))
if os.name == 'nt':
exitcode = subprocess.call(command, shell=True)
else:
exitcode = subprocess.call(command)
if correctoutcome == 'pass':
if exitcode != 0:
> raise AssertionError("Tests failed on ipynb (expected pass)")
E AssertionError: Tests failed on ipynb (expected pass)
tests/test_unit_tests_in_notebooks.py:68: AssertionError
------------------------------------------------------------------------------------ Captured stdout call ------------------------------------------------------------------------------------
Starting parametrized test with filename=/disk-samsung/freebsd-ports/devel/py-nbval/work-py39/nbval-0.9.6/tests/ipynb-test-samples/test-stream-pass-missing-unexecuted-output.ipynb, correctoutcome=pass
Command about to execute is '['py.test', '--nbval', '-v', '--current-env', '/disk-samsung/freebsd-ports/devel/py-nbval/work-py39/nbval-0.9.6/tests/ipynb-test-samples/test-stream-pass-missing-unexecuted-output.ipynb']'
------------------------------------------------------------------------------------ Captured stderr call ------------------------------------------------------------------------------------
ERROR: usage: py.test [options] [file_or_dir] [file_or_dir] [...]
py.test: error: unrecognized arguments: --nbval --current-env
inifile: None
rootdir: /disk-samsung/freebsd-ports/devel/py-nbval/work-py39/nbval-0.9.6
================================================================================ 8 failed, 4 passed in 4.94s =================================================================================
*** Error code 1
Version: 0.9.6 Python-3.9 FreeBSD 13.1 STABLE
The first lot of failures seem to indicate that nbformat is missing a file. That doesn't look like a problem with nbval, and I don't think there's any obvious reason that FreeBSD would be different in this regard than other Unix-y systems. So please check that you've got nbformat installed correctly - e.g. try uninstalling and reinstalling it.