def test_returns_self(self):
        temp_fs = fsopendir("temp://")
        parent = MagicMock()
        filename = temp_fs.getsyspath("temp.h5")
        _create_h5(filename)

        reader = HDFReader(parent, filename)
        self.assertEqual(reader, reader.__enter__())
    def test_returns_self(self):
        temp_fs = fsopendir('temp://')
        parent = MagicMock()
        filename = temp_fs.getsyspath('temp.h5')
        _create_h5(filename)

        reader = HDFReader(parent, filename)
        self.assertEqual(reader, reader.__enter__())
    def test_closes_reader(self, fake_close):
        temp_fs = fsopendir("temp://")
        parent = MagicMock()
        filename = temp_fs.getsyspath("temp.h5")
        _create_h5(filename)

        reader = HDFReader(parent, filename)
        reader.__exit__(None, None, None)
        fake_close.assert_called_once_with()
    def test_closes_reader(self, fake_close):
        temp_fs = fsopendir('temp://')
        parent = MagicMock()
        filename = temp_fs.getsyspath('temp.h5')
        _create_h5(filename)

        reader = HDFReader(parent, filename)
        reader.__exit__(None, None, None)
        fake_close.assert_called_once_with()
    def test_uses_cached_meta(self, fake_read):
        temp_fs = fsopendir('temp://')
        parent = MagicMock()
        filename = temp_fs.getsyspath('temp.h5')
        _create_h5(filename)

        reader = HDFReader(parent, filename)
        reader._meta = {}
        reader.meta
        fake_read.assert_not_called()
    def test_uses_cached_meta(self, fake_read):
        temp_fs = fsopendir("temp://")
        parent = MagicMock()
        filename = temp_fs.getsyspath("temp.h5")
        _create_h5(filename)

        reader = HDFReader(parent, filename)
        reader._meta = {}
        reader.meta
        fake_read.assert_not_called()
    def test_reads_meta_schema(self):
        temp_fs = fsopendir('temp://')
        filename = temp_fs.getsyspath('temp.h5')

        # use minimal descriptor to make the test simplier.
        descriptor = {
            'pos': Int64Col(),
            'name': StringCol(itemsize=255),
            'type': StringCol(itemsize=255)
        }
        rows = [[('pos', float(i)), ('name', str(i)), ('type', str(i))]
                for i in range(2)]
        self._write_test_meta(temp_fs, 'schema', descriptor, rows)

        with open_file(filename, mode='r') as h5_file:
            ret = HDFReader._read_meta(h5_file)
            self.assertIn('schema', ret)
            self.assertEqual(len(ret['schema']),
                             3)  # One for template, other for columns.
            self.assertEqual(ret['schema'][0], MPRowsFile.SCHEMA_TEMPLATE)
            self.assertEqual(len(ret['schema'][1]),
                             len(MPRowsFile.SCHEMA_TEMPLATE))
            self.assertEqual(len(ret['schema'][0]),
                             len(MPRowsFile.SCHEMA_TEMPLATE))

            pos_index = MPRowsFile.SCHEMA_TEMPLATE.index('pos')
            name_index = MPRowsFile.SCHEMA_TEMPLATE.index('name')
            self.assertEqual(ret['schema'][1][pos_index], 0)
            self.assertEqual(ret['schema'][2][pos_index], 1.0)

            self.assertEqual(ret['schema'][1][name_index], '0')
            self.assertEqual(ret['schema'][2][name_index], '1')
 def test_raises_ValueError_if_file_like_given(self):
     temp_fs = fsopendir('temp://')
     parent = MagicMock()
     try:
         HDFReader(parent, temp_fs.open('temp.h5', 'w'))
         raise AssertionError('ValueError was not raised.')
     except ValueError:
         pass
    def test_reads_meta_children(self, fake_child):
        fake_child.return_value = {}
        temp_fs = fsopendir("temp://")
        filename = temp_fs.getsyspath("temp.h5")
        _create_h5(filename)

        with open_file(filename, mode="r") as h5_file:
            HDFReader._read_meta(h5_file)

            # _read_meta_child was called properly
            self.assertEqual(len(fake_child.mock_calls), 7)
            self.assertIn(call(h5_file, "about"), fake_child.mock_calls)
            self.assertIn(call(h5_file, "excel"), fake_child.mock_calls)
            self.assertIn(call(h5_file, "row_spec"), fake_child.mock_calls)
            self.assertIn(call(h5_file, "source"), fake_child.mock_calls)
            self.assertIn(call(h5_file, "comments"), fake_child.mock_calls)
            self.assertIn(call(h5_file, "geo"), fake_child.mock_calls)
            self.assertIn(call(h5_file, "schema"), fake_child.mock_calls)
    def test_reads_meta_children(self, fake_child):
        fake_child.return_value = {}
        temp_fs = fsopendir('temp://')
        filename = temp_fs.getsyspath('temp.h5')
        _create_h5(filename)

        with open_file(filename, mode='r') as h5_file:
            HDFReader._read_meta(h5_file)

            # _read_meta_child was called properly
            self.assertEqual(len(fake_child.mock_calls), 7)
            self.assertIn(call(h5_file, 'about'), fake_child.mock_calls)
            self.assertIn(call(h5_file, 'excel'), fake_child.mock_calls)
            self.assertIn(call(h5_file, 'row_spec'), fake_child.mock_calls)
            self.assertIn(call(h5_file, 'source'), fake_child.mock_calls)
            self.assertIn(call(h5_file, 'comments'), fake_child.mock_calls)
            self.assertIn(call(h5_file, 'geo'), fake_child.mock_calls)
            self.assertIn(call(h5_file, 'schema'), fake_child.mock_calls)
    def test_reads_meta_if_cache_is_empty(self, fake_read):
        temp_fs = fsopendir('temp://')
        parent = MagicMock()
        filename = temp_fs.getsyspath('temp.h5')
        _create_h5(filename)

        reader = HDFReader(parent, filename)
        reader.meta
        self.assertEqual(len(fake_read.mock_calls), 1)
    def test_returns_default_template(self, fake_child):
        fake_child.return_value = {}
        temp_fs = fsopendir("temp://")
        filename = temp_fs.getsyspath("temp.h5")
        _create_h5(filename)

        with open_file(filename, mode="r") as h5_file:
            ret = HDFReader._read_meta(h5_file)
            expected_keys = ["about", "excel", "row_spec", "source", "comments", "geo", "schema"]
            self.assertEqual(sorted(expected_keys), sorted(ret.keys()))
    def test_returns_default_template(self, fake_child):
        fake_child.return_value = {}
        temp_fs = fsopendir('temp://')
        filename = temp_fs.getsyspath('temp.h5')
        _create_h5(filename)

        with open_file(filename, mode='r') as h5_file:
            ret = HDFReader._read_meta(h5_file)
            expected_keys = [
                'about', 'excel', 'row_spec', 'source', 'comments', 'geo',
                'schema'
            ]
            self.assertEqual(sorted(expected_keys), sorted(ret.keys()))
    def test_converts_hist_and_uvalues_json_to_list(self):
        temp_fs = fsopendir("temp://")

        # save meta.schema minimal table to the file.
        descriptor = {  # this is not valid descriptor, but I do not need it to be valid here.
            "hist": StringCol(itemsize=255),
            "uvalues": StringCol(itemsize=255),
        }
        self._write_test_meta(
            temp_fs, "schema", descriptor, [[("hist", json.dumps([0, 1])), ("uvalues", json.dumps(["a", "b"]))]]
        )

        # now read it from file.
        with open_file(temp_fs.getsyspath("temp.h5"), "r") as h5:
            ret = HDFReader._read_meta_child(h5, "schema")
            self.assertEqual(ret[0]["hist"], [0, 1])
            self.assertEqual(ret[0]["uvalues"], ["a", "b"])
    def test_reads_lines_to_dict(self):
        temp_fs = fsopendir("temp://")

        # save meta.about to the file.
        descriptor = {"load_time": Float64Col(), "create_time": Float64Col()}
        self._write_test_meta(temp_fs, "about", descriptor, [[("load_time", 1.0), ("create_time", 1.1)]])

        # now read it from file.
        with open_file(temp_fs.getsyspath("temp.h5"), "r") as h5:
            ret = HDFReader._read_meta_child(h5, "about")
            self.assertIsInstance(ret, list)
            first = ret[0]
            self.assertIn("load_time", first)
            self.assertEqual(first["load_time"], 1.0)

            self.assertIn("create_time", first)
            self.assertEqual(first["create_time"], 1.1)
    def test_converts_comment_rows_and_header_rows_json_to_list(self):
        temp_fs = fsopendir('temp://')

        # save meta.row_spec to the file.
        descriptor = {  # this is not valid descriptor, but I do not need it to be valid here.
            'header_rows': StringCol(itemsize=255),
            'comment_rows': StringCol(itemsize=255),
        }
        self._write_test_meta(temp_fs, 'row_spec', descriptor,
                              [[('comment_rows', json.dumps([0, 1])),
                                ('header_rows', json.dumps([2, 3]))]])

        # now read it from file.
        with open_file(temp_fs.getsyspath('temp.h5'), 'r') as h5:
            ret = HDFReader._read_meta_child(h5, 'row_spec')
            self.assertEqual(ret[0]['comment_rows'], [0, 1])
            self.assertEqual(ret[0]['header_rows'], [2, 3])
    def test_converts_hist_and_uvalues_json_to_list(self):
        temp_fs = fsopendir('temp://')

        # save meta.schema minimal table to the file.
        descriptor = {  # this is not valid descriptor, but I do not need it to be valid here.
            'hist': StringCol(itemsize=255),
            'uvalues': StringCol(itemsize=255),
        }
        self._write_test_meta(temp_fs, 'schema', descriptor,
                              [[('hist', json.dumps([0, 1])),
                                ('uvalues', json.dumps(['a', 'b']))]])

        # now read it from file.
        with open_file(temp_fs.getsyspath('temp.h5'), 'r') as h5:
            ret = HDFReader._read_meta_child(h5, 'schema')
            self.assertEqual(ret[0]['hist'], [0, 1])
            self.assertEqual(ret[0]['uvalues'], ['a', 'b'])
    def test_reads_lines_to_dict(self):
        temp_fs = fsopendir('temp://')

        # save meta.about to the file.
        descriptor = {'load_time': Float64Col(), 'create_time': Float64Col()}
        self._write_test_meta(temp_fs, 'about', descriptor,
                              [[('load_time', 1.0), ('create_time', 1.1)]])

        # now read it from file.
        with open_file(temp_fs.getsyspath('temp.h5'), 'r') as h5:
            ret = HDFReader._read_meta_child(h5, 'about')
            self.assertIsInstance(ret, list)
            first = ret[0]
            self.assertIn('load_time', first)
            self.assertEqual(first['load_time'], 1.0)

            self.assertIn('create_time', first)
            self.assertEqual(first['create_time'], 1.1)
    def test_contains_all_rows(self, fake_read):
        fake_read.return_value = {}
        temp_fs = fsopendir('temp://')
        parent = MagicMock()

        # save meta.about to the file.
        filename = temp_fs.getsyspath('temp.h5')
        _create_h5(filename)

        # now read it from file.
        reader = HDFReader(parent, filename)
        raw_iter = reader.raw
        first = next(raw_iter)
        self.assertEqual(first, [0.0, 0.0, 0.0])
        self.assertTrue(reader._in_iteration)
        rows = list(raw_iter)
        self.assertEqual(len(rows), 4)
        self.assertFalse(reader._in_iteration)
    def test_converts_comment_rows_and_header_rows_json_to_list(self):
        temp_fs = fsopendir("temp://")

        # save meta.row_spec to the file.
        descriptor = {  # this is not valid descriptor, but I do not need it to be valid here.
            "header_rows": StringCol(itemsize=255),
            "comment_rows": StringCol(itemsize=255),
        }
        self._write_test_meta(
            temp_fs,
            "row_spec",
            descriptor,
            [[("comment_rows", json.dumps([0, 1])), ("header_rows", json.dumps([2, 3]))]],
        )

        # now read it from file.
        with open_file(temp_fs.getsyspath("temp.h5"), "r") as h5:
            ret = HDFReader._read_meta_child(h5, "row_spec")
            self.assertEqual(ret[0]["comment_rows"], [0, 1])
            self.assertEqual(ret[0]["header_rows"], [2, 3])
    def test_generates_rows_as_RowProxy_instances(self):
        temp_fs = fsopendir('temp://')
        parent = MagicMock()
        filename = temp_fs.getsyspath('temp.h5')
        _create_h5(filename)

        reader = HDFReader(parent, filename)
        with patch.object(HDFReader, 'headers',
                          ['field1', 'field2', 'field3']):
            rows_iter = iter(reader)
            first = next(rows_iter)
            self.assertIsInstance(first, RowProxy)
            self.assertEqual(first.field1, 0.0)
            self.assertEqual(first.field2, 0.0)
            self.assertEqual(first.field3, 0.0)
            self.assertTrue(reader._in_iteration)

            rows = []
            for row in rows_iter:
                self.assertIsInstance(row, RowProxy)
                rows.append(row)
            self.assertEqual(len(rows), 4)
            self.assertFalse(reader._in_iteration)
    def test_reads_meta_schema(self):
        temp_fs = fsopendir("temp://")
        filename = temp_fs.getsyspath("temp.h5")

        # use minimal descriptor to make the test simplier.
        descriptor = {"pos": Int64Col(), "name": StringCol(itemsize=255), "type": StringCol(itemsize=255)}
        rows = [[("pos", float(i)), ("name", str(i)), ("type", str(i))] for i in range(2)]
        self._write_test_meta(temp_fs, "schema", descriptor, rows)

        with open_file(filename, mode="r") as h5_file:
            ret = HDFReader._read_meta(h5_file)
            self.assertIn("schema", ret)
            self.assertEqual(len(ret["schema"]), 3)  # One for template, other for columns.
            self.assertEqual(ret["schema"][0], MPRowsFile.SCHEMA_TEMPLATE)
            self.assertEqual(len(ret["schema"][1]), len(MPRowsFile.SCHEMA_TEMPLATE))
            self.assertEqual(len(ret["schema"][0]), len(MPRowsFile.SCHEMA_TEMPLATE))

            pos_index = MPRowsFile.SCHEMA_TEMPLATE.index("pos")
            name_index = MPRowsFile.SCHEMA_TEMPLATE.index("name")
            self.assertEqual(ret["schema"][1][pos_index], 0)
            self.assertEqual(ret["schema"][2][pos_index], 1.0)

            self.assertEqual(ret["schema"][1][name_index], "0")
            self.assertEqual(ret["schema"][2][name_index], "1")