Skip to content

Commit

Permalink
feat: Simpler affix key codecs. Closes #47
Browse files Browse the repository at this point in the history
  • Loading branch information
thorwhalen committed Jan 8, 2024
1 parent 85149dc commit 908c224
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 8 deletions.
31 changes: 26 additions & 5 deletions dol/kv_codecs.py
Original file line number Diff line number Diff line change
Expand Up @@ -412,25 +412,46 @@ def tuple_of_dict(keys):
return ValueCodec(partial(nest_in_dict, keys), itemgetter(*keys))


# Note: An affix is a morpheme that is attached to a word stem to form a new word or
# word form. Affixes include prefixes, suffixes, infixes, and circumfixes.


def _affix_encoder(string: str, prefix: str = '', suffix: str = ''):
return f'{prefix}{string}{suffix}'


def _affix_decoder(string: str, prefix: str = '', suffix: str = ''):
return string[len(prefix) : -len(suffix)]


def affix_key_codec(prefix: str = '', suffix: str = ''):
"""A factory that creates a key codec that affixes a prefix and suffix to the key"""
return KeyCodec(
encoder=partial(_affix_encoder, prefix=prefix, suffix=suffix),
decoder=partial(_affix_decoder, prefix=prefix, suffix=suffix),
)


@_add_default_codecs
class KeyCodecs(CodecCollection):
"""
A collection of key codecs
"""

def affixed(prefix: str = '', suffix: str = ''):
return affix_key_codec(prefix=prefix, suffix=suffix)

def suffixed(suffix: str):
st = KeyTemplate('{}' + f'{suffix}')
return KeyCodec(st.simple_str_to_str, st.str_to_simple_str)
return affix_key_codec(suffix=suffix)

def prefixed(prefix: str):
st = KeyTemplate(f'{prefix}' + '{}')
return KeyCodec(st.simple_str_to_str, st.str_to_simple_str)
return affix_key_codec(prefix=prefix)

def common_prefixed(keys: Iterable[str]):
from dol.util import max_common_prefix

prefix = max_common_prefix(keys)
return KeyCodecs.prefixed(prefix)
return KeyCodecs.prefixed(prefix, simple_str_sep='')


def common_prefix_keys_wrap(s: Mapping):
Expand Down
9 changes: 6 additions & 3 deletions dol/paths.py
Original file line number Diff line number Diff line change
Expand Up @@ -1632,12 +1632,15 @@ def simple_str_to_tuple(self, ss: str):
"""
if ss is None:
return None
field_values = ss.split(self.simple_str_sep)
if self.simple_str_sep:
field_values = ss.split(self.simple_str_sep)
else:
field_values = (ss,)
if len(field_values) != self._n_fields:
raise ValueError(
f"String '{ss}' has does not have the right number of field values. "
f"Expected {self._n_fields}, got {len(field_values)} "
f"(namely: {field_values}.)"
f'Expected {self._n_fields}, got {len(field_values)} '
f'(namely: {field_values}.)'
)
return tuple(f(x) for f, x in zip(self._from_str_funcs.values(), field_values))

Expand Down

0 comments on commit 908c224

Please sign in to comment.