Skip to content

Commit

Permalink
Tiny cleanups.
Browse files Browse the repository at this point in the history
  • Loading branch information
rec committed Jan 3, 2015
1 parent aac46c4 commit 0fe41bc
Show file tree
Hide file tree
Showing 6 changed files with 52 additions and 35 deletions.
36 changes: 15 additions & 21 deletions code/python/echomesh/base/GetPrefix.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,44 +9,38 @@ class PrefixException(Exception):

_NONE = object()

def get_prefix(table, name, allow_prefixes=True):
def get_prefix(table, key, allow_prefixes=True):
"""
Looks up an entry in a table where unique prefixes are allowed.
"""
result = table.get(name, _NONE)
result = table.get(key, _NONE)
if result is not _NONE:
return name, result
return key, result

if allow_prefixes:
results = [(k, v) for (k, v) in six.iteritems(table)
if k.startswith(name)]
if k.startswith(key)]
if len(results) == 1:
return results[0]
elif len(results) > 1:
words = sorted(x[0] for x in results)
cmds = Join.join_words(words)
raise PrefixException('"%s" matches more than one: %s' %
(name, cmds))
raise PrefixException('"%s" is not valid' % (name))
(key, cmds))
raise PrefixException('"%s" is not valid' % (key))

def get(table, name, allow_prefixes=True):
try:
return get_prefix(table, name, allow_prefixes)
except PrefixException:
return None

def set_assignment(address, value, master, slave, unmapped_names=None):
def set_assignment(address, value, master, slave, unmapped_keys=None):
unmapped = False
names = address.split('.')
for i, name in enumerate(names):
keys = address.split('.')
for i, key in enumerate(keys):
if unmapped:
new_master = master.get(name, {})
new_master = master.get(key, {})
else:
name, new_master = get_prefix(master, name)
if i == len(names) - 1:
slave[name] = value
key, new_master = get_prefix(master, key)
if i == len(keys) - 1:
slave[key] = value
else:
master = new_master
slave = slave.setdefault(name, {})
if (not i) and unmapped_names and name in unmapped_names:
slave = slave.setdefault(key, {})
if (not i) and unmapped_keys and key in unmapped_keys:
unmapped = True
2 changes: 1 addition & 1 deletion code/python/echomesh/base/GetPrefix_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,5 +50,5 @@ def test_assignment_prefix(self):

def test_assignment_unmapped(self):
GetPrefix.set_assignment('new.foo', 23, MASTER, self.slave,
unmapped_names=set(['new']))
unmapped_keys=set(['new']))
self.assertEqual(self.slave, {'new': {'foo': 23}})
4 changes: 1 addition & 3 deletions code/python/echomesh/base/MergeSettings.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,6 @@
audio.input.enable=false light.enable=false
"""

FileSettings = namedtuple('FileSettings', 'file base edits changes')

class MergeSettings(object):
def __init__(self, settings):
self.settings = settings
Expand Down Expand Up @@ -139,7 +137,7 @@ def _assignment_to_settings(self, args, error):
try:
GetPrefix.set_assignment(
addr, value, base_settings, settings,
unmapped_names=Merge.SETTINGS_EXCEPTIONS)
unmapped_keys=Merge.SETTINGS_EXCEPTIONS)
except GetPrefix.PrefixException:
raise Exception('Can\'t understand settings address "%s"' %
addr)
Expand Down
18 changes: 9 additions & 9 deletions code/python/echomesh/base/Reconfigure.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,18 @@
from echomesh.base import Name
from echomesh.base import Path

def _make(name, tags, project, show_error, args):
Name.set_name(name)
Name.set_tags(tags)
Path.set_project_path(project_path=project, show_error=show_error)
def reconfigure(args):
def _make(name, tags, project, show_error):
Name.set_name(name)
Name.set_tags(tags)
Path.set_project_path(project_path=project, show_error=show_error)

DataFile.compute_command_path(force=True)
return MergeSettings.MergeSettings(args)
DataFile.compute_command_path(force=True)
return MergeSettings.MergeSettings(args)

def reconfigure(args):
# Read a settings file with a given name, tags, and project.
# First, make a settings with the default information.
merge_settings = _make(None, [], None, False, args)
merge_settings = _make(None, [], None, False)

# Now, use the name, tags and project to get the correct configuration.
get = merge_settings.settings.get
Expand All @@ -29,4 +29,4 @@ def reconfigure(args):
tags = [tags]

prompt = not get('execution', 'autostart')
return _make(name, tags, project, prompt, args)
return _make(name, tags, project, prompt)
5 changes: 4 additions & 1 deletion code/python/echomesh/util/dict/PersistentDict.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,10 @@ def set_filename(self, filename):
self._write()

def get_prefix(self, *args):
return GetPrefix.get(self, *args)
try:
return GetPrefix.get_prefix(self, *args)
except GetPrefix.PrefixException:
return None

def _write(self):
Yaml.write(self._filename, self)
Expand Down
22 changes: 22 additions & 0 deletions code/python/echomesh/util/string/Formatted.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
from __future__ import absolute_import, division, print_function, unicode_literals

class Formatted(object):
"""A base class for an object that is represented by formatting its own
__dict__. To use, derive from this class, then set a FORMAT member to be a
string suitable for use in format()."""

FORMAT = ''
MEMBERS = []
FORMAT_WITH_CLASS = True

def _formatted(self):
if not self.FORMAT:
self.FORMAT = ' '.join('%s={%s}' % (m, m) for m in self.MEMBERS)
return self.FORMAT.format(**self.__dict__)

def __str__(self):
return repr(self) if self.FORMAT_WITH_CLASS else self._formatted()

def __repr__(self):
cl = self.__class__
return '%s.%s(%s)' % (cl.__module__, cl.__name__, self._formatted())

0 comments on commit 0fe41bc

Please sign in to comment.