### Navigation

- index
- modules
- Home »
- Contents »
- Module code »

# Source code for safe.common.utilities

    """Utilities for InaSAFE
    """
    import os
    import gettext
    from datetime import date
    import getpass
    from tempfile import mkstemp

    from safe.common.exceptions import VerificationError

    def verify(statement, message=None):
        """Verification of logical statement similar to assertions
        Input
            statement: expression
            message: error message in case statement evaluates as False

        Output
            None
        Raises
            VerificationError in case statement evaluates to False
        """

        if bool(statement) is False:
            raise VerificationError(message)

    def ugettext(s):
        """Translation support
        """
        path = os.path.abspath(os.path.join(os.path.dirname(__file__),
                                            '..', 'i18n'))
        if 'LANG' not in os.environ:
            return s
        lang = os.environ['LANG']
        filename_prefix = 'inasafe'
        t = gettext.translation(filename_prefix,
                                path, languages=[lang], fallback=True)
        return t.ugettext(s)

    def temp_dir(sub_dir='work'):
        """Obtain the temporary working directory for the operating system.

        An inasafe subdirectory will automatically be created under this and
        if specified, a user subdirectory under that.

        .. note:: You can use this together with unique_filename to create
           a file in a temporary directory under the inasafe workspace. e.g.

           tmpdir = temp_dir('testing')
           tmpfile = unique_filename(dir=tmpdir)
           print tmpfile
           /tmp/inasafe/23-08-2012/timlinux/testing/tmpMRpF_C

        Args:
            sub_dir str - optional argument which will cause an additional
                    subirectory to be created e.g. /tmp/inasafe/foo/

        Returns:
            Path to the output clipped layer (placed in the system temp dir).

        Raises:
           Any errors from the underlying system calls.
        """
        user = getpass.getuser().replace(' ', '_')
        current_date = date.today()
        date_string = current_date.strftime("%d-%m-%Y")
        # Following 4 lines are a workaround for tempfile.tempdir() unreliabilty
        handle, filename = mkstemp()
        os.close(handle)
        new_directory = os.path.dirname(filename)
        os.remove(filename)
        path = os.path.join(new_directory, 'inasafe', date_string, user, sub_dir)

        if not os.path.exists(path):
            # Ensure that the dir is world writable
            # Umask sets the new mask and returns the old
            old_mask = os.umask(0000)
            os.makedirs(path, 0777)
            # Resinstate the old mask for tmp
            os.umask(old_mask)
        return path

    def unique_filename(**kwargs):
        """Create new filename guaranteed not to exist previously

        Use mkstemp to create the file, then remove it and return the name

        If dir is specified, the tempfile will be created in the path specified
        otherwise the file will be created in a directory following this scheme:

        :file:`/tmp/inasafe/<dd-mm-yyyy>/<user>/impacts'

        See http://docs.python.org/library/tempfile.html for details.

        Example usage:

        tempdir = temp_dir(sub_dir='test')
        filename = unique_filename(suffix='.keywords', dir=tempdir)
        print filename
        /tmp/inasafe/23-08-2012/timlinux/test/tmpyeO5VR.keywords

        Or with no preferred subdir, a default subdir of 'impacts' is used:

        filename = unique_filename(suffix='.shp')
        print filename
        /tmp/inasafe/23-08-2012/timlinux/impacts/tmpoOAmOi.shp

        """

        if 'dir' not in kwargs:
            path = temp_dir('impacts')
            kwargs['dir'] = path
        if not os.path.exists(kwargs['dir']):
            # Ensure that the dir mask won't conflict with the mode
            # Umask sets the new mask and returns the old
            umask = os.umask(0000)
            # Ensure that the dir is world writable by explictly setting mode
            os.makedirs(kwargs['dir'], 0777)
            # Reinstate the old mask for tmp dir
            os.umask(umask)
        # Now we have the working dir set up go on and return the filename
        handle, filename = mkstemp(**kwargs)

        # Need to close it using the filehandle first for windows!
        os.close(handle)
        try:
            os.remove(filename)
        except OSError:
            pass
        return filename

### Navigation

- index
- modules
- Home »
- Contents »
- Module code »