dir_friend 0.0.4 → 0.1.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/README.md +7 -2
- data/lib/dir_friend.rb +8 -5
- data/lib/dir_friend/command.rb +15 -7
- data/lib/dir_friend/config.rb +63 -0
- data/lib/dir_friend/core_ext.rb +23 -0
- data/lib/dir_friend/template.yaml +68 -0
- data/lib/dir_friend/version.rb +1 -1
- data/spec/command_spec.rb +4 -3
- data/spec/config_spec.rb +85 -0
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 686edf0244b614d5c5ed36dd54cc5e156a4bfdfc
|
4
|
+
data.tar.gz: cd4f54a0c1d265a811d657ea8ec9ebd92e2cf562
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 55d033751543bd9db638f3c680a7845b07af5481f7a3b18881742150129ec61db7bbe8e34cdbfac3551f7c012180bee47c6132ed7b92b66270082c4f038825c7
|
7
|
+
data.tar.gz: b447ba2ff5418c2d04933841b73697c4c9960eb8f518b8237e7d18db18806619bd48bd13d6e201a9743224a13dcf915f93acda11a27b1748dcadcb5ed7a8cc66
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# DirFriend
|
2
2
|
|
3
|
-
`DirFriend` is a tool for
|
3
|
+
`DirFriend` is a tool for generating a DOT file which represent file directories.
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
@@ -26,10 +26,15 @@ In your terminal, try followings;
|
|
26
26
|
# Create a dot file for path/to/project
|
27
27
|
% dir_friend dot path/to/project
|
28
28
|
|
29
|
-
# Create with some options
|
29
|
+
# Create it with some options
|
30
30
|
% dir_friend dot path/to/project -l fdp -c blues --dir_shape box
|
31
31
|
% dir_friend dot path/to/project -g "bgcolor:azure,rkdir:LR,splines:ortho"
|
32
32
|
|
33
|
+
`dot` subcommand first creates `config.yaml` in 'YOUR_HOME_DIR/.dirfriend', which contains some pre-defined theme settings. You can call any of the themes with '--theme (or -t)' option for `dot` subcommand.
|
34
|
+
|
35
|
+
% dir_friend dot path/to/project --theme blueegg
|
36
|
+
|
37
|
+
|
33
38
|
In your ruby script;
|
34
39
|
|
35
40
|
```ruby
|
data/lib/dir_friend.rb
CHANGED
@@ -1,11 +1,14 @@
|
|
1
1
|
require 'gviz'
|
2
2
|
require 'tempfile'
|
3
|
+
require 'fileutils'
|
3
4
|
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
5
|
+
require 'dir_friend/version'
|
6
|
+
require 'dir_friend/core_ext'
|
7
|
+
require 'dir_friend/f'
|
8
|
+
require 'dir_friend/d'
|
9
|
+
require 'dir_friend/any'
|
10
|
+
require 'dir_friend/graph'
|
11
|
+
require 'dir_friend/config'
|
9
12
|
require 'dir_friend/command'
|
10
13
|
|
11
14
|
module DirFriend
|
data/lib/dir_friend/command.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'thor'
|
2
|
+
require 'yaml'
|
2
3
|
|
3
4
|
module DirFriend
|
4
5
|
class Command < Thor
|
@@ -10,12 +11,12 @@ module DirFriend
|
|
10
11
|
end
|
11
12
|
|
12
13
|
desc "dot PATH", "Create a graphviz dot file for PATH"
|
13
|
-
long_desc
|
14
|
-
ex.
|
14
|
+
long_desc ~<<-EOS
|
15
|
+
ex.
|
15
16
|
|
16
|
-
|
17
|
+
`dir_friend dot path/ -l fdp -c blues, -e "arrowhead:none"`
|
17
18
|
|
18
|
-
|
19
|
+
`dir_friend dot path/ -c greens -g "bgcolor:azure,rankdir:LR,splines:ortho"`
|
19
20
|
EOS
|
20
21
|
option :layout, aliases:"-l"
|
21
22
|
option :colorscheme, aliases:"-c"
|
@@ -27,13 +28,15 @@ ex.
|
|
27
28
|
option :save, aliases:"-s", default:'a'
|
28
29
|
option :depth, aliases:"-d", default:9
|
29
30
|
option :with_open, aliases:"-o", default: true, type: :boolean
|
31
|
+
option :theme, aliases:"-t"
|
30
32
|
def dot(path)
|
31
|
-
opt = options.
|
33
|
+
opt = options.to_keysym_hash
|
32
34
|
save_path = opt.delete(:save)
|
33
35
|
opt = opt_parser(opt)
|
36
|
+
|
34
37
|
dir = D.new(path, depth:options[:depth].to_i)
|
35
38
|
dir.to_dot(opt).save(save_path)
|
36
|
-
puts "
|
39
|
+
puts "'#{save_path}.dot' created in the current directory."
|
37
40
|
|
38
41
|
if options[:with_open] && OS.mac?
|
39
42
|
run(%Q{open "#{save_path}.dot"}, verbose: false)
|
@@ -67,7 +70,12 @@ DirFriend is a tool for visualizing file directory.
|
|
67
70
|
opt.update({attr => Hash[ kv_arr ]})
|
68
71
|
end
|
69
72
|
end
|
70
|
-
|
73
|
+
if Config.enable
|
74
|
+
theme = Config.read(opt.delete(:theme))
|
75
|
+
theme.merge(opt)
|
76
|
+
else
|
77
|
+
opt
|
78
|
+
end
|
71
79
|
end
|
72
80
|
end
|
73
81
|
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
|
2
|
+
module DirFriend
|
3
|
+
class Config
|
4
|
+
CONFIG_PATH = File.join(ENV['HOME'], '.dirfriend/config.yaml')
|
5
|
+
CONFIG_FILE = File.basename(CONFIG_PATH)
|
6
|
+
class << self
|
7
|
+
def read(theme)
|
8
|
+
new.read(theme)
|
9
|
+
end
|
10
|
+
attr_accessor :enable
|
11
|
+
end
|
12
|
+
self.enable = true
|
13
|
+
|
14
|
+
def read(theme)
|
15
|
+
if theme
|
16
|
+
use_passed_theme(theme)
|
17
|
+
else
|
18
|
+
use_default_theme
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def themes
|
23
|
+
@themes ||= YAML.load_file(CONFIG_PATH).to_keysym_hash
|
24
|
+
rescue Errno::ENOENT
|
25
|
+
create
|
26
|
+
{}
|
27
|
+
rescue Psych::SyntaxError => e
|
28
|
+
abort "Syntax errors found in your '#{CONFIG_FILE}': #{e}."
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
def create
|
33
|
+
dir = File.dirname(CONFIG_PATH)
|
34
|
+
Dir.mkdir(dir) unless Dir.exist?(dir)
|
35
|
+
FileUtils.copy(template, CONFIG_PATH)
|
36
|
+
puts "'#{CONFIG_FILE}' created in #{dir}."
|
37
|
+
puts "You can set a theme for dot from pre-defined or created by you!"
|
38
|
+
rescue => e
|
39
|
+
abort "Something go wrong: #{e}."
|
40
|
+
end
|
41
|
+
|
42
|
+
def template
|
43
|
+
File.join(__dir__, 'template.yaml')
|
44
|
+
end
|
45
|
+
|
46
|
+
def use_passed_theme(theme)
|
47
|
+
themes[theme.intern].tap do |tm|
|
48
|
+
abort "Theme: '#{theme}' not found in your #{CONFIG_FILE}." unless tm
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def use_default_theme
|
53
|
+
case defo = themes.delete(:default)
|
54
|
+
when Symbol, String
|
55
|
+
themes[defo.intern] || {}
|
56
|
+
when Hash
|
57
|
+
defo
|
58
|
+
else
|
59
|
+
{}
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module HashExtension
|
2
|
+
def to_keysym_hash
|
3
|
+
self.inject({}) do |h, (k, v)|
|
4
|
+
h[k.intern] = begin
|
5
|
+
case v
|
6
|
+
when Hash then v.to_keysym_hash
|
7
|
+
else v
|
8
|
+
end
|
9
|
+
end
|
10
|
+
h
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
module StringExtension
|
16
|
+
def ~
|
17
|
+
margin = scan(/^ +/).map(&:size).min
|
18
|
+
gsub(/^ {#{margin}}/, '')
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
Hash.send(:include, HashExtension)
|
23
|
+
String.send(:include, StringExtension)
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# This is a template for `dir_friend dot` subcommand.
|
2
|
+
#
|
3
|
+
# You can set a theme to default by giving
|
4
|
+
# one of the theme names or a hash settings directly
|
5
|
+
#
|
6
|
+
# ex.
|
7
|
+
# default: :pop
|
8
|
+
#
|
9
|
+
# default:
|
10
|
+
# colorscheme: reds
|
11
|
+
# style: fdp
|
12
|
+
#
|
13
|
+
# Themes can be called with '--theme' or '-t' option of `dot` subcommand.
|
14
|
+
#
|
15
|
+
# ex. `dir_friend dot path/ -t pop
|
16
|
+
|
17
|
+
default: tree
|
18
|
+
|
19
|
+
tree:
|
20
|
+
global:
|
21
|
+
rankdir: LR
|
22
|
+
splines: ortho
|
23
|
+
dir_shape: diamond
|
24
|
+
|
25
|
+
blueegg:
|
26
|
+
colorscheme: blues
|
27
|
+
edges:
|
28
|
+
color: lightblue
|
29
|
+
nodes:
|
30
|
+
shape: egg
|
31
|
+
|
32
|
+
inline:
|
33
|
+
layout: osage
|
34
|
+
colorscheme: greens
|
35
|
+
nodes:
|
36
|
+
shape: box
|
37
|
+
edges:
|
38
|
+
color: gold
|
39
|
+
|
40
|
+
closeup:
|
41
|
+
layout: neato
|
42
|
+
colorscheme: purd
|
43
|
+
nodes:
|
44
|
+
shape: polygon
|
45
|
+
|
46
|
+
flower:
|
47
|
+
layout: circo
|
48
|
+
colorscheme: rdylgn
|
49
|
+
nodes:
|
50
|
+
shape: doublecircle
|
51
|
+
|
52
|
+
rigid:
|
53
|
+
layout: sfdp
|
54
|
+
colorscheme: greys
|
55
|
+
nodes:
|
56
|
+
shape: doubleoctagon
|
57
|
+
|
58
|
+
star:
|
59
|
+
layout: dot
|
60
|
+
colorscheme: set310
|
61
|
+
global:
|
62
|
+
bgcolor: midnightblue
|
63
|
+
splines: curved
|
64
|
+
edges:
|
65
|
+
color: snow
|
66
|
+
arrowhead: none
|
67
|
+
nodes:
|
68
|
+
shape: star
|
data/lib/dir_friend/version.rb
CHANGED
data/spec/command_spec.rb
CHANGED
@@ -20,6 +20,7 @@ describe DirFriend::Command do
|
|
20
20
|
describe '#dot' do
|
21
21
|
before(:each) do
|
22
22
|
%w(A A/D A/D/G).each { |d| Dir.mkdir d }
|
23
|
+
DirFriend::Config.enable = false
|
23
24
|
end
|
24
25
|
|
25
26
|
around do |example|
|
@@ -37,7 +38,7 @@ describe DirFriend::Command do
|
|
37
38
|
with('open "a.dot"', verbose: false)
|
38
39
|
|
39
40
|
stdout = capture(:stdout) { described_class.start(['dot', 'A']) }
|
40
|
-
expect(stdout).to include '
|
41
|
+
expect(stdout).to include 'created in the current directory'
|
41
42
|
end
|
42
43
|
|
43
44
|
it 'should parse option' do
|
@@ -48,7 +49,7 @@ describe DirFriend::Command do
|
|
48
49
|
stdout = capture(:stdout) {
|
49
50
|
described_class.start(['dot', '--with-open=false', 'A'])
|
50
51
|
}
|
51
|
-
expect(stdout).to include '
|
52
|
+
expect(stdout).to include 'created in the current directory'
|
52
53
|
end
|
53
54
|
end if DirFriend::OS.mac?
|
54
55
|
|
@@ -65,7 +66,7 @@ describe DirFriend::Command do
|
|
65
66
|
stdout = capture(:stdout) {
|
66
67
|
described_class.start(['dot', '--with-open', 'A'])
|
67
68
|
}
|
68
|
-
expect(stdout).to include '
|
69
|
+
expect(stdout).to include 'created in the current directory'
|
69
70
|
end
|
70
71
|
end
|
71
72
|
end
|
data/spec/config_spec.rb
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'fakefs/spec_helpers'
|
3
|
+
|
4
|
+
|
5
|
+
describe DirFriend::Config do
|
6
|
+
include FakeFS::SpecHelpers
|
7
|
+
|
8
|
+
before(:each) do
|
9
|
+
stub_const("DirFriend::Config::CONFIG_PATH", "config.yaml")
|
10
|
+
File.write(described_class::CONFIG_PATH, ~<<-EOS)
|
11
|
+
default: :theme1
|
12
|
+
theme1:
|
13
|
+
colorscheme: reds
|
14
|
+
layout: fdp
|
15
|
+
theme2:
|
16
|
+
colorscheme: blues
|
17
|
+
layout: dot
|
18
|
+
EOS
|
19
|
+
File.write('template.yaml', '')
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '#themes' do
|
23
|
+
context 'config file exist' do
|
24
|
+
it 'read user settings' do
|
25
|
+
themes = described_class.new.themes
|
26
|
+
expected = { default: :theme1,
|
27
|
+
theme1:{colorscheme:'reds', layout:'fdp'},
|
28
|
+
theme2:{colorscheme:'blues', layout:'dot'} }
|
29
|
+
expect(themes).to eq expected
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'config file not exist' do
|
34
|
+
it 'creates a config file and returns a empty hash' do
|
35
|
+
config = described_class.new
|
36
|
+
config.instance_variable_set("@themes", nil)
|
37
|
+
stub_const("DirFriend::Config::CONFIG_PATH", "wrong_name_config.yaml")
|
38
|
+
config.stub(:template).and_return('template.yaml')
|
39
|
+
themes = config.themes
|
40
|
+
expect(themes).to be_empty
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe '#read' do
|
46
|
+
context 'with nil argument' do
|
47
|
+
it 'returns default theme' do
|
48
|
+
theme = described_class.read(nil)
|
49
|
+
expected = {colorscheme:'reds', layout:'fdp'}
|
50
|
+
expect(theme).to eq expected
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context 'with a theme argument' do
|
55
|
+
it 'returns the theme' do
|
56
|
+
theme = described_class.read(:theme2)
|
57
|
+
expected = {colorscheme:'blues', layout:'dot'}
|
58
|
+
expect(theme).to eq expected
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
context 'when the default value is a hash data' do
|
63
|
+
before(:each) do
|
64
|
+
File.write(described_class::CONFIG_PATH, ~<<-EOS)
|
65
|
+
default:
|
66
|
+
layout: fdp
|
67
|
+
graph:
|
68
|
+
splines: ortho
|
69
|
+
theme1:
|
70
|
+
colorscheme: reds
|
71
|
+
layout: fdp
|
72
|
+
theme2:
|
73
|
+
colorscheme: blues
|
74
|
+
layout: dot
|
75
|
+
EOS
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'returns the default value' do
|
79
|
+
theme = described_class.read(nil)
|
80
|
+
expected = {layout:'fdp', graph:{splines:'ortho'}}
|
81
|
+
expect(theme).to eq expected
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dir_friend
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kyoendo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-10-
|
11
|
+
date: 2013-10-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: gviz
|
@@ -114,11 +114,15 @@ files:
|
|
114
114
|
- lib/dir_friend.rb
|
115
115
|
- lib/dir_friend/any.rb
|
116
116
|
- lib/dir_friend/command.rb
|
117
|
+
- lib/dir_friend/config.rb
|
118
|
+
- lib/dir_friend/core_ext.rb
|
117
119
|
- lib/dir_friend/d.rb
|
118
120
|
- lib/dir_friend/f.rb
|
119
121
|
- lib/dir_friend/graph.rb
|
122
|
+
- lib/dir_friend/template.yaml
|
120
123
|
- lib/dir_friend/version.rb
|
121
124
|
- spec/command_spec.rb
|
125
|
+
- spec/config_spec.rb
|
122
126
|
- spec/dir_friend_spec.rb
|
123
127
|
- spec/graph_spec.rb
|
124
128
|
- spec/spec_helper.rb
|
@@ -148,6 +152,7 @@ specification_version: 4
|
|
148
152
|
summary: '`DirFriend` is a tool for visualizing file directory.'
|
149
153
|
test_files:
|
150
154
|
- spec/command_spec.rb
|
155
|
+
- spec/config_spec.rb
|
151
156
|
- spec/dir_friend_spec.rb
|
152
157
|
- spec/graph_spec.rb
|
153
158
|
- spec/spec_helper.rb
|