configurationengine/source/cone/public/utils.py
author m2lahtel
Thu, 21 Oct 2010 16:36:53 +0300
changeset 5 d2c80f5cab53
parent 3 e7e0ae78773e
permissions -rw-r--r--
Updated to version 1.2.14
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     1
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     2
# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     3
# All rights reserved.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     4
# This component and the accompanying materials are made available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     5
# under the terms of "Eclipse Public License v1.0"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     6
# which accompanies this distribution, and is available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     7
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     8
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     9
# Initial Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    10
# Nokia Corporation - initial contribution.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    11
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    12
# Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    13
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    14
# Description: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    15
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    16
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    17
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    18
import os
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    19
import re
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    20
import posixpath
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    21
import StringIO
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    22
import tokenize
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    23
import inspect
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    24
import traceback
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    25
import logging
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    26
import shlex
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    27
from xml.parsers import expat
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    28
import imghdr
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    29
from token import ENDMARKER, NAME, NUMBER, STRING
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    30
from cone.public import exceptions
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    31
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    32
import _etree_wrapper
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    33
etree = _etree_wrapper.ElementTreeWrapper()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    34
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    35
class resourceref(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    36
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    37
    Class container for set of resource reference related functions
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    38
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    39
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    40
    def filter_resources(cls, resources, regexp):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    41
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    42
        Filter out all resources that do not match the given regexp
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    43
        @return a array of resources that match the given resource
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    44
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    45
        test = re.compile(regexp, re.IGNORECASE)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    46
        return [r for r in resources if test.search(r)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    47
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    48
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    49
    def neg_filter_resources(cls, resources, regexp):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    50
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    51
        Filter out all resources that do match the given regexp
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    52
        @return a array of resources that dont match the given resource
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    53
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    54
        test = re.compile(regexp, re.IGNORECASE)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    55
        return [r for r in resources if not test.search(r)]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    56
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    57
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    58
    def insert_begin_slash(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    59
        if not ref.startswith('/'): 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    60
            return '/' + ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    61
        return ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    62
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    63
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    64
    def remove_begin_slash(cls, ref):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    65
        while ref.startswith('/'): 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    66
            ref = ref.replace('/', '', 1)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    67
        return ref
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    68
    
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    69
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    70
    def remove_end(self, path, str):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    71
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    72
            (ret, sep, rest) = path.partition(str)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    73
            return ret
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    74
        except ValueError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    75
            return path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    76
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    77
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    78
    def add_end_slash(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    79
        if not ref.endswith('/'): 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    80
            return ref+'/'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    81
        return ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    82
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    83
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    84
    def remove_end_slash(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    85
        if ref.endswith('/'): 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    86
            return ref[:-1]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    87
        return ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    88
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    89
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    90
    def norm(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    91
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    92
        Normalize the reference to common cone form. 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    93
        1. Always with forward slashes 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    94
        2. no beginning slash
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    95
        3. no end slash
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    96
        @return: A normalized reference string
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    97
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    98
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    99
        # Do not modify emtpy string at all
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   100
        if not ref == '':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   101
            normref = os.path.normpath(ref)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   102
            normref = normref.replace('\\','/').replace('"','')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   103
            normref = posixpath.normpath(normref)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   104
            normref = normref.rstrip('\\/')
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   105
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   106
            normref = ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   107
        return normref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   108
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   109
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   110
    def replace_dir(cls, ref, frompart, topart):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   111
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   112
        Replace a part of directory beginning from ref.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   113
        @param ref: the resource reference
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   114
        @param frompart: the part of directory name to be replaced
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   115
        @param topart: the partial name which replaces the frompart
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   116
        @return: a refenence with forward slashes
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   117
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   118
        # Normalize all paths and replace the name with string replace
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   119
        # 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   120
        normref = cls.norm(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   121
        normfrom = cls.norm(frompart)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   122
        normto = cls.norm(topart)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   123
        # Add the end slash to from and to as it should be a dir (if not empty)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   124
        if normto != "": normto = cls.add_end_slash(normto)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   125
        if normfrom != "": normfrom = cls.add_end_slash(normfrom)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   126
        if normref != "": normref = cls.add_end_slash(normref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   127
        retref = cls.norm(normref.replace(normfrom, normto, 1))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   128
        if retref  != "": retref = cls.remove_end_slash(retref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   129
        return retref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   130
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   131
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   132
    def join_refs(cls, refs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   133
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   134
        join a list of dotted references together with dots
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   135
        1. ignore empty refs
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   136
        2. no dot include begin dot
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   137
        3. no dot include end dot
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   138
        @param refs: a list of references
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   139
        @return: A normalized dotted reference
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   140
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   141
        # Create a copy of references without any empty strings
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   142
        import posixpath
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   143
        paramdict = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   144
        retref = posixpath.join(*refs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   145
        #retref = "/".join([ref for ref in refs if ref != ''])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   146
        #subs = re.sub('/+', '/', retref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   147
        return retref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   148
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   149
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   150
    def split_ref(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   151
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   152
        Replace a part of directory beginning from ref.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   153
        @param ref: the resource reference
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   154
        @return: a list of path elems
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   155
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   156
        return [r for r in ref.split('/') if r]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   157
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   158
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   159
    def psplit_ref(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   160
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   161
        pop split that splits the last element of the array 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   162
        1. empty ref returns an empty list
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   163
        @param ref: a resource references string (e.g. aaa/bbb/ccc.txt)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   164
        @return: A tuple of references (with given param ('aaa/bbb','ccc.txt')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   165
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   166
        refs = ref.rsplit('/', 1)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   167
        return ("".join(refs[0:-1]), refs[-1])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   168
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   169
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   170
    def remove_ext(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   171
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   172
        Remove file extension from ref 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   173
        1. remove file extension
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   174
        @return: a reference. E.g. (foo/test.confml) => foo/test
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   175
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   176
        filenameparts = cls.get_filename(ref).rsplit('.', 1)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   177
        path = cls.get_path(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   178
        if len(filenameparts)==2 and filenameparts[0] != "":
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   179
            return cls.join_refs([path, filenameparts[0]])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   180
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   181
            return ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   182
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   183
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   184
    def get_ext(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   185
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   186
        get file extension from ref 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   187
        1. get file extension
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   188
        @return: a reference. E.g. (foo/test.confml) => confml
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   189
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   190
        if len(ref.rsplit('.', 1)) == 2: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   191
            return ref.rsplit('.', 1)[1]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   192
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   193
            return ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   194
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   195
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   196
    def get_filename(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   197
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   198
        get file name part from ref 
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   199
        1. get file name
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   200
        @return: a reference. E.g. (foo/test.confml) => test.confml
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   201
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   202
        return ref.rsplit('/', 1)[-1]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   203
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   204
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   205
    def get_path(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   206
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   207
        get path part from ref 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   208
        1. get path from ref
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   209
        @return: a reference. E.g. (foo/test.confml) => foo
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   210
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   211
        if len(ref.rsplit('/', 1)) == 2: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   212
            return ref.rsplit('/', 1)[0]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   213
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   214
            return ""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   215
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   216
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   217
    def to_dottedref(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   218
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   219
        Convert a resource ref to dotted ref 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   220
        1. remove file extension
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   221
        2. convert path delims to dots
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   222
        @return: a dotted reference. E.g. (foo/test.confml) => foo_test
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   223
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   224
        newref = cls.remove_ext(ref).replace('/', '_').replace(' ', '_')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   225
        return dottedref.remove_begin_dot(newref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   226
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   227
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   228
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   229
    def to_objref(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   230
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   231
        Convert a resource ref to dotted ref 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   232
        1. remove file extension
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   233
        2. convert path delims to dots
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   234
        3. using double underscores for directory separation
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   235
        @return: a dotted reference. E.g. (foo/test.confml) => foo_test
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   236
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   237
        ref = ref.replace('/', '__')
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   238
        # Change the python comment character also as underscore so that the tokenizer 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   239
        # does not leave anything out
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   240
        ref = ref.replace('#', '_')
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   241
        newref = ''
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   242
        first_token = True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   243
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   244
            for toknum, tokval, spos, epos, _ in tokenize.generate_tokens(StringIO.StringIO(unicode(ref)).readline):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   245
                if toknum == ENDMARKER:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   246
                    break
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   247
                elif toknum == NAME:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   248
                    newref += str(tokval)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   249
                elif toknum == NUMBER:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   250
                    # Add a character before the number token if the first token is a number
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   251
                    if first_token:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   252
                        newref += '_'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   253
                    # replace a possible dot in number .123
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   254
                    newref += str(tokval.replace('.','_'))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   255
                elif toknum == STRING:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   256
                    newref += str(tokval.replace('"', ''))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   257
                else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   258
                    newref += '_'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   259
                # After first round set the first token to false
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   260
                first_token = False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   261
        except tokenize.TokenError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   262
            pass
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   263
        return newref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   264
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   265
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   266
    def to_dref(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   267
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   268
        Convert a resource ref to dotted ref 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   269
        1. remove file extension
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   270
        2. convert path delims to dots
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   271
        @return: a dotted reference. E.g. (foo/test.confml) => foo.test
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   272
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   273
        return dottedref.remove_begin_dot(cls.remove_ext(ref).replace('/','.'))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   274
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   275
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   276
    def to_hash(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   277
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   278
        Convert a resource ref to to hash 32 bit integer
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   279
        @return: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   280
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   281
        return "%s" % hex(hash(ref))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   282
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   283
    @classmethod
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   284
    def is_path(cls, ref):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   285
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   286
        returns true if the ref seems like a path
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   287
        @return: Boolean value [True|False]
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   288
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   289
        if cls.get_ext(ref) or cls.get_path(ref):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   290
            return True
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   291
        return False
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   292
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   293
class dottedref(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   294
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   295
    Class container for set of dotted reference related functions
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   296
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   297
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   298
    def join_refs(cls, refs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   299
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   300
        join a list of dotted references together with dots
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   301
        1. ignore empty refs
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   302
        2. no dot include begin dot
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   303
        3. no dot include end dot
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   304
        @param refs: a list of references
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   305
        @return: A normalized dotted reference
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   306
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   307
        # Create a dotted reference without any empty strings
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   308
        return '.'.join([ref for ref in refs if ref.strip()])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   309
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   310
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   311
    def split_ref(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   312
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   313
        split a dotted references string to a list of ref elements
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   314
        1. empty ref returns an empty list
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   315
        @param ref: a dotted references string (e.g. aaa.bbb.ccc)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   316
        @return: A list of references (with given param ['aaa','bbb','ccc']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   317
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   318
        # list of reference parts without any empty strings
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   319
        return [r for r in ref.split('.') if r]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   320
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   321
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   322
    def psplit_ref(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   323
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   324
        pop split that splits the last element of the array 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   325
        1. empty ref returns an empty list
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   326
        @param ref: a dotted references string (e.g. aaa.bbb.ccc)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   327
        @return: A tuple of references (with given param ('aaa.bbb','ccc')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   328
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   329
        refs = ref.rsplit('.', 1)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   330
        return ("".join(refs[0:-1]), refs[-1])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   331
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   332
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   333
    def remove_last(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   334
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   335
        removes the last element of the ref 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   336
        1. empty ref returns an empty list
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   337
        @param ref: a dotted references string (e.g. aaa.bbb.ccc)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   338
        @return: A reference (with given param ('aaa.bbb')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   339
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   340
        return ref.rsplit('.', 1)[0]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   341
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   342
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   343
    def get_last(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   344
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   345
        returns the last element of the ref 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   346
        1. empty ref returns an empty string
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   347
        @param ref: a dotted references string (e.g. aaa.bbb.ccc)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   348
        @return: A reference (with given param ('ccc')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   349
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   350
        return ref.rsplit('.', 1)[-1]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   351
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   352
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   353
    def get_name(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   354
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   355
        returns the last element of the ref 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   356
        1. empty ref returns an empty string
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   357
        @param ref: a dotted references string (e.g. aaa.bbb.ccc)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   358
        @return: A reference (with given param ('ccc')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   359
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   360
        if re.match('^(.*)\[.*\]$', ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   361
            return re.match('^(.*)\[.*\]$', ref).group(1)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   362
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   363
            return ref
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   364
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   365
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   366
    def get_index(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   367
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   368
        returns the last element of the ref 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   369
        1. empty ref returns an empty string
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   370
        @param ref: a dotted references string (e.g. aaa.bbb.ccc)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   371
        @return: A reference (with given param ('ccc')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   372
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   373
        if re.match('^.*\[(\d+)\]$', ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   374
            return int( re.match('^.*\[(\d+)\]$', ref).group(1) )
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   375
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   376
            return None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   377
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   378
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   379
    def remove_begin_dot(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   380
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   381
        removes all the dots from the begin of the ref 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   382
        @param ref: a dotted references string (e.g. .aaa.bbb.ccc)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   383
        @return: A reference (with given param ('aaa.bbb.ccc')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   384
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   385
        return ref.lstrip('.')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   386
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   387
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   388
    def ref2filter(cls, ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   389
        elems = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   390
        for refelem in dottedref.split_ref(ref):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   391
            if refelem == "**":
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   392
                elems.append(".*")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   393
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   394
                elems.append(refelem.replace("*","[^\.]*"))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   395
        return "\\.".join(elems)+"$"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   396
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   397
    @classmethod
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   398
    def has_wildcard(cls, ref):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   399
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   400
        Tests if the ref has any wildcards '*' in it.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   401
        @return: Boolean value. True when wildcards are found.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   402
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   403
        return ref.find('*') != -1
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   404
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   405
    @classmethod
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   406
    def get_static_ref(cls, ref):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   407
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   408
        Checks if the ref has any wildcards and return the non wildcard part of ref.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   409
        @return: string.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   410
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   411
        retparts = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   412
        for part in cls.split_ref(ref):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   413
            if cls.has_wildcard(part):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   414
                break
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   415
            else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   416
                retparts.append(part)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   417
        return ".".join(retparts)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   418
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   419
def extract_delimited_tokens(string, delimiters=('${', '}')):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   420
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   421
    Return a list of all tokens delimited by the given strings in the given string.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   422
    This function returns basically the first row of the result of
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   423
    extract_delimited_token_tuples(), with duplicates removed.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   424
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   425
    >>> dottedref.extract_refs("test1 ${my.ref1} test2 ${ my.ref1 } ${my.ref2}")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   426
    ['my.ref1', 'my.ref2']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   427
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   428
    ref_tuples = extract_delimited_token_tuples(string, delimiters)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   429
    return distinct_array([u'%s' % ref for ref, raw_ref in ref_tuples])
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   430
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   431
def extract_delimited_token_tuples(string, delimiters=('${', '}')):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   432
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   433
    Extract a list of (token, raw_token) tuples from the given string.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   434
    'token' is the the token extracted from the string and trimmed (surrounding
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   435
    whitespace removed), and raw_token is the unmodified match from the
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   436
    string, which can be used for replacing.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   437
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   438
    >>> dottedref.extract_ref_tuples("test1 ${my.ref1} test2 ${ my.ref1 } ${my.ref2}")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   439
    [('my.ref1', '${my.ref1}'), ('my.ref1', '${ my.ref1 }'), ('my.ref2', '${my.ref2}')]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   440
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   441
    pattern = '%s.*?%s' % (re.escape(delimiters[0]), re.escape(delimiters[1]))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   442
    matches = distinct_array(re.findall(pattern, string, re.DOTALL))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   443
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   444
    result = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   445
    for match in matches:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   446
        ref = match[len(delimiters[0]):-len(delimiters[1])].strip()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   447
        result.append((ref, match))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   448
    return result
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   449
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   450
def expand_delimited_tokens(string, expander_func, delimiters=('${', '}')):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   451
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   452
    Expand all tokens in the given string using the given expander function.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   453
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   454
    @param string: The string to expand.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   455
    @param expander_func: The function used for expanding. Should take two parameters:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   456
        1 - The token to expand.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   457
        2 - The index of the token in the string.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   458
    @param delimiters: Tuple specifying the delimiters for tokens.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   459
    @return: The expanded string.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   460
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   461
    # Collect a dictionary of token-entry pairs
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   462
    class Entry(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   463
        pass
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   464
    tokens = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   465
    for index, (token, raw_token) in enumerate(extract_delimited_token_tuples(string, delimiters)):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   466
        if token not in tokens:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   467
            entry = Entry()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   468
            entry.index = index
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   469
            entry.raw_tokens = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   470
            entry.value = unicode(expander_func(token, index))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   471
            tokens[token] = entry
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   472
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   473
            entry = tokens[token]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   474
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   475
        entry.raw_tokens.append(raw_token)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   476
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   477
    # Replace all tokens with the expanded values
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   478
    result = string
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   479
    for entry in tokens.itervalues():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   480
        for raw_token in entry.raw_tokens:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   481
            result = result.replace(raw_token, entry.value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   482
    return result
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   483
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   484
def expand_refs_by_default_view(string, default_view, delimiters=('${', '}'), default_value_for_missing='',
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   485
                                catch_not_found=True):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   486
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   487
    Convenience function for expanding the refs in a string using setting values.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   488
    @param default_value_for_missing: The default value used if a setting for
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   489
        a reference cannot be found. Has no effect if catch_not_found is False.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   490
    @param catch_not_found: If True, the NotFound exception raised when a setting
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   491
        is not found is caught and the value of default_value_for_missing is inserted
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   492
        in its place.
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   493
    @return: The expanded string.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   494
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   495
    def expand(ref, index):
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   496
        if catch_not_found:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   497
            try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   498
                return default_view.get_feature(ref).get_original_value()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   499
            except exceptions.NotFound:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   500
                logging.getLogger('cone').error("Feature '%s' not found" % ref)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   501
                return default_value_for_missing
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   502
        else:
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   503
            return default_view.get_feature(ref).get_original_value()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   504
    return expand_delimited_tokens(string, expand, delimiters)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   505
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   506
def distinct_array(arr):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   507
    newarray = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   508
    for val in arr:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   509
        try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   510
            # test to see whether the value already is in thearray
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   511
            newarray.index(val)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   512
        except ValueError:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   513
            newarray.append(val)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   514
    return newarray
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   515
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   516
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   517
def list_files(path):    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   518
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   519
    Get an array of files in a folder
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   520
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   521
    retarray = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   522
    # Walk through all files in the layer
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   523
    path = os.path.abspath(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   524
    for root, dirs, files in os.walk(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   525
        for name in files:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   526
            entry = os.path.join(root, name)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   527
            entry = os.path.normpath(os.path.abspath(entry))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   528
            if os.path.isfile(entry):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   529
                retarray.append(entry)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   530
    return retarray
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   531
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   532
def all_subclasses(classname):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   533
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   534
    @return: A list of all subclasses of classname
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   535
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   536
    subclasses = classname.__subclasses__()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   537
    # Create copy of the subclasses list for the iteration, 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   538
    # so that added items are not recursed again
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   539
    for subclass in classname.__subclasses__():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   540
        subclasses += all_subclasses(subclass)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   541
    return subclasses
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   542
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   543
def pathmatch(pattern, refpath):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   544
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   545
    Check for matching pattern for a ref path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   546
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   547
    filter = dottedref.ref2filter(pattern)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   548
    return re.match(filter, refpath) != None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   549
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   550
def filter(obj, filters):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   551
    for filter in filters:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   552
        if not filter(obj):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   553
            return False
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   554
    return True
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   555
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   556
def get_list(elem):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   557
    if not isinstance(elem, list):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   558
        return [elem]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   559
    else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   560
        return elem
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   561
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   562
def add_list(elem, add):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   563
    retlist = get_list(elem)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   564
    retlist.append(add)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   565
    return retlist
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   566
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   567
def prepend_list(elem, prepend):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   568
    retlist = get_list(elem)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   569
    retlist.insert(0, prepend)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   570
    return retlist
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   571
5
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   572
def iter_flatten(iterable):
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   573
    for item in iterable:
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   574
        if isinstance(item, (list, tuple)):
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   575
            for subitem in flatten_list(item):
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   576
                yield subitem
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   577
        else:
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   578
            yield item
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   579
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   580
def flatten_list(lst):
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   581
    """
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   582
    Flatten a list or tuple.
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   583
    @param lst: The list of tuple to flatten.
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   584
    @return: The flattened list.
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   585
    
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   586
    >>> flatten_list([1, 2, [3, [4, 5]], [6]])
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   587
    [1, 2, 3, 4, 5, 6]
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   588
    """
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   589
    return [item for item in iter_flatten(lst)]
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   590
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   591
def is_list(elem):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   592
    return isinstance(elem, list)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   593
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   594
def is_float(value):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   595
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   596
    Test if the fiven value (which can be a string) is a floating point value. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   597
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   598
    fvalue = float(value)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   599
    ivalue = int(fvalue)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   600
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   601
    return (fvalue - ivalue) != 0
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   602
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   603
def get_class(modelinstance, classinstance):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   604
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   605
    Get the actual model specific implementation class for a classinstance
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   606
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   607
    for attr in dir(modelinstance):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   608
        modelclass = getattr(modelinstance, attr)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   609
        if inspect.isclass(modelclass): 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   610
            if issubclass(modelclass, classinstance):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   611
                return modelclass
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   612
    return classinstance
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   613
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   614
class OProperty(object):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   615
    """Based on the emulation of PyProperty_Type() in Objects/descrobject.c
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   616
    from http://infinitesque.net/articles/2005/enhancing%20Python%27s%20property.xhtml"""
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   617
    def __init__(self, fget=None, fset=None, fdel=None, doc=None):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   618
        self.fget = fget
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   619
        self.fset = fset
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   620
        self.fdel = fdel
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   621
        self.__doc__ = doc
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   622
 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   623
    def __get__(self, obj, objtype=None):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   624
        if obj is None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   625
            return self
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   626
        if self.fget is None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   627
            raise AttributeError, "unreadable attribute"
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   628
        if self.fget.__name__ == '<lambda>' or not self.fget.__name__:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   629
            return self.fget(obj)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   630
        else:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   631
            return getattr(obj, self.fget.__name__)()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   632
 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   633
    def __set__(self, obj, value):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   634
        if self.fset is None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   635
            raise AttributeError, "can't set attribute"
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   636
        if self.fset.__name__ == '<lambda>' or not self.fset.__name__:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   637
            self.fset(obj, value)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   638
        else:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   639
            getattr(obj, self.fset.__name__)(value)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   640
 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   641
    def __delete__(self, obj):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   642
        if self.fdel is None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   643
            raise AttributeError, "can't delete attribute"
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   644
        if self.fdel.__name__ == '<lambda>' or not self.fdel.__name__:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   645
            self.fdel(obj)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   646
        else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   647
            getattr(obj, self.fdel.__name__)()
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   648
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   649
class xml(object):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   650
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   651
    Class container for set of XML-related helper functions.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   652
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   653
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   654
    @classmethod
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   655
    def split_tag_namespace(cls, xml_tag):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   656
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   657
        Split the given XML tag into a (namespace, tag) tuple.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   658
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   659
        >>> ReaderBase._split_tag_namespace("test")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   660
        (None, 'test')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   661
        >>> ReaderBase._split_tag_namespace("{http://www.test.com/xml/1}test")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   662
        ('http://www.test.com/xml/1', 'test')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   663
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   664
        if xml_tag.startswith('{'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   665
            parts = xml_tag[1:].split('}')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   666
            return (parts[0], parts[1])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   667
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   668
            return (None, xml_tag)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   669
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   670
    @classmethod
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   671
    def get_xml_root(cls, resource):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   672
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   673
        Get a (namespace, tag) tuple of the root element in the XML data
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   674
        read from the given resource.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   675
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   676
        @param resource:  The resource from which to read data. Should be a
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   677
            file-like object (i.e. should have a read() method).
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   678
        @return: A (namespace, tag) tuple. Note that the namespace may
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   679
            be None.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   680
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   681
        @raise exceptions.XmlParseError: The resource contains invalid XML data.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   682
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   683
        class RootElementFound(RuntimeError):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   684
            def __init__(self, root_name):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   685
                self.root_name = root_name
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   686
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   687
        def handle_start(name, attrs):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   688
            raise RootElementFound(name)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   689
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   690
        p = expat.ParserCreate(namespace_separator=':')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   691
        p.StartElementHandler = handle_start
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   692
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   693
        BUFSIZE = 128
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   694
        while True:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   695
            data = resource.read(BUFSIZE)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   696
            try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   697
                p.Parse(data, len(data) < BUFSIZE)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   698
            except RootElementFound, e:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   699
                parts = e.root_name.rsplit(':', 1)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   700
                if len(parts) > 1:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   701
                    return parts[0], parts[1]
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   702
                else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   703
                    return None, parts[0]
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   704
            except expat.ExpatError, e:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   705
                raise exceptions.XmlParseError(
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   706
                    "XML parse error on line %d: %s" % (e.lineno, e),
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   707
                    e.lineno, str(e))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   708
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   709
def update_dict(todict, fromdict):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   710
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   711
    Merges the elements of two dictionaries together.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   712
    @param todict: the target dictionary where data is merged. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   713
    @param fromdict: the source dict where data is read 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   714
    @return: the modified todict.  
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   715
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   716
    for key in fromdict:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   717
        todict.setdefault(key, []).extend(fromdict[key])
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   718
    return todict
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   719
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   720
def log_exception(logger, msg, msg_level=logging.ERROR, traceback_level=logging.DEBUG):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   721
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   722
    Log an exception so that the given message and the exception's
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   723
    traceback are logged separately with the given log levels.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   724
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   725
    The purpose is to print minimal information to the user when running
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   726
    the CLI (default level for STDOUT logging is WARNING), but the traceback
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   727
    should still be available in the log file (which uses the level DEBUG
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   728
    by default).
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   729
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   730
    Note that this function should be only used in an exception handler.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   731
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   732
    logger.log(msg_level, msg)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   733
    logger.log(traceback_level, traceback.format_exc())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   734
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   735
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   736
def grep(string,list):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   737
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   738
    Grep throught the items in the given list to find matching entries. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   739
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   740
    expr = re.compile(string)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   741
    return filter(expr.search,list)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   742
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   743
def grep_tuple(string,list):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   744
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   745
    Grep throught the items in the given list to find matching entries. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   746
    @return: a list of tuples (index,text) 
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   747
    """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   748
    results = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   749
    expr = re.compile(string)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   750
    for (index,text) in enumerate(list):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   751
        match = expr.search(text)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   752
        if match != None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   753
            results.append((index,match.string))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   754
    return results
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   755
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   756
def grep_dict(string,list):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   757
    """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   758
    Grep throught the items in the given list to find matching entries. 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   759
    @return: a dictionary with list index as key and matching text as value.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   760
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   761
    results = {}
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   762
    expr = re.compile(string)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   763
    for (index,text) in enumerate(list):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   764
        match = expr.search(text)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   765
        if match != None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   766
            results[index]  = match.string
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   767
    return results
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   768
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   769
def cmdsplit(s, comments=False, os_name='nt'):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   770
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   771
    Copy of shlex split method to allow parsing of command line parameters in operating system specific mode.
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   772
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   773
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   774
    posix = True
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   775
    lex = shlex.shlex(s, posix=posix)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   776
    lex.whitespace_split = True
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   777
    if not comments:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   778
        lex.commenters = ''
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   779
    if os_name == 'nt':
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   780
        lex.escape = '^'
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   781
    return list(lex)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   782
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   783
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   784
import sys
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   785
sys_version = "%d.%d" % (sys.version_info[0],sys.version_info[1])
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   786
if sys_version >= "2.6":
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   787
    def relpath(path, start=os.curdir):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   788
        return os.path.relpath(path, start)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   789
else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   790
    def relpath(path, start=os.curdir):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   791
        """Return a relative version of a path"""
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   792
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   793
        if not path:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   794
            raise ValueError("no path specified")
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   795
        start_list = os.path.abspath(start).split(os.sep)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   796
        path_list = os.path.abspath(path).split(os.sep)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   797
        if start_list[0].lower() != path_list[0].lower():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   798
            unc_path, rest = os.path.splitunc(path)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   799
            unc_start, rest = os.path.splitunc(start)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   800
            if bool(unc_path) ^ bool(unc_start):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   801
                raise ValueError("Cannot mix UNC and non-UNC paths (%s and %s)"
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   802
                                                                    % (path, start))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   803
            else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   804
                raise ValueError("path is on drive %s, start on drive %s"
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   805
                                                    % (path_list[0], start_list[0]))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   806
        # Work out how much of the filepath is shared by start and path.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   807
        for i in range(min(len(start_list), len(path_list))):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   808
            if start_list[i].lower() != path_list[i].lower():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   809
                break
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   810
        else:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   811
            i += 1
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   812
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   813
        rel_list = [os.pardir] * (len(start_list)-i) + path_list[i:]
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   814
        if not rel_list:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   815
            return os.curdir
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   816
        return os.path.join(*rel_list)