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

additional_directories[RW]
data_home[RW]
codelist[R]
metadata[R]

Public Class Methods

basename_without_ext(release_identifier) click to toggle source

@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
data_directory(user = nil) click to toggle source

@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
directories(user = nil) click to toggle source

@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
filename(release_identifier) click to toggle source
# 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
find_by_release_identifier(release_identifier) click to toggle source

@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
load_file(path) click to toggle source

@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
load_hash(h) click to toggle source

@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
new() click to toggle source

@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

data_directory(user = nil) click to toggle source
# File lib/pirka/library.rb, line 107
def data_directory(user = nil)
  self.class.data_directory(user)
end
each() { |cfi, data| ... } click to toggle source

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
filename() click to toggle source
# 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
save(path = nil) click to toggle source

@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
to_h() click to toggle source

@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
to_yaml() click to toggle source

@return [String]

# File lib/pirka/library.rb, line 154
def to_yaml
  to_h.to_yaml
end