lib/xdg.rb in xdg-1.0.0 vs lib/xdg.rb in xdg-2.0.0

- old
+ new

@@ -1,8 +1,6 @@ -require 'rbconfig' - -# = XDG Base Directory Standard +# XDG Base Directory Standard # # This provides a conveient library for conforming to the # XDG Base Directory Standard. # # http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html @@ -24,235 +22,25 @@ # temporary files. Much like var/ and tmp/ in FHS. # # The module returns all paths as String. # module XDG - - #module_function - extend self - - # Returns user's home directory. - # - def home - File.expand_path('~') # ENV['HOME'] + if RUBY_VERSION > '1.9' + require_relative 'xdg/version' + require_relative 'xdg/base_dir' + require_relative 'xdg/base_dir/extended' + require_relative 'xdg/base_dir/mixin' + else + require 'xdg/version' + require 'xdg/base_dir' + require 'xdg/base_dir/extended' + require 'xdg/base_dir/mixin' end - # Access to data resource locations. # - # XDG.data.each{ |dir| ... } - # - def data(*glob_and_flags, &block) - if !glob_and_flags.empty? or block_given? - Data.select(*glob_and_flags, &block) - else - Data - end + def self.[](*env_path) + BaseDir.new(*env_path) end +end - # Access to configuration locations. - # - # XDG.config.each{ |dir| ... } - # - def config(*glob_and_flags, &block) - if !glob_and_flags.empty? or block_given? - Config.select(*glob_and_flags, &block) - else - Config - end - end - - # Access to cache locations. - # - # XDG.cache.each{ |dir| ... } - # - def cache(*glob_and_flags, &block) - if !glob_and_flags.empty? or block_given? - Cache.select(*glob_and_flags, &block) - else - Cache - end - end - - # Each directory set shares these common methods. - # - module Common - - # Returns a complete list of directories, starting - # with the home location and moving outward. - def list - [home, *dirs] - end - - # Return array of matching files or directories - # in any of the resource locations, starting with - # the home directory and searching outward into - # system directories. - # - # Unlike #select, this doesn't take a block and each - # additional glob argument is treated as a logical-or. - # - # XDG::Data.glob("stick/*.rb", "stick/*.yaml") - # - def glob(*glob_and_flags) - glob, flags = *parse_arguments(*glob_and_flags) - find = [] - list.each do |dir| - glob.each do |pattern| - find.concat(Dir.glob(File.join(dir, pattern), flags)) - end - end - find.uniq - end - - # Return array of matching files or directories - # in any of the resource locations, starting with - # the home directory and searching outward into - # system directories. - # - # String parameters are joined into a pathname - # while Integers and Symbols treated as flags. - # - # For example, the following are equivalent: - # - # XDG.data.select('stick/units', File::FNM_CASEFOLD) - # - # XDG.data.select('stick', 'units', :casefold) - # - def select(*glob_and_flags, &block) - glob, flag = *parse_arguments(*glob_and_flags) - find = [] - list.each do |dir| - path = File.join(dir, *glob) - hits = Dir.glob(path, flag) - hits = hits.select(&block) if block_given? - find.concat(hits) - end - find.uniq - end - - # Find a file or directory. This works just like #select - # except that it returns the first match found. - # - # TODO: It would be more efficient to traverse the dirs and use #fnmatch. - # - def find(*glob_and_flags, &block) - glob, flag = *parse_arguments(*glob_and_flags) - find = nil - list.each do |dir| - path = File.join(dir, *glob) - hits = Dir.glob(path, flag) - hits = hits.select(&block) if block_given? - find = hits.first - break if find - end - find - end - - private - - def parse_arguments(*glob_and_flags) - glob, flags = *glob_and_flags.partition{ |e| String===e } - glob = ['**/*'] if glob.empty? - flag = flags.inject(0) do |m, f| - if Symbol === f - m + File::const_get("FNM_#{f.to_s.upcase}") - else - m + f.to_i - end - end - return glob, flag - end - - end - - # = DATA LOCATIONS - # - module Data - include Common - - # Location of personal data directory. - def home - @home ||= ( - File.expand_path( - ENV['XDG_DATA_HOME'] || File.join(XDG.home, '.local', 'share') - ) - ) - end - - # List of shared data directores. - def dirs - @dirs ||= ( - dirs = ENV['XDG_DATA_DIRS'].split(/[:;]/) - if dirs.empty? - #dirs = [ Config::CONFIG['localdatadir'], Config::CONFIG['datadir'] ] - dirs = Resource.dirs.map{ |d| File.join(d, 'share') } - end - dirs = dirs.map{ |d| File.expand_path(d) }.uniq - dirs = dirs.select{ |d| File.directory?(d) } - dirs - ) - end - - extend self - end - - # = CONFIGUTATION LOCATIONS - # - module Config - include Common - extend self - - # Location of personal config directory. - def home - @home ||= ( - File.expand_path( - ENV['XDG_CONFIG_HOME'] || File.join(XDG.home, '.config') - ) - ) - end - - # List of shared config directories. - def dirs - @dirs ||= ( - dirs = ENV['XDG_CONFIG_DIRS'].to_s.split(/[:;]/) - if dirs.empty? - #dirs = ['etc/xdg', 'etc'] - sysconfdir = ::Config::CONFIG['sysconfdir'] - dirs = [ File.join(sysconfdir, 'xdg'), sysconfdir ] - end - dirs = dirs.map{ |d| File.expand_path(d) }.uniq - dirs = dirs.select{ |d| File.directory?(d) } - dirs - ) - end - - extend self - end - - # = CACHE LOCATIONS - # - module Cache - include Common - - # Location of user's personal cache directory. - def home - @home ||= ( - File.expand_path( - ENV['XDG_CACHE_HOME'] || File.join(XDG.home, '.cache') - ) - ) - end - - # Serves as a no-op, since there are no common cache directories - # defined by the XDG standard. (Though one might argue that - # <tt>tmp/</tt> is one.) - def dirs - @dirs ||= [] - end - - extend self - end - -end # module XDG - -# Copyright (c) 2008,2009 Thomas Sawyer -# Distributed under the terms of the LGPL v3. +# Copyright (c) 2008,2011 Thomas Sawyer +# Distributed under the terms of the APACHE 2.0 license.