commonnexus 1.9.0__py2.py3-none-any.whl → 1.9.2__py2.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.
- commonnexus/__init__.py +1 -1
- commonnexus/blocks/characters.py +5 -0
- commonnexus/nexus.py +15 -2
- commonnexus/tokenizer.py +1 -1
- {commonnexus-1.9.0.dist-info → commonnexus-1.9.2.dist-info}/METADATA +10 -9
- {commonnexus-1.9.0.dist-info → commonnexus-1.9.2.dist-info}/RECORD +10 -10
- {commonnexus-1.9.0.dist-info → commonnexus-1.9.2.dist-info}/LICENSE +0 -0
- {commonnexus-1.9.0.dist-info → commonnexus-1.9.2.dist-info}/WHEEL +0 -0
- {commonnexus-1.9.0.dist-info → commonnexus-1.9.2.dist-info}/entry_points.txt +0 -0
- {commonnexus-1.9.0.dist-info → commonnexus-1.9.2.dist-info}/top_level.txt +0 -0
commonnexus/__init__.py
CHANGED
commonnexus/blocks/characters.py
CHANGED
|
@@ -549,10 +549,15 @@ class Charstatelabels(Payload):
|
|
|
549
549
|
if isinstance(w, Token) and w.text == '/':
|
|
550
550
|
in_states = True
|
|
551
551
|
continue
|
|
552
|
+
if name:
|
|
553
|
+
raise ValueError(
|
|
554
|
+
'Illegal token in charstatelabel: "{}{}"'.format(name, w))
|
|
552
555
|
name = w
|
|
553
556
|
except StopIteration:
|
|
554
557
|
break
|
|
555
558
|
if num:
|
|
559
|
+
if name and name in names:
|
|
560
|
+
duplicate_charlabel(name, 'CHARSTATELABELS', nexus)
|
|
556
561
|
self.characters.append(types.SimpleNamespace(number=num, name=name, states=states))
|
|
557
562
|
elif comma: # There was a comma, but no new label.
|
|
558
563
|
warnings.warn('Trailing comma in CHARSTATELABELS command')
|
commonnexus/nexus.py
CHANGED
|
@@ -5,6 +5,7 @@ import collections
|
|
|
5
5
|
import dataclasses
|
|
6
6
|
|
|
7
7
|
from .tokenizer import TokenType, iter_tokens, get_name
|
|
8
|
+
from .util import log_or_raise
|
|
8
9
|
from commonnexus.command import Command
|
|
9
10
|
from commonnexus.blocks import Block
|
|
10
11
|
|
|
@@ -45,7 +46,7 @@ class Config:
|
|
|
45
46
|
|
|
46
47
|
class Nexus(list):
|
|
47
48
|
"""
|
|
48
|
-
A NEXUS object implemented as list of
|
|
49
|
+
A NEXUS object implemented as list of commands with methods to read and write blocks.
|
|
49
50
|
|
|
50
51
|
From the spec:
|
|
51
52
|
|
|
@@ -95,6 +96,7 @@ class Nexus(list):
|
|
|
95
96
|
"""
|
|
96
97
|
self.cfg = config or Config(**kw)
|
|
97
98
|
self.trailing_whitespace = []
|
|
99
|
+
self.leading = []
|
|
98
100
|
self.block_implementations = {}
|
|
99
101
|
for cls in Block.__subclasses__():
|
|
100
102
|
self.block_implementations[cls.__name__.upper()] = cls
|
|
@@ -120,7 +122,10 @@ class Nexus(list):
|
|
|
120
122
|
if token.is_semicolon:
|
|
121
123
|
commands.append(Command(tuple(tokens)))
|
|
122
124
|
tokens = []
|
|
123
|
-
|
|
125
|
+
if commands:
|
|
126
|
+
self.trailing_whitespace = tokens
|
|
127
|
+
else:
|
|
128
|
+
self.leading = tokens
|
|
124
129
|
s = commands
|
|
125
130
|
list.__init__(self, s)
|
|
126
131
|
|
|
@@ -211,6 +216,7 @@ class Nexus(list):
|
|
|
211
216
|
END;
|
|
212
217
|
"""
|
|
213
218
|
return NEXUS \
|
|
219
|
+
+ ''.join(str(t) for t in self.leading) \
|
|
214
220
|
+ ''.join(''.join(str(t) for t in cmd) for cmd in self) \
|
|
215
221
|
+ ''.join(str(t) for t in self.trailing_whitespace)
|
|
216
222
|
|
|
@@ -224,8 +230,10 @@ class Nexus(list):
|
|
|
224
230
|
p.write_text(text, encoding=self.cfg.encoding)
|
|
225
231
|
|
|
226
232
|
def iter_comments(self):
|
|
233
|
+
yield from (t for t in self.leading if t.type == TokenType.COMMENT)
|
|
227
234
|
for cmd in self:
|
|
228
235
|
yield from (t for t in cmd if t.type == TokenType.COMMENT)
|
|
236
|
+
yield from (t for t in self.trailing_whitespace if t.type == TokenType.COMMENT)
|
|
229
237
|
|
|
230
238
|
@property
|
|
231
239
|
def comments(self) -> typing.List[str]:
|
|
@@ -262,6 +270,8 @@ class Nexus(list):
|
|
|
262
270
|
|
|
263
271
|
def validate(self, log=None):
|
|
264
272
|
valid = True
|
|
273
|
+
if any(t.type not in {TokenType.WHITESPACE, TokenType.COMMENT} for t in self.leading):
|
|
274
|
+
log_or_raise('Invalid token in preamble', log=log)
|
|
265
275
|
for block in self.iter_blocks():
|
|
266
276
|
#
|
|
267
277
|
# FIXME: we can do a lot of validation here! If block.__commands__ is a list, there is
|
|
@@ -269,6 +279,9 @@ class Nexus(list):
|
|
|
269
279
|
# If Payload.__multivalued__ == False, only one command instance is allowed, ...
|
|
270
280
|
#
|
|
271
281
|
valid = valid and block.validate(log=log)
|
|
282
|
+
if any(t.type not in {TokenType.WHITESPACE, TokenType.COMMENT}
|
|
283
|
+
for t in self.trailing_whitespace):
|
|
284
|
+
log_or_raise('Invalid token in text after the last command', log=log)
|
|
272
285
|
return valid
|
|
273
286
|
|
|
274
287
|
def get_numbers(self, object_name, items):
|
commonnexus/tokenizer.py
CHANGED
|
@@ -11,7 +11,7 @@ Punctuation
|
|
|
11
11
|
|
|
12
12
|
The following punctuation marks have special properties: [ ] do not break a
|
|
13
13
|
word; + and - are allowed as state symbols, but none of the rest are allowed; - is
|
|
14
|
-
considered punctuation except
|
|
14
|
+
considered punctuation except where it is the minus sign in a negative number.
|
|
15
15
|
"""
|
|
16
16
|
import enum
|
|
17
17
|
import itertools
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: commonnexus
|
|
3
|
-
Version: 1.9.
|
|
3
|
+
Version: 1.9.2
|
|
4
4
|
Summary: A nexus (phylogenetics) file reader and writer (.nex, .trees)
|
|
5
5
|
Home-page: https://github.com/dlce-eva/commonnexus
|
|
6
6
|
Author: Robert Forkel
|
|
@@ -99,14 +99,15 @@ and writing NEXUS
|
|
|
99
99
|
>>> print(Nexus.from_blocks(Data.from_data(nex.CHARACTERS.get_matrix())))
|
|
100
100
|
#NEXUS
|
|
101
101
|
BEGIN DATA;
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
102
|
+
DIMENSIONS NCHAR=10;
|
|
103
|
+
FORMAT DATATYPE=STANDARD MISSING=? GAP=- SYMBOLS="01";
|
|
104
|
+
MATRIX
|
|
105
|
+
t1 1001010000
|
|
106
|
+
t2 0101000100
|
|
107
|
+
t3 0011101010
|
|
108
|
+
t4 0001100001
|
|
109
|
+
t5 0001100001
|
|
110
|
+
;
|
|
110
111
|
END;
|
|
111
112
|
```
|
|
112
113
|
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
commonnexus/__init__.py,sha256=
|
|
1
|
+
commonnexus/__init__.py,sha256=c8gR9z5hNsSngL9DzrmgqmzpJYXivE4XNKRmbA8Z94M,121
|
|
2
2
|
commonnexus/__main__.py,sha256=k07DsoCHCRw2Wi0HzXCmvNCSt8cddDEGCBlnHZorm6k,4361
|
|
3
3
|
commonnexus/cli_util.py,sha256=pmqd3Fs2Wef7hRf0Z6koZ1Bg6-16FZUMOYZ8cMTY5Ig,3710
|
|
4
4
|
commonnexus/command.py,sha256=5ZbW3wQY1GO6fChK7aqOzwjKBRxkPlKdUf09JbYEy9c,4284
|
|
5
|
-
commonnexus/nexus.py,sha256=
|
|
6
|
-
commonnexus/tokenizer.py,sha256=
|
|
5
|
+
commonnexus/nexus.py,sha256=rsfxX_cM4aOxS5p-lu39U2ZEcHswDoXPGGiVBiiVAMA,18380
|
|
6
|
+
commonnexus/tokenizer.py,sha256=a_zcTLhEc2KW2KCbVFXF-KoZlJg5TTfN9PIh7qnnIuk,11460
|
|
7
7
|
commonnexus/util.py,sha256=WomyVUggYJON5T9uNuIZ_Bxm16UJHIhO737SjKcFYO0,168
|
|
8
8
|
commonnexus/blocks/__init__.py,sha256=ehKEEc_E62zhlkvbp0p3asY56QkLuhqk7wYd1AqQuKI,602
|
|
9
9
|
commonnexus/blocks/assumptions.py,sha256=SNURUIUNP86SgTTdfLVTnGQ0FJDnd3I6FTz3jT9A7aw,11215
|
|
10
10
|
commonnexus/blocks/base.py,sha256=-sMfVczf7gWQ-hc9eV2pOgDgZUs9osrbDu_LbTPTgGM,8562
|
|
11
|
-
commonnexus/blocks/characters.py,sha256=
|
|
11
|
+
commonnexus/blocks/characters.py,sha256=5zvGPUi6J9ES9hc-1flKb_OJzkhdqXn_1lbL_QbSfag,60130
|
|
12
12
|
commonnexus/blocks/codons.py,sha256=Gox96r1Y3y8wmJIP1KhchfAepMC8BZB4Y7O2BTOcybc,7365
|
|
13
13
|
commonnexus/blocks/distances.py,sha256=E1XnkOhn4NKwhKQS3APhcKJ6HR6B33O2q6rdzQ0n4wU,16018
|
|
14
14
|
commonnexus/blocks/notes.py,sha256=6YctkCTgGAtOWKQ08LgzKXW_X0E1Oe5OgkqcF6iR5LY,8502
|
|
@@ -28,9 +28,9 @@ commonnexus/tools/__init__.py,sha256=X8dv4VrjAo5C8VJdUXMrKviDLUrwXbawE5SJiQ--2uQ
|
|
|
28
28
|
commonnexus/tools/combine.py,sha256=5vPQKcqA2acFji2lZc_xNZr1Xm2F3TPmfQk-fa9GA60,3048
|
|
29
29
|
commonnexus/tools/matrix.py,sha256=3e2n_beug3MZyzXDgawjxxh1QfiM7KVp757OepCjQR0,11492
|
|
30
30
|
commonnexus/tools/normalise.py,sha256=RdAasznob1aIY4B5z0Ir3jm9T5Yj_nbFzdtFtUM553U,6131
|
|
31
|
-
commonnexus-1.9.
|
|
32
|
-
commonnexus-1.9.
|
|
33
|
-
commonnexus-1.9.
|
|
34
|
-
commonnexus-1.9.
|
|
35
|
-
commonnexus-1.9.
|
|
36
|
-
commonnexus-1.9.
|
|
31
|
+
commonnexus-1.9.2.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
32
|
+
commonnexus-1.9.2.dist-info/METADATA,sha256=VLz6kYpG539mRNneegc18DiE-bq_7x9LyM6BSzUUEbI,5357
|
|
33
|
+
commonnexus-1.9.2.dist-info/WHEEL,sha256=bb2Ot9scclHKMOLDEHY6B2sicWOgugjFKaJsT7vwMQo,110
|
|
34
|
+
commonnexus-1.9.2.dist-info/entry_points.txt,sha256=0CbsOaqe6jaHnG1rpheuIISCZvFp1G1oBgDym82rpAo,58
|
|
35
|
+
commonnexus-1.9.2.dist-info/top_level.txt,sha256=SiWuQrmGciG5Ivhrqz6ueU1Sxv-fzudflsMof81-I54,12
|
|
36
|
+
commonnexus-1.9.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|