tty-tree 0.3.0 → 0.4.0
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 +4 -4
- data/CHANGELOG.md +9 -0
- data/README.md +24 -24
- data/lib/tty/tree/path_walker.rb +1 -1
- data/lib/tty/tree/version.rb +1 -1
- metadata +14 -21
- data/Rakefile +0 -8
- data/bin/console +0 -14
- data/bin/setup +0 -8
- data/spec/spec_helper.rb +0 -71
- data/spec/unit/directory_renderer_spec.rb +0 -173
- data/spec/unit/hash_walker_spec.rb +0 -122
- data/spec/unit/new_spec.rb +0 -85
- data/spec/unit/node_spec.rb +0 -42
- data/spec/unit/number_renderer_spec.rb +0 -65
- data/spec/unit/path_walker_spec.rb +0 -127
- data/tasks/console.rake +0 -11
- data/tasks/coverage.rake +0 -11
- data/tasks/spec.rake +0 -29
- data/tty-tree.gemspec +0 -27
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5b8452b6655c19ad246609177067301233b28c43fb9c893923d7f4ad22563788
|
4
|
+
data.tar.gz: d830d19213e512c25ccb5101e5dcf1b493e4ef0a386e0552d140cdf6e0d9e679
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e20e02a6917378ca0a002ca21ca9bcbffaa73bafd53350eee51053e2b42ce530bd3a0ee12d71368f0ce2e44bb759479964c8f582f71d6db427b7ed37cadc2f1e
|
7
|
+
data.tar.gz: d9da30e6338893311439317b5fa8e0a4d63ec3358fd825d0b546b6e6219edd6eba3f416a52f74e88f8edf277aef917efff70994595497799739fcc14aed695d0
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
# Change log
|
2
2
|
|
3
|
+
## [v0.4.0] - 2020-01-16
|
4
|
+
|
5
|
+
### Changed
|
6
|
+
* Change gemspec to add metadata and remove test artifacts
|
7
|
+
|
8
|
+
### Fixed
|
9
|
+
* Change to fix Ruby 2.7 keyword conversion warnings
|
10
|
+
|
3
11
|
## [v0.3.0] - 2019-05-03
|
4
12
|
|
5
13
|
### Changed
|
@@ -14,6 +22,7 @@
|
|
14
22
|
|
15
23
|
* Initial implementation and release
|
16
24
|
|
25
|
+
[v0.4.0]: https://github.com/piotrmurach/tty-tree/compare/v0.3.0...v0.4.0
|
17
26
|
[v0.3.0]: https://github.com/piotrmurach/tty-tree/compare/v0.2.0...v0.3.0
|
18
27
|
[v0.2.0]: https://github.com/piotrmurach/tty-tree/compare/v0.1.0...v0.2.0
|
19
28
|
[v0.1.0]: https://github.com/piotrmurach/tty-tree/compare/v0.1.0
|
data/README.md
CHANGED
@@ -44,12 +44,12 @@ Or install it yourself as:
|
|
44
44
|
* [1. Usage](#1-usage)
|
45
45
|
* [2. Interface](#2-interface)
|
46
46
|
* [2.1 new](#21-new)
|
47
|
-
* [2.1.1 level](#211-level)
|
48
|
-
* [2.1.2 file_limit](#212-
|
49
|
-
* [2.1.3 show_hidden](#213-show_hidden)
|
50
|
-
* [2.1.4 only_dirs](#214-only_dirs)
|
47
|
+
* [2.1.1 :level](#211-level)
|
48
|
+
* [2.1.2 :file_limit](#212-file_limit)
|
49
|
+
* [2.1.3 :show_hidden](#213-show_hidden)
|
50
|
+
* [2.1.4 :only_dirs](#214-only_dirs)
|
51
51
|
* [2.2 render](#22-render)
|
52
|
-
* [2.2.1 indent](#221-indent)
|
52
|
+
* [2.2.1 :indent](#221-indent)
|
53
53
|
|
54
54
|
## 1. Usage
|
55
55
|
|
@@ -104,12 +104,12 @@ puts tree.render
|
|
104
104
|
# =>
|
105
105
|
# dir1
|
106
106
|
# ├── config.dat
|
107
|
-
# ├── dir2
|
108
|
-
# │ ├── dir3
|
109
|
-
# │ │ └── file3-1.txt
|
110
|
-
# │ └── file2-1.txt
|
111
|
-
# ├── file1-1.txt
|
112
|
-
# └── file1-2.txt
|
107
|
+
# ├── dir2
|
108
|
+
# │ ├── dir3
|
109
|
+
# │ │ └── file3-1.txt
|
110
|
+
# │ └── file2-1.txt
|
111
|
+
# ├── file1-1.txt
|
112
|
+
# └── file1-2.txt
|
113
113
|
```
|
114
114
|
|
115
115
|
The `render` call returns a string and leaves it up to api consumer how to handle the tree like output.
|
@@ -126,7 +126,7 @@ tree = TTY::Tree.new('dir-name')
|
|
126
126
|
tree = TTY::Tree.new(Pathname.pwd)
|
127
127
|
```
|
128
128
|
|
129
|
-
|
129
|
+
Or hash data structure:
|
130
130
|
|
131
131
|
```ruby
|
132
132
|
data = {
|
@@ -172,7 +172,7 @@ tree = TTY::Tree.new('dir-name', level: 2)
|
|
172
172
|
# => parse directories as deep as 2 levels
|
173
173
|
```
|
174
174
|
|
175
|
-
#### 2.1.2 file_limit
|
175
|
+
#### 2.1.2 `:file_limit`
|
176
176
|
|
177
177
|
Prevent `TTY::Tree` descending directories more than `#` entries:
|
178
178
|
|
@@ -180,7 +180,7 @@ Prevent `TTY::Tree` descending directories more than `#` entries:
|
|
180
180
|
tree = TTY::Tree.new('dir-name', file_limit: 2)
|
181
181
|
```
|
182
182
|
|
183
|
-
#### 2.1.3 show_hidden
|
183
|
+
#### 2.1.3 `:show_hidden`
|
184
184
|
|
185
185
|
In order to for `TTY::Tree` to include hidden files in its output use `:show_hidden` option like so:
|
186
186
|
|
@@ -211,17 +211,17 @@ If you prefer a numeric notation of nested content you can use `TTY::NumberRende
|
|
211
211
|
```ruby
|
212
212
|
puts tree.render(as: :number)
|
213
213
|
# =>
|
214
|
-
# dir1
|
215
|
-
# 1.1 config.dat
|
216
|
-
# 1.2 dir2
|
217
|
-
# 2.3 dir3
|
218
|
-
# 3.4 file3-1.txt
|
219
|
-
# 2.5 file2-1.txt
|
220
|
-
# 1.6 file1-1.txt
|
221
|
-
# 1.7 file1-2.txt
|
214
|
+
# dir1
|
215
|
+
# 1.1 config.dat
|
216
|
+
# 1.2 dir2
|
217
|
+
# 2.3 dir3
|
218
|
+
# 3.4 file3-1.txt
|
219
|
+
# 2.5 file2-1.txt
|
220
|
+
# 1.6 file1-1.txt
|
221
|
+
# 1.7 file1-2.txt
|
222
222
|
```
|
223
223
|
|
224
|
-
#### 2.2.1 indent
|
224
|
+
#### 2.2.1 `:indent`
|
225
225
|
|
226
226
|
The number of spaces to use when indenting nested directories. By default `4` spaces are used.
|
227
227
|
|
@@ -241,4 +241,4 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/piotrm
|
|
241
241
|
|
242
242
|
## Copyright
|
243
243
|
|
244
|
-
Copyright (c) 2017
|
244
|
+
Copyright (c) 2017 Piotr Murach. See LICENSE for further details.
|
data/lib/tty/tree/path_walker.rb
CHANGED
data/lib/tty/tree/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tty-tree
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Piotr Murach
|
8
8
|
autorequire:
|
9
|
-
bindir:
|
9
|
+
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-01-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -54,17 +54,15 @@ dependencies:
|
|
54
54
|
version: '3.0'
|
55
55
|
description: Print directory or structured data in a tree like format.
|
56
56
|
email:
|
57
|
-
-
|
57
|
+
- piotr@piotrmurach.com
|
58
58
|
executables: []
|
59
59
|
extensions: []
|
60
|
-
extra_rdoc_files:
|
60
|
+
extra_rdoc_files:
|
61
|
+
- README.md
|
61
62
|
files:
|
62
63
|
- CHANGELOG.md
|
63
64
|
- LICENSE.txt
|
64
65
|
- README.md
|
65
|
-
- Rakefile
|
66
|
-
- bin/console
|
67
|
-
- bin/setup
|
68
66
|
- lib/tty-tree.rb
|
69
67
|
- lib/tty/tree.rb
|
70
68
|
- lib/tty/tree/directory_renderer.rb
|
@@ -73,21 +71,16 @@ files:
|
|
73
71
|
- lib/tty/tree/number_renderer.rb
|
74
72
|
- lib/tty/tree/path_walker.rb
|
75
73
|
- lib/tty/tree/version.rb
|
76
|
-
- spec/spec_helper.rb
|
77
|
-
- spec/unit/directory_renderer_spec.rb
|
78
|
-
- spec/unit/hash_walker_spec.rb
|
79
|
-
- spec/unit/new_spec.rb
|
80
|
-
- spec/unit/node_spec.rb
|
81
|
-
- spec/unit/number_renderer_spec.rb
|
82
|
-
- spec/unit/path_walker_spec.rb
|
83
|
-
- tasks/console.rake
|
84
|
-
- tasks/coverage.rake
|
85
|
-
- tasks/spec.rake
|
86
|
-
- tty-tree.gemspec
|
87
74
|
homepage: https://piotrmurach.github.io/tty
|
88
75
|
licenses:
|
89
76
|
- MIT
|
90
|
-
metadata:
|
77
|
+
metadata:
|
78
|
+
allowed_push_host: https://rubygems.org
|
79
|
+
bug_tracker_uri: https://github.com/piotrmurach/tty-tree/issues
|
80
|
+
changelog_uri: https://github.com/piotrmurach/tty-tree/blob/master/CHANGELOG.md
|
81
|
+
documentation_uri: https://www.rubydoc.info/gems/tty-tree
|
82
|
+
homepage_uri: https://piotrmurach.github.io/tty
|
83
|
+
source_code_uri: https://github.com/piotrmurach/tty-tree
|
91
84
|
post_install_message:
|
92
85
|
rdoc_options: []
|
93
86
|
require_paths:
|
@@ -103,7 +96,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
103
96
|
- !ruby/object:Gem::Version
|
104
97
|
version: '0'
|
105
98
|
requirements: []
|
106
|
-
rubygems_version: 3.
|
99
|
+
rubygems_version: 3.1.2
|
107
100
|
signing_key:
|
108
101
|
specification_version: 4
|
109
102
|
summary: Print directory or structured data in a tree like format.
|
data/Rakefile
DELETED
data/bin/console
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require "bundler/setup"
|
4
|
-
require "tty/tree"
|
5
|
-
|
6
|
-
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
-
# with your gem easier. You can also use a different console, if you like.
|
8
|
-
|
9
|
-
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
-
# require "pry"
|
11
|
-
# Pry.start
|
12
|
-
|
13
|
-
require "irb"
|
14
|
-
IRB.start(__FILE__)
|
data/bin/setup
DELETED
data/spec/spec_helper.rb
DELETED
@@ -1,71 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
if RUBY_VERSION > '1.9' and (ENV['COVERAGE'] || ENV['TRAVIS'])
|
4
|
-
require 'simplecov'
|
5
|
-
require 'coveralls'
|
6
|
-
|
7
|
-
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
|
8
|
-
SimpleCov::Formatter::HTMLFormatter,
|
9
|
-
Coveralls::SimpleCov::Formatter
|
10
|
-
]
|
11
|
-
|
12
|
-
SimpleCov.start do
|
13
|
-
command_name 'spec'
|
14
|
-
add_filter 'spec'
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
require 'bundler/setup'
|
19
|
-
require 'tty/tree'
|
20
|
-
require 'fileutils'
|
21
|
-
|
22
|
-
module TestHelpers
|
23
|
-
module Paths
|
24
|
-
def gem_root
|
25
|
-
File.expand_path("#{File.dirname(__FILE__)}/..")
|
26
|
-
end
|
27
|
-
|
28
|
-
def dir_path(*args)
|
29
|
-
path = File.join(gem_root, *args)
|
30
|
-
FileUtils.mkdir_p(path)
|
31
|
-
File.realpath(path)
|
32
|
-
end
|
33
|
-
|
34
|
-
def tmp_path(*args)
|
35
|
-
File.join(dir_path('tmp'), *args)
|
36
|
-
end
|
37
|
-
|
38
|
-
def fixtures_path(*args)
|
39
|
-
File.join(dir_path('spec/fixtures'), *args)
|
40
|
-
end
|
41
|
-
|
42
|
-
def within_dir(target, &block)
|
43
|
-
::Dir.chdir(target, &block)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
RSpec.configure do |config|
|
49
|
-
config.include(TestHelpers::Paths)
|
50
|
-
# config.example_status_persistence_file_path = ".rspec_status"
|
51
|
-
|
52
|
-
config.expect_with :rspec do |c|
|
53
|
-
c.syntax = :expect
|
54
|
-
end
|
55
|
-
|
56
|
-
config.mock_with :rspec do |mocks|
|
57
|
-
mocks.verify_partial_doubles = true
|
58
|
-
end
|
59
|
-
|
60
|
-
config.disable_monkey_patching!
|
61
|
-
|
62
|
-
config.warnings = true
|
63
|
-
|
64
|
-
if config.files_to_run.one?
|
65
|
-
config.default_formatter = 'doc'
|
66
|
-
end
|
67
|
-
|
68
|
-
config.order = :random
|
69
|
-
|
70
|
-
Kernel.srand config.seed
|
71
|
-
end
|
@@ -1,173 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
# frozen_string_literal: true
|
3
|
-
|
4
|
-
RSpec.describe TTY::Tree::DirectoryRenderer do
|
5
|
-
it "renders directory as path" do
|
6
|
-
tree = within_dir(fixtures_path) do
|
7
|
-
TTY::Tree.new('dir1')
|
8
|
-
end
|
9
|
-
|
10
|
-
expect(tree.render).to eq([
|
11
|
-
"dir1\n",
|
12
|
-
"├── config.dat\n",
|
13
|
-
"├── dir2\n",
|
14
|
-
"│ ├── dir3\n",
|
15
|
-
"│ │ └── file3-1.txt\n",
|
16
|
-
"│ └── file2-1.txt\n",
|
17
|
-
"├── file1-1.txt\n",
|
18
|
-
"└── file1-2.txt\n",
|
19
|
-
].join)
|
20
|
-
end
|
21
|
-
|
22
|
-
it "renders hash data as path " do
|
23
|
-
data = {
|
24
|
-
dir1: [
|
25
|
-
'config.dat',
|
26
|
-
{ dir2: [
|
27
|
-
{ dir3: [ 'file3-1.txt' ] },
|
28
|
-
'file2-1.txt'
|
29
|
-
]
|
30
|
-
},
|
31
|
-
'file1-1.txt',
|
32
|
-
'file1-2.txt'
|
33
|
-
]
|
34
|
-
}
|
35
|
-
|
36
|
-
tree = TTY::Tree.new(data)
|
37
|
-
|
38
|
-
expect(tree.render).to eq([
|
39
|
-
"dir1\n",
|
40
|
-
"├── config.dat\n",
|
41
|
-
"├── dir2\n",
|
42
|
-
"│ ├── dir3\n",
|
43
|
-
"│ │ └── file3-1.txt\n",
|
44
|
-
"│ └── file2-1.txt\n",
|
45
|
-
"├── file1-1.txt\n",
|
46
|
-
"└── file1-2.txt\n",
|
47
|
-
].join)
|
48
|
-
end
|
49
|
-
|
50
|
-
it "correctly renders orphaned directory as path" do
|
51
|
-
tree = within_dir(fixtures_path) do
|
52
|
-
TTY::Tree.new('orphan_dir')
|
53
|
-
end
|
54
|
-
|
55
|
-
expect(tree.render).to eq([
|
56
|
-
"orphan_dir\n",
|
57
|
-
"├── a.txt\n",
|
58
|
-
"├── b.txt\n",
|
59
|
-
"└── data\n",
|
60
|
-
" ├── data1.bin\n",
|
61
|
-
" ├── data2.sql\n",
|
62
|
-
" └── data3.inf\n",
|
63
|
-
].join)
|
64
|
-
end
|
65
|
-
|
66
|
-
it "correctly renders hash with orphaned directory as path" do
|
67
|
-
data = {
|
68
|
-
orphan_dir: [
|
69
|
-
'a.txt',
|
70
|
-
'b.txt',
|
71
|
-
{ data: [
|
72
|
-
'data1.bin',
|
73
|
-
'data2.sql',
|
74
|
-
'data3.inf'
|
75
|
-
]
|
76
|
-
}
|
77
|
-
]
|
78
|
-
}
|
79
|
-
|
80
|
-
tree = TTY::Tree.new(data)
|
81
|
-
|
82
|
-
expect(tree.render).to eq([
|
83
|
-
"orphan_dir\n",
|
84
|
-
"├── a.txt\n",
|
85
|
-
"├── b.txt\n",
|
86
|
-
"└── data\n",
|
87
|
-
" ├── data1.bin\n",
|
88
|
-
" ├── data2.sql\n",
|
89
|
-
" └── data3.inf\n",
|
90
|
-
].join)
|
91
|
-
end
|
92
|
-
|
93
|
-
it "renders directory as path without indentation" do
|
94
|
-
tree = within_dir(fixtures_path) do
|
95
|
-
TTY::Tree.new('dir1')
|
96
|
-
end
|
97
|
-
|
98
|
-
expect(tree.render(indent: 0)).to eq([
|
99
|
-
"dir1\n",
|
100
|
-
"├── config.dat\n",
|
101
|
-
"├── dir2\n",
|
102
|
-
"│├── dir3\n",
|
103
|
-
"││└── file3-1.txt\n",
|
104
|
-
"│└── file2-1.txt\n",
|
105
|
-
"├── file1-1.txt\n",
|
106
|
-
"└── file1-2.txt\n",
|
107
|
-
].join)
|
108
|
-
end
|
109
|
-
|
110
|
-
it "renders directory without hidden files" do
|
111
|
-
tree = within_dir(fixtures_path) do
|
112
|
-
TTY::Tree.new('hidden_dir', show_hidden: true)
|
113
|
-
end
|
114
|
-
|
115
|
-
expect(tree.render).to eq([
|
116
|
-
"hidden_dir\n",
|
117
|
-
"├── .with_dot\n",
|
118
|
-
"│ └── config.dat\n",
|
119
|
-
"├── dir1\n",
|
120
|
-
"│ ├── .file1.2\n",
|
121
|
-
"│ ├── dir1.1\n",
|
122
|
-
"│ │ └── .file1.1.1\n",
|
123
|
-
"│ ├── dir1.2\n",
|
124
|
-
"│ │ └── file1.2.1\n",
|
125
|
-
"│ └── file1.1\n",
|
126
|
-
"└── dir2\n",
|
127
|
-
" └── .file2.1\n",
|
128
|
-
].join)
|
129
|
-
end
|
130
|
-
|
131
|
-
it "renders directory with only dirs" do
|
132
|
-
tree = within_dir(fixtures_path) do
|
133
|
-
TTY::Tree.new('hidden_dir', only_dirs: true)
|
134
|
-
end
|
135
|
-
|
136
|
-
expect(tree.render).to eq([
|
137
|
-
"hidden_dir\n",
|
138
|
-
"├── dir1\n",
|
139
|
-
"│ ├── dir1.1\n",
|
140
|
-
"│ └── dir1.2\n",
|
141
|
-
"└── dir2\n",
|
142
|
-
].join)
|
143
|
-
end
|
144
|
-
|
145
|
-
it "renders directory with only dirs including hidden ones" do
|
146
|
-
tree = within_dir(fixtures_path) do
|
147
|
-
TTY::Tree.new('hidden_dir', only_dirs: true, show_hidden: true)
|
148
|
-
end
|
149
|
-
|
150
|
-
expect(tree.render).to eq([
|
151
|
-
"hidden_dir\n",
|
152
|
-
"├── .with_dot\n",
|
153
|
-
"├── dir1\n",
|
154
|
-
"│ ├── dir1.1\n",
|
155
|
-
"│ └── dir1.2\n",
|
156
|
-
"└── dir2\n",
|
157
|
-
].join)
|
158
|
-
end
|
159
|
-
|
160
|
-
it "doesn't show dirs with files exceeding limit" do
|
161
|
-
tree = within_dir(fixtures_path) do
|
162
|
-
TTY::Tree.new('large_dir', file_limit: 4)
|
163
|
-
end
|
164
|
-
|
165
|
-
expect(tree.render).to eq([
|
166
|
-
"large_dir\n",
|
167
|
-
"├── huge_dir\n",
|
168
|
-
"├── large1\n",
|
169
|
-
"├── large2\n",
|
170
|
-
"└── large3\n",
|
171
|
-
].join)
|
172
|
-
end
|
173
|
-
end
|
@@ -1,122 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
# frozen_string_literal: true
|
3
|
-
|
4
|
-
RSpec.describe TTY::Tree::HashWalker do
|
5
|
-
it "walks hash data and collects nodes" do
|
6
|
-
data = {
|
7
|
-
dir1: [
|
8
|
-
'config.dat',
|
9
|
-
{ dir2: [
|
10
|
-
{ dir3: [ 'file3-1.txt' ] },
|
11
|
-
'file2-1.txt'
|
12
|
-
]
|
13
|
-
},
|
14
|
-
'file1-1.txt',
|
15
|
-
'file1-2.txt'
|
16
|
-
]
|
17
|
-
}
|
18
|
-
|
19
|
-
walker = TTY::Tree::HashWalker.new
|
20
|
-
|
21
|
-
walker.traverse(data)
|
22
|
-
|
23
|
-
expect(walker.nodes).to eq([
|
24
|
-
TTY::Tree::Node.new('dir1', '', '', 0),
|
25
|
-
TTY::Tree::Node.new('config.dat', 'dir1', '', 1),
|
26
|
-
TTY::Tree::Node.new('dir2', 'dir1', '', 1),
|
27
|
-
TTY::Tree::Node.new('dir3', 'dir1/dir2', ':pipe', 2),
|
28
|
-
TTY::Tree::LeafNode.new('file3-1.txt', 'dir1/dir2/dir3', ':pipe:pipe', 3),
|
29
|
-
TTY::Tree::LeafNode.new('file2-1.txt', 'dir1/dir2', ':pipe', 2),
|
30
|
-
TTY::Tree::Node.new('file1-1.txt', 'dir1', '', 1),
|
31
|
-
TTY::Tree::LeafNode.new('file1-2.txt', 'dir1', '', 1),
|
32
|
-
])
|
33
|
-
|
34
|
-
expect(walker.nodes.map(&:full_path).map(&:to_s)).to eq([
|
35
|
-
"dir1",
|
36
|
-
"dir1/config.dat",
|
37
|
-
"dir1/dir2",
|
38
|
-
"dir1/dir2/dir3",
|
39
|
-
"dir1/dir2/dir3/file3-1.txt",
|
40
|
-
"dir1/dir2/file2-1.txt",
|
41
|
-
"dir1/file1-1.txt",
|
42
|
-
"dir1/file1-2.txt",
|
43
|
-
])
|
44
|
-
end
|
45
|
-
|
46
|
-
it "walks path tree and collects nodes up to max level" do
|
47
|
-
data = {
|
48
|
-
dir1: [
|
49
|
-
'config.dat',
|
50
|
-
{ dir2: [
|
51
|
-
{ dir3: [ 'file3-1.txt' ] },
|
52
|
-
'file2-1.txt'
|
53
|
-
]
|
54
|
-
},
|
55
|
-
'file1-1.txt',
|
56
|
-
'file1-2.txt'
|
57
|
-
]
|
58
|
-
}
|
59
|
-
|
60
|
-
walker = TTY::Tree::HashWalker.new(level: 2)
|
61
|
-
|
62
|
-
walker.traverse(data)
|
63
|
-
|
64
|
-
expect(walker.nodes.map(&:full_path).map(&:to_s)).to eq([
|
65
|
-
"dir1",
|
66
|
-
"dir1/config.dat",
|
67
|
-
"dir1/dir2",
|
68
|
-
"dir1/dir2/file2-1.txt",
|
69
|
-
"dir1/file1-1.txt",
|
70
|
-
"dir1/file1-2.txt",
|
71
|
-
])
|
72
|
-
end
|
73
|
-
|
74
|
-
it "doesn't walks path tree exceeding file limit" do
|
75
|
-
data = {
|
76
|
-
orphan_dir: [
|
77
|
-
'a.txt',
|
78
|
-
'b.txt',
|
79
|
-
{ data: [
|
80
|
-
'data1.bin',
|
81
|
-
'data2.sql',
|
82
|
-
'data3.inf',
|
83
|
-
'data4.csv'
|
84
|
-
]
|
85
|
-
}
|
86
|
-
]
|
87
|
-
}
|
88
|
-
|
89
|
-
walker = TTY::Tree::HashWalker.new(file_limit: 3)
|
90
|
-
|
91
|
-
walker.traverse(data)
|
92
|
-
|
93
|
-
expect(walker.nodes.map(&:full_path).map(&:to_s)).to eq([
|
94
|
-
"orphan_dir",
|
95
|
-
"orphan_dir/a.txt",
|
96
|
-
"orphan_dir/b.txt",
|
97
|
-
"orphan_dir/data"
|
98
|
-
])
|
99
|
-
end
|
100
|
-
|
101
|
-
it "counts files & dirs" do
|
102
|
-
data = {
|
103
|
-
dir1: [
|
104
|
-
'config.dat',
|
105
|
-
{ dir2: [
|
106
|
-
{ dir3: [ 'file3-1.txt' ] },
|
107
|
-
'file2-1.txt'
|
108
|
-
]
|
109
|
-
},
|
110
|
-
'file1-1.txt',
|
111
|
-
'file1-2.txt'
|
112
|
-
]
|
113
|
-
}
|
114
|
-
walker = TTY::Tree::HashWalker.new
|
115
|
-
|
116
|
-
walker.traverse(data)
|
117
|
-
|
118
|
-
expect(walker.files_count).to eq(5)
|
119
|
-
|
120
|
-
expect(walker.dirs_count).to eq(2)
|
121
|
-
end
|
122
|
-
end
|
data/spec/unit/new_spec.rb
DELETED
@@ -1,85 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
# frozen_string_literal: true
|
3
|
-
|
4
|
-
RSpec.describe TTY::Tree, '#new' do
|
5
|
-
it "exposes [] as instance creation & accepts Dir" do
|
6
|
-
tree = TTY::Tree[::File.join(Dir.pwd, 'lib')]
|
7
|
-
|
8
|
-
expect(tree.nodes).to_not be_empty
|
9
|
-
end
|
10
|
-
|
11
|
-
it "exposes [] as instance creation & accepts Pathname" do
|
12
|
-
tree = TTY::Tree[Pathname.pwd.join('lib')]
|
13
|
-
|
14
|
-
expect(tree.nodes).to_not be_empty
|
15
|
-
end
|
16
|
-
|
17
|
-
it "provides DSL for creating tree" do
|
18
|
-
tree = TTY::Tree.new do
|
19
|
-
node 'dir1' do
|
20
|
-
node 'config.dat'
|
21
|
-
node 'dir2' do
|
22
|
-
node 'dir3' do
|
23
|
-
leaf 'file3-1.txt'
|
24
|
-
end
|
25
|
-
leaf 'file2-1.txt'
|
26
|
-
end
|
27
|
-
node 'file1-1.txt'
|
28
|
-
leaf 'file1-2.txt'
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
expect(tree.nodes).to eq([
|
33
|
-
TTY::Tree::Node.new('dir1', '', '', 0),
|
34
|
-
TTY::Tree::Node.new('config.dat', 'dir1', '', 1),
|
35
|
-
TTY::Tree::Node.new('dir2', 'dir1', '', 1),
|
36
|
-
TTY::Tree::Node.new('dir3', 'dir1/dir2', ':pipe', 2),
|
37
|
-
TTY::Tree::LeafNode.new('file3-1.txt', 'dir1/dir2/dir3', ':pipe:pipe', 3),
|
38
|
-
TTY::Tree::LeafNode.new('file2-1.txt', 'dir1/dir2', ':pipe', 2),
|
39
|
-
TTY::Tree::Node.new('file1-1.txt', 'dir1', '', 1),
|
40
|
-
TTY::Tree::LeafNode.new('file1-2.txt', 'dir1', '', 1),
|
41
|
-
])
|
42
|
-
end
|
43
|
-
|
44
|
-
it "provides DSL for creating orphaned tree" do
|
45
|
-
tree = TTY::Tree.new do
|
46
|
-
node 'orphan_dir' do
|
47
|
-
node 'a.txt'
|
48
|
-
node 'b.txt'
|
49
|
-
leaf 'data' do
|
50
|
-
node 'data1.bin'
|
51
|
-
node 'data2.sql'
|
52
|
-
leaf 'data3.inf'
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
expect(tree.nodes).to eq([
|
58
|
-
TTY::Tree::Node.new("orphan_dir", '', '', 0),
|
59
|
-
TTY::Tree::Node.new("a.txt", 'orphan_dir', '', 1),
|
60
|
-
TTY::Tree::Node.new("b.txt", 'orphan_dir', '', 1),
|
61
|
-
TTY::Tree::LeafNode.new("data", 'orphan_dir', '', 1),
|
62
|
-
TTY::Tree::Node.new("data1.bin", 'orphan_dir/data', ':space', 2),
|
63
|
-
TTY::Tree::Node.new("data2.sql", 'orphan_dir/data', ':space', 2),
|
64
|
-
TTY::Tree::LeafNode.new("data3.inf", 'orphan_dir/data', ':space', 2)
|
65
|
-
])
|
66
|
-
end
|
67
|
-
|
68
|
-
it "yields current node to DSL tree node" do
|
69
|
-
yielded = []
|
70
|
-
|
71
|
-
TTY::Tree.new do
|
72
|
-
node 'dir1' do |dir1|
|
73
|
-
yielded << dir1
|
74
|
-
node 'dir2' do |dir2|
|
75
|
-
yielded << dir2
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
expect(yielded).to eq([
|
81
|
-
TTY::Tree::Node.new("dir1", '', '', 0),
|
82
|
-
TTY::Tree::Node.new("dir2", 'dir1', '', 1)
|
83
|
-
])
|
84
|
-
end
|
85
|
-
end
|
data/spec/unit/node_spec.rb
DELETED
@@ -1,42 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
# frozen_string_literal: true
|
3
|
-
|
4
|
-
RSpec.describe TTY::Tree::Node do
|
5
|
-
it "provides directory stats" do
|
6
|
-
dir = fixtures_path('dir1')
|
7
|
-
node = TTY::Tree::Node.new(dir, '', '', 0)
|
8
|
-
|
9
|
-
expect(node.directory?).to eq(true)
|
10
|
-
expect(node.file?).to eq(false)
|
11
|
-
expect(node.symlink?).to eq(false)
|
12
|
-
expect(node.socket?).to eq(false)
|
13
|
-
expect(node.pipe?).to eq(false)
|
14
|
-
end
|
15
|
-
|
16
|
-
it "informs if node is hidden" do
|
17
|
-
file = fixtures_path('hidden', 'dir1', '.file1.2')
|
18
|
-
node = TTY::Tree::Node.new(file, '', '', 0)
|
19
|
-
|
20
|
-
expect(node.hidden?).to eq(true)
|
21
|
-
end
|
22
|
-
|
23
|
-
it "compares two nodes for equality" do
|
24
|
-
node_a = TTY::Tree::Node.new('dir1', '', '', 0)
|
25
|
-
node_b = TTY::Tree::Node.new('dir1', '', '', 0)
|
26
|
-
|
27
|
-
expect(node_a).to eq(node_b)
|
28
|
-
end
|
29
|
-
|
30
|
-
it "compares two nodes for inequlity" do
|
31
|
-
node_a = TTY::Tree::Node.new('dir1', '', '', 0)
|
32
|
-
node_b = TTY::Tree::Node.new('dir2', '', '', 0)
|
33
|
-
|
34
|
-
expect(node_a).to_not eq(node_b)
|
35
|
-
end
|
36
|
-
|
37
|
-
it "strips null bytes from pathname" do
|
38
|
-
node = nil
|
39
|
-
expect {node = TTY::Tree::Node.new("dir1\0", '', '', 0)}.not_to raise_error
|
40
|
-
expect(node.path.to_s).to eq('dir1')
|
41
|
-
end
|
42
|
-
end
|
@@ -1,65 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
RSpec.describe TTY::Tree::NumberRenderer do
|
4
|
-
it "renders directory as numbers" do
|
5
|
-
tree = within_dir(fixtures_path) do
|
6
|
-
TTY::Tree.new('dir1')
|
7
|
-
end
|
8
|
-
|
9
|
-
expect(tree.render(as: :number)).to eq([
|
10
|
-
"dir1\n",
|
11
|
-
"1.1 config.dat\n",
|
12
|
-
"1.2 dir2\n",
|
13
|
-
" 2.3 dir3\n",
|
14
|
-
" 3.4 file3-1.txt\n",
|
15
|
-
" 2.5 file2-1.txt\n",
|
16
|
-
"1.6 file1-1.txt\n",
|
17
|
-
"1.7 file1-2.txt\n",
|
18
|
-
].join)
|
19
|
-
end
|
20
|
-
|
21
|
-
it "renders hash data as numbers" do
|
22
|
-
data = {
|
23
|
-
dir1: [
|
24
|
-
'config.dat',
|
25
|
-
{ dir2: [
|
26
|
-
{ dir3: [ 'file3-1.txt' ] },
|
27
|
-
'file2-1.txt'
|
28
|
-
]
|
29
|
-
},
|
30
|
-
'file1-1.txt',
|
31
|
-
'file1-2.txt'
|
32
|
-
]
|
33
|
-
}
|
34
|
-
|
35
|
-
tree = TTY::Tree.new(data)
|
36
|
-
|
37
|
-
expect(tree.render(as: :number)).to eq([
|
38
|
-
"dir1\n",
|
39
|
-
"1.1 config.dat\n",
|
40
|
-
"1.2 dir2\n",
|
41
|
-
" 2.3 dir3\n",
|
42
|
-
" 3.4 file3-1.txt\n",
|
43
|
-
" 2.5 file2-1.txt\n",
|
44
|
-
"1.6 file1-1.txt\n",
|
45
|
-
"1.7 file1-2.txt\n",
|
46
|
-
].join)
|
47
|
-
end
|
48
|
-
|
49
|
-
it "renders directory as numbers without indentation" do
|
50
|
-
tree = within_dir(fixtures_path) do
|
51
|
-
TTY::Tree.new('dir1')
|
52
|
-
end
|
53
|
-
|
54
|
-
expect(tree.render(as: :number, indent: 0)).to eq([
|
55
|
-
"dir1\n",
|
56
|
-
"1.1 config.dat\n",
|
57
|
-
"1.2 dir2\n",
|
58
|
-
"2.3 dir3\n",
|
59
|
-
"3.4 file3-1.txt\n",
|
60
|
-
"2.5 file2-1.txt\n",
|
61
|
-
"1.6 file1-1.txt\n",
|
62
|
-
"1.7 file1-2.txt\n",
|
63
|
-
].join)
|
64
|
-
end
|
65
|
-
end
|
@@ -1,127 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
# frozen_string_literal: true
|
3
|
-
|
4
|
-
RSpec.describe TTY::Tree::PathWalker do
|
5
|
-
it "walks path tree and collects nodes" do
|
6
|
-
walker = TTY::Tree::PathWalker.new
|
7
|
-
|
8
|
-
within_dir(fixtures_path) do
|
9
|
-
walker.traverse('dir1')
|
10
|
-
end
|
11
|
-
|
12
|
-
expect(walker.nodes).to eq([
|
13
|
-
TTY::Tree::Node.new('dir1', '', '', 0),
|
14
|
-
TTY::Tree::Node.new('dir1/config.dat', 'dir1', '', 1),
|
15
|
-
TTY::Tree::Node.new('dir2', 'dir1', '', 1),
|
16
|
-
TTY::Tree::Node.new('dir3', 'dir1/dir2', ':pipe', 2),
|
17
|
-
TTY::Tree::LeafNode.new('dir1/dir2/dir3/file3-1.txt', 'dir1/dir2/dir3', ':pipe:pipe', 3),
|
18
|
-
TTY::Tree::LeafNode.new('dir1/dir2/file2-1.txt', 'dir1/dir2', ':pipe', 2),
|
19
|
-
TTY::Tree::Node.new('dir1/file1-1.txt', 'dir1', '', 1),
|
20
|
-
TTY::Tree::LeafNode.new('dir1/file1-2.txt', 'dir1', '', 1),
|
21
|
-
])
|
22
|
-
|
23
|
-
expect(walker.nodes.map(&:full_path).map(&:to_s)).to eq([
|
24
|
-
"dir1",
|
25
|
-
"dir1/config.dat",
|
26
|
-
"dir1/dir2",
|
27
|
-
"dir1/dir2/dir3",
|
28
|
-
"dir1/dir2/dir3/file3-1.txt",
|
29
|
-
"dir1/dir2/file2-1.txt",
|
30
|
-
"dir1/file1-1.txt",
|
31
|
-
"dir1/file1-2.txt",
|
32
|
-
])
|
33
|
-
end
|
34
|
-
|
35
|
-
it "walks orphaned path tree and collects nodes" do
|
36
|
-
walker = TTY::Tree::PathWalker.new
|
37
|
-
|
38
|
-
within_dir(fixtures_path) do
|
39
|
-
walker.traverse('orphan_dir')
|
40
|
-
end
|
41
|
-
|
42
|
-
expect(walker.nodes).to eq([
|
43
|
-
TTY::Tree::Node.new("orphan_dir", '', '', 0),
|
44
|
-
TTY::Tree::Node.new("orphan_dir/a.txt", 'orphan_dir', '', 1),
|
45
|
-
TTY::Tree::Node.new("orphan_dir/b.txt", 'orphan_dir', '', 1),
|
46
|
-
TTY::Tree::LeafNode.new("data", 'orphan_dir', '', 1),
|
47
|
-
TTY::Tree::Node.new("orphan_dir/data/data1.bin", 'orphan_dir/data', ':space', 2),
|
48
|
-
TTY::Tree::Node.new("orphan_dir/data/data2.sql", 'orphan_dir/data', ':space', 2),
|
49
|
-
TTY::Tree::LeafNode.new("orphan_dir/data/data3.inf", 'orphan_dir/data', ':space', 2)
|
50
|
-
])
|
51
|
-
|
52
|
-
expect(walker.nodes.map(&:full_path).map(&:to_s)).to eq([
|
53
|
-
"orphan_dir",
|
54
|
-
"orphan_dir/a.txt",
|
55
|
-
"orphan_dir/b.txt",
|
56
|
-
"orphan_dir/data",
|
57
|
-
"orphan_dir/data/data1.bin",
|
58
|
-
"orphan_dir/data/data2.sql",
|
59
|
-
"orphan_dir/data/data3.inf"
|
60
|
-
])
|
61
|
-
end
|
62
|
-
|
63
|
-
it "walks path tree and collects nodes limited by the level" do
|
64
|
-
walker = TTY::Tree::PathWalker.new(level: 2)
|
65
|
-
|
66
|
-
within_dir(fixtures_path) do
|
67
|
-
walker.traverse('dir1')
|
68
|
-
end
|
69
|
-
|
70
|
-
expect(walker.nodes.map(&:full_path).map(&:to_s)).to eq([
|
71
|
-
"dir1",
|
72
|
-
"dir1/config.dat",
|
73
|
-
"dir1/dir2",
|
74
|
-
"dir1/dir2/file2-1.txt",
|
75
|
-
"dir1/file1-1.txt",
|
76
|
-
"dir1/file1-2.txt",
|
77
|
-
])
|
78
|
-
end
|
79
|
-
|
80
|
-
it "doesn't walk paths exceeding file limit" do
|
81
|
-
walker = TTY::Tree::PathWalker.new(file_limit: 4)
|
82
|
-
|
83
|
-
within_dir(fixtures_path) do
|
84
|
-
walker.traverse('large_dir')
|
85
|
-
end
|
86
|
-
|
87
|
-
expect(walker.nodes.map(&:full_path).map(&:to_s)).to eq([
|
88
|
-
"large_dir",
|
89
|
-
"large_dir/huge_dir",
|
90
|
-
"large_dir/large1",
|
91
|
-
"large_dir/large2",
|
92
|
-
"large_dir/large3"
|
93
|
-
])
|
94
|
-
end
|
95
|
-
|
96
|
-
it "counts files & dirs" do
|
97
|
-
walker = TTY::Tree::PathWalker.new
|
98
|
-
|
99
|
-
within_dir(fixtures_path) do
|
100
|
-
walker.traverse('dir1')
|
101
|
-
end
|
102
|
-
|
103
|
-
expect(walker.files_count).to eq(5)
|
104
|
-
|
105
|
-
expect(walker.dirs_count).to eq(2)
|
106
|
-
end
|
107
|
-
|
108
|
-
it "counts files & dirs including max level limit" do
|
109
|
-
walker = TTY::Tree::PathWalker.new(level: 2)
|
110
|
-
|
111
|
-
within_dir(fixtures_path) do
|
112
|
-
walker.traverse('dir1')
|
113
|
-
end
|
114
|
-
|
115
|
-
expect(walker.files_count).to eq(4)
|
116
|
-
|
117
|
-
expect(walker.dirs_count).to eq(1)
|
118
|
-
end
|
119
|
-
|
120
|
-
it "raises when walking non-directory" do
|
121
|
-
walker = TTY::Tree::PathWalker.new
|
122
|
-
|
123
|
-
expect {
|
124
|
-
walker.traverse('unknown-dir')
|
125
|
-
}.to raise_error(ArgumentError, /unknown-dir is not a directory path/)
|
126
|
-
end
|
127
|
-
end
|
data/tasks/console.rake
DELETED
data/tasks/coverage.rake
DELETED
data/tasks/spec.rake
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
begin
|
4
|
-
require 'rspec/core/rake_task'
|
5
|
-
|
6
|
-
desc 'Run all specs'
|
7
|
-
RSpec::Core::RakeTask.new(:spec) do |task|
|
8
|
-
task.pattern = 'spec/{unit,integration}{,/*/**}/*_spec.rb'
|
9
|
-
end
|
10
|
-
|
11
|
-
namespace :spec do
|
12
|
-
desc 'Run unit specs'
|
13
|
-
RSpec::Core::RakeTask.new(:unit) do |task|
|
14
|
-
task.pattern = 'spec/unit{,/*/**}/*_spec.rb'
|
15
|
-
end
|
16
|
-
|
17
|
-
desc 'Run integration specs'
|
18
|
-
RSpec::Core::RakeTask.new(:integration) do |task|
|
19
|
-
task.pattern = 'spec/integration{,/*/**}/*_spec.rb'
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
rescue LoadError
|
24
|
-
%w[spec spec:unit spec:integration].each do |name|
|
25
|
-
task name do
|
26
|
-
$stderr.puts "In order to run #{name}, do `gem install rspec`"
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
data/tty-tree.gemspec
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
lib = File.expand_path('../lib', __FILE__)
|
2
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
-
require 'tty/tree/version'
|
4
|
-
|
5
|
-
Gem::Specification.new do |spec|
|
6
|
-
spec.name = "tty-tree"
|
7
|
-
spec.version = TTY::Tree::VERSION
|
8
|
-
spec.authors = ["Piotr Murach"]
|
9
|
-
spec.email = ["me@piotrmurach.com"]
|
10
|
-
|
11
|
-
spec.summary = %q{Print directory or structured data in a tree like format.}
|
12
|
-
spec.description = %q{Print directory or structured data in a tree like format.}
|
13
|
-
spec.homepage = "https://piotrmurach.github.io/tty"
|
14
|
-
spec.license = "MIT"
|
15
|
-
|
16
|
-
spec.files = Dir['{lib,spec}/**/*.rb', '{bin,tasks}/*', 'tty-tree.gemspec']
|
17
|
-
spec.files += Dir['README.md', 'CHANGELOG.md', 'LICENSE.txt', 'Rakefile']
|
18
|
-
spec.bindir = "exe"
|
19
|
-
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
|
-
spec.require_paths = ["lib"]
|
21
|
-
|
22
|
-
spec.required_ruby_version = '>= 2.0.0'
|
23
|
-
|
24
|
-
spec.add_development_dependency "bundler", ">= 1.14.0"
|
25
|
-
spec.add_development_dependency "rake"
|
26
|
-
spec.add_development_dependency "rspec", "~> 3.0"
|
27
|
-
end
|