Skip to content

Support for node aliases lists. #25

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
# Copyright © 2007–13 martin f. krafft <madduck@madduck.net>
# Released under the terms of the Artistic Licence 2.0
#
PYFILES = $(shell find -name .git -o -name dist -o -name build -prune -o -name '*.py' -print)
PYFILES = $(shell find ./ -name .git -o -name dist -o -name build -prune -o -name '*.py' -print)

tests:
python ./run_tests.py
Expand Down
4 changes: 3 additions & 1 deletion reclass/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,12 @@
from output import OutputLoader
from storage.loader import StorageBackendLoader
from storage.memcache_proxy import MemcacheProxy
from storage.aliases_proxy import AliasesProxy

def get_storage(storage_type, nodes_uri, classes_uri, **kwargs):
storage_class = StorageBackendLoader(storage_type).load()
return MemcacheProxy(storage_class(nodes_uri, classes_uri, **kwargs))
aliases_proxy = AliasesProxy(storage_class(nodes_uri, classes_uri, **kwargs), nodes_uri)
return MemcacheProxy(aliases_proxy)


def output(data, fmt, pretty_print=False):
Expand Down
64 changes: 64 additions & 0 deletions reclass/storage/aliases_proxy.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
#
# -*- coding: utf-8 -*-
#
# This file is part of reclass (http://github.com/madduck/reclass)
#
# Copyright © 2007–14 martin f. krafft <madduck@madduck.net>
# Released under the terms of the Artistic Licence 2.0
#
import os
import sys

from reclass.storage import NodeStorageBase

STORAGE_NAME = 'alias_proxy'

def vvv(msg):
#print >>sys.stderr, msg
pass

class AliasesProxy(NodeStorageBase):

def __init__(self, real_storage, node_storage_uri, suffix=".aliases"):
name = '{0}({1})'.format(STORAGE_NAME, real_storage.name)
super(AliasesProxy, self).__init__(name)
self._real_storage = real_storage
self._suffix = suffix
self._mapping = self._find_aliases(node_storage_uri)

name = property(lambda self: self._real_storage.name)

def get_node(self, name, merge_base=None):
return self._lookup_node(name, self._real_storage.get_node)

def get_class(self, name):
return self._real_storage.get_class(name)

def enumerate_nodes(self):
return self._mapping.keys() + self._real_storage.enumerate_nodes()

def _find_aliases(self, node_storage_uri):
mapping = {}
for root, subFolders, files in os.walk(node_storage_uri):
vvv("Lookup for aliases at %s" % root)
for f in filter(lambda f: f.endswith(self._suffix), files):
target_node = os.path.basename(os.path.splitext(f)[0])
vvv("Reading %s for %s" % (f, target_node))
with open(os.path.join(node_storage_uri, f), 'r') as fin:
for alias in fin:
alias = alias.rstrip()
vvv("%s=>%s" % (alias, target_node))
mapping[alias] = target_node
return mapping

def _lookup_node(self, name, getter):

try:
ret = self._mapping[name]
vvv("Found alias for %s => %s" % (name, ret))

except KeyError, e:
ret = name

return getter(ret)