pynmrstar 3.3.5__cp311-cp311-musllinux_1_2_x86_64.whl → 3.3.6__cp311-cp311-musllinux_1_2_x86_64.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.

Potentially problematic release.


This version of pynmrstar might be problematic. Click here for more details.

Binary file
pynmrstar/_internal.py CHANGED
@@ -7,23 +7,19 @@ import zlib
7
7
  from datetime import date
8
8
  from gzip import GzipFile
9
9
  from io import StringIO, BytesIO
10
+ from pathlib import Path
10
11
  from typing import Dict, Union, IO, List, Tuple
11
- from urllib.error import HTTPError, URLError
12
- from urllib.request import urlopen, Request
12
+ from urllib.error import URLError
13
+
14
+ import requests
13
15
 
14
16
  import pynmrstar
15
17
 
16
- __version__: str = "3.3.5"
18
+ __version__: str = "3.3.6"
17
19
  min_cnmrstar_version: str = "3.2.0"
18
20
 
19
- # If we have requests, open a session to reuse for the duration of the program run
20
- try:
21
- from requests import session as _requests_session
22
- # This replaces the urllib HTTPError if we have requests
23
- from requests.exceptions import HTTPError, ConnectionError
24
- _session = _requests_session()
25
- except ModuleNotFoundError:
26
- _session = None
21
+ # Create a session to reuse for the duration of the program run
22
+ _session = requests.session()
27
23
 
28
24
  logger = logging.getLogger('pynmrstar')
29
25
 
@@ -81,64 +77,34 @@ def _get_url_reliably(url: str, wait_time: float = 10, raw: bool = False, timeou
81
77
 
82
78
  global _session
83
79
 
84
- # If using Requests
85
- if _session:
80
+ try:
81
+ response = _session.get(url, timeout=timeout,
82
+ headers={'Application': f'PyNMRSTAR {__version__}'})
83
+ except requests.exceptions.ConnectionError:
84
+ _session = requests.session()
86
85
  try:
87
86
  response = _session.get(url, timeout=timeout,
88
87
  headers={'Application': f'PyNMRSTAR {__version__}'})
89
- except ConnectionError:
90
- _session = _requests_session()
91
- try:
92
- response = _session.get(url, timeout=timeout,
93
- headers={'Application': f'PyNMRSTAR {__version__}'})
94
- except ConnectionError:
95
- raise HTTPError("A ConnectionError was thrown during an attempt to load the entry.")
96
-
97
- # We are rate limited - sleep and try again
98
- if response.status_code == 403:
99
- if retries > 0:
100
- logger.warning(f'We were rate limited. Sleeping for {wait_time} seconds.')
101
- time.sleep(wait_time)
102
- return _get_url_reliably(url, wait_time=wait_time*2, raw=raw, timeout=timeout,
103
- retries=retries - 1)
104
- else:
105
- raise HTTPError("Continued to receive 403 (forbidden, due to rate limit) after multiple wait times.") \
106
- from None
107
- if response.status_code == 404:
108
- raise KeyError(f"Server returned 404.") from None
109
- response.raise_for_status()
110
- if raw:
111
- return response.content
88
+ except requests.exceptions.ConnectionError:
89
+ raise requests.exceptions.HTTPError("A ConnectionError was thrown during an attempt to load the entry.")
90
+
91
+ # We are rate limited - sleep and try again
92
+ if response.status_code == 403:
93
+ if retries > 0:
94
+ logger.warning(f'We were rate limited. Sleeping for {wait_time} seconds.')
95
+ time.sleep(wait_time)
96
+ return _get_url_reliably(url, wait_time=wait_time * 2, raw=raw, timeout=timeout,
97
+ retries=retries - 1)
112
98
  else:
113
- return response.text
99
+ raise requests.exceptions.HTTPError("Continued to receive 403 (forbidden, due to rate limit) after multiple wait times.") \
100
+ from None
101
+ if response.status_code == 404:
102
+ raise KeyError(f"Server returned 404.") from None
103
+ response.raise_for_status()
104
+ if raw:
105
+ return response.content
114
106
  else:
115
- # Use the built in library
116
- try:
117
- req = Request(url)
118
- req.add_header('Application', f'PyNMRSTAR {__version__}')
119
- url_request = urlopen(req, timeout=timeout)
120
- serialized_ent = url_request.read()
121
- url_request.close()
122
-
123
- except HTTPError as err:
124
- if err.code == 404:
125
- raise KeyError(f"Server returned 404.") from None
126
- # We are rate limited - sleep and try again
127
- elif err.code == 403:
128
- if retries > 0:
129
- logger.warning(f'We were rate limited. Sleeping for {wait_time} seconds.')
130
- time.sleep(wait_time)
131
- return _get_url_reliably(url, wait_time=wait_time * 2, raw=raw, timeout=timeout,
132
- retries=retries - 1)
133
- else:
134
- raise HTTPError("Continued to receive 403 (forbidden, due to rate limit) after multiple wait "
135
- "times.") from None
136
- else:
137
- raise err
138
- if raw:
139
- return serialized_ent
140
- else:
141
- return serialized_ent.decode()
107
+ return response.text
142
108
 
143
109
 
144
110
  def _get_entry_from_database(entry_num: Union[str, int],
@@ -161,7 +127,7 @@ def _get_entry_from_database(entry_num: Union[str, int],
161
127
  if "error" in json_data:
162
128
  raise RuntimeError('Something wrong with API response.')
163
129
  ent = pynmrstar.Entry.from_json(json_data)
164
- except (HTTPError, ConnectionError, RuntimeError):
130
+ except (requests.exceptions.HTTPError, requests.exceptions.ConnectionError, RuntimeError):
165
131
  # Can't fall back to FTP for chemcomps
166
132
  if entry_num.startswith("chemcomp"):
167
133
  raise IOError("Unable to load that chemcomp from the API.")
@@ -176,7 +142,7 @@ def _get_entry_from_database(entry_num: Union[str, int],
176
142
  # Use a longer timeout for the timeout
177
143
  entry_content = _get_url_reliably(url, raw=False, timeout=20, retries=1)
178
144
  ent = pynmrstar.Entry.from_string(entry_content)
179
- except HTTPError:
145
+ except requests.exceptions.HTTPError:
180
146
  raise IOError(f"Entry {entry_num} does not exist in the public database.") from None
181
147
  except URLError:
182
148
  raise IOError("You don't appear to have an active internet connection. Cannot fetch entry.") from None
@@ -206,7 +172,7 @@ def _get_entry_from_database(entry_num: Union[str, int],
206
172
  return ent
207
173
 
208
174
 
209
- def _interpret_file(the_file: Union[str, IO]) -> StringIO:
175
+ def _interpret_file(the_file: Union[str, Path, IO]) -> StringIO:
210
176
  """Helper method returns some sort of object with a read() method.
211
177
  the_file could be a URL, a file location, a file object, or a
212
178
  gzipped version of any of the above."""
@@ -225,6 +191,9 @@ def _interpret_file(the_file: Union[str, IO]) -> StringIO:
225
191
  else:
226
192
  with open(the_file, 'rb') as read_file:
227
193
  buffer = BytesIO(read_file.read())
194
+ elif isinstance(the_file, Path):
195
+ with open(str(the_file), 'rb') as read_file:
196
+ buffer = BytesIO(read_file.read())
228
197
  else:
229
198
  raise ValueError("Cannot figure out how to interpret the file you passed.")
230
199
 
@@ -269,7 +238,7 @@ def get_clean_tag_list(item: Union[str, List[str], Tuple[str]]) -> List[Dict[str
269
238
 
270
239
 
271
240
  def write_to_file(nmrstar_object: Union['pynmrstar.Entry', 'pynmrstar.Saveframe'],
272
- file_name: str,
241
+ file_name: Union[str, Path],
273
242
  format_: str = "nmrstar",
274
243
  show_comments: bool = True,
275
244
  skip_empty_loops: bool = False,
@@ -287,6 +256,6 @@ def write_to_file(nmrstar_object: Union['pynmrstar.Entry', 'pynmrstar.Saveframe'
287
256
  elif format_ == "json":
288
257
  data_to_write = nmrstar_object.get_json()
289
258
 
290
- out_file = open(file_name, "w")
259
+ out_file = open(str(file_name), "w")
291
260
  out_file.write(data_to_write)
292
261
  out_file.close()
pynmrstar/_types.py ADDED
@@ -0,0 +1,14 @@
1
+ from typing import Dict, Any, List, Union
2
+
3
+ RowDict = Dict[str, Any] # One row: tag → value
4
+ ColumnarDict = Dict[str, List[Any]] # One column per tag
5
+ RowMatrix = List[List[Any]] # Matrix of rows (format #3)
6
+ FlatRow = List[Any] # One flat row (format #4)
7
+
8
+ DataInput = Union[
9
+ RowDict, # format #1 – single row
10
+ List[RowDict], # format #1 – many rows
11
+ ColumnarDict, # format #2 – columnar
12
+ RowMatrix, # format #3 – list of lists
13
+ FlatRow, # format #4 – flat list
14
+ ]
pynmrstar/entry.py CHANGED
@@ -3,6 +3,7 @@ import json
3
3
  import logging
4
4
  import warnings
5
5
  from io import StringIO
6
+ from pathlib import Path
6
7
  from typing import TextIO, BinaryIO, Union, List, Optional, Dict, Any, Tuple
7
8
 
8
9
  from pynmrstar import definitions, utils, loop as loop_mod, parser as parser_mod, saveframe as saveframe_mod
@@ -304,13 +305,14 @@ class Entry(object):
304
305
 
305
306
  @classmethod
306
307
  def from_file(cls,
307
- the_file: Union[str, TextIO, BinaryIO],
308
+ the_file: Union[str, Path, TextIO, BinaryIO],
308
309
  convert_data_types: bool = False,
309
310
  raise_parse_warnings: bool = False,
310
311
  schema: Schema = None):
311
312
  """Create an entry by loading in a file. If the_file starts with
312
313
  http://, https://, or ftp:// then we will use those protocols to
313
- attempt to open the file.
314
+ attempt to open the file. the_file can be a string path, pathlib.Path
315
+ object, or an open file handle.
314
316
 
315
317
  Setting convert_data_types to True will automatically convert
316
318
  the data loaded from the file into the corresponding python type as
@@ -956,7 +958,7 @@ class Entry(object):
956
958
 
957
959
  return errors
958
960
 
959
- def write_to_file(self, file_name: str, format_: str = "nmrstar", show_comments: bool = True,
961
+ def write_to_file(self, file_name: Union[str, Path], format_: str = "nmrstar", show_comments: bool = True,
960
962
  skip_empty_loops: bool = False, skip_empty_tags: bool = False) -> None:
961
963
  """ Writes the entry to the specified file in NMR-STAR format.
962
964
 
pynmrstar/loop.py CHANGED
@@ -4,10 +4,12 @@ from copy import deepcopy
4
4
  from csv import reader as csv_reader, writer as csv_writer
5
5
  from io import StringIO
6
6
  from itertools import chain
7
+ from pathlib import Path
7
8
  from typing import TextIO, BinaryIO, Union, List, Optional, Any, Dict, Callable, Tuple
8
9
 
9
10
  from pynmrstar import definitions, utils, entry as entry_mod
10
11
  from pynmrstar._internal import _json_serialize, _interpret_file
12
+ from pynmrstar._types import DataInput
11
13
  from pynmrstar.exceptions import InvalidStateError
12
14
  from pynmrstar.parser import Parser
13
15
  from pynmrstar.schema import Schema
@@ -294,7 +296,7 @@ class Loop(object):
294
296
 
295
297
  @classmethod
296
298
  def from_file(cls,
297
- the_file: Union[str, TextIO, BinaryIO],
299
+ the_file: Union[str, Path, TextIO, BinaryIO],
298
300
  csv: bool = False,
299
301
  convert_data_types: bool = False,
300
302
  raise_parse_warnings: bool = False,
@@ -302,7 +304,8 @@ class Loop(object):
302
304
  """Create a loop by loading in a file. Specify csv=True if
303
305
  the file is a CSV file. If the_file starts with http://,
304
306
  https://, or ftp:// then we will use those protocols to attempt
305
- to open the file.
307
+ to open the file. the_file can be a string path, pathlib.Path object,
308
+ or an open file handle.
306
309
 
307
310
  Setting convert_data_types to True will automatically convert
308
311
  the data loaded from the file into the corresponding python type as
@@ -458,49 +461,66 @@ class Loop(object):
458
461
 
459
462
  return True
460
463
 
461
- def add_data(self,
462
- data: Union[List[dict], Dict[str, List], List[Union[str, float, int]], List[List[Any]]],
463
- rearrange: bool = False,
464
- convert_data_types: bool = False,
465
- schema: Schema = None):
466
- """Add data to a loop. You can provide the data to add organized in four different ways, though the first
467
- two are recommended for new code. The other two (#3 and #4) are preserved for sake of existing code (written
468
- prior to version 3.3) and for niche use cases:
469
-
470
- 1: You can provide a list of dictionaries of tags to add. For example,
471
- ``[{'name': 'Jeff', 'location': 'Connecticut'}, {'name': 'Chad', 'location': 'Madison'}]`` will add two new
472
- rows, and set the values of the tags ``name`` and ``location`` to the values provided. If there are other
473
- tags in the loop, they will be assigned null values for the rows corresponding to the tags added.
474
-
475
- 2: You can provide a dictionary of lists, as such (corresponds to adding the same ultimate data as in the
476
- example #1): ``{'name': ['Jeff', 'Chad'], 'location': ['Connecticut', 'Madison']}``. This will also create
477
- two new rows in the loop and assign the values provided.
478
-
479
- 3: You can provide a list of lists of tag values to add. In this case, each list must have the same tag
480
- values (and order of tags) as the known tags present in the loop. To correspond to the above examples, the data
481
- would look like: ``[['Jeff', 'Connecticut'], ['Chad', 'Madison']]``. Adding data this way requires both that
482
- you provide values for all tags present in the loop, and that you provide the values in the same order that the
483
- tags already are already defined in the loop.
484
-
485
- 4. You can provide a single list of tag values to add. In the most simple case, that would correspond to just
486
- adding one row of data in the same was as in #3 above, as such: ``['Jeff', 'Connecticut']``. In a more
487
- complicated example, you could also add data (corresponding to example #1 and #2) as such:
488
- ``['Jeff', 'Connecticut', 'Chad', 'Madison']`` - but if you provide data this way, you must set
489
- ``rearrange=True``. This usage is strongly discouraged, but exists for legacy reasons.
490
-
491
- :param data: See the docstring for the method.
492
- :type data: Union[List[dict], Dict[str, List], List[Union[str, float, int]], List[List[Any]]]
493
- :param convert_data_types: If true, converts data you provide into the data type defined in the dictionary.
494
- For example, if you provided the string '5' for the tag ``_Atom_chem_shift.Val``, it would automatically
495
- be converted to a float while being added. This is mainly useful for parsers, as your data is probably
496
- already in a format that is usable for you.
497
- :type convert_data_types: bool
498
- :param rearrange: If true, rearrange data provided in method #4 as necessary to fit in the loop. This only
499
- exists for parsers, and it's use is strongly discouraged.
500
- :type rearrange: bool
501
- :param schema: A pynmrstar Schema object, which will be used to determine data types if convert_data_types
502
- is True.
503
- :type schema: pynmrstar.Schema
464
+ def add_data(
465
+ self,
466
+ data: DataInput,
467
+ rearrange: bool = False,
468
+ convert_data_types: bool = False,
469
+ schema: Union[Schema, None] = None,
470
+ ) -> None:
471
+ """
472
+ Add data to a loop.
473
+
474
+ You can supply *data* in **four** canonical formats. Formats #1 and #2
475
+ are the most convenient; the others are retained mainly for legacy code.
476
+
477
+ 1. **Row‑oriented dictionaries** *(preferred)*
478
+ a **list** of dictionaries,
479
+ where each dictionary represents one row::
480
+
481
+ [{'name': 'Jeff', 'location': 'Connecticut'},
482
+ {'name': 'Chad', 'location': 'Madison'}]
483
+
484
+ 2. **Column‑oriented dictionary of lists**
485
+ A dictionary mapping each tag to a list of values (or to a single
486
+ scalar)::
487
+
488
+ {'name': ['Jeff', 'Chad'],
489
+ 'location': ['Connecticut', 'Madison']}
490
+
491
+ All value‑lists must be the same length; that length determines the
492
+ number of rows created.
493
+
494
+ 3. **Matrix of values**
495
+ A list of lists whose inner order exactly matches the loop’s current
496
+ tag order::
497
+
498
+ [['Jeff', 'Connecticut'],
499
+ ['Chad', 'Madison']]
500
+
501
+ 4. **Flat list of values**
502
+ A single list whose length is either:
503
+ exactly the number of tags (adds one row), or
504
+ any multiple of that length **when** ``rearrange=True``::
505
+
506
+ ['Jeff', 'Connecticut'] # one row
507
+ ['Jeff', 'Connecticut', 'Chad', 'Madison'] # two rows (requires rearrange=True)
508
+
509
+ This form is discouraged and kept only for backward compatibility.
510
+
511
+ Parameters
512
+ ----------
513
+ data
514
+ The data to add, in any of the formats described above.
515
+ rearrange
516
+ Only used with format #4. When ``True`` the flat list is split into
517
+ evenly sized rows. Rarely needed outside of old parsers.
518
+ convert_data_types
519
+ If ``True`` each value is converted to the type defined in *schema*
520
+ before insertion.
521
+ schema
522
+ A :class:`pynmrstar.Schema` instance used when
523
+ ``convert_data_types`` is ``True``.
504
524
  """
505
525
 
506
526
  if not data:
@@ -564,7 +584,8 @@ class Loop(object):
564
584
  # Add the user data
565
585
  pending_data.append(data)
566
586
  else:
567
- raise ValueError("Your data did not match one of the supported types.")
587
+ raise ValueError("Your data did not match one of the supported types. Please review the documentation for "
588
+ "proper usage of this function.")
568
589
 
569
590
  # Auto convert data types if option set
570
591
  if convert_data_types:
pynmrstar/saveframe.py CHANGED
@@ -2,6 +2,7 @@ import json
2
2
  import warnings
3
3
  from csv import reader as csv_reader, writer as csv_writer
4
4
  from io import StringIO
5
+ from pathlib import Path
5
6
  from typing import TextIO, BinaryIO, Union, List, Optional, Any, Dict, Iterable, Tuple
6
7
 
7
8
  from pynmrstar import definitions, entry as entry_mod, loop as loop_mod, parser as parser_mod, utils
@@ -346,7 +347,7 @@ class Saveframe(object):
346
347
 
347
348
  @classmethod
348
349
  def from_file(cls,
349
- the_file: Union[str, TextIO, BinaryIO],
350
+ the_file: Union[str, Path, TextIO, BinaryIO],
350
351
  csv: bool = False,
351
352
  convert_data_types: bool = False,
352
353
  raise_parse_warnings: bool = False,
@@ -354,7 +355,8 @@ class Saveframe(object):
354
355
  """Create a saveframe by loading in a file. Specify csv=True is
355
356
  the file is a CSV file. If the_file starts with http://,
356
357
  https://, or ftp:// then we will use those protocols to attempt
357
- to open the file.
358
+ to open the file. the_file can be a string path, pathlib.Path object,
359
+ or an open file handle.
358
360
 
359
361
  Setting convert_data_types to True will automatically convert
360
362
  the data loaded from the file into the corresponding python type as
@@ -998,7 +1000,7 @@ class Saveframe(object):
998
1000
  return errors
999
1001
 
1000
1002
  def write_to_file(self,
1001
- file_name: str,
1003
+ file_name: Union[str, Path],
1002
1004
  format_: str = "nmrstar",
1003
1005
  show_comments: bool = True,
1004
1006
  skip_empty_loops: bool = False,
@@ -1,11 +1,12 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: pynmrstar
3
- Version: 3.3.5
3
+ Version: 3.3.6
4
4
  Summary: PyNMR-STAR provides tools for reading, writing, modifying, and interacting with NMR-STAR files. Maintained by the BMRB.
5
5
  Home-page: https://github.com/uwbmrb/PyNMRSTAR
6
6
  Author: Jon Wedell
7
- Author-email: wedell@uchc.edu
7
+ Author-email: Jon Wedell <wedell@uchc.edu>
8
8
  License: MIT
9
+ Project-URL: Homepage, https://github.com/bmrb-io/PyNMRSTAR
9
10
  Keywords: bmrb,parser,nmr,nmrstar,biomagresbank,biological magnetic resonance bank
10
11
  Classifier: Development Status :: 6 - Mature
11
12
  Classifier: Environment :: Console
@@ -29,6 +30,10 @@ Requires-Python: >=3.7
29
30
  Description-Content-Type: text/x-rst
30
31
  License-File: LICENSE
31
32
  Requires-Dist: requests<=3,>=2.21.0
33
+ Dynamic: author
34
+ Dynamic: home-page
35
+ Dynamic: license-file
36
+ Dynamic: requires-python
32
37
 
33
38
  Welcome to PyNMR-STAR!
34
39
  ======================================
@@ -0,0 +1,20 @@
1
+ cnmrstar.cpython-311-x86_64-linux-musl.so,sha256=4EP83ARzGwEXpYjw1yMgsCFkcjoqjGVKJx0I-ZiJJb8,60920
2
+ pynmrstar/__init__.py,sha256=z9uQkhmqipDrLHpEk81w7y7HEgepEcKyK7ZWr8YavJA,1967
3
+ pynmrstar/_internal.py,sha256=sf_qxTXdWejDLn2fqEqKr-wC0OtNHNgDud3AurGj3OA,10756
4
+ pynmrstar/_types.py,sha256=INDwmnS3s1RkLg64A--hoJyZNnWJl6cHP5HTRXaO9EY,626
5
+ pynmrstar/definitions.py,sha256=H4X8POb0CsA9lv8tiLupH0wBzKPdyy5OZCe0A1OqZiU,1510
6
+ pynmrstar/entry.py,sha256=NtEyXt4MUFEZ0REnGyeOhTMKEwqot3XmWE8_ENwciC8,46369
7
+ pynmrstar/exceptions.py,sha256=xJlGbHB_QXMiNWuU_6livAQBMljBuCba50WA_K9pIbc,1449
8
+ pynmrstar/loop.py,sha256=VoYs_qc2ESFDg-FLAb8urLe5geSyiGrEfJ3ySFr0miA,51128
9
+ pynmrstar/parser.py,sha256=cYnRBkQAdXJU_HY6WCcWMY0Rq2weDyr1hxiWOoQbNfg,15546
10
+ pynmrstar/saveframe.py,sha256=CfK_8SoZBNeTNtKxsjxg3pEta2qkbFzBV70V7jyzd_Q,44261
11
+ pynmrstar/schema.py,sha256=tJsVHkVQR8glvchFBzlRvGDpx2HxS76eucAjR_aKVog,15779
12
+ pynmrstar/utils.py,sha256=rd7JkVM9B7gMiveO0RhH6YtoJTB0CUiggsPtSVzmvl8,4662
13
+ pynmrstar/reference_files/comments.str,sha256=vOGWBs5XU3ddNyROkVOhaPwGb8kx5stoChgo6ICBMio,9942
14
+ pynmrstar/reference_files/data_types.csv,sha256=awbw34Icg16-6epkQLGRM5dEvthcq3hvkgbt6rlZh0I,3432
15
+ pynmrstar/reference_files/schema.csv,sha256=BfAJyjfDQaZakdEL5V97dTSDxwgxQZCIp1DeKEhT65w,3694703
16
+ pynmrstar-3.3.6.dist-info/METADATA,sha256=uAe4_DNzPZAMi70lyZcyiOOzLC1KY18epgl1GfV4Jd4,2593
17
+ pynmrstar-3.3.6.dist-info/WHEEL,sha256=kA_iIvT-cxTFNl4I8QDfFHN1DAyqZDYakVXCaObxeLo,112
18
+ pynmrstar-3.3.6.dist-info/top_level.txt,sha256=e5QP9re453LfgZ_mZNGHa7E5HFAXiRoNBPkF1hnn7JQ,19
19
+ pynmrstar-3.3.6.dist-info/RECORD,,
20
+ pynmrstar-3.3.6.dist-info/licenses/LICENSE,sha256=pAZXnNE2dxxwXFIduGyn1gpvPefJtUYOYZOi3yeGG94,1068
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.5.0)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: false
4
4
  Tag: cp311-cp311-musllinux_1_2_x86_64
5
5
 
@@ -1,19 +0,0 @@
1
- cnmrstar.cpython-311-x86_64-linux-musl.so,sha256=HHGp74fkPgDDMXwMHVgV6WtrC2mA5It_1qUA0GGC0sY,60792
2
- pynmrstar/loop.py,sha256=46vAeXMtKaSovLzFhhiFQCz1nsNqOJPSVpkTTa9tbtg,51892
3
- pynmrstar/exceptions.py,sha256=xJlGbHB_QXMiNWuU_6livAQBMljBuCba50WA_K9pIbc,1449
4
- pynmrstar/schema.py,sha256=tJsVHkVQR8glvchFBzlRvGDpx2HxS76eucAjR_aKVog,15779
5
- pynmrstar/_internal.py,sha256=GNWZPAKI7swRfqndVKamFyATNdNa_3nhocTvzT-fM4Y,12068
6
- pynmrstar/parser.py,sha256=cYnRBkQAdXJU_HY6WCcWMY0Rq2weDyr1hxiWOoQbNfg,15546
7
- pynmrstar/definitions.py,sha256=H4X8POb0CsA9lv8tiLupH0wBzKPdyy5OZCe0A1OqZiU,1510
8
- pynmrstar/__init__.py,sha256=z9uQkhmqipDrLHpEk81w7y7HEgepEcKyK7ZWr8YavJA,1967
9
- pynmrstar/utils.py,sha256=rd7JkVM9B7gMiveO0RhH6YtoJTB0CUiggsPtSVzmvl8,4662
10
- pynmrstar/entry.py,sha256=BcwVtSdfcDj4NWzmWvSbwilG9whxTk6CyZUbR15mLBk,46240
11
- pynmrstar/saveframe.py,sha256=5p-_NWi2nEju2FtJG5zm1aSdJrSZi_5lkCMIpTHWXYI,44133
12
- pynmrstar/reference_files/comments.str,sha256=vOGWBs5XU3ddNyROkVOhaPwGb8kx5stoChgo6ICBMio,9942
13
- pynmrstar/reference_files/schema.csv,sha256=BfAJyjfDQaZakdEL5V97dTSDxwgxQZCIp1DeKEhT65w,3694703
14
- pynmrstar/reference_files/data_types.csv,sha256=awbw34Icg16-6epkQLGRM5dEvthcq3hvkgbt6rlZh0I,3432
15
- pynmrstar-3.3.5.dist-info/METADATA,sha256=DDi4dJhZ0O9p6mWUX2bd72UtKVfKySfqa1uSJEOQRN8,2438
16
- pynmrstar-3.3.5.dist-info/RECORD,,
17
- pynmrstar-3.3.5.dist-info/top_level.txt,sha256=e5QP9re453LfgZ_mZNGHa7E5HFAXiRoNBPkF1hnn7JQ,19
18
- pynmrstar-3.3.5.dist-info/WHEEL,sha256=MQ29nCArLmrihs_AhYLz4TIaCgvATTq37oKgctZCPls,112
19
- pynmrstar-3.3.5.dist-info/LICENSE,sha256=pAZXnNE2dxxwXFIduGyn1gpvPefJtUYOYZOi3yeGG94,1068