class VFS::JSONWriter

JSONWriter class. @see llvm.org/doxygen/VirtualFileSystem_8cpp_source.html @abstract

Attributes

dir_stack[R]

Public Class Methods

new() click to toggle source
# File lib/yaml-vfs/yaml_vfs.rb, line 79
def initialize
  @dir_stack = []
end

Public Instance Methods

write(entries, use_external_names, case_sensitive, overlay_relative, overlay_dir) click to toggle source
# File lib/yaml-vfs/yaml_vfs.rb, line 67
def write(entries, use_external_names, case_sensitive, overlay_relative, overlay_dir)
  use_overlay_relative = write_yaml_header(use_external_names, case_sensitive, overlay_relative, overlay_dir)
  unless entries.empty?
    current_dir_empty = write_root_entry(entries, use_overlay_relative, overlay_dir)
    entries.drop(1).reduce(current_dir_empty) do |empty, entry|
      dir = entry.directory? ? entry.v_path : entry.v_path.dirname
      start_directory_or_return(dir, empty, use_overlay_relative, overlay_dir, entry)
    end
  end
  write_yaml_footer(entries)
end

Private Instance Methods

contained_in?(parent, path) click to toggle source
# File lib/yaml-vfs/yaml_vfs.rb, line 93
def contained_in?(parent, path)
  path.ascend { |p| break true if parent == p } || false
end
contained_part(parent, path) click to toggle source
# File lib/yaml-vfs/yaml_vfs.rb, line 97
def contained_part(parent, path)
  raise ArgumentError if parent.nil?
  raise ArgumentError unless contained_in?(parent, path)

  path.relative_path_from(parent)
end
dir_indent() click to toggle source
# File lib/yaml-vfs/yaml_vfs.rb, line 85
def dir_indent
  @dir_stack.length * 4
end
end_directory() click to toggle source
# File lib/yaml-vfs/yaml_vfs.rb, line 114
def end_directory
  indent = dir_indent
  @stream += "]\n".indent(indent + 2)
  @stream += '}'.indent(indent)
  @dir_stack.pop
end
file_indent() click to toggle source
# File lib/yaml-vfs/yaml_vfs.rb, line 89
def file_indent
  (@dir_stack.length + 1) * 4
end
overlay_dir_sub_rpath(use, overlay_dir, rpath) click to toggle source
# File lib/yaml-vfs/yaml_vfs.rb, line 130
def overlay_dir_sub_rpath(use, overlay_dir, rpath)
  if use
    raise ArgumentError, 'Overlay dir must be contained in RPath' unless rpath.fnmatch?("#{overlay_dir}*")

    rpath = rpath.relative_path_from(overlay_dir).expand_path
  end
  rpath
end
start_directory(path) click to toggle source
# File lib/yaml-vfs/yaml_vfs.rb, line 104
def start_directory(path)
  name = @dir_stack.empty? ? path : contained_part(@dir_stack.last, path)
  @dir_stack << path
  indent = dir_indent
  @stream += "{\n".indent(indent)
  @stream += "'type': 'directory',\n".indent(indent + 2)
  @stream += "'name': \"#{name}\",\n".indent(indent + 2)
  @stream += "'contents': [\n".indent(indent + 2)
end
start_directory_or_return(dir, current_dir_empty, use_overlay_relative, overlay_dir, entry) click to toggle source
# File lib/yaml-vfs/yaml_vfs.rb, line 189
def start_directory_or_return(dir, current_dir_empty, use_overlay_relative, overlay_dir, entry)
  if dir == @dir_stack.last
    @stream += ",\n" unless current_dir_empty
  else
    @stream += ",\n" if until_end_directory(dir) || !current_dir_empty
    start_directory(dir)
    current_dir_empty = true
  end
  use_overlay_relative_and_write_entry(use_overlay_relative, overlay_dir, current_dir_empty, entry)
end
until_end_directory(dir) click to toggle source
# File lib/yaml-vfs/yaml_vfs.rb, line 170
def until_end_directory(dir)
  dir_popped_from_stack = false
  until @dir_stack.empty? || contained_in?(@dir_stack.last, dir)
    @stream += "\n"
    end_directory
    dir_popped_from_stack = true
  end
  dir_popped_from_stack
end
use_overlay_relative_and_write_entry(use_overlay_relative, overlay_dir, current_dir_empty, entry) click to toggle source
# File lib/yaml-vfs/yaml_vfs.rb, line 180
def use_overlay_relative_and_write_entry(use_overlay_relative, overlay_dir, current_dir_empty, entry)
  rpath = overlay_dir_sub_rpath(use_overlay_relative, overlay_dir, entry.r_path)
  unless entry.directory?
    write_entry(entry.v_path.basename, rpath)
    current_dir_empty = false
  end
  current_dir_empty
end
write_entry(v_path, r_path) click to toggle source
# File lib/yaml-vfs/yaml_vfs.rb, line 121
def write_entry(v_path, r_path)
  indent = file_indent
  @stream += "{\n".indent(indent)
  @stream += "'type': 'file',\n".indent(indent + 2)
  @stream += "'name': \"#{v_path}\",\n".indent(indent + 2)
  @stream += "'external-contents': \"#{r_path}\"\n".indent(indent + 2)
  @stream += '}'.indent(file_indent)
end
write_root_entry(entries, use_overlay_relative, overlay_dir) click to toggle source
# File lib/yaml-vfs/yaml_vfs.rb, line 161
def write_root_entry(entries, use_overlay_relative, overlay_dir)
  return true if entries.empty?

  f_entry = entries.first
  start_directory(f_entry.directory? ? f_entry.v_path : f_entry.v_path.dirname)
  current_dir_empty = f_entry.directory?
  use_overlay_relative_and_write_entry(use_overlay_relative, overlay_dir, current_dir_empty, f_entry)
end
write_yaml_header(use_external_names, case_sensitive, overlay_relative, _overlay_dir) click to toggle source
# File lib/yaml-vfs/yaml_vfs.rb, line 139
def write_yaml_header(use_external_names, case_sensitive, overlay_relative, _overlay_dir)
  @stream = "{\n  'version': 0,\n"
  @stream += "  'case-sensitive': '#{case_sensitive}',\n" unless case_sensitive.nil?
  @stream += "  'use-external-names': '#{use_external_names}',\n" unless use_external_names.nil?
  use_overlay_relative = !overlay_relative.nil?
  @stream += "  'overlay_relative': '#{overlay_relative}',\n" if use_overlay_relative
  @stream += "  'roots': [\n"
  use_overlay_relative
end