Esempio n. 1
0
def test_external_reference_invalid_fragment(tmpdir):
    exttree = {
        'list_of_stuff': [
            'foobar',
            42,
            np.array([7, 8, 9], np.float)
            ]
        }
    external_path = os.path.join(str(tmpdir), 'external.asdf')
    with asdf.AsdfFile(exttree) as ff:
        ff.write_to(external_path)

    tree = {
        'foo': {
            '$ref': 'external.asdf#/list_of_stuff/a'
            }
        }

    with asdf.AsdfFile(tree, uri=pathname2url(
            os.path.join(str(tmpdir), 'main.asdf'))) as ff:
        with pytest.raises(ValueError):
            ff.resolve_references()

    tree = {
        'foo': {
            '$ref': 'external.asdf#/list_of_stuff/3'
            }
        }

    with asdf.AsdfFile(tree, uri=pathname2url(
            os.path.join(str(tmpdir), 'main.asdf'))) as ff:
        with pytest.raises(ValueError):
            ff.resolve_references()
Esempio n. 2
0
 def get_read_fd():
     f = generic_io.get_file(path, mode='r')
     assert isinstance(f, generic_io.RealFile)
     assert f._uri == urljoin('file:', pathname2url(path))
     # This is to check for a "feature" in Python 3.x that reading zero
     # bytes from a socket causes it to stop.  We have code in generic_io.py
     # to workaround it.
     f.read(0)
     return f
Esempio n. 3
0
 def get_read_fd():
     f = generic_io.get_file(path, mode='r')
     assert isinstance(f, generic_io.RealFile)
     assert f._uri == urljoin('file:', pathname2url(path))
     # This is to check for a "feature" in Python 3.x that reading zero
     # bytes from a socket causes it to stop.  We have code in generic_io.py
     # to workaround it.
     f.read(0)
     return f
Esempio n. 4
0
 def __init__(self, fd, mode, close=True, uri=None):
     super(RealFile, self).__init__(fd, mode, close=close, uri=uri)
     stat = os.fstat(fd.fileno())
     if sys.platform.startswith('win'):
         # There appears to be reliable way to get block size on Windows,
         # so just choose a reasonable default
         self._blksize = io.DEFAULT_BUFFER_SIZE
     else:
         self._blksize = stat.st_blksize
     self._size = stat.st_size
     if (uri is None and
         isinstance(fd.name, six.string_types) and
         os.path.exists(fd.name)):
         self._uri = urlparse.urljoin(
             'file:', pathname2url(os.path.abspath(fd.name)))
Esempio n. 5
0
def test_external_reference_invalid(tmpdir):
    tree = {
        'foo': {
            '$ref': 'fail.asdf'
            }
        }

    ff = asdf.AsdfFile(tree)
    with pytest.raises(ValueError):
        ff.resolve_references()

    ff = asdf.AsdfFile(tree, uri="http://nowhere.com/")
    with pytest.raises(IOError):
        ff.resolve_references()

    ff = asdf.AsdfFile(tree, uri=pathname2url(
        os.path.join(str(tmpdir), 'main.asdf')))
    with pytest.raises(IOError):
        ff.resolve_references()
Esempio n. 6
0
def test_internal_reference():
    tree = {
        'foo': 2,
        'bar': {'$ref': '#'}
    }

    ff = asdf.AsdfFile(tree)
    ff.find_references()
    assert isinstance(ff.tree['bar'], reference.Reference)
    ff.resolve_references()
    assert ff.tree['bar']['foo'] == 2

    tree = {
        'foo': 2
    }
    ff = asdf.AsdfFile(tree, uri=pathname2url(os.path.abspath("test.asdf")))
    ff.tree['bar'] = ff.make_reference([])
    buff = io.BytesIO()
    ff.write_to(buff)
    buff.seek(0)
    content = asdf.AsdfFile().read(buff, _get_yaml_content=True)
    assert b"{$ref: ''}" in content
Esempio n. 7
0
 def get_write_fd():
     f = generic_io.get_file(path, mode='w')
     assert isinstance(f, generic_io.RealFile)
     assert f._uri == urljoin('file:', pathname2url(path))
     return f
Esempio n. 8
0
 def get_read_fd():
     f = generic_io.get_file(io.open(path, 'r+b'), mode='rw')
     assert isinstance(f, generic_io.RealFile)
     assert f._uri == urljoin('file:', pathname2url(path))
     return f
Esempio n. 9
0
 def get_write_fd():
     f = generic_io.get_file(path, mode='w')
     assert isinstance(f, generic_io.RealFile)
     assert f._uri == urljoin('file:', pathname2url(path))
     return f
Esempio n. 10
0
 def get_read_fd():
     f = generic_io.get_file(io.open(path, 'r+b'), mode='rw')
     assert isinstance(f, generic_io.RealFile)
     assert f._uri == urljoin('file:', pathname2url(path))
     return f
Esempio n. 11
0
 def url_mapping(self):
     return [('http://nowhere.org/schemas/custom/1.0.0/',
              urljoin('file:', pathname2url(os.path.join(
                  TEST_DATA_PATH))) + '/{url_suffix}.yaml')]
Esempio n. 12
0
 def url_mapping(self):
     return [
         ('http://nowhere.org/schemas/custom/1.0.0/',
          urljoin('file:', pathname2url(os.path.join(TEST_DATA_PATH))) +
          '/{url_suffix}.yaml')
     ]
Esempio n. 13
0
def test_external_reference(tmpdir):
    exttree = {
        'cool_stuff': {
            'a': np.array([0, 1, 2], np.float),
            'b': np.array([3, 4, 5], np.float)
            },
        'list_of_stuff': [
            'foobar',
            42,
            np.array([7, 8, 9], np.float)
            ]
        }
    external_path = os.path.join(str(tmpdir), 'external.asdf')
    with asdf.AsdfFile(exttree) as ext:
        ext.write_to(external_path)
    external_path = os.path.join(str(tmpdir), 'external2.asdf')
    with asdf.AsdfFile(exttree) as ff:
        ff.write_to(external_path)

    tree = {
        # The special name "data" here must be an array.  This is
        # included so that such validation can be ignored when we just
        # have a "$ref".
        'data': {
            '$ref': 'external.asdf#/cool_stuff/a'
            },
        'science_data': {
            '$ref': 'external.asdf#/cool_stuff/a'
            },
        'science_data2': {
            '$ref': 'external2.asdf#/cool_stuff/a'
            },
        'foobar': {
            '$ref': 'external.asdf#/list_of_stuff/0',
            },
        'answer': {
            '$ref': 'external.asdf#/list_of_stuff/1'
            },
        'array': {
            '$ref': 'external.asdf#/list_of_stuff/2',
            },
        'whole_thing': {
            '$ref': 'external.asdf#'
            },
        'myself': {
            '$ref': '#',
            },
        'internal': {
            '$ref': '#science_data'
            }
        }

    def do_asserts(ff):
        assert 'unloaded' in repr(ff.tree['science_data'])
        assert 'unloaded' in str(ff.tree['science_data'])
        assert len(ff._external_asdf_by_uri) == 0

        assert_array_equal(ff.tree['science_data'], exttree['cool_stuff']['a'])
        assert len(ff._external_asdf_by_uri) == 1
        with pytest.raises((ValueError, RuntimeError)):
            # Assignment destination is readonly
            ff.tree['science_data'][0] = 42

        assert_array_equal(ff.tree['science_data2'], exttree['cool_stuff']['a'])
        assert len(ff._external_asdf_by_uri) == 2

        assert ff.tree['foobar']() == 'foobar'
        assert ff.tree['answer']() == 42
        assert_array_equal(ff.tree['array'], exttree['list_of_stuff'][2])

        assert_tree_match(ff.tree['whole_thing'](), exttree)

        assert_array_equal(
            ff.tree['whole_thing']['cool_stuff']['a'],
            exttree['cool_stuff']['a'])

        assert_array_equal(
            ff.tree['myself']['science_data'],
            exttree['cool_stuff']['a'])
        # Make sure that referencing oneself doesn't make another call
        # to disk.
        assert len(ff._external_asdf_by_uri) == 2

        assert_array_equal(ff.tree['internal'], exttree['cool_stuff']['a'])

    with asdf.AsdfFile(tree, uri=pathname2url(
            os.path.join(str(tmpdir), 'main.asdf'))) as ff:
        do_asserts(ff)

        internal_path = os.path.join(str(tmpdir), 'main.asdf')
        ff.write_to(internal_path)

    with asdf.AsdfFile.read(internal_path) as ff:
        do_asserts(ff)

    with asdf.AsdfFile.read(internal_path) as ff:
        assert len(ff._external_asdf_by_uri) == 0
        ff.resolve_references()
        assert len(ff._external_asdf_by_uri) == 2

        assert isinstance(ff.tree['data'], ndarray.NDArrayType)
        assert isinstance(ff.tree['science_data'], ndarray.NDArrayType)

        assert_array_equal(ff.tree['science_data'], exttree['cool_stuff']['a'])
        assert_array_equal(ff.tree['science_data2'], exttree['cool_stuff']['a'])

        assert ff.tree['foobar'] == 'foobar'
        assert ff.tree['answer'] == 42
        assert_array_equal(ff.tree['array'], exttree['list_of_stuff'][2])

        assert_tree_match(ff.tree['whole_thing'], exttree)

        assert_array_equal(
            ff.tree['whole_thing']['cool_stuff']['a'],
            exttree['cool_stuff']['a'])

        assert_array_equal(
            ff.tree['myself']['science_data'],
            exttree['cool_stuff']['a'])

        assert_array_equal(ff.tree['internal'], exttree['cool_stuff']['a'])
Esempio n. 14
0
                        return None
                    return _map_func

                func = _make_map_func(mapping)
            else:
                raise ValueError("Invalid mapping '{0}'".format(mapping))

            normalized.append(func)

        return tuple(normalized)

    def __call__(self, input):
        for mapper in self._mapping:
            output = mapper(input)
            if output is not None:
                return output
        return input

    def __hash__(self):
        return hash(self._mapping)


DEFAULT_URL_MAPPING = [
    (constants.STSCI_SCHEMA_URI_BASE,
     urljoin('file:', pathname2url(os.path.join(
         SCHEMA_PATH, 'stsci.edu'))) + '/{url_suffix}.yaml')
]


default_url_mapping = Resolver(DEFAULT_URL_MAPPING, 'url')
Esempio n. 15
0
                        return None

                    return _map_func

                func = _make_map_func(mapping)
            else:
                raise ValueError("Invalid mapping '{0}'".format(mapping))

            normalized.append(func)

        return tuple(normalized)

    def __call__(self, input):
        for mapper in self._mapping:
            output = mapper(input)
            if output is not None:
                return output
        return input

    def __hash__(self):
        return hash(self._mapping)


DEFAULT_URL_MAPPING = [
    (constants.STSCI_SCHEMA_URI_BASE,
     urljoin('file:', pathname2url(os.path.join(SCHEMA_PATH, 'stsci.edu'))) +
     '/{url_suffix}.yaml')
]

default_url_mapping = Resolver(DEFAULT_URL_MAPPING, 'url')