Exemplo n.º 1
0
 def __init__(self, table_path, key_field, value_field, where_clause=None, **kwargs):
     _vld.raise_if(_vld.is_iterable(value_field), ValueError,
                   '{} expects a single value field: use {} instead'.format(ValueLookup.__name__,
                                                                            RowLookup.__name__))
     _vld.pass_if(all(_vld.has_value(v) for v in (table_path, key_field, value_field)), ValueError,
                  '{} requires valid table_path, key_field and value_field arguments')
     super(ValueLookup, self).__init__(table_path, key_field, value_field, where_clause, **kwargs)
Exemplo n.º 2
0
 def __init__(self, table_path, key_field, value_fields, where_clause=None, **kwargs):
     _vld.raise_if(len(value_fields) <= 1, ValueError, '{} expects multiple value fields: use {} instead'.format(
             RowLookup.__name__, ValueLookup.__name__))
     _vld.pass_if(all(_vld.has_value(v) for v in (table_path, key_field, value_fields[0])), ValueError,
                  '{} requires valid table_path, key_field and value_fields arguments')
     super(RowLookup, self).__init__(table_path, key_field, value_fields, where_clause, **kwargs)
     self._fieldmap = {name.lower(): i for i, name in enumerate(value_fields)}
Exemplo n.º 3
0
    def _parse(self):
        """ Reads the Python arguments specific to GEONIS menu scripts. """
        last_m = len(self._mapping) - 1
        for i, m in enumerate(self._mapping):
            try:
                if m.name == self._PARAM_CONST and i == last_m:
                    # If it's the last mapping for the script parameters,
                    # consume all remaining arguments and call mapping function on each script param.
                    # Note that there can not be more than self._MAX_PARAMS and superfluous parameters are removed.
                    value = self._save_params([
                        m.func(x, m.default)
                        for x in _sys.argv[i:i + self._MAX_PARAMS]
                    ])
                else:
                    # Call mapping function on the current argument
                    value = m.func(_sys.argv[i], m.default) or m.default
            except IndexError:
                value = m.default
            except Exception:
                raise

            if m.required and not _vld.has_value(value, True):
                raise AttributeError(
                    'Empty or missing required {!r} argument at position {}'.
                    format(m.name, i))
            self._store[m.name] = value
Exemplo n.º 4
0
    def __init__(self,
                 table_path: str,
                 key_field: str,
                 value_fields: _tp.Sequence[str],
                 where_clause: _tp.Union[None, str, _q.Where] = None,
                 **kwargs):
        _vld.raise_if(
            len(value_fields) <= 1, ValueError,
            f'{RowLookup.__name__} expects multiple value fields: use {ValueLookup.__name__} instead'
        )
        _vld.pass_if(
            all(
                _vld.has_value(v)
                for v in (table_path, key_field, value_fields[0])), ValueError,
            f'{RowLookup.__name__} requires valid table_path, key_field and value_fields arguments'
        )

        # User cannot override row processor function for this class
        if _ROWFUNC_ARG in kwargs:
            del kwargs[_ROWFUNC_ARG]

        self._dupekeys = kwargs.get(_DUPEKEYS_ARG, False)
        self._rowtype = list if kwargs.get(_MUTABLE_ARG, False) else tuple
        super(RowLookup, self).__init__(table_path, key_field, value_fields,
                                        where_clause, **kwargs)

        self._fieldmap = {
            name.lower(): i
            for i, name in enumerate(value_fields)
        }
Exemplo n.º 5
0
    def __str__(self):
        """
        Returns a formatted string of all instance properties (e.g. for logging purposes).

        :return str:    Formatted properties (1 per line).
        """

        # Filter out empty properties and format key-value pairs (1 per line)
        # Notice that ScriptParameters will have their type name removed, because its __str__ method has been overridden
        return _const.CHAR_LF.join('{}: {}'.format(_tu.capitalize(k), v)
                                   for k, v in self._store.iteritems()
                                   if _vld.has_value(v))
Exemplo n.º 6
0
    def __init__(self, table_path, key_field, value_field, where_clause=None, **kwargs):
        _vld.raise_if(_vld.is_iterable(value_field), ValueError,
                      '{} expects a single value field: use {} instead'.format(ValueLookup.__name__,
                                                                               RowLookup.__name__))
        _vld.pass_if(all(_vld.has_value(v) for v in (table_path, key_field, value_field)), ValueError,
                     '{} requires valid table_path, key_field and value_field arguments'.format(ValueLookup.__name__))

        # User cannot override row processor function for this class
        if _ROWFUNC_ARG in kwargs:
            del kwargs[_ROWFUNC_ARG]

        self._dupekeys = kwargs.get(_DUPEKEYS_ARG, False)
        super(ValueLookup, self).__init__(table_path, key_field, value_field, where_clause, **kwargs)
Exemplo n.º 7
0
def find_layer(name, mxd=None, dataframe=None, case_sensitive=False):
    """
    Finds a **single** layer by its (case-insensitive) name in the specified ArcMap document (or current one).
    If the layer was not found, ``None`` is returned.

    :param name:            Name of the layer to find.
                            If the layer name exists multiple times in different group layers,
                            you can prefix the layer with the group layer name followed by a forward slash (/).
    :param mxd:             The path to the ArcMap Document (MXD) or a MapDocument instance in which to find the layer.
                            If no MXD is specified, the search will take place in the current MXD (if any).
    :param dataframe:       The name of the data frame in which to find the layer.
                            If no data frame is specified and/or there is only 1 data frame,
                            the search will take place in the active data frame.
    :param case_sensitive:  If ``True``, the layer name needs to match exactly.
                            If ``False`` (default), the layer character case is ignored.
                            Note that this setting also affects the *dataframe* argument, when specified.
    :type name:             str, unicode
    :type mxd:              str, unicode, arcpy.mapping.MapDocument
    :type dataframe:        str, unicode
    :type case_sensitive:   bool
    :rtype:                 arcpy.mapping.Layer
    :raises ValueError:     If no layer name was specified, or if no map document was found.

    .. seealso::            https://desktop.arcgis.com/en/arcmap/latest/analyze/arcpy-mapping/layer-class.htm
    """

    # Validation
    _vld.pass_if(_vld.has_value(name), ValueError,
                 'Layer name has not been specified')

    name = _tu.to_unicode(_paths.normalize(name, not case_sensitive))
    mxd_ref, df_ref = _get_mxd_df(mxd, dataframe, case_sensitive)

    # Find the layer by name
    for lyr in _arcpy.mapping.ListLayers(mxd_ref, data_frame=df_ref):
        lyr_name = lyr.name if case_sensitive else lyr.name.lower()
        if lyr_name == name or _paths.normalize(lyr.longName,
                                                not case_sensitive) == name:
            return lyr
    return None
Exemplo n.º 8
0
def test_hasvalue():
    assert validate.has_value('') is False
    assert validate.has_value(None) is False
    assert validate.has_value([]) is False
    assert validate.has_value({}) is False
    assert validate.has_value('a') is True
    assert validate.has_value(0) is True
    assert validate.has_value(1) is True
    assert validate.has_value(3.14) is True
    assert validate.has_value('  ', True) is False
    assert validate.has_value(0, True) is True
    assert validate.has_value(None, True) is False
    assert validate.has_value('Panaché') is True