Class: Staticky::Files::MemoryFileSystem::Node
- Inherits:
-
Object
- Object
- Staticky::Files::MemoryFileSystem::Node
- 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
-
#children ⇒ Object
readonly
Returns the value of attribute children.
-
#mode ⇒ Object
readonly
Returns the value of attribute mode.
-
#segment ⇒ Object
readonly
Returns the value of attribute segment.
Class Method Summary collapse
-
.root ⇒ Staticky::Files::MemoryFileSystem::Node
Instantiate a root node.
Instance Method Summary collapse
- #array_to_string(content) ⇒ Object
-
#chmod=(mode) ⇒ Object
Set UNIX mode It accepts base 2, 8, 10, and 16 numbers.
-
#directory? ⇒ TrueClass, FalseClass
Check if node is a directory.
- #executable? ⇒ Boolean
-
#file? ⇒ TrueClass, FalseClass
Check if node is a file.
-
#get(segment) ⇒ Staticky::Files::MemoryFileSystem::Node, NilClass
Get a node child.
-
#initialize(segment, mode = DEFAULT_DIRECTORY_MODE) ⇒ Staticky::Files::MemoryFileSystem::Node
constructor
Instantiate a new node.
-
#read ⇒ String
Read file contents.
-
#readable? ⇒ TrueClass, FalseClass
Check if node is executable for user.
-
#readlines ⇒ Array<String>
Read file content lines.
-
#set(segment) ⇒ Object
Set a node child.
-
#unset(segment) ⇒ Object
Unset a node child.
-
#write(content) ⇒ Object
Write file contents IMPORTANT: This operation turns a node into a file.
Constructor Details
#initialize(segment, mode = DEFAULT_DIRECTORY_MODE) ⇒ Staticky::Files::MemoryFileSystem::Node
Instantiate a new node. It’s a directory node by default.
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
#children ⇒ Object (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 |
#mode ⇒ Object (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 |
#segment ⇒ Object (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
.root ⇒ Staticky::Files::MemoryFileSystem::Node
Instantiate a 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
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
100 101 102 |
# File 'lib/staticky/files/memory_file_system/node.rb', line 100 def directory? !file? end |
#executable? ⇒ Boolean
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
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
73 74 75 |
# File 'lib/staticky/files/memory_file_system/node.rb', line 73 def get(segment) @children&.fetch(segment, nil) end |
#read ⇒ String
Read 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
166 167 168 |
# File 'lib/staticky/files/memory_file_system/node.rb', line 166 def readable? mode.anybits?(MODE_USER_READ) end |
#readlines ⇒ Array<String>
Read 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
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
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
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 |