vortex-nwp 2.1.1__py3-none-any.whl → 2.1.3__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.
vortex/__init__.py CHANGED
@@ -53,10 +53,10 @@ from .toolbox import algo as task
53
53
 
54
54
  from . import nwp as nwp # footprints import
55
55
 
56
- __version__ = "2.1.1"
56
+ __version__ = "2.1.3"
57
57
  __prompt__ = "Vortex v-" + __version__ + ":"
58
58
 
59
- __nextversion__ = "2.1.1"
59
+ __nextversion__ = "2.1.4"
60
60
  __tocinfoline__ = "VORTEX core package"
61
61
 
62
62
  __all__ = [
vortex/algo/components.py CHANGED
@@ -1841,7 +1841,10 @@ class Parallel(xExecutableAlgoComponent):
1841
1841
  def _mpitool_attributes(self, opts):
1842
1842
  """Return the dictionary of attributes needed to create the mpitool object."""
1843
1843
  # Read the appropriate configuration in the target file
1844
- conf_dict = config.from_config(section="mpitool")
1844
+ if not config.is_defined(section="mpitool"):
1845
+ conf_dict = {}
1846
+ else:
1847
+ conf_dict = config.from_config(section="mpitool")
1845
1848
  if self.mpiname:
1846
1849
  conf_dict["mpiname"] = self.mpiname
1847
1850
  # Make "mpirun" the default mpi command name
vortex/algo/mpitools.py CHANGED
@@ -84,6 +84,7 @@ from vortex.tools import env
84
84
  from vortex.tools.arm import ArmForgeTool
85
85
  from vortex.tools.systems import ExecutionError
86
86
  from vortex.util import config
87
+ from vortex.config import is_defined, ConfigurationError
87
88
 
88
89
  #: No automatic export
89
90
  __all__ = []
@@ -1431,12 +1432,15 @@ class SRun(MpiTool):
1431
1432
  @property
1432
1433
  def _actual_slurmversion(self):
1433
1434
  """Return the slurm major version number."""
1434
- slurmversion = self.slurmversion or from_config(
1435
- section="mpitool", key="slurmversion"
1436
- )
1437
- if not slurmversion:
1438
- raise ValueError("No slurm version specified")
1439
- return slurmversion
1435
+ if self.slurmversion:
1436
+ return self.slurmversion
1437
+
1438
+ if not is_defined(section="mpitool", key="slurmversion"):
1439
+ raise ConfigurationError(
1440
+ "Using 'srun' MPI tool but slurm version is not configured. See "
1441
+ "https://vortex-nwp.readthedocs.io/en/latest/user-guide/configuration.html#mpitool"
1442
+ )
1443
+ return from_config(section="mpitool", key="slurmversion")
1440
1444
 
1441
1445
  def _set_binaries_hack(self, binaries):
1442
1446
  """Set the list of :class:`MpiBinaryDescription` objects associated with this instance."""
@@ -14,7 +14,7 @@ from bronx.system import hash as hashutils
14
14
  import footprints
15
15
 
16
16
  from vortex import sessions
17
- from vortex.config import from_config, ConfigurationError
17
+ from vortex.config import from_config, ConfigurationError, is_defined
18
18
  from vortex.syntax.stdattrs import (
19
19
  hashalgo,
20
20
  hashalgo_avail_list,
@@ -870,6 +870,13 @@ class ArchiveStore(Store):
870
870
  @property
871
871
  def actual_storetube(self):
872
872
  """This archive network name (potentially read form the configuration file)."""
873
+ if self._actual_storetube:
874
+ return self._actual_storetube
875
+ if not is_defined(section="storage", key="protocol"):
876
+ raise ConfigurationError(
877
+ "Using remote data tree but protocol is not configured. See "
878
+ "https://vortex-nwp.readthedocs.io/en/latest/user-guide/configuration.html#storage"
879
+ )
873
880
  if self._actual_storetube is None:
874
881
  self._actual_storetube = from_config(
875
882
  section="storage",
vortex/data/geometries.py CHANGED
@@ -764,12 +764,25 @@ def load(inifile="@geometries.ini", refresh=False, verbose=True):
764
764
 
765
765
  The class that will be instantiated depends on the "kind" keyword..
766
766
  """
767
+ from vortex import sessions
768
+
767
769
  iniconf = configparser.ConfigParser()
770
+
771
+ # Load from vortex distribution
768
772
  with importlib.resources.open_text(
769
773
  "vortex.data",
770
774
  "geometries.ini",
771
775
  ) as fh:
772
776
  iniconf.read_file(fh)
777
+
778
+ # Load from user's config directory if it exists
779
+ glove = sessions.current().glove
780
+ local = sessions.system()
781
+ user_geometries = glove.configrc + "/geometries.ini"
782
+ if local.path.exists(user_geometries):
783
+ with open(user_geometries, encoding="utf-8") as fh:
784
+ iniconf.read_file(fh)
785
+
773
786
  for item in iniconf.sections():
774
787
  gdesc = dict(iniconf.items(item))
775
788
  gkind = gdesc.get("kind")
vortex/data/providers.py CHANGED
@@ -279,6 +279,7 @@ class Vortex(Provider):
279
279
 
280
280
  _DEFAULT_NAME_BUILDER = names.VortexNameBuilder()
281
281
  _CUSTOM_NAME_BUILDERS = dict()
282
+ _SPECIAL_EXPS = ("oper", "dble", "test", "mirr")
282
283
 
283
284
  _footprint = [
284
285
  block,
@@ -365,8 +366,8 @@ class Vortex(Provider):
365
366
  self._namebuilder = self._CUSTOM_NAME_BUILDERS[self.namebuild]
366
367
  else:
367
368
  self._namebuilder = self._DEFAULT_NAME_BUILDER
368
- if self.experiment in ("oper", "dble"):
369
- self.experiment = self.experiment.upper()
369
+ if self.experiment in (n.upper() for n in self._SPECIAL_EXPS):
370
+ self.experiment = self.experiment.lower()
370
371
 
371
372
  # Ensure compatibility with deprecated namespace attribute
372
373
  # Under the hood the namespace attribute is still used to
@@ -426,7 +427,7 @@ class Vortex(Provider):
426
427
 
427
428
  def netloc(self, resource):
428
429
  """Returns the current ``namespace``."""
429
- if self.experiment in ("OPER", "DBLE"):
430
+ if self.experiment in self._SPECIAL_EXPS:
430
431
  return "vsop." + self.namespace.domain
431
432
  return self.namespace.netloc
432
433
 
vortex/data/stores.py CHANGED
@@ -908,16 +908,9 @@ class VortexArchiveStore(MultiStore):
908
908
 
909
909
  def alternates_netloc(self):
910
910
  """Return netlocs describing both base and stacked archives."""
911
- netloc_m = re.match(
912
- r"(?P<base>v.*)\.archive\.(?P<country>\w+)", self.netloc
913
- )
914
911
  return [
915
- "{base:s}.archive-legacy.{country:s}".format(
916
- **netloc_m.groupdict()
917
- ),
918
- "{base:s}.stacked-archive-legacy.{country:s}".format(
919
- **netloc_m.groupdict()
920
- ),
912
+ f"{self.netloc.firstname}.archive-legacy.fr",
913
+ f"{self.netloc.firstname}.stacked-archive-legacy.fr",
921
914
  ]
922
915
 
923
916
  def alternates_fpextras(self):
@@ -1025,18 +1018,16 @@ class VortexCacheOp2ResearchStore(_VortexCacheBaseStore):
1025
1018
 
1026
1019
  def __init__(self, *args, **kw):
1027
1020
  super().__init__(*args, **kw)
1028
- try:
1029
- cachepath = config.from_config(
1030
- section="data-tree",
1031
- key="op_rootdir",
1032
- )
1033
- except config.ConfigurationError as e:
1034
- logger.error(
1035
- "Cannot use special experiment cache without providing",
1036
- "cache location",
1021
+ if not config.is_defined(section="data-tree", key="op_rootdir"):
1022
+ raise config.ConfigurationError(
1023
+ "Using special experiment but corresponding cache location "
1024
+ 'is not configured. Bet sure to set "op_rootdir" in configuration. '
1025
+ "See https://vortex-nwp.readthedocs.io/en/latest/user-guide/oper-dble-data-trees"
1037
1026
  )
1038
- raise e
1039
-
1027
+ cachepath = config.from_config(
1028
+ section="data-tree",
1029
+ key="op_rootdir",
1030
+ )
1040
1031
  self.location = os.path.join(cachepath, "vortex")
1041
1032
 
1042
1033
 
@@ -1341,6 +1332,10 @@ class PromiseCacheStore(VortexCacheMtStore):
1341
1332
  ),
1342
1333
  )
1343
1334
 
1335
+ def __init__(self, *args, **kw):
1336
+ super().__init__(*args, **kw)
1337
+ self.location = os.path.join(get_cache_location(), "promise")
1338
+
1344
1339
  @staticmethod
1345
1340
  def _add_default_options(options):
1346
1341
  options_upd = options.copy()
vortex/nwp/data/stores.py CHANGED
@@ -12,6 +12,7 @@ from bronx.fancies import loggers
12
12
  from bronx.stdtypes import date
13
13
  from vortex.data.abstractstores import Store
14
14
  from vortex.syntax.stdattrs import compressionpipeline
15
+ from vortex import config
15
16
 
16
17
  #: No automatic export
17
18
  __all__ = []
@@ -109,14 +110,17 @@ class BdpeStore(Store):
109
110
  if s_archive == "True":
110
111
  extraenv["BDPE_LECTURE_ARCHIVE_AUTORISEE"] = "oui"
111
112
 
112
- wsinterpreter = self.system.default_target.get(
113
- "bdpe:wsclient_interpreter", None
114
- )
115
- wscommand = self.system.default_target.get("bdpe:wsclient_path", None)
116
- if wscommand is None:
117
- raise RuntimeError(
118
- "bdpe:wsclient_path has to be set in the target config"
113
+ try:
114
+ wsinterpreter = config.from_config(
115
+ section="bdpe", key="wsclient_interpreter"
119
116
  )
117
+ except config.ConfigurationError:
118
+ wsinterpreter = "bash"
119
+
120
+ try:
121
+ wscommand = config.from_config(section="bdpe", key="wsclient_path")
122
+ except config.ConfigurationError:
123
+ wscommand = "/opt/softs/sopra/bin/lirepe.sh"
120
124
 
121
125
  args.insert(0, wscommand)
122
126
  if wsinterpreter is not None:
vortex/tools/grib.py CHANGED
@@ -567,7 +567,7 @@ class EcGribDecoMixin(AlgoComponentDecoMixin):
567
567
  def _eccodes_envsetup(
568
568
  self,
569
569
  eccodes_lib,
570
- envvar="ECCODES_DEFINITIONS_PATH",
570
+ envvar="ECCODES_DEFINITION_PATH",
571
571
  tgt_path="definitions",
572
572
  ):
573
573
  """Export envirionment variables required by ECCODES
@@ -612,7 +612,7 @@ class EcGribDecoMixin(AlgoComponentDecoMixin):
612
612
  if eccodes_lib is not None:
613
613
  defvar = self._eccodes_envsetup(
614
614
  eccodes_lib,
615
- envvar="ECCODES_DEFINITIONS_PATH",
615
+ envvar="ECCODES_DEFINITION_PATH",
616
616
  tgt_path="definitions",
617
617
  )
618
618
  subdir = Path("ifs_samples") / (
@@ -4,12 +4,14 @@ Interface to SMS commands.
4
4
 
5
5
  import contextlib
6
6
  import functools
7
+ import re
8
+ import socket
7
9
 
8
10
  from bronx.fancies import loggers
9
11
  import footprints
10
12
 
11
13
  from vortex import config
12
- from .services import Service
14
+ from .services import Service, get_cluster_name
13
15
 
14
16
  __all__ = []
15
17
 
@@ -363,46 +365,40 @@ class EcFlow(EcmwfLikeScheduler):
363
365
  def __init__(self, *args, **kw):
364
366
  logger.debug("EcFlow scheduler client init %s", self)
365
367
  super().__init__(*args, **kw)
366
- self._actual_clientpath = self.clientpath
367
-
368
- def path(self):
369
- """Return the actual binary path to the EcFlow client."""
370
- if self._actual_clientpath is None:
371
- thistarget = self.sh.default_target
372
- guesspath = self.env.ECF_CLIENT_PATH or thistarget.get(
373
- "ecflow:clientpath"
374
- )
375
- ecfversion = self.env.get("ECF_VERSION", "default")
376
- guesspath = guesspath.format(version=ecfversion)
377
- if guesspath is None:
378
- logger.warning(
379
- "ecFlow service could not guess the install location [%s]",
380
- str(guesspath),
381
- )
368
+ if not self.clientpath:
369
+ if not config.is_defined(section="ecflow", key="clientpath"):
370
+ self.clientpath = "ecflow_client"
382
371
  else:
383
- self._actual_clientpath = guesspath
384
- if not self.sh.path.exists(self._actual_clientpath):
385
- logger.warning(
386
- "No ecFlow client found at init time [path:%s]>",
387
- self._actual_clientpath,
388
- )
389
- return self._actual_clientpath
372
+ self.clientpath = config.from_config(
373
+ section="ecflow",
374
+ key="clientpath",
375
+ )
390
376
 
391
377
  @contextlib.contextmanager
392
378
  def child_session_setup(self):
393
379
  """Setup a SSH tunnel if necessary."""
394
380
  with super().child_session_setup() as setup_rc:
395
- if setup_rc and not self.sh.default_target.isnetworknode:
381
+ name = get_cluster_name(socket.gethostname())
382
+ # If the current node is a compute node, it cannot reach
383
+ # the EcFlow server. In this case, the request is made
384
+ # through a SSH tunnel on taranisoper-int
385
+ is_compute_node = re.match(
386
+ rf"{name}\d+\.{name}hpc\.meteo\.fr", socket.gethostname()
387
+ )
388
+ if setup_rc and is_compute_node:
396
389
  tunnel = None
397
390
  # wait and retries from config
398
- thistarget = self.sh.default_target
399
- sshwait = float(thistarget.get("ecflow:sshproxy_wait", 6))
400
- sshretries = float(
401
- thistarget.get("ecflow:sshproxy_retries", 2)
402
- )
403
- sshretrydelay = float(
404
- thistarget.get("ecflow:sshproxy_retrydelay", 1)
405
- )
391
+ ssh_settings = {
392
+ conf_key: default
393
+ if not config.is_defined("ecflow", conf_key)
394
+ else config.from_config("ecflow", conf_key)
395
+ for conf_key, default in (
396
+ ("sshproxy_wait", 6),
397
+ ("sshproxy_retries", 2),
398
+ ("sshproxy_retrydelay", 1),
399
+ )
400
+ }
401
+
406
402
  # Build up an SSH tunnel to convey the EcFlow command
407
403
  ecconf = self.conf(dict())
408
404
  echost = ecconf.get("{:s}HOST".format(self.env_pattern), None)
@@ -411,14 +407,15 @@ class EcFlow(EcmwfLikeScheduler):
411
407
  setup_rc = False
412
408
  else:
413
409
  sshobj = self.sh.ssh(
414
- "network",
415
- virtualnode=True,
410
+ hostname=f"{name}oper-int",
416
411
  mandatory_hostcheck=False,
417
- maxtries=sshretries,
418
- triesdelay=sshretrydelay,
412
+ maxtries=ssh_settings["sshproxy_retries"],
413
+ triesdelay=ssh_settings["sshproxy_retrydelay"],
419
414
  )
420
415
  tunnel = sshobj.tunnel(
421
- echost, int(ecport), maxwait=sshwait
416
+ echost,
417
+ int(ecport),
418
+ maxwait=ssh_settings["sshproxy_wait"],
422
419
  )
423
420
  if not tunnel:
424
421
  setup_rc = False
@@ -458,9 +455,7 @@ class EcFlow(EcmwfLikeScheduler):
458
455
 
459
456
  def _actual_child(self, cmd, options, critical=True):
460
457
  """Miscellaneous ecFlow sub-command."""
461
- args = [
462
- self.path(),
463
- ]
458
+ args = [self.clientpath]
464
459
  if options:
465
460
  args.append("--{:s}={!s}".format(cmd, options[0]))
466
461
  if len(options) > 1:
vortex/tools/services.py CHANGED
@@ -9,6 +9,7 @@ import configparser
9
9
  import contextlib
10
10
  import hashlib
11
11
  import pprint
12
+ import re
12
13
  from string import Template
13
14
 
14
15
 
@@ -23,6 +24,7 @@ from vortex.util.config import (
23
24
  load_template,
24
25
  LegacyTemplatingAdapter,
25
26
  )
27
+ from vortex import config
26
28
 
27
29
  #: No automatic export
28
30
  __all__ = []
@@ -530,8 +532,6 @@ class HideService(Service):
530
532
  """Main action: hide a cheap copy of this file under a unique name."""
531
533
 
532
534
  rootdir = self.rootdir
533
- if rootdir is None:
534
- rootdir = self.sh.default_target.get("hidden_rootdir", None)
535
535
  if rootdir is not None:
536
536
  rootdir = self.sh.path.expanduser(rootdir)
537
537
 
@@ -795,12 +795,11 @@ class TemplatedMailService(MailService):
795
795
  """
796
796
  tpl = self.message
797
797
  if tpl == "":
798
- tplfile = self.section.get("template", self.id)
799
- tplfile = self._template_name_rewrite(tplfile)
798
+ tplpath = self._TEMPLATES_DIR / (
799
+ self.section.get("template", self.id) + ".tpl"
800
+ )
800
801
  try:
801
- tpl = load_template(
802
- self.ticket, tplfile, encoding=self.inputs_charset
803
- )
802
+ tpl = load_template(tplpath, encoding=self.inputs_charset)
804
803
  except ValueError as exc:
805
804
  logger.error("%s", exc.message)
806
805
  return None
@@ -938,3 +937,18 @@ class AbstractRdTemplatedMailService(TemplatedMailService):
938
937
  # The generic host/cluster name
939
938
  sdict["host"] = self.sh.default_target.inetname
940
939
  return sdict
940
+
941
+
942
+ def get_cluster_name(hostname):
943
+ if not config.is_defined(section="services", key="cluster_names"):
944
+ raise config.ConfigurationError(
945
+ 'Missing configuration key "cluster_names" in section "services". '
946
+ "See https://vortex-nwp.readthedocs.io/en/latest/user-guide/configuration.html#services"
947
+ )
948
+ cluster_names = config.from_config(section="services", key="cluster_names")
949
+ m = re.match("^(" + "|".join(n for n in cluster_names) + ")", hostname)
950
+ if (m is None) or (m.group(0) not in cluster_names):
951
+ raise ValueError(
952
+ f"Current host should be either one of {cluster_names}"
953
+ )
954
+ return m.group(0)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vortex-nwp
3
- Version: 2.1.1
3
+ Version: 2.1.3
4
4
  Summary: A Python library to write Numerical Weather Prediction pipelines components
5
5
  Author-email: The Vortex Team <vortex.support@meteo.fr>
6
6
  License: CECILL-C
@@ -1,30 +1,30 @@
1
- vortex/__init__.py,sha256=Lvzac_DBD8BQOlEYi8CFRkS0Xeecz5PyKbdgVjUS2GA,4374
1
+ vortex/__init__.py,sha256=c5NNahiKAbT_l0w-Ni5wOdjQyybGAFjJ6g8UhnZ-7x4,4374
2
2
  vortex/config.py,sha256=YEpcc81wR94jvn36fPONmKc1tM4ap0s8Rc7v3KfDUok,2948
3
3
  vortex/gloves.py,sha256=GKz27S8eLfRlk8fNqVL_z1gsQ8zvEj73p5uVi11ou00,8487
4
4
  vortex/proxy.py,sha256=OlPrVUJS5FoKt5pX8ApN1crFFDj8RJAqhDEilwvfrYU,127
5
5
  vortex/sessions.py,sha256=l_ZUUFS-l0J2Mg6KEXaUQiDhbIABrWCfcY-9ExazKEg,9988
6
6
  vortex/toolbox.py,sha256=fDTvfghg8Yl7ggAwhIaY3V6owO3V1IG9LBf6F97A_50,42385
7
7
  vortex/algo/__init__.py,sha256=I_9COn_QBRbwvbqhs0X3CdHeR97NZhBacIqwKjnVBTg,359
8
- vortex/algo/components.py,sha256=zs_DaKHFEHX9GQ-pn1HheAo4JvNusQi3D4u3ZhqVqe4,89362
9
- vortex/algo/mpitools.py,sha256=EffZ4Ok934tvEYyUjKpVA-lEUVA29FwUVBtUQ8xWnDI,73977
8
+ vortex/algo/components.py,sha256=JvznzerMhxLxbKZRWtQPIX7y-JjTAMwcIzG9TAXB7Sc,89460
9
+ vortex/algo/mpitools.py,sha256=hMVKPqu3z4ohGt9OtKCiDRNK6RlVBWgjelDoNaDH5hw,74235
10
10
  vortex/algo/serversynctools.py,sha256=fPel0txVHsrUfk6VFaeKa0D6i21fOskIAR_BbByBv9g,5601
11
11
  vortex/algo/mpitools_templates/__init__.py,sha256=Jbw903aPqVKF-AaSoB-mGMxthSvm88O_yqGoGmf_S_U,18
12
12
  vortex/algo/mpitools_templates/envelope_wrapper_default.tpl,sha256=4VhkDx_YbOYywKQ82HIxRJXGcDpLuOgqcY7Edx9Rxyw,453
13
13
  vortex/algo/mpitools_templates/envelope_wrapper_mpiauto.tpl,sha256=iB4_4jz-7QDqpl6AxrlCACsotJnEMG75dtazuGfkCb4,514
14
14
  vortex/algo/mpitools_templates/wrapstd_wrapper_default.tpl,sha256=hh1Um95FIuvXAhUTMifAfixtfGgyjF1vEaF1nmbqMLw,502
15
15
  vortex/data/__init__.py,sha256=XaHof5W6oCalr4X6oYAK4zW3z3F6mKuwdbKxmmmDraY,560
16
- vortex/data/abstractstores.py,sha256=tDEEHqyk7-5ETS8RdYFxiGAOkxmtJbj5TlR7Qx_JtAE,55373
16
+ vortex/data/abstractstores.py,sha256=DSnuv3nCoCy54XbM1LKGoZfOrFKuf8GqnRWTvT8yYro,55754
17
17
  vortex/data/containers.py,sha256=Qny5rqwXEdDWxG4JlC8KcsSAsHK3pp8qukZj1PTFBOM,26004
18
18
  vortex/data/contents.py,sha256=ZrwlJfOvkTemzikFRgYBQH3ApC-TPNrbZxpZstzDdbY,19079
19
19
  vortex/data/executables.py,sha256=FeR3SA2wW97zAQXwWVecZ0v6VYT5L_3K1Czuv33Bk74,6723
20
20
  vortex/data/flow.py,sha256=P1itBnA8jaoCWnVQjqbD_Pf26rpzud1JdwSLECDnDl4,3008
21
21
  vortex/data/geometries.ini,sha256=J7hX5hYWqwBjdUAul6q8j10U6b3I-QEHrFJ98LBTQXM,52805
22
- vortex/data/geometries.py,sha256=SjCF-74zDkbpt3qQujJU_UpeoBtgS7-xrEhbC4ywyRE,27429
22
+ vortex/data/geometries.py,sha256=ijRpb4Z0xhdYFlbO5thichY5g4DCK-oYG99Nlu6p9lw,27815
23
23
  vortex/data/handlers.py,sha256=0XeVFoSKSCMdvKTx5b1pczN79d14k_uGqccG6IXMX-8,50469
24
24
  vortex/data/outflow.py,sha256=IPKJkn75lRvhSqN5969TuhRAPnsZKlrWR4Cmw6VBFDs,1475
25
- vortex/data/providers.py,sha256=kLHJI3F9mkRjRcQzs0xaH_cdfvXd9H4x5h1Lm4PGSFk,15652
25
+ vortex/data/providers.py,sha256=dkJHW9KuvNszdoWrRxcRv2u-z3gX2RPY3rlk5sEj0Vk,15730
26
26
  vortex/data/resources.py,sha256=UOwvQDTJxS9z66Aa7JM2nWM3IxrMWvY3L2J9D5w3sZw,6348
27
- vortex/data/stores.py,sha256=2er--NmR25ikRmNsPSEr7JTPhvEtBPYk3Xpc-PlhNbU,44531
27
+ vortex/data/stores.py,sha256=pAJ93vhNYAd3l56G-JJ4WqvFoLwKlW4cEquEEtfmvx0,44609
28
28
  vortex/data/sync_templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
29
  vortex/layout/__init__.py,sha256=aZsDhVJrd3-648vw-UESI_2BLxyGl71sHdyrg9cL638,826
30
30
  vortex/layout/contexts.py,sha256=GkysEtOOUj3nQvGUWrFjOOjzv7SmWFPUSLTH_pMMycI,20363
@@ -69,7 +69,7 @@ vortex/nwp/data/obs.py,sha256=ZYUJ_NvI1OaaWw7h4I5tM3lNns66l--bwtHtayWKPoA,25378
69
69
  vortex/nwp/data/oopsexec.py,sha256=LlCfDZuEZVuTBFwa-pzRpO9nxOOq2398ObBItjiOXBE,1995
70
70
  vortex/nwp/data/providers.py,sha256=eHibwb_jkeFLyIywY4nA3PzpvxHal5J_3NjlF2M0bvc,7293
71
71
  vortex/nwp/data/query.py,sha256=IGGgGNMKH3beTpsx1_YsIYg6OE-cUBQzczwBE9m1JPU,5451
72
- vortex/nwp/data/stores.py,sha256=-WK7uaF4SlwDgABVFx-Vz7_hdSLPsYgIcECWl46Prk8,5354
72
+ vortex/nwp/data/stores.py,sha256=IWGhCnQepcAOm8mVf5jAeXclIInFmJrQ5kCHdVBIvCk,5445
73
73
  vortex/nwp/data/surfex.py,sha256=u8_SBCBAKhz1utghoGmB-bWTtDwIFteOEQv1HRkYLYw,7643
74
74
  vortex/nwp/syntax/__init__.py,sha256=m9oAm8sMUB8WzEnq93II1I20fYd1O29nBGWaa5ClmzQ,281
75
75
  vortex/nwp/syntax/stdattrs.py,sha256=HiLqZG_iuxqzYLsybMNAxoz_z96frg_PTksXomuYCRE,12928
@@ -112,7 +112,7 @@ vortex/tools/ddhpack.py,sha256=tOcQ5XQ7yTFBlisyjANDPMPQPijvHwz8yWY1eBfZMAs,206
112
112
  vortex/tools/delayedactions.py,sha256=miw6q5L5eOaxtLXhPIJlVs5Mi8vMXuIx55dY2TtU8BU,27126
113
113
  vortex/tools/env.py,sha256=ka7VaM3D5XuMRxja7oWA-eLgsUFqtWOmPvfbyHBi8Ps,18460
114
114
  vortex/tools/folder.py,sha256=R3bQtwnyn01WzkF3NdzJKb2tCkAPWYB61Bb90r0B09I,27992
115
- vortex/tools/grib.py,sha256=aH1y2LZDRBn3TywXsVZlxTRk6kdShMVgbHJTpGcfMGU,25700
115
+ vortex/tools/grib.py,sha256=rxHU6MTTtFK09O5W1ebEDiVigyt7rlO0ISX8pfdFGE8,25698
116
116
  vortex/tools/lfi.py,sha256=9mvXL-R5PQtTut7gsSMGJa0iNqpNgOFp7yuEMqYGIBA,29681
117
117
  vortex/tools/listings.py,sha256=LTfQHjT0XlK3Hxewbi06HZQjKhALmg0Gvz69UooOFog,15123
118
118
  vortex/tools/names.py,sha256=Knb2YsUsEjGpODBva1kEOBXRM2d_H0ylHwp-OoO3mnY,21644
@@ -121,8 +121,8 @@ vortex/tools/odb.py,sha256=TZ1Qq8QmFIh3OP-bsgnwPuHPdfMKNXUAfhc-KSx9tZQ,193
121
121
  vortex/tools/parallelism.py,sha256=f4uBp37Q3BG71Qn1yy_YSTPdk-2ZZ7zoGRQsGm6pT1Y,12345
122
122
  vortex/tools/prestaging.py,sha256=lGJIo4SA8pDziF1nbBogsrK1bgwDQA6tj9Wg9VUFt6Q,7078
123
123
  vortex/tools/rawfiles.py,sha256=keUI6QtEZQrWQ7H_Sg_TY9SY32anfb-suqJkrDmdXN0,215
124
- vortex/tools/schedulers.py,sha256=XduOQab1dRiHwz7Mnt3mxXByGzAHMsDLCwlUOpMdXEk,15828
125
- vortex/tools/services.py,sha256=v0uqAOXR9PsXJwv4-_yWpGzFniD7WghXW4p6WwaNtPA,29231
124
+ vortex/tools/schedulers.py,sha256=7JtfYfSJgViytM7T26B61V8W83dvNwkDWdb2jY_Bn-A,15691
125
+ vortex/tools/services.py,sha256=hprRFmLcQRLVGDUnFxUFHaEB7ll1tNdt38hRQz8SWF8,29795
126
126
  vortex/tools/storage.py,sha256=o_QryBe6wg0PzyRjG5eh8m3HfO1cQfd-3NG8OGwjuyw,34453
127
127
  vortex/tools/surfex.py,sha256=qbCIGt-dmfIRWRRMjOQnzc9sGNnt8PIFSqQYT77trhw,1408
128
128
  vortex/tools/systems.py,sha256=Zu04yTVIZU0hCiRH_STmdGuknjVd8dNsxXWr87k_5aE,149081
@@ -137,8 +137,8 @@ vortex/util/roles.py,sha256=9un_QAijaMn5iTS7PrdoWI5_NNw7uHxMWTnyhc5aNzg,1150
137
137
  vortex/util/storefunctions.py,sha256=uSfG-G_A88iJf3DwFBd-j0rw6eJta8opfRT39aQHsHM,3615
138
138
  vortex/util/structs.py,sha256=vapErq0MNhiKlsnjrv_a5M0Rn29KbP3WE_oiy4Hfwb8,683
139
139
  vortex/util/worker.py,sha256=zp8f2tx4SXwf1v55XMdYLAx7n3vSlg8PRGrkHgnfdmg,4721
140
- vortex_nwp-2.1.1.dist-info/licenses/LICENSE,sha256=ewBJPmWAcQqtBPrydH10tt6ECkcYP3b1o2RfH85pJF0,21863
141
- vortex_nwp-2.1.1.dist-info/METADATA,sha256=sKpeLSnU4V_HVbydy8gYnmfaof1G4RY4MzKqdYjnX-U,2185
142
- vortex_nwp-2.1.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
143
- vortex_nwp-2.1.1.dist-info/top_level.txt,sha256=3xfbSD7kw8xKl0jk4GNHsOPKbhubstfWHPl6bxHciRQ,7
144
- vortex_nwp-2.1.1.dist-info/RECORD,,
140
+ vortex_nwp-2.1.3.dist-info/licenses/LICENSE,sha256=ewBJPmWAcQqtBPrydH10tt6ECkcYP3b1o2RfH85pJF0,21863
141
+ vortex_nwp-2.1.3.dist-info/METADATA,sha256=Hbbea9Uml3ko4Amutk5FO0INbWbHzhabPigBufh8eFA,2185
142
+ vortex_nwp-2.1.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
143
+ vortex_nwp-2.1.3.dist-info/top_level.txt,sha256=3xfbSD7kw8xKl0jk4GNHsOPKbhubstfWHPl6bxHciRQ,7
144
+ vortex_nwp-2.1.3.dist-info/RECORD,,