Skip to content

Commit

Permalink
Add meta class for build steps.
Browse files Browse the repository at this point in the history
  • Loading branch information
alenz33 committed Mar 20, 2015
1 parent 096697f commit c2585d4
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 2 deletions.
4 changes: 2 additions & 2 deletions conduct.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,8 +92,8 @@ def main(argv=None):
BuildStep('s1', {}).build()
BuildStep('s2', {}).build()
BuildStep('s3', {}).build()
#bs = CopyBS('copysth', {})
#bs.build()
bs = CopyBS('copysth', {})
bs.build()
except Exception as e:
conduct.log.exception(e)
conduct.log.error('')
Expand Down
63 changes: 63 additions & 0 deletions conduct/buildsteps.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,80 @@
#
# *****************************************************************************

import pprint

import conduct
from conduct.util import systemCall
from conduct.loggers import LOGLEVELS
from conduct.param import Parameter, oneof


class BuildStepMeta(type):
'''
Meta class for merging parameters and outparameters within the
inheritance tree.
'''

def __new__(mcls, name, bases, attrs):

mcls._mergeDictAttr('parameters', bases, attrs)
mcls._mergeDictAttr('outparameters', bases, attrs)

mcls._createProperties(attrs['parameters'], attrs)
mcls._createProperties(attrs['outparameters'], attrs)

cls = type.__new__(mcls, name, bases, attrs)

return cls

@classmethod
def _mergeDictAttr(mcls, name, bases, attrs):
attr = {}

for base in bases:
if hasattr(base, name):
attr.update(getattr(base, name))

attr.update(attrs.get(name, {}))

attrs[name] = attr

@classmethod
def _createProperties(mcls, paramDict, attrs):
for name, definition in paramDict.iteritems():
mcls._createProperty(name, definition, attrs)


@classmethod
def _createProperty(mcls, paramName, paramDef, attrs):
def readFunc(self):
return self._params[paramName]
readFunc.__name__ = '_readParam%s' % paramName.capitalize()

def writeFunc(self, value):
try:
self._params[paramName] = paramDef.type(value)
except ValueError as e:
raise ValueError('Cannot set %s: %s' % (paramName, e))
writeFunc.__name__ = '_writeParam%s' % paramName.capitalize()

attrs[paramName] = property(readFunc, writeFunc)






class BuildStep(object):
__metaclass__ = BuildStepMeta

parameters = {
'loglevel' : Parameter(type=oneof(LOGLEVELS.keys()), helpStr='Log level', default='info'),
}

outparameters = {
}

def __init__(self, name, paramCfg):
self._paramCfg = paramCfg

Expand Down

0 comments on commit c2585d4

Please sign in to comment.