class Dry::Files::MemoryFileSystem::Node

Memory file system node (directory or file)

@since 0.1.0 @api private

File modes implementation inspired by www.calleluks.com/flags-bitmasks-and-unix-file-system-permissions-in-ruby/

Constants

DEFAULT_DIRECTORY_MODE

Default directory mode: 0755

@since 0.1.0 @api private

DEFAULT_FILE_MODE

Default file mode: 0644

@since 0.1.0 @api private

MODE_BASE

@since 0.1.0 @api private

MODE_GROUP_EXECUTE

@since 0.1.0 @api private

MODE_GROUP_READ

@since 0.1.0 @api private

MODE_GROUP_WRITE

@since 0.1.0 @api private

MODE_OTHERS_EXECUTE

@since 0.1.0 @api private

MODE_OTHERS_READ

@since 0.1.0 @api private

MODE_OTHERS_WRITE

@since 0.1.0 @api private

MODE_USER_EXECUTE

@since 0.1.0 @api private

MODE_USER_READ

@since 0.1.0 @api private

MODE_USER_WRITE

@since 0.1.0 @api private

ROOT_PATH

@since 0.1.0 @api private

Attributes

mode[R]

@since 0.1.0 @api private

segment[R]

@since 0.1.0 @api private

Public Class Methods

new(segment, mode = DEFAULT_DIRECTORY_MODE) click to toggle source

Instantiate a new node. It's a directory node by default.

@param segment [String] the path segment of the node @param mode [Integer] the UNIX mode

@return [Dry::Files::MemoryFileSystem::Node] the new node

@see mode=

@since 0.1.0 @api private

# File lib/dry/files/memory_file_system/node.rb, line 113
def initialize(segment, mode = DEFAULT_DIRECTORY_MODE)
  @segment = segment
  @children = nil
  @content = nil

  self.chmod = mode
end
root() click to toggle source

Instantiate a root node

@return [Dry::Files::MemoryFileSystem::Node] the root node

@since 0.1.0 @api private

# File lib/dry/files/memory_file_system/node.rb, line 93
def self.root
  new(ROOT_PATH)
end

Public Instance Methods

chmod=(mode) click to toggle source

Set UNIX mode It accepts base 2, 8, 10, and 16 numbers

@param mode [Integer] the file mode

@since 0.1.0 @api private

# File lib/dry/files/memory_file_system/node.rb, line 230
def chmod=(mode)
  @mode = mode.to_s(MODE_BASE).hex
end
directory?() click to toggle source

Check if node is a directory

@return [TrueClass,FalseClass] the result of the check

@since 0.1.0 @api private

# File lib/dry/files/memory_file_system/node.rb, line 165
def directory?
  !file?
end
executable?() click to toggle source

Check if node is executable for user

@return [TrueClass,FalseClass] the result of the check

@since 0.1.0 @api private

# File lib/dry/files/memory_file_system/node.rb, line 240
def executable?
  (mode & MODE_USER_EXECUTE).positive?
end
file?() click to toggle source

Check if node is a file

@return [TrueClass,FalseClass] the result of the check

@since 0.1.0 @api private

# File lib/dry/files/memory_file_system/node.rb, line 175
def file?
  !@content.nil?
end
get(segment) click to toggle source

Get a node child

@param segment [String] the child path segment

@return [Dry::Files::MemoryFileSystem::Node,NilClass] the child node, if found

@since 0.1.0 @api private

# File lib/dry/files/memory_file_system/node.rb, line 129
def get(segment)
  @children&.fetch(segment, nil)
end
read() click to toggle source

Read file contents

@return [String] the file contents

@raise [Dry::Files::NotMemoryFileError] if node isn't a file

@since 0.1.0 @api private

# File lib/dry/files/memory_file_system/node.rb, line 187
def read
  raise NotMemoryFileError, segment unless file?

  @content.rewind
  @content.read
end
readlines() click to toggle source

Read file content lines

@return [Array<String>] the file content lines

@raise [Dry::Files::NotMemoryFileError] if node isn't a file

@since 0.1.0 @api private

# File lib/dry/files/memory_file_system/node.rb, line 202
def readlines
  raise NotMemoryFileError, segment unless file?

  @content.rewind
  @content.readlines
end
set(segment) click to toggle source

Set a node child

@param segment [String] the child path segment

@since 0.1.0 @api private

# File lib/dry/files/memory_file_system/node.rb, line 139
def set(segment)
  @children ||= {}
  @children[segment] ||= self.class.new(segment)
end
unset(segment) click to toggle source

Unset a node child

@param segment [String] the child path segment

@raise [Dry::Files::UnknownMemoryNodeError] if the child node cannot be found

@since 0.1.0 @api private

# File lib/dry/files/memory_file_system/node.rb, line 152
def unset(segment)
  @children ||= {}
  raise UnknownMemoryNodeError, segment unless @children.key?(segment)

  @children.delete(segment)
end
write(*content) click to toggle source

Write file contents IMPORTANT: This operation turns a node into a file

@param content [String, Array<String>] the file content

@raise [Dry::Files::NotMemoryFileError] if node isn't a file

@since 0.1.0 @api private

# File lib/dry/files/memory_file_system/node.rb, line 218
def write(*content)
  @content = StringIO.new(content.join($RS))
  @mode = DEFAULT_FILE_MODE
end