Source code for sardana.macroserver.macros.lists

#!/usr/bin/env python

##############################################################################
##
# This file is part of Sardana
##
# http://www.sardana-controls.org/
##
# Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
##
# Sardana is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
##
# Sardana is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Lesser General Public License for more details.
##
# You should have received a copy of the GNU Lesser General Public License
# along with Sardana.  If not, see <http://www.gnu.org/licenses/>.
##
##############################################################################

"""This is the lists macro module"""


__all__ = ["ls0d", "ls1d", "ls2d", "lsa", "lscom", "lsct", "lsctrl",
           "lsctrllib", "lsdef", "lsexp", "lsi", "lsior", "lsm", "lsmeas",
           "lsp", "lspc", "lspm", "lsmac", "lsmaclib", "lstg"]

__docformat__ = 'restructuredtext'

from taurus.console import Alignment
from taurus.console.list import List
from sardana.macroserver.macro import Macro, Type, ViewOption

Left, Right, HCenter = Alignment.Left, Alignment.Right, Alignment.HCenter

#~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
# List of elements related macros
#~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-


class _ls(Macro):
    # TODO: duplication of the default value definition is a workaround
    # for #427. See commit message cc3331a for more details.
    param_def = [
        ['filter', [['filter', Type.String, ".*",
                     'a regular expression filter'], {'min': 1}],
         [".*"], 'a regular expression filter'],
    ]

    def get_column_names(self):
        cols = []
        for col in self.cols:
            if isinstance(col, tuple):
                col = col[0]
            cols.append(col)
        return cols

    def get_column_members(self):
        cols = []
        for col in self.cols:
            if isinstance(col, tuple):
                col = col[1]
            cols.append(col.lower())
        return cols

    def run(self, *filter):
        self.warning('This macro is not intended to be executed directly by '
                     'the user')
        return


[docs] class lsdef(_ls): """List all macro definitions""" cols = 'Name', 'Module', 'Brief Description' width = -1, -1, -1 align = Right, Right, Left
[docs] def run(self, filter): # TODO: passing a list causes TypeError: unhashable type: 'list' # uncomment it when bug-473 is fixed: # https://sourceforge.net/p/sardana/tickets/473/ filter = filter[0] cols = self.get_column_names() out = List(cols, text_alignment=self.align, max_col_width=self.width) for m in self.getMacros(filter): if m.name.startswith("_"): continue desc_length = self.getViewOption(ViewOption.DescriptionLength) description = m.get_brief_description(max_chars=desc_length) if len(description) < 61: out.appendRow([m.name, m.module_name, description]) else: out.appendRow([m.name, m.module_name, description[0:60]]) for i in range(1, len(description)/60 + 1): out.appendRow(["", "", description[60*i:60*(i+1)]]) for line in out.genOutput(): self.output(line)
class _lsobj(_ls): subtype = Macro.All cols = 'Name', 'Type', 'Controller', 'Axis' # , 'State' width = -1, -1, -1, -1 # , -1 align = Right, Right, Right, Right # , Right show_overwritten_msg = False def objs(self, filter): return self.findObjs(filter, type_class=self.type, subtype=self.subtype, reserve=False) def obj2Row(self, o, cols=None): cols = cols or self.get_column_members() ret = [] for col in cols: if col == 'controller': value = self.getController(o.controller).name elif col == 'name': isoverwritten = getattr(o, "isoverwritten", False) value = getattr(o, col) if isoverwritten is True: value = "[*] " + value if self.show_overwritten_msg is False: self.show_overwritten_msg = True else: value = getattr(o, col) if value is None: value = '-----' ret.append(value) return ret def run(self, filter): objs = self.objs(filter) nb = len(objs) if nb == 0: if self.subtype is Macro.All: if isinstance(self.type, str): t = self.type.lower() else: t = ", ".join(self.type).lower() else: t = self.subtype.lower() self.output('No %ss defined' % t) return cols = self.get_column_names() out = List(cols, text_alignment=self.align, max_col_width=self.width) objs.sort() for obj in objs: try: out.appendRow(self.obj2Row(obj)) except: pass for line in out.genOutput(): self.output(line) if (self.show_overwritten_msg is True and hasattr(self, "overwritten_msg")): self.warning(self.overwritten_msg)
[docs] class lsp(_lsobj): """Lists all pools""" cols = 'Name', 'Default' width = -1, -1 align = Right, HCenter type = Type.Pool
[docs] def prepare(self, filter, **opts): try: self.def_pool = self.getEnv('DefaultPool').lower() or None except: self.def_pool = None
def obj2Row(self, o): if self.def_pool and (o.getName().lower() == self.def_pool): default = '*' else: default = ' ' return o.name, default
[docs] class lsm(_lsobj): """Lists all motors""" type = Type.Moveable
[docs] class lspm(lsm): """Lists all existing motors""" subtype = 'PseudoMotor'
[docs] class lscom(_lsobj): """Lists all communication channels""" type = Type.ComChannel
[docs] class lsior(_lsobj): """Lists all IORegisters""" type = Type.IORegister
[docs] class lsexp(_lsobj): """Lists all experiment channels""" type = Type.ExpChannel
[docs] class lsct(lsexp): """Lists all Counter/Timers""" subtype = 'CTExpChannel'
[docs] class ls0d(lsexp): """Lists all 0D experiment channels""" subtype = 'ZeroDExpChannel'
[docs] class ls1d(lsexp): """Lists all 1D experiment channels""" subtype = 'OneDExpChannel'
[docs] class ls2d(lsexp): """Lists all 2D experiment channels""" subtype = 'TwoDExpChannel'
[docs] class lspc(lsexp): """Lists all pseudo counters""" subtype = 'PseudoCounter'
[docs] class lstg(_lsobj): """Lists all trigger/gate elements""" type = Type.TriggerGate
[docs] class lsctrllib(_lsobj): """Lists all existing controller classes""" type = Type.ControllerClass cols = 'Name', ('Type', 'main_type'), ('Library', 'module'), ('Family', 'gender')
[docs] class lsctrl(_lsobj): """Lists all existing controllers""" type = Type.Controller cols = 'Name', ('Type', 'main_type'), ('Class', 'klass'), 'Module'
[docs] class lsi(_lsobj): """Lists all existing instruments""" type = Type.Instrument cols = 'Name', ('Class', 'klass'), ('Parent', 'parent_instrument')
[docs] class lsa(_lsobj): """Lists all existing objects""" type = Type.Moveable, Type.ComChannel, Type.ExpChannel, Type.IORegister,\ Type.TriggerGate
[docs] class lsmeas(_lsobj): """List existing measurement groups""" type = Type.MeasurementGroup cols = 'Active', 'Name', 'Experim. channels' width = -1, -1, 60 align = HCenter, Right, Left
[docs] def prepare(self, filter, **opts): try: self.mnt_grp = self.getEnv('ActiveMntGrp').lower() or None except: self.mnt_grp = None
def obj2Row(self, o): if self.mnt_grp and (o.getName().lower() == self.mnt_grp): active = '*' else: active = ' ' return active, o.name, ", ".join(o.getChannelLabels())
[docs] class lsmac(_lsobj): """Lists existing macros""" type = Type.MacroCode cols = 'Name', ('Location', 'file_path') overwritten_msg = ("\nNote: if [*] is present together with the macro " + "name means that a macro with the same name \nis " + "defined in other module with less precedence and " + "it has been overwritten.")
[docs] class lsmaclib(_lsobj): """Lists existing macro libraries.""" type = Type.MacroLibrary cols = 'Name', ('Location', 'file_path')