Class: Staticky::Files::MemoryFileSystem::Node

Inherits:
Object
  • Object
show all
Defined in:
lib/staticky/files/memory_file_system/node.rb

Overview

Memory file system node (directory or file)

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

Constant Summary collapse

MODE_USER_READ =
0b100000000
MODE_USER_WRITE =
0b010000000
MODE_USER_EXECUTE =
0b001000000
MODE_GROUP_READ =
0b000100000
MODE_GROUP_WRITE =
0b000010000
MODE_GROUP_EXECUTE =
0b000001000
MODE_OTHERS_READ =
0b000000100
MODE_OTHERS_WRITE =
0b000000010
MODE_OTHERS_EXECUTE =
0b000000001
DEFAULT_DIRECTORY_MODE =

Default directory mode: 0755

MODE_USER_READ |
MODE_USER_WRITE |
MODE_USER_EXECUTE |
MODE_GROUP_READ |
MODE_GROUP_EXECUTE |
MODE_OTHERS_READ |
MODE_GROUP_EXECUTE
DEFAULT_FILE_MODE =

Default file mode: 0644

MODE_USER_READ |
MODE_USER_WRITE |
MODE_GROUP_READ |
MODE_OTHERS_READ
MODE_BASE =
16
ROOT_PATH =
"/"
EMPTY_CONTENT =
""

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(segment, mode = DEFAULT_DIRECTORY_MODE) ⇒ Staticky::Files::MemoryFileSystem::Node

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

See Also:

  • #mode=

Parameters:

  • the path segment of the node

  • (defaults to: DEFAULT_DIRECTORY_MODE)

    the UNIX mode



59
60
61
62
63
64
65
# File 'lib/staticky/files/memory_file_system/node.rb', line 59

def initialize(segment, mode = DEFAULT_DIRECTORY_MODE)
  @segment = segment
  @children = nil
  @content = nil

  self.chmod = mode
end

Instance Attribute Details

#childrenObject (readonly)

Returns the value of attribute children.



48
49
50
# File 'lib/staticky/files/memory_file_system/node.rb', line 48

def children
  @children
end

#modeObject (readonly)

Returns the value of attribute mode.



48
49
50
# File 'lib/staticky/files/memory_file_system/node.rb', line 48

def mode
  @mode
end

#segmentObject (readonly)

Returns the value of attribute segment.



48
49
50
# File 'lib/staticky/files/memory_file_system/node.rb', line 48

def segment
  @segment
end

Class Method Details

.rootStaticky::Files::MemoryFileSystem::Node

Instantiate a root node

Returns:

  • the root node



44
45
46
# File 'lib/staticky/files/memory_file_system/node.rb', line 44

def self.root
  new(ROOT_PATH)
end

Instance Method Details

#array_to_string(content) ⇒ Object



174
175
176
177
178
# File 'lib/staticky/files/memory_file_system/node.rb', line 174

def array_to_string(content)
  content
    .map { |line| line.sub(NEW_LINE_MATCHER, EMPTY_CONTENT) }
    .join(NEW_LINE) + NEW_LINE
end

#chmod=(mode) ⇒ Object

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

Parameters:

  • the file mode



159
160
161
# File 'lib/staticky/files/memory_file_system/node.rb', line 159

def chmod=(mode)
  @mode = mode.to_s(MODE_BASE).hex
end

#directory?TrueClass, FalseClass

Check if node is a directory

Returns:

  • the result of the check



100
101
102
# File 'lib/staticky/files/memory_file_system/node.rb', line 100

def directory?
  !file?
end

#executable?Boolean

Returns:



170
171
172
# File 'lib/staticky/files/memory_file_system/node.rb', line 170

def executable?
  mode.anybits?(MODE_USER_EXECUTE)
end

#file?TrueClass, FalseClass

Check if node is a file

Returns:

  • the result of the check



107
108
109
# File 'lib/staticky/files/memory_file_system/node.rb', line 107

def file?
  !@content.nil?
end

#get(segment) ⇒ Staticky::Files::MemoryFileSystem::Node, NilClass

Get a node child

node, if found

Parameters:

  • the child path segment

Returns:

  • the child



73
74
75
# File 'lib/staticky/files/memory_file_system/node.rb', line 73

def get(segment)
  @children&.fetch(segment, nil)
end

#readString

Read file contents

Raises:

  • if node isn’t a file

Returns:

  • the file contents



116
117
118
119
120
121
# File 'lib/staticky/files/memory_file_system/node.rb', line 116

def read
  raise NotMemoryFileError, segment unless file?

  @content.rewind
  @content.read
end

#readable?TrueClass, FalseClass

Check if node is executable for user

Returns:

  • the result of the check



166
167
168
# File 'lib/staticky/files/memory_file_system/node.rb', line 166

def readable?
  mode.anybits?(MODE_USER_READ)
end

#readlinesArray<String>

Read file content lines

Raises:

  • if node isn’t a file

Returns:

  • the file content lines



128
129
130
131
132
133
# File 'lib/staticky/files/memory_file_system/node.rb', line 128

def readlines
  raise NotMemoryFileError, segment unless file?

  @content.rewind
  @content.readlines
end

#set(segment) ⇒ Object

Set a node child

Parameters:

  • the child path segment



80
81
82
83
# File 'lib/staticky/files/memory_file_system/node.rb', line 80

def set(segment)
  @children ||= {}
  @children[segment] ||= self.class.new(segment)
end

#unset(segment) ⇒ Object

Unset a node child

Raises:

  • if the child node cannot be found

Parameters:

  • the child path segment



90
91
92
93
94
95
# File 'lib/staticky/files/memory_file_system/node.rb', line 90

def unset(segment)
  @children ||= {}
  raise UnknownMemoryNodeError, segment unless @children.key?(segment)

  @children.delete(segment)
end

#write(content) ⇒ Object

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

Raises:

  • if node isn’t a file

Parameters:

  • the file content



141
142
143
144
145
146
147
148
149
150
151
152
153
# File 'lib/staticky/files/memory_file_system/node.rb', line 141

def write(content)
  content = case content
  when String
    content
  when Array
    array_to_string(content)
  when NilClass
    EMPTY_CONTENT
  end

  @content = StringIO.new(content)
  @mode = DEFAULT_FILE_MODE
end