python-dwca-reader 0.16.4__py3-none-any.whl → 0.17.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- dwca/descriptors.py +239 -3
- dwca/files.py +381 -55
- dwca/read.py +65 -17
- dwca/rows.py +105 -78
- dwca/star_record.py +1 -2
- dwca/test/archive_builder.py +188 -0
- dwca/test/test_characterization.py +617 -0
- dwca/test/test_datafile.py +286 -3
- dwca/test/test_descriptors.py +331 -0
- dwca/test/test_dwcareader.py +74 -12
- dwca/test/test_rows.py +173 -0
- dwca/version.py +1 -1
- {python_dwca_reader-0.16.4.dist-info → python_dwca_reader-0.17.0.dist-info}/METADATA +4 -2
- python_dwca_reader-0.17.0.dist-info/RECORD +30 -0
- python_dwca_reader-0.16.4.dist-info/RECORD +0 -28
- {python_dwca_reader-0.16.4.dist-info → python_dwca_reader-0.17.0.dist-info}/AUTHORS +0 -0
- {python_dwca_reader-0.16.4.dist-info → python_dwca_reader-0.17.0.dist-info}/LICENSE.txt +0 -0
- {python_dwca_reader-0.16.4.dist-info → python_dwca_reader-0.17.0.dist-info}/WHEEL +0 -0
- {python_dwca_reader-0.16.4.dist-info → python_dwca_reader-0.17.0.dist-info}/top_level.txt +0 -0
dwca/test/test_dwcareader.py
CHANGED
|
@@ -3,7 +3,6 @@ import tempfile
|
|
|
3
3
|
import unittest
|
|
4
4
|
import xml.etree.ElementTree as ET
|
|
5
5
|
|
|
6
|
-
import pandas as pd
|
|
7
6
|
from unittest.mock import patch
|
|
8
7
|
|
|
9
8
|
from dwca.darwincore.utils import qualname as qn
|
|
@@ -12,9 +11,18 @@ from dwca.exceptions import RowNotFound, InvalidArchive, NotADataFile
|
|
|
12
11
|
from dwca.files import CSVDataFile
|
|
13
12
|
from dwca.read import DwCAReader
|
|
14
13
|
from dwca.rows import CoreRow, ExtensionRow
|
|
14
|
+
from dwca.vendor import _has_pandas
|
|
15
15
|
from .helpers import sample_data_path
|
|
16
16
|
import pytest
|
|
17
17
|
|
|
18
|
+
# Pandas is an optional dependency of the library, so the test suite has to run without
|
|
19
|
+
# it too. The tests that genuinely exercise pd_read() are skipped when it is absent; the
|
|
20
|
+
# one that checks pd_read's behavior WITHOUT pandas deliberately still runs.
|
|
21
|
+
if _has_pandas:
|
|
22
|
+
import pandas as pd
|
|
23
|
+
|
|
24
|
+
requires_pandas = unittest.skipUnless(_has_pandas, "pandas is not installed")
|
|
25
|
+
|
|
18
26
|
|
|
19
27
|
class TestPandasIntegration(unittest.TestCase):
|
|
20
28
|
"""Tests of Pandas integration features."""
|
|
@@ -31,6 +39,7 @@ class TestPandasIntegration(unittest.TestCase):
|
|
|
31
39
|
with pytest.raises(ImportError):
|
|
32
40
|
dwca.pd_read("occurrence.txt")
|
|
33
41
|
|
|
42
|
+
@requires_pandas
|
|
34
43
|
def test_pd_read_simple_case(self):
|
|
35
44
|
with DwCAReader(sample_data_path("dwca-simple-test-archive.zip")) as dwca:
|
|
36
45
|
df = dwca.pd_read("occurrence.txt")
|
|
@@ -56,6 +65,7 @@ class TestPandasIntegration(unittest.TestCase):
|
|
|
56
65
|
"betta splendens",
|
|
57
66
|
]
|
|
58
67
|
|
|
68
|
+
@requires_pandas
|
|
59
69
|
def test_pd_read_chunked_default_value(self):
|
|
60
70
|
"""Pandas chuncksize should not be used with default values.
|
|
61
71
|
|
|
@@ -66,6 +76,7 @@ class TestPandasIntegration(unittest.TestCase):
|
|
|
66
76
|
for chunk in dwca.pd_read("occurrence.txt", chunksize=1):
|
|
67
77
|
pass
|
|
68
78
|
|
|
79
|
+
@requires_pandas
|
|
69
80
|
def test_pd_read_chunked(self):
|
|
70
81
|
"""If no default values are available in the archive, chunksize should work.
|
|
71
82
|
|
|
@@ -75,6 +86,7 @@ class TestPandasIntegration(unittest.TestCase):
|
|
|
75
86
|
for chunk in dwca.pd_read("occurrence.txt", chunksize=2):
|
|
76
87
|
assert isinstance(chunk, pd.DataFrame)
|
|
77
88
|
|
|
89
|
+
@requires_pandas
|
|
78
90
|
def test_pd_read_no_data_files(self):
|
|
79
91
|
with DwCAReader(sample_data_path("dwca-simple-test-archive.zip")) as dwca:
|
|
80
92
|
with pytest.raises(NotADataFile):
|
|
@@ -83,6 +95,7 @@ class TestPandasIntegration(unittest.TestCase):
|
|
|
83
95
|
with pytest.raises(NotADataFile):
|
|
84
96
|
dwca.pd_read("eml.xml")
|
|
85
97
|
|
|
98
|
+
@requires_pandas
|
|
86
99
|
def test_pd_read_extensions(self):
|
|
87
100
|
with DwCAReader(sample_data_path("dwca-2extensions.zip")) as dwca:
|
|
88
101
|
desc_df = dwca.pd_read("description.txt")
|
|
@@ -95,6 +108,7 @@ class TestPandasIntegration(unittest.TestCase):
|
|
|
95
108
|
assert vern_df.shape == (4, 4)
|
|
96
109
|
assert vern_df["countryCode"].values.tolist() == ["US", "ZA", "FI", "ZA"]
|
|
97
110
|
|
|
111
|
+
@requires_pandas
|
|
98
112
|
def test_pd_read_quotedir(self):
|
|
99
113
|
with DwCAReader(sample_data_path("dwca-csv-quote-dir")) as dwca:
|
|
100
114
|
df = dwca.pd_read("occurrence.txt")
|
|
@@ -102,6 +116,7 @@ class TestPandasIntegration(unittest.TestCase):
|
|
|
102
116
|
assert df.shape == (2, 5)
|
|
103
117
|
assert df["basisOfRecord"].values.tolist()[0] == "Observation, something"
|
|
104
118
|
|
|
119
|
+
@requires_pandas
|
|
105
120
|
def test_pd_read_default_values(self):
|
|
106
121
|
with DwCAReader(sample_data_path("dwca-test-default.zip")) as dwca:
|
|
107
122
|
df = dwca.pd_read("occurrence.txt")
|
|
@@ -110,6 +125,7 @@ class TestPandasIntegration(unittest.TestCase):
|
|
|
110
125
|
for country in df["country"].values.tolist():
|
|
111
126
|
assert country == "Belgium"
|
|
112
127
|
|
|
128
|
+
@requires_pandas
|
|
113
129
|
def test_pd_read_utf8_eol_ignored(self):
|
|
114
130
|
"""Ensure we don't split lines based on the x85 utf8 EOL char.
|
|
115
131
|
|
|
@@ -121,13 +137,20 @@ class TestPandasIntegration(unittest.TestCase):
|
|
|
121
137
|
# (61 - and probably an IndexError - if errors)
|
|
122
138
|
assert 64 == df.shape[1]
|
|
123
139
|
|
|
140
|
+
@requires_pandas
|
|
124
141
|
def test_pd_read_simple_csv(self):
|
|
125
142
|
with DwCAReader(sample_data_path("dwca-simple-csv.zip")) as dwca:
|
|
126
143
|
df = dwca.pd_read("0008333-160118175350007.csv")
|
|
127
|
-
# Ensure we get the correct number of rows
|
|
144
|
+
# Ensure we get the correct number of rows and columns
|
|
128
145
|
assert 3 == df.shape[0]
|
|
129
|
-
|
|
146
|
+
assert 42 == df.shape[1]
|
|
147
|
+
# This archive has no metafile, so the first column (gbifid) has no id_index to
|
|
148
|
+
# rely on. It must come from the headers list as a regular column, not be silently
|
|
149
|
+
# promoted to the DataFrame index by pandas because of a missing header name.
|
|
150
|
+
assert "gbifid" in df.columns
|
|
151
|
+
assert df.index.name is None
|
|
130
152
|
|
|
153
|
+
# Ensure we can access arbitrary data
|
|
131
154
|
assert df["decimallatitude"].values.tolist()[1] == -31.98333
|
|
132
155
|
|
|
133
156
|
|
|
@@ -257,11 +280,15 @@ class TestDwCAReader(unittest.TestCase):
|
|
|
257
280
|
pass
|
|
258
281
|
|
|
259
282
|
def test_custom_tempdir(self):
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
283
|
+
previous_tempdir = tempfile.tempdir
|
|
284
|
+
try:
|
|
285
|
+
tmp_dir = os.path.abspath(".tmp")
|
|
286
|
+
with DwCAReader(
|
|
287
|
+
sample_data_path("dwca-simple-test-archive.zip"), tmp_dir=tmp_dir
|
|
288
|
+
) as dwca:
|
|
289
|
+
assert dwca.absolute_temporary_path("occurrence.txt").startswith(tmp_dir)
|
|
290
|
+
finally:
|
|
291
|
+
tempfile.tempdir = previous_tempdir
|
|
265
292
|
|
|
266
293
|
def test_use_extensions(self):
|
|
267
294
|
"""Ensure the .use_extensions attribute of DwCAReader works as intended."""
|
|
@@ -533,10 +560,9 @@ class TestDwCAReader(unittest.TestCase):
|
|
|
533
560
|
assert "Row id:" in l_repr
|
|
534
561
|
assert "Reference extension rows: No" in l_repr
|
|
535
562
|
assert "Reference source metadata: No" in l_repr
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
)
|
|
563
|
+
# Assert the value reaches the representation, not how Python formats a dict.
|
|
564
|
+
assert "tetraodon fluviatilis" in l_repr
|
|
565
|
+
assert "tetraodon fluviatilis" == l.data[qn("scientificName")]
|
|
540
566
|
|
|
541
567
|
with DwCAReader(sample_data_path("dwca-star-test-archive.zip")) as star_dwca:
|
|
542
568
|
l = star_dwca.rows[0]
|
|
@@ -1068,6 +1094,42 @@ class TestDwCAReader(unittest.TestCase):
|
|
|
1068
1094
|
# The next line will throw an exception if metadata.xml can't be parsed
|
|
1069
1095
|
DwCAReader(sample_data_path("gbif-results-whitespace-in-xml.zip"))
|
|
1070
1096
|
|
|
1097
|
+
def test_nested_iteration_is_independent(self):
|
|
1098
|
+
with DwCAReader(sample_data_path("dwca-ids.zip")) as dwca:
|
|
1099
|
+
pairs = [(outer.id, inner.id) for outer in dwca for inner in dwca]
|
|
1100
|
+
|
|
1101
|
+
assert 16 == len(pairs)
|
|
1102
|
+
|
|
1103
|
+
def test_lookup_inside_a_loop_terminates(self):
|
|
1104
|
+
with DwCAReader(sample_data_path("dwca-ids.zip")) as dwca:
|
|
1105
|
+
seen = []
|
|
1106
|
+
for row in dwca:
|
|
1107
|
+
seen.append(row.id)
|
|
1108
|
+
dwca.get_corerow_by_id("1")
|
|
1109
|
+
|
|
1110
|
+
assert ["4", "1", "3", "2"] == seen
|
|
1111
|
+
|
|
1112
|
+
def test_next_still_works(self):
|
|
1113
|
+
dwca = DwCAReader(sample_data_path("dwca-ids.zip"))
|
|
1114
|
+
try:
|
|
1115
|
+
assert "4" == dwca.next().id
|
|
1116
|
+
assert "1" == dwca.next().id
|
|
1117
|
+
finally:
|
|
1118
|
+
dwca.close()
|
|
1119
|
+
|
|
1120
|
+
def test_iter_terms_on_the_reader(self):
|
|
1121
|
+
with DwCAReader(sample_data_path("dwca-simple-test-archive.zip")) as dwca:
|
|
1122
|
+
values = list(
|
|
1123
|
+
dwca.iter_terms(
|
|
1124
|
+
[
|
|
1125
|
+
"http://rs.tdwg.org/dwc/terms/locality",
|
|
1126
|
+
"http://rs.tdwg.org/dwc/terms/family",
|
|
1127
|
+
]
|
|
1128
|
+
)
|
|
1129
|
+
)
|
|
1130
|
+
|
|
1131
|
+
assert [("Borneo", "Tetraodontidae"), ("Mumbai", "Osphronemidae")] == values
|
|
1132
|
+
|
|
1071
1133
|
|
|
1072
1134
|
if __name__ == "__main__":
|
|
1073
1135
|
unittest.main()
|
dwca/test/test_rows.py
CHANGED
|
@@ -47,3 +47,176 @@ class TestExtensionRow(unittest.TestCase):
|
|
|
47
47
|
assert 0 == vernacular_first_line.position
|
|
48
48
|
assert 1 == vernacular_second_line.position
|
|
49
49
|
assert 2 == vernacular_third_line.position
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class TestRowHashing(unittest.TestCase):
|
|
53
|
+
def test_core_rows_are_hashable(self):
|
|
54
|
+
"""CHANGES.txt has claimed rows are hashable since 0.3.3, but __key() embedded a
|
|
55
|
+
dict and a list, so hash() raised TypeError for every row."""
|
|
56
|
+
with DwCAReader(sample_data_path("dwca-2extensions.zip")) as dwca:
|
|
57
|
+
rows = dwca.rows
|
|
58
|
+
|
|
59
|
+
assert len(set(rows)) == len(rows)
|
|
60
|
+
|
|
61
|
+
def test_extension_rows_are_hashable(self):
|
|
62
|
+
with DwCAReader(sample_data_path("dwca-2extensions.zip")) as dwca:
|
|
63
|
+
extension_rows = dwca.rows[0].extensions
|
|
64
|
+
|
|
65
|
+
assert len(set(extension_rows)) == len(extension_rows)
|
|
66
|
+
|
|
67
|
+
def test_unlinked_core_rows_are_comparable(self):
|
|
68
|
+
"""A CoreRow obtained directly from CSVDataFile.get_row_by_position() (rather than by
|
|
69
|
+
iterating the DwCAReader) is never linked to extension files or source metadata, so
|
|
70
|
+
self.extension_data_files and self.source_metadata don't exist on it. __key() used to
|
|
71
|
+
access self.extensions and self.source_metadata unconditionally, so hash()/__eq__ on
|
|
72
|
+
such a row raised AttributeError - which set() and put in a set both trigger."""
|
|
73
|
+
with DwCAReader(sample_data_path("dwca-2extensions.zip")) as dwca:
|
|
74
|
+
one = dwca.core_file.get_row_by_position(0)
|
|
75
|
+
two = dwca.core_file.get_row_by_position(0)
|
|
76
|
+
|
|
77
|
+
assert one is not two
|
|
78
|
+
assert one == two
|
|
79
|
+
assert hash(one) == hash(two)
|
|
80
|
+
assert len({one, two}) == 1
|
|
81
|
+
|
|
82
|
+
def test_equal_rows_hash_equally(self):
|
|
83
|
+
# Two distinct objects that compare equal must hash equal.
|
|
84
|
+
with DwCAReader(sample_data_path("dwca-2extensions.zip")) as dwca:
|
|
85
|
+
one = dwca.rows[0]
|
|
86
|
+
two = dwca.rows[0]
|
|
87
|
+
|
|
88
|
+
assert one is not two
|
|
89
|
+
assert one == two
|
|
90
|
+
assert hash(one) == hash(two)
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
class TestRowEquality(unittest.TestCase):
|
|
94
|
+
"""Rows compare by value, including across readers.
|
|
95
|
+
|
|
96
|
+
Row equality used to embed the DataFileDescriptor, which compared by object identity: rows
|
|
97
|
+
read from two DwCAReader instances over the same archive never compared equal, even with
|
|
98
|
+
identical data, raw_fields, id, position and rowtype.
|
|
99
|
+
"""
|
|
100
|
+
|
|
101
|
+
def test_core_rows_from_two_readers_over_the_same_archive_are_equal(self):
|
|
102
|
+
path = sample_data_path("dwca-2extensions.zip")
|
|
103
|
+
|
|
104
|
+
with DwCAReader(path) as one, DwCAReader(path) as two:
|
|
105
|
+
row_one = one.rows[0]
|
|
106
|
+
row_two = two.rows[0]
|
|
107
|
+
|
|
108
|
+
assert row_one.descriptor is not row_two.descriptor
|
|
109
|
+
assert row_one == row_two
|
|
110
|
+
assert not (row_one != row_two)
|
|
111
|
+
assert hash(row_one) == hash(row_two)
|
|
112
|
+
assert len({row_one, row_two}) == 1
|
|
113
|
+
|
|
114
|
+
def test_extension_rows_from_two_readers_over_the_same_archive_are_equal(self):
|
|
115
|
+
path = sample_data_path("dwca-2extensions.zip")
|
|
116
|
+
|
|
117
|
+
with DwCAReader(path) as one, DwCAReader(path) as two:
|
|
118
|
+
row_one = one.rows[0].extensions[0]
|
|
119
|
+
row_two = two.rows[0].extensions[0]
|
|
120
|
+
|
|
121
|
+
assert row_one.descriptor is not row_two.descriptor
|
|
122
|
+
assert row_one == row_two
|
|
123
|
+
assert hash(row_one) == hash(row_two)
|
|
124
|
+
assert len({row_one, row_two}) == 1
|
|
125
|
+
|
|
126
|
+
def test_different_core_rows_are_not_equal(self):
|
|
127
|
+
with DwCAReader(sample_data_path("dwca-2extensions.zip")) as dwca:
|
|
128
|
+
assert dwca.rows[0] != dwca.rows[1]
|
|
129
|
+
|
|
130
|
+
def test_comparing_a_core_row_to_an_extension_row_returns_false(self):
|
|
131
|
+
"""__key() is name-mangled, so CoreRow.__eq__ used to call other._CoreRow__key() on an
|
|
132
|
+
ExtensionRow, which doesn't have it: the comparison raised AttributeError instead of
|
|
133
|
+
returning False."""
|
|
134
|
+
with DwCAReader(sample_data_path("dwca-2extensions.zip")) as dwca:
|
|
135
|
+
core_row = dwca.rows[0]
|
|
136
|
+
extension_row = core_row.extensions[0]
|
|
137
|
+
|
|
138
|
+
assert core_row != extension_row
|
|
139
|
+
assert extension_row != core_row
|
|
140
|
+
assert not (core_row == extension_row)
|
|
141
|
+
|
|
142
|
+
def test_comparing_rows_with_other_types_returns_false(self):
|
|
143
|
+
with DwCAReader(sample_data_path("dwca-2extensions.zip")) as dwca:
|
|
144
|
+
core_row = dwca.rows[0]
|
|
145
|
+
extension_row = core_row.extensions[0]
|
|
146
|
+
|
|
147
|
+
for row in (core_row, extension_row):
|
|
148
|
+
assert row != "not a row"
|
|
149
|
+
assert row != 42
|
|
150
|
+
assert row != None # noqa: E711 - we're testing __eq__, not identity
|
|
151
|
+
assert not (row == "not a row")
|
|
152
|
+
|
|
153
|
+
def test_rows_of_different_types_can_share_a_set(self):
|
|
154
|
+
"""A CoreRow and an ExtensionRow landing in the same hash bucket must compare, not
|
|
155
|
+
raise."""
|
|
156
|
+
with DwCAReader(sample_data_path("dwca-2extensions.zip")) as dwca:
|
|
157
|
+
core_row = dwca.rows[0]
|
|
158
|
+
extension_row = core_row.extensions[0]
|
|
159
|
+
|
|
160
|
+
assert len({core_row, extension_row}) == 2
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
class TestRowFromFields(unittest.TestCase):
|
|
164
|
+
def _descriptor(self):
|
|
165
|
+
import xml.etree.ElementTree as ET
|
|
166
|
+
|
|
167
|
+
from dwca.descriptors import DataFileDescriptor
|
|
168
|
+
|
|
169
|
+
section = """
|
|
170
|
+
<core encoding="utf-8" fieldsTerminatedBy="\\t" linesTerminatedBy="\\n" \
|
|
171
|
+
fieldsEnclosedBy="" ignoreHeaderLines="0" rowType="http://rs.tdwg.org/dwc/terms/Occurrence">
|
|
172
|
+
<files><location>occurrence.txt</location></files>
|
|
173
|
+
<id index="0" />
|
|
174
|
+
<field index="0" term="http://x/id"/>
|
|
175
|
+
<field index="1" term="http://x/locality"/>
|
|
176
|
+
</core>
|
|
177
|
+
"""
|
|
178
|
+
return DataFileDescriptor.make_from_metafile_section(ET.fromstring(section))
|
|
179
|
+
|
|
180
|
+
def test_from_fields_matches_the_raw_line_constructor(self):
|
|
181
|
+
from dwca.rows import CoreRow
|
|
182
|
+
|
|
183
|
+
descriptor = self._descriptor()
|
|
184
|
+
|
|
185
|
+
from_line = CoreRow("1\tBorneo\n", 0, descriptor)
|
|
186
|
+
from_fields = CoreRow.from_fields(["1", "Borneo"], 0, descriptor)
|
|
187
|
+
|
|
188
|
+
assert from_line.data == from_fields.data
|
|
189
|
+
assert from_line.raw_fields == from_fields.raw_fields
|
|
190
|
+
assert from_line.id == from_fields.id
|
|
191
|
+
assert from_line.position == from_fields.position
|
|
192
|
+
assert from_line.rowtype == from_fields.rowtype
|
|
193
|
+
|
|
194
|
+
def test_from_fields_returns_the_right_class(self):
|
|
195
|
+
from dwca.rows import CoreRow
|
|
196
|
+
|
|
197
|
+
row = CoreRow.from_fields(["1", "Borneo"], 0, self._descriptor())
|
|
198
|
+
|
|
199
|
+
assert isinstance(row, CoreRow)
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
class TestCsvLineToFieldsQuoting(unittest.TestCase):
|
|
203
|
+
def test_quote_at_the_edge_of_content_is_preserved(self):
|
|
204
|
+
"""The csv module already un-doubles escaped quotes; stripping afterwards ate a
|
|
205
|
+
legitimate leading or trailing quote from the field's own content."""
|
|
206
|
+
assert ['1', 'say "hi"'] == csv_line_to_fields(
|
|
207
|
+
'"1","say ""hi"""', "\n", ",", '"'
|
|
208
|
+
)
|
|
209
|
+
assert ['1', '"hi" she said'] == csv_line_to_fields(
|
|
210
|
+
'"1","""hi"" she said"', "\n", ",", '"'
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
def test_delimiter_inside_a_quoted_field_still_works(self):
|
|
214
|
+
"""Regression guard for the v0.11.0 fix."""
|
|
215
|
+
assert ["field 1", "field 2, with comma", "field 3"] == csv_line_to_fields(
|
|
216
|
+
'field 1,"field 2, with comma",field 3', "\n", ",", '"'
|
|
217
|
+
)
|
|
218
|
+
|
|
219
|
+
def test_unenclosed_line_keeps_quote_characters(self):
|
|
220
|
+
assert ["1", '"betta" splendens'] == csv_line_to_fields(
|
|
221
|
+
'1\t"betta" splendens', "\n", "\t", ""
|
|
222
|
+
)
|
dwca/version.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "0.
|
|
1
|
+
__version__ = "0.17.0"
|
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: python-dwca-reader
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.17.0
|
|
4
4
|
Summary: A simple Python package to read Darwin Core Archive (DwC-A) files.
|
|
5
5
|
Home-page: https://github.com/BelgianBiodiversityPlatform/python-dwca-reader
|
|
6
6
|
Author: Nicolas Noé - Belgian Biodiversity Platform
|
|
7
7
|
Author-email: n.noe@biodiversity.be
|
|
8
8
|
License: BSD licence, see LICENCE.txt
|
|
9
9
|
Classifier: Programming Language :: Python :: 3
|
|
10
|
-
Classifier: Programming Language :: Python :: 3.7
|
|
11
10
|
Classifier: Programming Language :: Python :: 3.8
|
|
12
11
|
Classifier: Programming Language :: Python :: 3.9
|
|
13
12
|
Classifier: Programming Language :: Python :: 3.10
|
|
14
13
|
Classifier: Programming Language :: Python :: 3.11
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
15
16
|
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
|
17
|
+
Requires-Python: >=3.8
|
|
16
18
|
License-File: LICENSE.txt
|
|
17
19
|
License-File: AUTHORS
|
|
18
20
|
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
dwca/__init__.py,sha256=Jzb_RfgvXCrm_SQ4AfeGVi1N36YybxnM5mpyxrnihgI,33
|
|
2
|
+
dwca/descriptors.py,sha256=X0ztwqIIEKPsONmCHxyqlV2hvIaPCmEGUfAOtE-XMOI,22451
|
|
3
|
+
dwca/exceptions.py,sha256=3TyIelM2rrnFPH97isxQGv0ICRLebT_bXMnXOhuIg30,380
|
|
4
|
+
dwca/files.py,sha256=2d3d5YYM6A83qtbkU_O7TekI88gcOg9pzBKytrAu8lw,20566
|
|
5
|
+
dwca/helpers.py,sha256=3o6L4yTqtVIsFEl9PMpDoyqITKXvS-ErTGVvjWIlFZA,245
|
|
6
|
+
dwca/minibench.py,sha256=6hP4Z-kAz-i57QUdipLvj7D_BCq2YW9wndyg3eW6e9A,1537
|
|
7
|
+
dwca/read.py,sha256=iOhhTz1f6wWk1INRAtVWcaRuJDCsBx65nAStWPd_bL8,25246
|
|
8
|
+
dwca/rows.py,sha256=ZEHdfjtok-GCZ7VKsTeHQNoO7agKf4RCrQvMxuDYPNE,11281
|
|
9
|
+
dwca/star_record.py,sha256=n6OL9bdsAikjiCY5iB1TfX3bXgXyHv4520FLKkknusI,2775
|
|
10
|
+
dwca/vendor.py,sha256=521cjnCVI-tsomTcc7B-cS6F79wQmqU8fai47zviv0o,99
|
|
11
|
+
dwca/version.py,sha256=XpM3lncCzPBIwMSvDN7i10pke_c6KdJtVLZYbCiaTRw,23
|
|
12
|
+
dwca/darwincore/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
13
|
+
dwca/darwincore/build_dc_terms_list.py,sha256=3ZTOM8vvKpQR5H-LTDxeo3JoSpuu79OtyWsw4WDfr0A,1388
|
|
14
|
+
dwca/darwincore/terms.py,sha256=Q3ieJp-Fjf3Vrx4qVqhn4NOqiLo6BuxyOluk2cYwzhc,8772
|
|
15
|
+
dwca/darwincore/utils.py,sha256=7k_XNIBuykHWTRGyZ_BWLjw2cP-jmo9Y-78FEl3dQz4,845
|
|
16
|
+
dwca/test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
17
|
+
dwca/test/archive_builder.py,sha256=V-Iwr6XBa6J7EENkVOUWqhakxLewrO7NGOxGColqnlM,6739
|
|
18
|
+
dwca/test/helpers.py,sha256=1FB4lDV9gtcz6yHvLTAMiWFH-_YLmaMuBiUYYd47T1o,156
|
|
19
|
+
dwca/test/test_characterization.py,sha256=bO8rtoXFvurp60rCdZvMs9erxCOKDX1iAyQA2cHmqZ8,22194
|
|
20
|
+
dwca/test/test_datafile.py,sha256=QWd6yoQyRU1afaser-SL3uyrmv7Eybq29b0IJPFmHCc,18762
|
|
21
|
+
dwca/test/test_descriptors.py,sha256=Jhw1xliGenEdoSAh-zVm_QfqIsQsFhE9_4WzMsm5MOM,38907
|
|
22
|
+
dwca/test/test_dwcareader.py,sha256=mpDJpjKMTUnorPxuwzLc5GaaximYhdMRcSg9u2OjmlA,47289
|
|
23
|
+
dwca/test/test_rows.py,sha256=J_mY-GbG9GUA8jbaIgu8igZ1rW4tEqlxkUG8o3i3HF0,8991
|
|
24
|
+
dwca/test/test_star_record.py,sha256=5YYVdjIOy8QNuclS7fareApTIvqJuDmNLt4GEak7Z2I,4906
|
|
25
|
+
python_dwca_reader-0.17.0.dist-info/AUTHORS,sha256=5qn6Kxn1rBj2J7M4LHSwQiQHhVOs5ejilGssEmEhct4,528
|
|
26
|
+
python_dwca_reader-0.17.0.dist-info/LICENSE.txt,sha256=2Rc1BeoBQjG30Abb8zL34Wd9MrxVBRftyXiltvK2hJg,1506
|
|
27
|
+
python_dwca_reader-0.17.0.dist-info/METADATA,sha256=GNpXbG6J2N2dFLzoRKLKCMcz-iSGoZkspTFVrUNtHDs,1626
|
|
28
|
+
python_dwca_reader-0.17.0.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
|
|
29
|
+
python_dwca_reader-0.17.0.dist-info/top_level.txt,sha256=wUMEHbrB4ck4vyfybf4X2bv-HLgIU8uen_C5bMw8P1E,5
|
|
30
|
+
python_dwca_reader-0.17.0.dist-info/RECORD,,
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
dwca/__init__.py,sha256=Jzb_RfgvXCrm_SQ4AfeGVi1N36YybxnM5mpyxrnihgI,33
|
|
2
|
-
dwca/descriptors.py,sha256=QxpCKBBT1yftkGA9oHq45eCNney5Xtq898McLuwqSxo,12817
|
|
3
|
-
dwca/exceptions.py,sha256=3TyIelM2rrnFPH97isxQGv0ICRLebT_bXMnXOhuIg30,380
|
|
4
|
-
dwca/files.py,sha256=7EIDxNyqrf8ef9Wl71iDl1jap8X5n6BajD3BlPnamcs,6542
|
|
5
|
-
dwca/helpers.py,sha256=3o6L4yTqtVIsFEl9PMpDoyqITKXvS-ErTGVvjWIlFZA,245
|
|
6
|
-
dwca/minibench.py,sha256=6hP4Z-kAz-i57QUdipLvj7D_BCq2YW9wndyg3eW6e9A,1537
|
|
7
|
-
dwca/read.py,sha256=fQce6xOBmzzWv7AMlya2hUNO_Jpgq8bIvwGqfbPN5c0,22814
|
|
8
|
-
dwca/rows.py,sha256=hxc5k27ZFFSaiVsqkIZXJT3D6jOuo4wThIEl2LBd_JE,9392
|
|
9
|
-
dwca/star_record.py,sha256=CXsKLc9Hb6VMYGWAd1p93mR48VExPxLeUyh0k5alo-E,2804
|
|
10
|
-
dwca/vendor.py,sha256=521cjnCVI-tsomTcc7B-cS6F79wQmqU8fai47zviv0o,99
|
|
11
|
-
dwca/version.py,sha256=v0NTmSx9E_r4wWkO-UdvuH1fI3XtgjoFi5IbuPS9pjY,23
|
|
12
|
-
dwca/darwincore/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
13
|
-
dwca/darwincore/build_dc_terms_list.py,sha256=3ZTOM8vvKpQR5H-LTDxeo3JoSpuu79OtyWsw4WDfr0A,1388
|
|
14
|
-
dwca/darwincore/terms.py,sha256=Q3ieJp-Fjf3Vrx4qVqhn4NOqiLo6BuxyOluk2cYwzhc,8772
|
|
15
|
-
dwca/darwincore/utils.py,sha256=7k_XNIBuykHWTRGyZ_BWLjw2cP-jmo9Y-78FEl3dQz4,845
|
|
16
|
-
dwca/test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
17
|
-
dwca/test/helpers.py,sha256=1FB4lDV9gtcz6yHvLTAMiWFH-_YLmaMuBiUYYd47T1o,156
|
|
18
|
-
dwca/test/test_datafile.py,sha256=UGBJg5ZIe21OkeaMKhSRbxZLgY_fmDE24_tEJkrS1ps,7152
|
|
19
|
-
dwca/test/test_descriptors.py,sha256=md0NZo9-b-NoOIG752Yqq6VvNMCNFG_MfL0xtzRPo4o,25977
|
|
20
|
-
dwca/test/test_dwcareader.py,sha256=AgimWJFjW3Mrswu8n9EO7GqRpcY6CkDv4mpjCTXIcSI,44848
|
|
21
|
-
dwca/test/test_rows.py,sha256=PbR6EDpCM9NneDAyYjyoHlO8gaue-FLFtIXgsdWA5NU,1693
|
|
22
|
-
dwca/test/test_star_record.py,sha256=5YYVdjIOy8QNuclS7fareApTIvqJuDmNLt4GEak7Z2I,4906
|
|
23
|
-
python_dwca_reader-0.16.4.dist-info/AUTHORS,sha256=5qn6Kxn1rBj2J7M4LHSwQiQHhVOs5ejilGssEmEhct4,528
|
|
24
|
-
python_dwca_reader-0.16.4.dist-info/LICENSE.txt,sha256=2Rc1BeoBQjG30Abb8zL34Wd9MrxVBRftyXiltvK2hJg,1506
|
|
25
|
-
python_dwca_reader-0.16.4.dist-info/METADATA,sha256=j1gPCRXiwZha7tPu4VvvxO0GSUrhIgfuDd_9O-VrznU,1551
|
|
26
|
-
python_dwca_reader-0.16.4.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
|
|
27
|
-
python_dwca_reader-0.16.4.dist-info/top_level.txt,sha256=wUMEHbrB4ck4vyfybf4X2bv-HLgIU8uen_C5bMw8P1E,5
|
|
28
|
-
python_dwca_reader-0.16.4.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|