dev_suite 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 18cb4bab59f55347094ab11c9772b132446789b2c5a12cdb0a596b9ccd57ab0b
4
- data.tar.gz: 212866e22087fa628633af141c349e9831f0d0ad060018aed0f0cd6742cbfb9e
3
+ metadata.gz: b962be05b7f06443a5620effcba37759712b4a930654f28782280bdcfb975698
4
+ data.tar.gz: 3d3987ce785c0211d279a382fcd0dace11ce3e66861629b613e1857ddf9064c5
5
5
  SHA512:
6
- metadata.gz: 29b881d2e2f34f10aced28ff856a56ca75da39c4000c8cd17194d2bd535c7b595799919ba164bf2a55ac61b4e0f3d9833f9e11c028e3fcc51c0b1017ba307aca
7
- data.tar.gz: d136f946ff59f6db1d5ac5d14447d302ed6f85df55e1c4b64af2f0cc5a54efa2a48ec4aaffa2a520cb455195af4300aeb0c3ae606da6c4b7aba19ca66a5a6e32
6
+ metadata.gz: f5cc89b151a1224cd7fa29c65c05a0d873e400585ad949e5f5b6278bb23aacfda90367036372f659f5596e948217b63cc00a71c71cfcc1a20fe4c72076227257
7
+ data.tar.gz: 13998cef95d7658837462bb319f5af0664302eeeb54168fc1fe0c9049f3f287df8887665d27eaf69009789cac71541b3d0e457d3f456ce2af35557d2832b2248
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- dev_suite (0.1.1)
4
+ dev_suite (0.1.2)
5
5
  benchmark (~> 0.1)
6
6
  get_process_mem (~> 0.2)
7
7
 
data/README.md CHANGED
@@ -80,6 +80,37 @@ DevSuite::SomeUtility.do_something
80
80
  ```
81
81
  </details>
82
82
 
83
+ <details>
84
+ <summary><strong>Directory Tree Visualization</strong></summary>
85
+
86
+ Visualize the structure of directories and their subdirectories with a detailed hierarchical representation. This tool is essential for understanding the organization of your files and directories at a glance.
87
+
88
+ **Usage:**
89
+ ```ruby
90
+ require 'dev_suite'
91
+
92
+ # Set the base path for the directory you want to visualize
93
+ base_path = "/path/to/your/directory"
94
+
95
+ # Perform the visualization
96
+ DevSuite::DirectoryTree::Visualizer.visualize(base_path)
97
+ ```
98
+
99
+ **Example output**
100
+ ```
101
+ /path/to/your/directory/
102
+ ├── project/
103
+ │ ├── src/
104
+ │ │ ├── main.rb
105
+ │ │ └── helper.rb
106
+ │ └── spec/
107
+ │ └── main_spec.rb
108
+ ├── doc/
109
+ │ └── README.md
110
+ └── test/
111
+ └── test_helper.rb
112
+ ```
113
+ </details>
83
114
 
84
115
  ## Development
85
116
 
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DevSuite
4
+ module DirectoryTree
5
+ module Node
6
+ class Base
7
+ attr_reader :name
8
+
9
+ def initialize(name)
10
+ @name = name
11
+ end
12
+
13
+ def directory?
14
+ raise NotImplementedError, "Must implement in subclass"
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base"
4
+
5
+ module DevSuite
6
+ module DirectoryTree
7
+ module Node
8
+ class Directory < Base
9
+ attr_reader :children
10
+
11
+ def initialize(name)
12
+ super
13
+ @children = []
14
+ end
15
+
16
+ def directory?
17
+ true
18
+ end
19
+
20
+ def add_child(child)
21
+ @children << child
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base"
4
+
5
+ module DevSuite
6
+ module DirectoryTree
7
+ module Node
8
+ class File < Base
9
+ def directory?
10
+ false
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base"
4
+
5
+ module DevSuite
6
+ module DirectoryTree
7
+ module Node
8
+ class PermissionDenied < Base
9
+ # This class is used to represent a file or directory that the user does not have permission to access.
10
+ def initialize(name, is_directory)
11
+ super(name)
12
+ @is_directory = is_directory
13
+ end
14
+
15
+ def directory?
16
+ @is_directory
17
+ end
18
+
19
+ def children
20
+ []
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DevSuite
4
+ module DirectoryTree
5
+ module Node
6
+ require_relative "node/file"
7
+ require_relative "node/directory"
8
+ require_relative "node/permission_denied"
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pathname"
4
+
5
+ module DevSuite
6
+ module DirectoryTree
7
+ module Renderer
8
+ class Base
9
+ def initialize(base_path)
10
+ @base_path = Pathname.new(base_path)
11
+ end
12
+
13
+ def render
14
+ root = build_tree(@base_path)
15
+ render_node(root, "", true)
16
+ end
17
+
18
+ private
19
+
20
+ # Builds the tree structure
21
+ # @param path [Pathname] The path to build the tree from
22
+ # @return [Node::Base] The root node of the tree
23
+ def build_tree(path)
24
+ raise NotImplementedError, "You must implement the build_tree method"
25
+ end
26
+
27
+ # Renders a node in the tree
28
+ # @param node [Node::Base] The node to render
29
+ # @param prefix [String] The prefix to add to the node
30
+ # @param is_last [Boolean] Whether this is the last node in the list
31
+ # @return [String] The rendered node
32
+ def render_node(node, prefix, is_last)
33
+ raise NotImplementedError, "You must implement the render_node method"
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base"
4
+ require_relative "../node"
5
+
6
+ module DevSuite
7
+ module DirectoryTree
8
+ module Renderer
9
+ class Simple < Base
10
+ private
11
+
12
+ def build_tree(path)
13
+ return Node::PermissionDenied.new(path.basename.to_s, path.directory?) unless path.readable?
14
+
15
+ if path.directory?
16
+ dir = Node::Directory.new(path.basename.to_s)
17
+ children = path.children.sort_by { |child| child.basename.to_s.downcase }
18
+ children.each do |child|
19
+ dir.add_child(build_tree(child))
20
+ end
21
+ dir
22
+ else
23
+ Node::File.new(path.basename.to_s)
24
+ end
25
+ rescue Errno::EACCES
26
+ Node::PermissionDenied.new(path.basename.to_s, path.directory?)
27
+ end
28
+
29
+ def render_node(node, prefix = "", is_last = true)
30
+ # Determine if this is the root node based on the prefix content
31
+ is_root = prefix.empty?
32
+
33
+ # Prepare the connector appropriately, omitting it for the root
34
+ connector = if is_root
35
+ ""
36
+ else
37
+ (is_last ? "└── " : "├── ")
38
+ end
39
+
40
+ # Compute the new prefix for children
41
+ new_prefix = "#{prefix}#{is_last ? " " : "| "}"
42
+
43
+ # Construct the output for the current node, avoiding the connector for the root
44
+ output = "#{prefix}#{connector}#{node.name}"
45
+ output += "/\n" if node.directory?
46
+
47
+ # Recursively render children if it's a directory
48
+ if node.directory? && node.children.any?
49
+ node.children.each_with_index do |child, index|
50
+ output += render_node(child, new_prefix, index == node.children.size - 1)
51
+ end
52
+ elsif !node.directory?
53
+ output += "\n"
54
+ end
55
+
56
+ output
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DevSuite
4
+ module DirectoryTree
5
+ module Renderer
6
+ require_relative "renderer/simple"
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pathname"
4
+ require_relative "renderer"
5
+
6
+ module DevSuite
7
+ module DirectoryTree
8
+ class Visualizer
9
+ class << self
10
+ # Visualizes the directory tree
11
+ # @param base_path [String] The base path of the directory
12
+ def visualize(base_path)
13
+ new(base_path).visualize
14
+ end
15
+ end
16
+
17
+ def initialize(base_path, renderer: Renderer::Simple.new(base_path))
18
+ @renderer = renderer
19
+ end
20
+
21
+ def visualize
22
+ puts @renderer.render
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DevSuite
4
+ module DirectoryTree
5
+ require_relative "directory_tree/visualizer"
6
+ end
7
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DevSuite
2
4
  module Performance
3
5
  module Reportor
@@ -1,3 +1,3 @@
1
1
  module DevSuite
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
data/lib/dev_suite.rb CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  require "dev_suite/version"
4
4
  require "dev_suite/performance"
5
+ require "dev_suite/directory_tree"
5
6
 
6
7
  module DevSuite
7
8
  class Error < StandardError; end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dev_suite
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Huy Nguyen
@@ -61,6 +61,16 @@ files:
61
61
  - bin/setup
62
62
  - dev_suite.gemspec
63
63
  - lib/dev_suite.rb
64
+ - lib/dev_suite/directory_tree.rb
65
+ - lib/dev_suite/directory_tree/node.rb
66
+ - lib/dev_suite/directory_tree/node/base.rb
67
+ - lib/dev_suite/directory_tree/node/directory.rb
68
+ - lib/dev_suite/directory_tree/node/file.rb
69
+ - lib/dev_suite/directory_tree/node/permission_denied.rb
70
+ - lib/dev_suite/directory_tree/renderer.rb
71
+ - lib/dev_suite/directory_tree/renderer/base.rb
72
+ - lib/dev_suite/directory_tree/renderer/simple.rb
73
+ - lib/dev_suite/directory_tree/visualizer.rb
64
74
  - lib/dev_suite/performance.rb
65
75
  - lib/dev_suite/performance/analyzer.rb
66
76
  - lib/dev_suite/performance/data.rb