Changeset 9090:6ce4760c8b13 in orange


Ignore:
Timestamp:
10/10/11 16:11:47 (3 years ago)
Author:
ales_erjavec <ales.erjavec@…>
Branch:
default
Convert:
4e43ba67156d8884f1eca18be6a84a94c7b1f9f6
Message:

Added prefixed search path support for Table loading. Not yet documented.
References #828.

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • orange/Orange/data/io.py

    r9089 r9090  
    741741 
    742742registerFileType = Orange.misc.deprecated_function_name(register_file_type) 
     743 
     744#__doc__ +=  \ 
     745"""\ 
     746Search Paths 
     747============ 
     748 
     749Associate a prefix with a search path for easier data loading. 
     750The paths can be stored in a user specific file. 
     751 
     752Example :: 
     753 
     754    >>> import Orange, os 
     755    >>> from Orange.data import io 
     756    >>> io.set_search_path("my_datasets", 
     757    ...                     os.path.expanduser("~/Documents/My Datasets")) 
     758    ...                     persistent=True) 
     759    ... 
     760     
     761    >>> data = Orange.data.Table("mydatasets:dataset1.tab") 
     762 
     763 
     764.. autofunction:: set_search_path 
     765 
     766.. autofunction:: search_paths 
     767 
     768.. autofunction:: persistent_search_paths 
     769 
     770.. autofunction:: find_file 
     771 
     772.. autofunction:: expand_filename 
     773 
     774""" 
     775# Non-persistent registered paths 
     776_session_paths = [] 
     777 
     778import ConfigParser 
     779from ConfigParser import SafeConfigParser 
     780 
     781@Orange.misc.lru_cache(maxsize=1) 
     782def persistent_search_paths(): 
     783    """ Return a list of persistent registered (prefix, path) pairs 
     784    """ 
     785     
     786    global_settings_dir = Orange.misc.environ.install_dir 
     787    user_settings_dir = Orange.misc.environ.orange_settings_dir 
     788    parser = SafeConfigParser() 
     789    parser.read([os.path.join(global_settings_dir, "orange-search-paths.cfg"), 
     790                 os.path.join(user_settings_dir, "orange-search-paths.cfg")]) 
     791    try: 
     792        items = parser.items("paths") 
     793        defaults = parser.defaults().items() 
     794        items = [i for i in items if i not in defaults] 
     795    except ConfigParser.NoSectionError: 
     796        items = [] 
     797    return items 
     798 
     799def save_persistent_search_path(prefix, path): 
     800    """ Save the prefix, path pair. If path is None delete the  
     801    registered prefix. 
     802     
     803    """ 
     804    if isinstance(path, list): 
     805        path = os.path.pathsep.join(path) 
     806         
     807    user_settings_dir = Orange.misc.environ.orange_settings_dir 
     808    if not os.path.exists(user_settings_dir): 
     809        try: 
     810            os.makedirs(user_settings_dir) 
     811        except OSError: 
     812            pass 
     813     
     814    filename = os.path.join(user_settings_dir, "orange-search-paths.cfg") 
     815    parser = SafeConfigParser() 
     816    parser.read([filename]) 
     817     
     818    if not parser.has_section("paths"): 
     819        parser.add_section("paths") 
     820         
     821    if path is not None: 
     822        parser.set("paths", prefix, path) 
     823    elif parser.has_option("paths", prefix): 
     824        # Remove the registered prefix  
     825        parser.remove_option("paths", prefix) 
     826    parser.write(open(filename, "wb")) 
     827     
     828def search_paths(prefix=None): 
     829    """ Return a list of the registered (prefix, path) pairs. 
     830    """ 
     831    persistent_paths = persistent_search_paths() 
     832    paths = _session_paths + persistent_paths 
     833    if prefix is not None: 
     834        for pref, path in paths: 
     835            if pref == prefix: 
     836                return path 
     837        return "" 
     838    else: 
     839        return paths 
     840     
     841def set_search_path(prefix, path, persistent=False): 
     842    """ Associate a search path with a prefix. 
     843     
     844    :param prefix: a prefix 
     845    :type prefix: str 
     846     
     847    :param path: search path (can also be a list of path strings) 
     848    :type paths: str 
     849     
     850    :param persistent: if True then the prefix-paths pair will be  
     851        saved between sessions (default False). 
     852    :type persistent: bool  
     853     
     854    """ 
     855    global _session_paths 
     856     
     857    if isinstance(path, list): 
     858        path = os.path.pathsep.join(path) 
     859         
     860    if persistent: 
     861        save_persistent_search_path(prefix, path) 
     862        # Invalidate the persistent_search_paths cache. 
     863        persistent_search_paths.clear() 
     864    else: 
     865        _session_paths.append((prefix, path)) 
     866         
     867 
     868def expand_filename(prefixed_name): 
     869    """ Expand the prefixed filename with the full path. 
     870    :: 
     871         
     872        >>> from Orange.data import io 
     873        >>> io.set_search_paths("docs", "/Users/aleserjavec/Documents") 
     874        >>> io.expand_filename("docs:my_tab_file.tab") 
     875        '/Users/aleserjavec/Documents/my_tab_file.tab' 
     876         
     877         
     878    """ 
     879    print "expand", prefixed_name 
     880    prefix, filename = prefixed_name.split(":", 1) #TODO: windows drive letters. 
     881    paths = search_paths(prefix) 
     882    if paths: 
     883        path = paths.split(os.path.pathsep, 1)[0] 
     884        return os.path.join(path, filename) 
     885    else: 
     886        raise ValueError("Unknown prefix %r." % prefix) 
     887     
     888def find_file(prefixed_name): 
     889    """ Find the prefixed filename and return its full path. 
     890    """ 
     891    print "find", prefixed_name 
     892    if not os.path.exists(prefixed_name): 
     893        if ":" not in prefixed_name: 
     894            raise ValueError("Not a prefixed name.")  
     895        prefix, filename = prefixed_name.split(":", 1)  
     896        paths = search_paths(prefix) 
     897        if paths: 
     898            for path in paths.split(os.path.pathsep): 
     899                if os.path.exists(os.path.join(path, filename)): 
     900                    return os.path.join(path, filename) 
     901            raise ValueError("No file %r on prefixed search path %r." % \ 
     902                             (filename, paths)) 
     903        else: 
     904            raise ValueError("Unknown prefix %r." % prefix) 
     905    else: 
     906        return prefixed_name 
     907     
  • source/orange/lib_kernel.cpp

    r8934 r9090  
    21082108  PyErr_Fetch(&ptype, &pvalue, &ptraceback); 
    21092109 
     2110  // Try to find the file in the doc/datasets directory 
    21102111  PyObject *configurationModule = PyImport_ImportModule("orngConfiguration"); 
    21112112  if (configurationModule) { 
     
    21132114    if (datasetsPath) 
    21142115      res = loadDataFromFilePath(type, filename, argstuple, keywords, generatorOnly, PyString_AsString(datasetsPath)); 
    2115       Py_DECREF(configurationModule); 
     2116    Py_DECREF(configurationModule); 
    21162117  } 
    21172118  else { 
    21182119    PyErr_Clear(); 
    21192120  } 
     2121 
     2122  // Try fo find the file using Orange.data.io.find_file 
     2123  PyObject *ioModule = PyImport_ImportModule("Orange.data.io"); 
     2124  if (ioModule) { 
     2125      PyObject *find_file = PyObject_GetAttrString(ioModule, "find_file"); 
     2126      if (find_file){ 
     2127          PyObject *py_args = Py_BuildValue("(s)", filename); 
     2128          PyObject *ex_filename = PyObject_Call(find_file, py_args, NULL); 
     2129          if (ex_filename && PyString_Check(ex_filename)){ 
     2130              res = loadDataFromFileNoSearch(type, PyString_AsString(ex_filename), argstuple, keywords, generatorOnly); 
     2131              Py_DECREF(ex_filename); 
     2132          } 
     2133          else 
     2134              PyErr_Clear(); 
     2135          Py_DECREF(py_args); 
     2136          Py_DECREF(find_file); 
     2137      } 
     2138      Py_DECREF(ioModule); 
     2139  } 
     2140  if (!res) 
     2141      PyErr_Clear(); 
    21202142 
    21212143  if (!res) { 
Note: See TracChangeset for help on using the changeset viewer.