[GRASS-SVN] r62383 - in grass/trunk/lib/python/pygrass: . gis modules/grid modules/interface testsuite

svn_grass at osgeo.org svn_grass at osgeo.org
Sun Oct 26 10:00:51 PDT 2014


Author: zarch
Date: 2014-10-26 10:00:51 -0700 (Sun, 26 Oct 2014)
New Revision: 62383

Added:
   grass/trunk/lib/python/pygrass/utils.py
Removed:
   grass/trunk/lib/python/pygrass/functions.py
Modified:
   grass/trunk/lib/python/pygrass/Makefile
   grass/trunk/lib/python/pygrass/gis/__init__.py
   grass/trunk/lib/python/pygrass/modules/grid/grid.py
   grass/trunk/lib/python/pygrass/modules/grid/patch.py
   grass/trunk/lib/python/pygrass/modules/interface/flag.py
   grass/trunk/lib/python/pygrass/modules/interface/module.py
   grass/trunk/lib/python/pygrass/modules/interface/parameter.py
   grass/trunk/lib/python/pygrass/modules/interface/typedict.py
   grass/trunk/lib/python/pygrass/testsuite/test_doctests.py
Log:
pygrass: rename functions to utils

Modified: grass/trunk/lib/python/pygrass/Makefile
===================================================================
--- grass/trunk/lib/python/pygrass/Makefile	2014-10-26 16:42:33 UTC (rev 62382)
+++ grass/trunk/lib/python/pygrass/Makefile	2014-10-26 17:00:51 UTC (rev 62383)
@@ -7,7 +7,7 @@
 GDIR = $(PYDIR)/grass
 DSTDIR = $(GDIR)/pygrass
 
-MODULES = errors functions orderdict
+MODULES = errors utils orderdict
 
 CLEAN_SUBDIRS = messages modules raster vector gis shell tests
 

Deleted: grass/trunk/lib/python/pygrass/functions.py
===================================================================
--- grass/trunk/lib/python/pygrass/functions.py	2014-10-26 16:42:33 UTC (rev 62382)
+++ grass/trunk/lib/python/pygrass/functions.py	2014-10-26 17:00:51 UTC (rev 62383)
@@ -1,384 +0,0 @@
-# -*- coding: utf-8 -*-
-import itertools
-import fnmatch
-import os
-from sqlite3 import OperationalError
-
-import grass.lib.gis as libgis
-libgis.G_gisinit('')
-import grass.lib.raster as libraster
-from grass.script import core as grasscore
-
-from grass.pygrass.errors import GrassError
-
-
-def looking(obj, filter_string):
-    """
-    >>> import grass.lib.vector as libvect
-    >>> sorted(looking(libvect, '*by_box*'))  # doctest: +NORMALIZE_WHITESPACE
-    ['Vect_select_areas_by_box', 'Vect_select_isles_by_box',
-     'Vect_select_lines_by_box', 'Vect_select_nodes_by_box']
-
-    """
-    word_list = dir(obj)
-    word_list.sort()
-    return fnmatch.filter(word_list, filter_string)
-
-
-def findfiles(dirpath, match=None):
-    """Return a list of the files"""
-    res = []
-    for f in sorted(os.listdir(dirpath)):
-        abspath = os.path.join(dirpath, f)
-        if os.path.isdir(abspath):
-            res.extend(findfiles(abspath, match))
-
-        if match:
-            if fnmatch.fnmatch(abspath, match):
-                res.append(abspath)
-        else:
-            res.append(abspath)
-    return res
-
-
-def findmaps(type, pattern=None, mapset='', location='', gisdbase=''):
-    """Return a list of tuple contining the names of the:
-
-        * map
-        * mapset,
-        * location,
-        * gisdbase
-
-    """
-    from grass.pygrass.gis import Gisdbase, Location, Mapset
-
-    def find_in_location(type, pattern, location):
-        res = []
-        for msetname in location.mapsets():
-            mset = Mapset(msetname, location.name, location.gisdbase)
-            res.extend([(m, mset.name, mset.location, mset.gisdbase)
-                        for m in mset.glist(type, pattern)])
-        return res
-
-    def find_in_gisdbase(type, pattern, gisdbase):
-        res = []
-        for loc in gisdbase.locations():
-            res.extend(find_in_location(type, pattern,
-                                        Location(loc, gisdbase.name)))
-        return res
-
-    if gisdbase and location and mapset:
-        mset = Mapset(mapset, location, gisdbase)
-        return [(m, mset.name, mset.location, mset.gisdbase)
-                for m in mset.glist(type, pattern)]
-    elif gisdbase and location:
-        loc = Location(location, gisdbase)
-        return find_in_location(type, pattern, loc)
-    elif gisdbase:
-        gis = Gisdbase(gisdbase)
-        return find_in_gisdbase(type, pattern, gis)
-    elif location:
-        loc = Location(location)
-        return find_in_location(type, pattern, loc)
-    elif mapset:
-        mset = Mapset(mapset)
-        return [(m, mset.name, mset.location, mset.gisdbase)
-                for m in mset.glist(type, pattern)]
-    else:
-        gis = Gisdbase()
-        return find_in_gisdbase(type, pattern, gis)
-
-
-def remove(oldname, maptype):
-    """Remove a map"""
-    grasscore.run_command('g.remove', quiet=True, flags='f',
-                          type=maptype, pattern=oldname)
-
-
-def rename(oldname, newname, maptype, **kwargs):
-    """Rename a map"""
-    kwargs.update({maptype: '{old},{new}'.format(old=oldname, new=newname), })
-    grasscore.run_command('g.rename', quiet=True, **kwargs)
-
-
-def copy(existingmap, newmap, maptype, **kwargs):
-    """Copy a map
-
-    >>> copy('census', 'mycensus', 'vect')
-    >>> rename('mycensus', 'mynewcensus', 'vect')
-    >>> remove('mynewcensus', 'vect')
-
-    """
-    kwargs.update({maptype: '{old},{new}'.format(old=existingmap, new=newmap)})
-    grasscore.run_command('g.copy', quiet=True, **kwargs)
-
-
-def getenv(env):
-    """Return the current grass environment variables
-
-    >>> getenv("MAPSET")
-    'user1'
-
-    """
-    return libgis.G__getenv(env)
-
-
-def get_mapset_raster(mapname, mapset=''):
-    """Return the mapset of the raster map
-
-    >>> get_mapset_raster('elevation')
-    'PERMANENT'
-
-    """
-    return libgis.G_find_raster2(mapname, mapset)
-
-
-def get_mapset_vector(mapname, mapset=''):
-    """Return the mapset of the vector map
-
-    >>> get_mapset_vector('census')
-    'PERMANENT'
-
-    """
-    return libgis.G_find_vector2(mapname, mapset)
-
-
-def is_clean_name(name):
-    """Return if the name is valid
-
-    >>> is_clean_name('census')
-    True
-    >>> is_clean_name('0census')
-    True
-    >>> is_clean_name('census?')
-    False
-    >>> is_clean_name('cénsus')
-    False
-
-    """
-    if libgis.G_legal_filename(name) < 0:
-        return False
-    return True
-
-
-def coor2pixel(coord, region):
-    """Convert coordinates into a pixel row and col
-
-    >>> reg = Region()
-    >>> coor2pixel((reg.west, reg.north), reg)
-    (0.0, 0.0)
-    >>> coor2pixel((reg.east, reg.south), reg) == (reg.rows, reg.cols)
-    True
-
-    """
-    (east, north) = coord
-    return (libraster.Rast_northing_to_row(north, region.c_region),
-            libraster.Rast_easting_to_col(east, region.c_region))
-
-
-def pixel2coor(pixel, region):
-    """Convert row and col of a pixel into a coordinates
-
-    >>> reg = Region()
-    >>> pixel2coor((0, 0), reg) == (reg.north, reg.west)
-    True
-    >>> pixel2coor((reg.cols, reg.rows), reg) == (reg.south, reg.east)
-    True
-
-    """
-    (col, row) = pixel
-    return (libraster.Rast_row_to_northing(row, region.c_region),
-            libraster.Rast_col_to_easting(col, region.c_region))
-
-
-def get_raster_for_points(poi_vector, raster, column=None, region=None):
-    """Query a raster map for each point feature of a vector
-
-    Example
-
-    >>> from grass.pygrass.vector import VectorTopo
-    >>> from grass.pygrass.raster import RasterRow
-    >>> ele = RasterRow('elevation')
-    >>> copy('schools','myschools','vect')
-    >>> sch = VectorTopo('myschools')
-    >>> sch.open(mode='r')
-    >>> get_raster_for_points(sch, ele)               # doctest: +ELLIPSIS
-    [(1, 633649.2856743174, 221412.94434781274, 145.06602)...
-    >>> sch.table.columns.add('elevation','double precision')
-    >>> 'elevation' in sch.table.columns
-    True
-    >>> get_raster_for_points(sch, ele, 'elevation')
-    True
-    >>> sch.table.filters.select('NAMESHORT','elevation')
-    Filters(u'SELECT NAMESHORT, elevation FROM myschools;')
-    >>> cur = sch.table.execute()
-    >>> cur.fetchall()                                # doctest: +ELLIPSIS
-    [(u'SWIFT CREEK', 145.06602), ... (u'9TH GRADE CTR', None)]
-    >>> remove('myschools','vect')
-
-
-    :param point: point vector object
-    :param raster: raster object
-    :param str column: column name to update
-
-    """
-    from math import isnan
-    if not column:
-        result = []
-    if region is None:
-        from grass.pygrass.gis.region import Region
-        region = Region()
-    if not poi_vector.is_open():
-        poi_vector.open()
-    if not raster.is_open():
-        raster.open()
-    if poi_vector.num_primitive_of('point') == 0:
-        raise GrassError(_("Vector doesn't contain points"))
-    for poi in poi_vector.viter('points'):
-        val = raster.get_value(poi, region)
-        if column:
-            if val is not None and not isnan(val):
-                poi.attrs[column] = val
-        else:
-            if val is not None and not isnan(val):
-                result.append((poi.id, poi.x, poi.y, val))
-            else:
-                result.append((poi.id, poi.x, poi.y, None))
-    if not column:
-        return result
-    else:
-        poi.attrs.commit()
-        return True
-
-
-def r_export(rast, output='', fmt='png', **kargs):
-    from grass.pygrass.modules import Module
-    if rast.exist():
-        output = output if output else "%s_%s.%s" % (rast.name, rast.mapset,
-                                                     fmt)
-        Module('r.out.%s' % fmt, input=rast.fullname(), output=output,
-               overwrite=True, **kargs)
-        return output
-    else:
-        raise ValueError('Raster map does not exist.')
-
-
-def get_lib_path(modname, libname):
-    """Return the path of the libname contained in the module.
-
-    >>> get_lib_path(modname='r.modis', libname='libmodis')
-    """
-    from os.path import isdir, join
-    from os import getenv
-
-    if isdir(join(getenv('GISBASE'), 'etc', modname)):
-        path = join(os.getenv('GISBASE'), 'etc', modname)
-    elif getenv('GRASS_ADDON_BASE') and \
-            isdir(join(getenv('GRASS_ADDON_BASE'), 'etc', modname)):
-        path = join(getenv('GRASS_ADDON_BASE'), 'etc', modname)
-    elif getenv('GRASS_ADDON_BASE') and \
-            isdir(join(getenv('GRASS_ADDON_BASE'), modname, modname)):
-        path = join(os.getenv('GRASS_ADDON_BASE'), modname, modname)
-    elif isdir(join('..', libname)):
-        path = join('..', libname)
-    else:
-        path = None
-    return path
-
-
-def split_in_chunk(iterable, lenght=10):
-    """Split a list in chunk.
-
-    >>> for chunk in split_in_chunk(range(25)): print chunk
-    (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
-    (10, 11, 12, 13, 14, 15, 16, 17, 18, 19)
-    (20, 21, 22, 23, 24)
-    >>> for chunk in split_in_chunk(range(25), 3): print chunk
-    (0, 1, 2)
-    (3, 4, 5)
-    (6, 7, 8)
-    (9, 10, 11)
-    (12, 13, 14)
-    (15, 16, 17)
-    (18, 19, 20)
-    (21, 22, 23)
-    (24,)
-    """
-    it = iter(iterable)
-    while True:
-        chunk = tuple(itertools.islice(it, lenght))
-        if not chunk:
-            return
-        yield chunk
-
-
-def table_exist(cursor, table_name):
-    """Return True if the table exist False otherwise"""
-    try:
-        # sqlite
-        cursor.execute("SELECT name FROM sqlite_master"
-                       " WHERE type='table' AND name='%s';" % table_name)
-    except OperationalError:
-        try:
-            # pg
-            cursor.execute("SELECT EXISTS(SELECT * FROM "
-                           "information_schema.tables "
-                           "WHERE table_name=%s)" % table_name)
-        except OperationalError:
-            return False
-    one = cursor.fetchone() if cursor else None
-    return True if one and one[0] else False
-
-
-def docstring_property(class_doc):
-    """Property attribute for docstrings.
-    Took from: https://gist.github.com/bfroehle/4041015
-
-    >>> class A(object):
-    ...     '''Main docstring'''
-    ...     def __init__(self, x):
-    ...         self.x = x
-    ...     @docstring_property(__doc__)
-    ...     def __doc__(self):
-    ...         return "My value of x is %s." % self.x
-
-    >>> A.__doc__
-    'Main docstring'
-
-    >>> a = A(10)
-    >>> a.__doc__
-    'My value of x is 10.'
-    """
-    def wrapper(fget):
-        return DocstringProperty(class_doc, fget)
-    return wrapper
-
-
-class DocstringProperty(object):
-    """Property for the `__doc__` attribute.
-
-    Different than `property` in the following two ways:
-
-    * When the attribute is accessed from the main class, it returns the value
-      of `class_doc`, *not* the property itself. This is necessary so Sphinx
-      and other documentation tools can access the class docstring.
-
-    * Only supports getting the attribute; setting and deleting raise an
-      `AttributeError`.
-    """
-
-    def __init__(self, class_doc, fget):
-        self.class_doc = class_doc
-        self.fget = fget
-
-    def __get__(self, obj, type=None):
-        if obj is None:
-            return self.class_doc
-        else:
-            return self.fget(obj)
-
-    def __set__(self, obj, value):
-        raise AttributeError("can't set attribute")
-
-    def __delete__(self, obj):
-        raise AttributeError("can't delete attribute")

Modified: grass/trunk/lib/python/pygrass/gis/__init__.py
===================================================================
--- grass/trunk/lib/python/pygrass/gis/__init__.py	2014-10-26 16:42:33 UTC (rev 62382)
+++ grass/trunk/lib/python/pygrass/gis/__init__.py	2014-10-26 17:00:51 UTC (rev 62383)
@@ -55,7 +55,7 @@
     if value and CHECK_IS[type](join(path, value)):
         return value
     elif value is '':
-        from grass.pygrass.functions import getenv
+        from grass.pygrass.utils import getenv
         return getenv(type)
     else:
         raise GrassError("%s <%s> not found" % (type.title(),

Modified: grass/trunk/lib/python/pygrass/modules/grid/grid.py
===================================================================
--- grass/trunk/lib/python/pygrass/modules/grid/grid.py	2014-10-26 16:42:33 UTC (rev 62382)
+++ grass/trunk/lib/python/pygrass/modules/grid/grid.py	2014-10-26 17:00:51 UTC (rev 62383)
@@ -11,7 +11,7 @@
 from grass.pygrass.gis import Mapset, Location
 from grass.pygrass.gis.region import Region
 from grass.pygrass.modules import Module
-from grass.pygrass.functions import get_mapset_raster, findmaps
+from grass.pygrass.utils import get_mapset_raster, findmaps
 
 from grass.pygrass.modules.grid.split import split_region_tiles
 from grass.pygrass.modules.grid.patch import rpatch_map

Modified: grass/trunk/lib/python/pygrass/modules/grid/patch.py
===================================================================
--- grass/trunk/lib/python/pygrass/modules/grid/patch.py	2014-10-26 16:42:33 UTC (rev 62382)
+++ grass/trunk/lib/python/pygrass/modules/grid/patch.py	2014-10-26 17:00:51 UTC (rev 62383)
@@ -8,7 +8,7 @@
                         with_statement, print_function, unicode_literals)
 from grass.pygrass.gis.region import Region
 from grass.pygrass.raster import RasterRow
-from grass.pygrass.functions import coor2pixel
+from grass.pygrass.utils import coor2pixel
 
 
 def get_start_end_index(bbox_list):

Modified: grass/trunk/lib/python/pygrass/modules/interface/flag.py
===================================================================
--- grass/trunk/lib/python/pygrass/modules/interface/flag.py	2014-10-26 16:42:33 UTC (rev 62382)
+++ grass/trunk/lib/python/pygrass/modules/interface/flag.py	2014-10-26 17:00:51 UTC (rev 62383)
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 from __future__ import (nested_scopes, generators, division, absolute_import,
                         with_statement, print_function, unicode_literals)
-from grass.pygrass.functions import docstring_property
+from grass.pygrass.utils import docstring_property
 from grass.pygrass.modules.interface import read
 
 

Modified: grass/trunk/lib/python/pygrass/modules/interface/module.py
===================================================================
--- grass/trunk/lib/python/pygrass/modules/interface/module.py	2014-10-26 16:42:33 UTC (rev 62382)
+++ grass/trunk/lib/python/pygrass/modules/interface/module.py	2014-10-26 17:00:51 UTC (rev 62383)
@@ -15,7 +15,7 @@
 from grass.exceptions import CalledModuleError
 from grass.script.core import Popen, PIPE
 from grass.pygrass.errors import GrassError, ParameterError
-from grass.pygrass.functions import docstring_property
+from grass.pygrass.utils import docstring_property
 from grass.pygrass.modules.interface.parameter import Parameter
 from grass.pygrass.modules.interface.flag import Flag
 from grass.pygrass.modules.interface.typedict import TypeDict

Modified: grass/trunk/lib/python/pygrass/modules/interface/parameter.py
===================================================================
--- grass/trunk/lib/python/pygrass/modules/interface/parameter.py	2014-10-26 16:42:33 UTC (rev 62382)
+++ grass/trunk/lib/python/pygrass/modules/interface/parameter.py	2014-10-26 17:00:51 UTC (rev 62383)
@@ -8,7 +8,7 @@
                         with_statement, print_function, unicode_literals)
 import re
 
-from grass.pygrass.functions import docstring_property
+from grass.pygrass.utils import docstring_property
 from grass.pygrass.modules.interface.read import GETTYPE, element2dict, DOC
 
 

Modified: grass/trunk/lib/python/pygrass/modules/interface/typedict.py
===================================================================
--- grass/trunk/lib/python/pygrass/modules/interface/typedict.py	2014-10-26 16:42:33 UTC (rev 62382)
+++ grass/trunk/lib/python/pygrass/modules/interface/typedict.py	2014-10-26 17:00:51 UTC (rev 62383)
@@ -12,7 +12,7 @@
 except ImportError:
     from grass.pygrass.orderdict import OrderedDict
 
-from grass.pygrass.functions import docstring_property
+from grass.pygrass.utils import docstring_property
 
 
 class TypeDict(OrderedDict):

Modified: grass/trunk/lib/python/pygrass/testsuite/test_doctests.py
===================================================================
--- grass/trunk/lib/python/pygrass/testsuite/test_doctests.py	2014-10-26 16:42:33 UTC (rev 62382)
+++ grass/trunk/lib/python/pygrass/testsuite/test_doctests.py	2014-10-26 17:00:51 UTC (rev 62383)
@@ -8,7 +8,7 @@
 import grass.gunittest
 import grass.gunittest.utils
 
-import grass.pygrass.functions as gfunctions
+import grass.pygrass.utils as gutils
 
 
 # doctest does not allow changing the base classes of test case, skip test case
@@ -30,7 +30,7 @@
     # for now it is the only place where it works
     grass.gunittest.utils.do_doctest_gettext_workaround()
     # this should be called at some top level
-    tests.addTests(doctest.DocTestSuite(gfunctions))
+    tests.addTests(doctest.DocTestSuite(gutils))
     return tests
 
 

Copied: grass/trunk/lib/python/pygrass/utils.py (from rev 62378, grass/trunk/lib/python/pygrass/functions.py)
===================================================================
--- grass/trunk/lib/python/pygrass/utils.py	                        (rev 0)
+++ grass/trunk/lib/python/pygrass/utils.py	2014-10-26 17:00:51 UTC (rev 62383)
@@ -0,0 +1,384 @@
+# -*- coding: utf-8 -*-
+import itertools
+import fnmatch
+import os
+from sqlite3 import OperationalError
+
+import grass.lib.gis as libgis
+libgis.G_gisinit('')
+import grass.lib.raster as libraster
+from grass.script import core as grasscore
+
+from grass.pygrass.errors import GrassError
+
+
+def looking(obj, filter_string):
+    """
+    >>> import grass.lib.vector as libvect
+    >>> sorted(looking(libvect, '*by_box*'))  # doctest: +NORMALIZE_WHITESPACE
+    ['Vect_select_areas_by_box', 'Vect_select_isles_by_box',
+     'Vect_select_lines_by_box', 'Vect_select_nodes_by_box']
+
+    """
+    word_list = dir(obj)
+    word_list.sort()
+    return fnmatch.filter(word_list, filter_string)
+
+
+def findfiles(dirpath, match=None):
+    """Return a list of the files"""
+    res = []
+    for f in sorted(os.listdir(dirpath)):
+        abspath = os.path.join(dirpath, f)
+        if os.path.isdir(abspath):
+            res.extend(findfiles(abspath, match))
+
+        if match:
+            if fnmatch.fnmatch(abspath, match):
+                res.append(abspath)
+        else:
+            res.append(abspath)
+    return res
+
+
+def findmaps(type, pattern=None, mapset='', location='', gisdbase=''):
+    """Return a list of tuple contining the names of the:
+
+        * map
+        * mapset,
+        * location,
+        * gisdbase
+
+    """
+    from grass.pygrass.gis import Gisdbase, Location, Mapset
+
+    def find_in_location(type, pattern, location):
+        res = []
+        for msetname in location.mapsets():
+            mset = Mapset(msetname, location.name, location.gisdbase)
+            res.extend([(m, mset.name, mset.location, mset.gisdbase)
+                        for m in mset.glist(type, pattern)])
+        return res
+
+    def find_in_gisdbase(type, pattern, gisdbase):
+        res = []
+        for loc in gisdbase.locations():
+            res.extend(find_in_location(type, pattern,
+                                        Location(loc, gisdbase.name)))
+        return res
+
+    if gisdbase and location and mapset:
+        mset = Mapset(mapset, location, gisdbase)
+        return [(m, mset.name, mset.location, mset.gisdbase)
+                for m in mset.glist(type, pattern)]
+    elif gisdbase and location:
+        loc = Location(location, gisdbase)
+        return find_in_location(type, pattern, loc)
+    elif gisdbase:
+        gis = Gisdbase(gisdbase)
+        return find_in_gisdbase(type, pattern, gis)
+    elif location:
+        loc = Location(location)
+        return find_in_location(type, pattern, loc)
+    elif mapset:
+        mset = Mapset(mapset)
+        return [(m, mset.name, mset.location, mset.gisdbase)
+                for m in mset.glist(type, pattern)]
+    else:
+        gis = Gisdbase()
+        return find_in_gisdbase(type, pattern, gis)
+
+
+def remove(oldname, maptype):
+    """Remove a map"""
+    grasscore.run_command('g.remove', quiet=True, flags='f',
+                          type=maptype, pattern=oldname)
+
+
+def rename(oldname, newname, maptype, **kwargs):
+    """Rename a map"""
+    kwargs.update({maptype: '{old},{new}'.format(old=oldname, new=newname), })
+    grasscore.run_command('g.rename', quiet=True, **kwargs)
+
+
+def copy(existingmap, newmap, maptype, **kwargs):
+    """Copy a map
+
+    >>> copy('census', 'mycensus', 'vect')
+    >>> rename('mycensus', 'mynewcensus', 'vect')
+    >>> remove('mynewcensus', 'vect')
+
+    """
+    kwargs.update({maptype: '{old},{new}'.format(old=existingmap, new=newmap)})
+    grasscore.run_command('g.copy', quiet=True, **kwargs)
+
+
+def getenv(env):
+    """Return the current grass environment variables
+
+    >>> getenv("MAPSET")
+    'user1'
+
+    """
+    return libgis.G__getenv(env)
+
+
+def get_mapset_raster(mapname, mapset=''):
+    """Return the mapset of the raster map
+
+    >>> get_mapset_raster('elevation')
+    'PERMANENT'
+
+    """
+    return libgis.G_find_raster2(mapname, mapset)
+
+
+def get_mapset_vector(mapname, mapset=''):
+    """Return the mapset of the vector map
+
+    >>> get_mapset_vector('census')
+    'PERMANENT'
+
+    """
+    return libgis.G_find_vector2(mapname, mapset)
+
+
+def is_clean_name(name):
+    """Return if the name is valid
+
+    >>> is_clean_name('census')
+    True
+    >>> is_clean_name('0census')
+    True
+    >>> is_clean_name('census?')
+    False
+    >>> is_clean_name('cénsus')
+    False
+
+    """
+    if libgis.G_legal_filename(name) < 0:
+        return False
+    return True
+
+
+def coor2pixel(coord, region):
+    """Convert coordinates into a pixel row and col
+
+    >>> reg = Region()
+    >>> coor2pixel((reg.west, reg.north), reg)
+    (0.0, 0.0)
+    >>> coor2pixel((reg.east, reg.south), reg) == (reg.rows, reg.cols)
+    True
+
+    """
+    (east, north) = coord
+    return (libraster.Rast_northing_to_row(north, region.c_region),
+            libraster.Rast_easting_to_col(east, region.c_region))
+
+
+def pixel2coor(pixel, region):
+    """Convert row and col of a pixel into a coordinates
+
+    >>> reg = Region()
+    >>> pixel2coor((0, 0), reg) == (reg.north, reg.west)
+    True
+    >>> pixel2coor((reg.cols, reg.rows), reg) == (reg.south, reg.east)
+    True
+
+    """
+    (col, row) = pixel
+    return (libraster.Rast_row_to_northing(row, region.c_region),
+            libraster.Rast_col_to_easting(col, region.c_region))
+
+
+def get_raster_for_points(poi_vector, raster, column=None, region=None):
+    """Query a raster map for each point feature of a vector
+
+    Example
+
+    >>> from grass.pygrass.vector import VectorTopo
+    >>> from grass.pygrass.raster import RasterRow
+    >>> ele = RasterRow('elevation')
+    >>> copy('schools','myschools','vect')
+    >>> sch = VectorTopo('myschools')
+    >>> sch.open(mode='r')
+    >>> get_raster_for_points(sch, ele)               # doctest: +ELLIPSIS
+    [(1, 633649.2856743174, 221412.94434781274, 145.06602)...
+    >>> sch.table.columns.add('elevation','double precision')
+    >>> 'elevation' in sch.table.columns
+    True
+    >>> get_raster_for_points(sch, ele, 'elevation')
+    True
+    >>> sch.table.filters.select('NAMESHORT','elevation')
+    Filters(u'SELECT NAMESHORT, elevation FROM myschools;')
+    >>> cur = sch.table.execute()
+    >>> cur.fetchall()                                # doctest: +ELLIPSIS
+    [(u'SWIFT CREEK', 145.06602), ... (u'9TH GRADE CTR', None)]
+    >>> remove('myschools','vect')
+
+
+    :param point: point vector object
+    :param raster: raster object
+    :param str column: column name to update
+
+    """
+    from math import isnan
+    if not column:
+        result = []
+    if region is None:
+        from grass.pygrass.gis.region import Region
+        region = Region()
+    if not poi_vector.is_open():
+        poi_vector.open()
+    if not raster.is_open():
+        raster.open()
+    if poi_vector.num_primitive_of('point') == 0:
+        raise GrassError(_("Vector doesn't contain points"))
+    for poi in poi_vector.viter('points'):
+        val = raster.get_value(poi, region)
+        if column:
+            if val is not None and not isnan(val):
+                poi.attrs[column] = val
+        else:
+            if val is not None and not isnan(val):
+                result.append((poi.id, poi.x, poi.y, val))
+            else:
+                result.append((poi.id, poi.x, poi.y, None))
+    if not column:
+        return result
+    else:
+        poi.attrs.commit()
+        return True
+
+
+def r_export(rast, output='', fmt='png', **kargs):
+    from grass.pygrass.modules import Module
+    if rast.exist():
+        output = output if output else "%s_%s.%s" % (rast.name, rast.mapset,
+                                                     fmt)
+        Module('r.out.%s' % fmt, input=rast.fullname(), output=output,
+               overwrite=True, **kargs)
+        return output
+    else:
+        raise ValueError('Raster map does not exist.')
+
+
+def get_lib_path(modname, libname):
+    """Return the path of the libname contained in the module.
+
+    >>> get_lib_path(modname='r.modis', libname='libmodis')
+    """
+    from os.path import isdir, join
+    from os import getenv
+
+    if isdir(join(getenv('GISBASE'), 'etc', modname)):
+        path = join(os.getenv('GISBASE'), 'etc', modname)
+    elif getenv('GRASS_ADDON_BASE') and \
+            isdir(join(getenv('GRASS_ADDON_BASE'), 'etc', modname)):
+        path = join(getenv('GRASS_ADDON_BASE'), 'etc', modname)
+    elif getenv('GRASS_ADDON_BASE') and \
+            isdir(join(getenv('GRASS_ADDON_BASE'), modname, modname)):
+        path = join(os.getenv('GRASS_ADDON_BASE'), modname, modname)
+    elif isdir(join('..', libname)):
+        path = join('..', libname)
+    else:
+        path = None
+    return path
+
+
+def split_in_chunk(iterable, lenght=10):
+    """Split a list in chunk.
+
+    >>> for chunk in split_in_chunk(range(25)): print chunk
+    (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
+    (10, 11, 12, 13, 14, 15, 16, 17, 18, 19)
+    (20, 21, 22, 23, 24)
+    >>> for chunk in split_in_chunk(range(25), 3): print chunk
+    (0, 1, 2)
+    (3, 4, 5)
+    (6, 7, 8)
+    (9, 10, 11)
+    (12, 13, 14)
+    (15, 16, 17)
+    (18, 19, 20)
+    (21, 22, 23)
+    (24,)
+    """
+    it = iter(iterable)
+    while True:
+        chunk = tuple(itertools.islice(it, lenght))
+        if not chunk:
+            return
+        yield chunk
+
+
+def table_exist(cursor, table_name):
+    """Return True if the table exist False otherwise"""
+    try:
+        # sqlite
+        cursor.execute("SELECT name FROM sqlite_master"
+                       " WHERE type='table' AND name='%s';" % table_name)
+    except OperationalError:
+        try:
+            # pg
+            cursor.execute("SELECT EXISTS(SELECT * FROM "
+                           "information_schema.tables "
+                           "WHERE table_name=%s)" % table_name)
+        except OperationalError:
+            return False
+    one = cursor.fetchone() if cursor else None
+    return True if one and one[0] else False
+
+
+def docstring_property(class_doc):
+    """Property attribute for docstrings.
+    Took from: https://gist.github.com/bfroehle/4041015
+
+    >>> class A(object):
+    ...     '''Main docstring'''
+    ...     def __init__(self, x):
+    ...         self.x = x
+    ...     @docstring_property(__doc__)
+    ...     def __doc__(self):
+    ...         return "My value of x is %s." % self.x
+
+    >>> A.__doc__
+    'Main docstring'
+
+    >>> a = A(10)
+    >>> a.__doc__
+    'My value of x is 10.'
+    """
+    def wrapper(fget):
+        return DocstringProperty(class_doc, fget)
+    return wrapper
+
+
+class DocstringProperty(object):
+    """Property for the `__doc__` attribute.
+
+    Different than `property` in the following two ways:
+
+    * When the attribute is accessed from the main class, it returns the value
+      of `class_doc`, *not* the property itself. This is necessary so Sphinx
+      and other documentation tools can access the class docstring.
+
+    * Only supports getting the attribute; setting and deleting raise an
+      `AttributeError`.
+    """
+
+    def __init__(self, class_doc, fget):
+        self.class_doc = class_doc
+        self.fget = fget
+
+    def __get__(self, obj, type=None):
+        if obj is None:
+            return self.class_doc
+        else:
+            return self.fget(obj)
+
+    def __set__(self, obj, value):
+        raise AttributeError("can't set attribute")
+
+    def __delete__(self, obj):
+        raise AttributeError("can't delete attribute")



More information about the grass-commit mailing list