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.
@@ -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
- # Ensure we can access arbitrary data
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
- tmp_dir = os.path.abspath(".tmp")
261
- with DwCAReader(
262
- sample_data_path("dwca-simple-test-archive.zip"), tmp_dir=tmp_dir
263
- ) as dwca:
264
- assert dwca.absolute_temporary_path("occurrence.txt").startswith(tmp_dir)
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
- assert (
537
- "http://rs.tdwg.org/dwc/terms/scientificName': 'tetraodon fluviatilis'"
538
- in l_repr
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.16.4"
1
+ __version__ = "0.17.0"
@@ -1,18 +1,20 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: python-dwca-reader
3
- Version: 0.16.4
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,,