dirtree 0.1.0 → 0.2.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/Gemfile +1 -1
- data/README.md +45 -11
- data/dirtree.gemspec +1 -0
- data/exe/dirtree +33 -6
- data/lib/dirtree/version.rb +1 -1
- data/templates/circles.html.erb +111 -0
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cb64f8d686c8126e4dab42c711d7f3b17eb050d3
|
4
|
+
data.tar.gz: ff74a6c7a5e016e8e5852421916fb62190c7c24f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 67ed70759e896f00a666d5568b0e7d793081f6e85fecb7bf61e6eff1e33ce9a0f0f984f1aaacacda46147caa457c6be2a80939630a73af18db6662908020878d
|
7
|
+
data.tar.gz: a41b0d579446826b277b709c4f538c4486db68f33cdb59b54510e2ca523543bdeb0132903104e46b968284991121d5a579ffbb5a3e036c9b747ef207bdc49c7d
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
# Dirtree
|
2
2
|
|
3
|
+
[](https://badge.fury.io/rb/dirtree)
|
4
|
+
|
3
5
|
Dirtree visualizes an list of file paths into a tree graph, printed as HTML page, it can be useful in visualizing a whole project you're working on to start cleanup or organizing your code or spotting large directories or unneeded files.
|
4
6
|
|
7
|
+
## Tree template
|
8
|
+

|
9
|
+
|
10
|
+
## Circles template
|
11
|
+

|
12
|
+
|
5
13
|
## Installation
|
6
14
|
|
7
15
|
|
@@ -15,28 +23,54 @@ Dirtree visualizes an list of file paths into a tree graph, printed as HTML page
|
|
15
23
|
-o, --output=File.html Specify a path to write output, if not specified output will be printed to STDOUT
|
16
24
|
|
17
25
|
|
18
|
-
|
26
|
+
## Examples
|
27
|
+
|
28
|
+
**Visualize current directory recursively**
|
29
|
+
|
30
|
+
```
|
31
|
+
$ dirtree -o output.html **/* *
|
32
|
+
```
|
33
|
+
|
34
|
+
make sure you have `globstar` on
|
35
|
+
```
|
36
|
+
$ shopt -s globstar
|
37
|
+
```
|
38
|
+
|
39
|
+
**Visualize files from git ls**
|
40
|
+
|
41
|
+
```
|
42
|
+
$ git ls-files | dirtree -o output.html
|
43
|
+
```
|
19
44
|
|
20
|
-
|
45
|
+
**Dirtree prints to standard output if no --output option specified so you can redirect it**
|
21
46
|
|
22
|
-
|
47
|
+
```
|
48
|
+
$ git ls-files | dirtree > output.html
|
49
|
+
```
|
23
50
|
|
24
|
-
|
51
|
+
**visualize only files that include specific word**
|
25
52
|
|
26
|
-
|
53
|
+
```
|
54
|
+
$ git ls-files | grep keyword | dirtree > output.html
|
55
|
+
```
|
27
56
|
|
28
|
-
|
57
|
+
**works with find**
|
29
58
|
|
30
|
-
|
59
|
+
visualize all files that ends with `rb`
|
31
60
|
|
32
|
-
|
61
|
+
```
|
62
|
+
$ find ~ -name *rb | dirtree > output.html
|
63
|
+
```
|
33
64
|
|
34
|
-
|
65
|
+
**With ag:silver searcher**
|
35
66
|
|
36
|
-
|
67
|
+
```
|
68
|
+
$ ag -l | dirtree -o output.html
|
69
|
+
```
|
37
70
|
|
38
|
-
|
71
|
+
## Conjunctions
|
39
72
|
|
73
|
+
* [lsgh](https://www.github.com/blazeeboy/lsgh) Draw a tree for a github user/org and open pull requests.
|
40
74
|
|
41
75
|
## Contributing
|
42
76
|
|
data/dirtree.gemspec
CHANGED
data/exe/dirtree
CHANGED
@@ -4,23 +4,51 @@ require 'optparse'
|
|
4
4
|
require 'json'
|
5
5
|
require 'erb'
|
6
6
|
|
7
|
-
|
7
|
+
templates_dir = File.join(File.dirname(__FILE__), '..', 'templates')
|
8
|
+
templates = Dir.open(templates_dir).map do |file|
|
9
|
+
file[0...file.index('.')]
|
10
|
+
end.reject(&:empty?)
|
11
|
+
|
12
|
+
options = {
|
13
|
+
template: 'tree'
|
14
|
+
}
|
15
|
+
|
8
16
|
OptionParser.new do |opts|
|
9
17
|
opts.banner = 'Usage: dirtree [options]... [file]...'
|
10
18
|
|
11
|
-
opts.on(
|
19
|
+
opts.on(
|
20
|
+
'-v',
|
21
|
+
'--version',
|
22
|
+
'Print version'
|
23
|
+
) do
|
12
24
|
puts "Dirtree version #{Dirtree::VERSION}"
|
13
25
|
exit
|
14
26
|
end
|
15
27
|
|
16
|
-
opts.on(
|
28
|
+
opts.on(
|
29
|
+
'-h',
|
30
|
+
'--help',
|
31
|
+
'Show this help text'
|
32
|
+
) do
|
17
33
|
puts opts
|
18
34
|
exit
|
19
35
|
end
|
20
36
|
|
21
|
-
opts.on(
|
37
|
+
opts.on(
|
38
|
+
'-oFile.html',
|
39
|
+
'--output=File.html',
|
40
|
+
'Specify a path to write output, by default will be printed to STDOUT'
|
41
|
+
) do |value|
|
22
42
|
options[:output] = value
|
23
43
|
end
|
44
|
+
|
45
|
+
opts.on(
|
46
|
+
'-tTemplateName',
|
47
|
+
'--template=TemplateName',
|
48
|
+
'Specify the template name, available templates ' + templates.to_s
|
49
|
+
) do |value|
|
50
|
+
options[:template] = value
|
51
|
+
end
|
24
52
|
end.parse!
|
25
53
|
|
26
54
|
files = ARGV.empty? ? STDIN.read.lines : ARGV
|
@@ -28,8 +56,7 @@ files.map!(&:strip)
|
|
28
56
|
|
29
57
|
root = Dirtree::Node.new('/')
|
30
58
|
files.each { |file| root.insert(file.split('/')) }
|
31
|
-
|
32
|
-
template_file = File.join(templates_dir, 'tree.html.erb')
|
59
|
+
template_file = File.join(templates_dir, options[:template] + '.html.erb')
|
33
60
|
template = File.read(File.expand_path(template_file))
|
34
61
|
|
35
62
|
tree = root.as_json
|
data/lib/dirtree/version.rb
CHANGED
@@ -0,0 +1,111 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<meta charset="utf-8">
|
3
|
+
<style>
|
4
|
+
|
5
|
+
html, body{
|
6
|
+
height: 100%;
|
7
|
+
margin: 0;
|
8
|
+
padding: 0;
|
9
|
+
}
|
10
|
+
|
11
|
+
.node {
|
12
|
+
cursor: pointer;
|
13
|
+
}
|
14
|
+
|
15
|
+
.node:hover {
|
16
|
+
stroke: #000;
|
17
|
+
stroke-width: 1.5px;
|
18
|
+
}
|
19
|
+
|
20
|
+
.node--leaf {
|
21
|
+
fill: white;
|
22
|
+
}
|
23
|
+
|
24
|
+
.label {
|
25
|
+
font: 11px "Helvetica Neue", Helvetica, Arial, sans-serif;
|
26
|
+
text-anchor: middle;
|
27
|
+
text-shadow: 0 1px 0 #fff, 1px 0 0 #fff, -1px 0 0 #fff, 0 -1px 0 #fff;
|
28
|
+
}
|
29
|
+
|
30
|
+
.label,
|
31
|
+
.node--root,
|
32
|
+
.node--leaf {
|
33
|
+
pointer-events: none;
|
34
|
+
}
|
35
|
+
|
36
|
+
</style>
|
37
|
+
<svg width="100%" height="100%"></svg>
|
38
|
+
<script src="https://d3js.org/d3.v4.min.js"></script>
|
39
|
+
<script>
|
40
|
+
// Copied from https://bl.ocks.org/mbostock/7607535
|
41
|
+
var width = window.innerWidth,
|
42
|
+
height = window.innerHeight;
|
43
|
+
var svg = d3.select("svg"),
|
44
|
+
margin = 20,
|
45
|
+
diameter = Math.min(width, height),
|
46
|
+
g = svg.append("g").attr("transform", "translate(" + diameter / 2 + "," + diameter / 2 + ")");
|
47
|
+
|
48
|
+
var color = d3.scaleLinear()
|
49
|
+
.domain([-1, 5])
|
50
|
+
.range(["hsl(152,80%,80%)", "hsl(228,30%,40%)"])
|
51
|
+
.interpolate(d3.interpolateHcl);
|
52
|
+
|
53
|
+
var pack = d3.pack()
|
54
|
+
.size([diameter - margin, diameter - margin])
|
55
|
+
.padding(2);
|
56
|
+
|
57
|
+
root = <%= tree.to_json %>;
|
58
|
+
root = d3.hierarchy(root)
|
59
|
+
.sum(function(d) { return d.children.length + 1; })
|
60
|
+
.sort(function(a, b) { return b.value - a.value; });
|
61
|
+
|
62
|
+
var focus = root,
|
63
|
+
nodes = pack(root).descendants(),
|
64
|
+
view;
|
65
|
+
|
66
|
+
var circle = g.selectAll("circle")
|
67
|
+
.data(nodes)
|
68
|
+
.enter().append("circle")
|
69
|
+
.attr("class", function(d) { return d.parent ? d.children ? "node" : "node node--leaf" : "node node--root"; })
|
70
|
+
.style("fill", function(d) { return d.children ? color(d.depth) : null; })
|
71
|
+
.on("click", function(d) { if (focus !== d) zoom(d), d3.event.stopPropagation(); });
|
72
|
+
|
73
|
+
var text = g.selectAll("text")
|
74
|
+
.data(nodes)
|
75
|
+
.enter().append("text")
|
76
|
+
.attr("class", "label")
|
77
|
+
.style("fill-opacity", function(d) { return d.parent === root ? 1 : 0; })
|
78
|
+
.style("display", function(d) { return d.parent === root ? "inline" : "none"; })
|
79
|
+
.text(function(d) { return d.data.name; });
|
80
|
+
|
81
|
+
var node = g.selectAll("circle,text");
|
82
|
+
|
83
|
+
svg
|
84
|
+
.style("background", color(-1))
|
85
|
+
.on("click", function() { zoom(root); });
|
86
|
+
|
87
|
+
zoomTo([root.x, root.y, root.r * 2 + margin]);
|
88
|
+
|
89
|
+
function zoom(d) {
|
90
|
+
var focus0 = focus; focus = d;
|
91
|
+
|
92
|
+
var transition = d3.transition()
|
93
|
+
.duration(d3.event.altKey ? 7500 : 750)
|
94
|
+
.tween("zoom", function(d) {
|
95
|
+
var i = d3.interpolateZoom(view, [focus.x, focus.y, focus.r * 2 + margin]);
|
96
|
+
return function(t) { zoomTo(i(t)); };
|
97
|
+
});
|
98
|
+
|
99
|
+
transition.selectAll("text")
|
100
|
+
.filter(function(d) { return d.parent === focus || this.style.display === "inline"; })
|
101
|
+
.style("fill-opacity", function(d) { return d.parent === focus ? 1 : 0; })
|
102
|
+
.on("start", function(d) { if (d.parent === focus) this.style.display = "inline"; })
|
103
|
+
.on("end", function(d) { if (d.parent !== focus) this.style.display = "none"; });
|
104
|
+
}
|
105
|
+
|
106
|
+
function zoomTo(v) {
|
107
|
+
var k = diameter / v[2]; view = v;
|
108
|
+
node.attr("transform", function(d) { return "translate(" + (d.x - v[0]) * k + "," + (d.y - v[1]) * k + ")"; });
|
109
|
+
circle.attr("r", function(d) { return d.r * k; });
|
110
|
+
}
|
111
|
+
</script>
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dirtree
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Emad Elsaid
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-07-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -56,6 +56,7 @@ files:
|
|
56
56
|
- lib/dirtree.rb
|
57
57
|
- lib/dirtree/node.rb
|
58
58
|
- lib/dirtree/version.rb
|
59
|
+
- templates/circles.html.erb
|
59
60
|
- templates/tree.html.erb
|
60
61
|
homepage: https://www.github.com/blazeeboy/dirtree
|
61
62
|
licenses:
|
@@ -77,7 +78,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
77
78
|
version: '0'
|
78
79
|
requirements: []
|
79
80
|
rubyforge_project:
|
80
|
-
rubygems_version: 2.6.
|
81
|
+
rubygems_version: 2.6.10
|
81
82
|
signing_key:
|
82
83
|
specification_version: 4
|
83
84
|
summary: display list of file paths as an interactive tree
|