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 CHANGED
@@ -1,4 +1,4 @@
1
1
  from .nexus import Nexus, Config # noqa: F401
2
2
  from commonnexus.blocks import Block # noqa: F401
3
3
 
4
- __version__ = '1.9.0'
4
+ __version__ = '1.9.2'
@@ -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 tokens with methods to access newick constituents.
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
- self.trailing_whitespace = tokens
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 were it is the minus sign in a negative number.
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.0
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
- 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;
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=WHq2NYClXqtJOmfAtyBC1X55uxYBcTcbRg17ywBEpKk,121
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=00pUVi1sBaVViI0r_P8YUfEeHw0h_10_sSGeIWn905o,17661
6
- commonnexus/tokenizer.py,sha256=8G2nP-xNN1gBd2a_7qxGDhHloCzoH4YE063p01FLTuk,11459
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=PvNHn11UdwCSNpAWZo_McowAzLlCqVhhxGRUF08T6Xs,59877
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.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
32
- commonnexus-1.9.0.dist-info/METADATA,sha256=mNQkc5C10gAI0q9LRfJOsYIBFnZvQFhXzBPsBbyxT6k,5379
33
- commonnexus-1.9.0.dist-info/WHEEL,sha256=bb2Ot9scclHKMOLDEHY6B2sicWOgugjFKaJsT7vwMQo,110
34
- commonnexus-1.9.0.dist-info/entry_points.txt,sha256=0CbsOaqe6jaHnG1rpheuIISCZvFp1G1oBgDym82rpAo,58
35
- commonnexus-1.9.0.dist-info/top_level.txt,sha256=SiWuQrmGciG5Ivhrqz6ueU1Sxv-fzudflsMof81-I54,12
36
- commonnexus-1.9.0.dist-info/RECORD,,
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,,