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