Skip to content
Snippets Groups Projects
Commit 2093f86b authored by Daniel Savoiu's avatar Daniel Savoiu
Browse files

Update law to `v0.1.12`. Adapt `SpaceSeparatedListParameter`.

parent f3328dbe
Branches fix/space_separated_parameter_for_law_v0.1.12
No related tags found
2 merge requests!6Update law to `v0.1.12`, reduction of code duplication, and various small fixes.,!5Update law to `v0.1.12`. Adapt `SpaceSeparatedListParameter`.
......@@ -2,13 +2,16 @@
import os
import csv
import re
import logging
import luigi
import law
import law.contrib.htcondor
import six
from law.parameter import CSVParameter
from law.parameter import CSVParameter, NO_STR
from law.util import is_lazy_iterable, make_tuple
logger = logging.getLogger(__name__)
......@@ -17,14 +20,91 @@ law.contrib.load("wlcg")
class SpaceSeparatedListParameter(CSVParameter):
CSV_SEP = " "
# developed for `law` revision df3d1fd0a15fd73f80eee859a616373d829f4513 (v0.1.12)
# might need to be changed when updating to newer `law` versions
def __init__(self, *args, **kwargs):
# warn that brace expansion is not supported
if kwargs.pop("brace_expand", False):
logger.warning("{!r} does not support brace expansion".format(self))
super(SpaceSeparatedListParameter, self).__init__(*args, **kwargs)
def _check_len(self, value):
value = tuple(
v.replace(",", "\\,")
if isinstance(v, six.string_types)
else v
for v in value
)
super(SpaceSeparatedListParameter, self)._check_len(value)
def parse(self, inp):
# collapse contiguous whitespace
if self.CSV_SEP in inp:
inp = re.sub(r'\s+', ' ', inp)
"""
Parse the SpaceSeparatedListParameter, splitting the `inp` string on
contiguous whitespace.
"""
if not inp or inp == NO_STR:
value = tuple()
elif isinstance(inp, (tuple, list)) or is_lazy_iterable(inp):
value = make_tuple(inp)
elif isinstance(inp, six.string_types):
# replace escaped separators
if self._escape_sep:
escaped_sep = "__law_escaped_csv_sep__"
inp = inp.replace("\\ ", escaped_sep)
# replace literal commas so they are not parsed
# by CSV reader
escaped_comma = "__law_escaped_comma__"
inp = inp.replace(",", escaped_comma)
# strip initial and final spaces
inp = re.sub(r"(^\s+|\s+$)", "", inp)
# collapse contiguous whitespace to commas
inp = re.sub(r"\s+", ",", inp)
# proper csv split
elems = list(csv.reader([inp]))[0]
# add back escaped commas per element
elems = [elem.replace(escaped_comma, ",") for elem in elems]
# add back escaped separators per element
if self._escape_sep:
elems = [elem.replace(escaped_sep, " ") for elem in elems]
value = tuple(map(self._inst.parse, elems))
else:
value = (inp,)
# apply uniqueness, sort, length and choices checks
value = self._check_unique(value)
value = self._check_sort(value)
self._check_len(value)
self._check_choices(value)
return value
def serialize(self, value):
"""
Serialize a value into a string that, when parsed as a
SpaceSeparatedListParameter, yields that value.
"""
if not value:
value = tuple()
value = make_tuple(value)
# escape any literal spaces in value elements
value = tuple(
v.replace(" ", "\\ ")
if isinstance(v, six.string_types)
else v
for v in value
)
# apply uniqueness, sort, length and choices checks
value = self._check_unique(value)
value = self._check_sort(value)
self._check_len(value)
self._check_choices(value)
return " ".join(str(self._inst.serialize(elem)) for elem in value)
return super(SpaceSeparatedListParameter, self).parse(inp)
class Task(law.Task):
......
Subproject commit 8c7ae918cf4ed874db518be3d98424b184012823
Subproject commit df3d1fd0a15fd73f80eee859a616373d829f4513
Subproject commit 3a3db7510b33eb22c63ad94bc735a9032949249f
Subproject commit 65486e4383f9f411da95937451205d3c7b61b9e1
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment