class Pirka::Library
Environment variables affect this class:
XDG_DATA_HOME: Directory to store library files and read. Defaults to $HOME/.local/share XDG_DATA_DIRS: Directories to search library files. Separated with a colon ':'. Defaults to /usr/local/share:/usr/share
@see standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
Constants
- DATA_DIRS
- DATA_HOME
- DIR_NAME
- EXT
- SUBDIR_LENGTH
- XDG_DATA_DIRS
- XDG_DATA_HOME
Attributes
Public Class Methods
@param [String] release_identifier Release Identifier @return [String] String that `Release Identifier` property in metadata is encoded based on RFC 4648 “Base 64 Encoding with URL and Filename Safe Alphabet” @see tools.ietf.org/html/rfc4648#page-7 @todo Better name
# File lib/pirka/library.rb, line 64 def basename_without_ext(release_identifier) Base64.urlsafe_encode64(release_identifier) end
@see standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
# File lib/pirka/library.rb, line 45 def data_directory(user = nil) directories.first end
@return [Array<Pathname>]
# File lib/pirka/library.rb, line 34 def directories(user = nil) data_dirs = ENV["XDG_DATA_DIRS"] ? ENV["XDG_DATA_DIRS"].split(":").collect {|dir| Pathname.new(dir)/DIR_NAME} : DATA_DIRS data_home = ENV["XDG_DATA_HOME"] ? Pathname.new(ENV["XDG_DATA_HOME"])/DIR_NAME : Pathname.new(Dir.home(user))/DATA_HOME ([@data_home, data_home] + @additional_directories + data_dirs).compact end
# File lib/pirka/library.rb, line 68 def filename(release_identifier) name = basename_without_ext(release_identifier) name.insert(SUBDIR_LENGTH, "/") if name.length > SUBDIR_LENGTH name + EXT end
@param [String] release_identifier @return [Library, nil]
# File lib/pirka/library.rb, line 51 def find_by_release_identifier(release_identifier) lib_path = filename(release_identifier) directories.each do |dir| path = dir/lib_path return load_file(path) if path.file? end nil end
@param [Pathname, String] path @return [Library]
# File lib/pirka/library.rb, line 76 def load_file(path) load_hash(YAML.load_file(path.to_s)) end
@param [Hash] h @return [Library]
# File lib/pirka/library.rb, line 82 def load_hash(h) library = new h.each_pair do |key, value| if key == "codelist" value.each_pair do |cfi, data| library.codelist[EPUB::CFI.parse(cfi)] = data end else library.metadata[key] = value end end library end
@param [Pathname, String, nil] directory for library files. When `nil` passed, default directories are used
# File lib/pirka/library.rb, line 102 def initialize @metadata = {} @codelist = {} end
Public Instance Methods
# File lib/pirka/library.rb, line 107 def data_directory(user = nil) self.class.data_directory(user) end
Iterate over codelist in order of EPUB CFI @overload each
@yieldparam [EPUB::CFI] cfi EPUB CFI indicating code element @yieldparam [String] language Language name
@overload each
@return [Enumerator] Enumerator which iterates over cfi and lang
# File lib/pirka/library.rb, line 133 def each sorted_list = @codelist.each_pair.sort_by {|(cfi, data)| cfi} if block_given? sorted_list.each do |(cfi, data)| yield cfi, data end else sorted_list.each end end
# File lib/pirka/library.rb, line 111 def filename raise _("Release Identifier is not set") unless @metadata["Release Identifier"] self.class.filename(@metadata["Release Identifier"]) end
@param [Pathname, String, nil] path File path to save library data.
When `nil` is passwd, default directory + filename determined by Release Identifier is used
@return [Pathname] File path that library data was saved
# File lib/pirka/library.rb, line 119 def save(path = nil) path = data_directory/filename unless path path = Pathname(path) path.dirname.mkpath unless path.dirname.directory? path.write to_yaml path end
@return [Hash]
# File lib/pirka/library.rb, line 145 def to_h metadata.merge({ "codelist" => each.with_object({}) {|(cfi, value), list| list[cfi.to_s] = value } }) end
@return [String]
# File lib/pirka/library.rb, line 154 def to_yaml to_h.to_yaml end