overpath 0.0.1
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 +7 -0
- data/bin/overpath +195 -0
- data/lib/overpath.rb +2 -0
- data/lib/overpath/path_printer.rb +61 -0
- data/lib/overpath/path_table.rb +41 -0
- data/overpath.rdoc +120 -0
- metadata +78 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f8be652dae7a95b56a2a470dac2e794bcca7ede3
|
4
|
+
data.tar.gz: 075eeb68462839818003675154bf2462f717da24
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 70b53e13618d162fc0f97536b032ec5d37593ddd3419b83045de5085e48b58c09e1616ea5fcffa6b05e54340c391772de5b84717ac826e2f989c8fab32b0e972
|
7
|
+
data.tar.gz: 7afd3db406c31a07d49d2c401cb83a6f97a55b2276645509ce8ddcef6880bee57a82b6dd40fa9dff42ce425e5544db767eecb6c925e6f81a3ec83220a5a4f2c0
|
data/bin/overpath
ADDED
@@ -0,0 +1,195 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'overpath'
|
3
|
+
require 'gli'
|
4
|
+
|
5
|
+
include GLI::App
|
6
|
+
program_desc 'Valhalla awaits!'
|
7
|
+
program_long_desc 'Find your path before Ragnarök comes!'
|
8
|
+
default_command 'help'
|
9
|
+
hide_commands_without_desc true
|
10
|
+
version '0.0.1'
|
11
|
+
sort_help :manually
|
12
|
+
accept(File) do |string|
|
13
|
+
File.path(string)
|
14
|
+
end
|
15
|
+
flag %i[file], desc: 'Specify a file to store paths',
|
16
|
+
default_value: File.join(Dir.home, '.overpath/overpath'),
|
17
|
+
arg_name: 'filepath',
|
18
|
+
type: File
|
19
|
+
|
20
|
+
pre do |global_options, _command, _options, _args|
|
21
|
+
path = global_options[:file]
|
22
|
+
dir = File.dirname(path)
|
23
|
+
Dir.mkdir(dir) unless Dir.exist?(dir)
|
24
|
+
@table = PathTable.new(path)
|
25
|
+
@table.load
|
26
|
+
end
|
27
|
+
|
28
|
+
post do
|
29
|
+
@table.save
|
30
|
+
end
|
31
|
+
|
32
|
+
desc 'Set one path with one key'
|
33
|
+
arg 'key'
|
34
|
+
arg 'path', :optional
|
35
|
+
command :add do |c|
|
36
|
+
c.desc 'Set favorite path'
|
37
|
+
c.switch %i[f favorite]
|
38
|
+
c.action do |_global_options, options, args|
|
39
|
+
key = args[0]
|
40
|
+
if key
|
41
|
+
value = File.expand_path(args[1] ? args[1] : Dir.pwd)
|
42
|
+
@table.table[key] = value
|
43
|
+
puts PathPrinter.str([key, value])
|
44
|
+
@table.favorite = key if options[:f]
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
desc 'Get paths with keys'
|
50
|
+
arg 'key, ...'
|
51
|
+
command :get do |c|
|
52
|
+
c.desc 'Get the path of directory instead of file'
|
53
|
+
c.switch %i[d directory]
|
54
|
+
c.desc 'List all paths'
|
55
|
+
c.switch %i[a all]
|
56
|
+
c.desc 'Don\'t escape the path'
|
57
|
+
c.switch [:E]
|
58
|
+
c.action do |_global_options, options, args|
|
59
|
+
list = if options[:a]
|
60
|
+
@table.table.values
|
61
|
+
elsif args.empty? && @table.favorite
|
62
|
+
[@table.table[@table.favorite]]
|
63
|
+
else
|
64
|
+
@table.table.values_at(*args).select { |item| item }
|
65
|
+
end
|
66
|
+
if options[:d]
|
67
|
+
list.map! { |path| (File.directory?(path) ? path : File.dirname(path)) }
|
68
|
+
end
|
69
|
+
puts PathPrinter.string(list, true, !options[:E])
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
desc 'Choose your favorite path'
|
74
|
+
arg 'key', :optional
|
75
|
+
command :fav do |c|
|
76
|
+
c.desc 'Clean current favorite path'
|
77
|
+
c.switch %i[c clean]
|
78
|
+
c.action do |_global_options, options, args|
|
79
|
+
if options[:c]
|
80
|
+
if @table.favorite
|
81
|
+
key_value = [@table.favorite, @table.table[@table.favorite]]
|
82
|
+
puts PathPrinter.str_del(key_value)
|
83
|
+
@table.favorite = nil
|
84
|
+
end
|
85
|
+
elsif args[0]
|
86
|
+
value = @table.table[args[0]]
|
87
|
+
if value
|
88
|
+
@table.favorite = args[0]
|
89
|
+
puts PathPrinter.str_mark([@table.favorite, value], @table.favorite)
|
90
|
+
end
|
91
|
+
elsif @table.favorite
|
92
|
+
key_value = [@table.favorite, @table.table[@table.favorite]]
|
93
|
+
puts PathPrinter.str_mark(key_value, @table.favorite)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
desc 'List paths and their keys'
|
99
|
+
command :ls do |c|
|
100
|
+
c.desc 'List keys only'
|
101
|
+
c.switch %i[k keys-only]
|
102
|
+
c.desc 'List paths only'
|
103
|
+
c.switch %i[p paths-only]
|
104
|
+
c.desc 'Don\'t escape the paths'
|
105
|
+
c.switch [:E]
|
106
|
+
c.action do |_global_options, options, _args|
|
107
|
+
list = nil
|
108
|
+
if options[:k] == options[:p]
|
109
|
+
list = PathPrinter.string_with_mark(@table.table.to_a,
|
110
|
+
true,
|
111
|
+
!options[:E],
|
112
|
+
@table.favorite)
|
113
|
+
elsif options[:k]
|
114
|
+
list = PathPrinter.string(@table.table.keys,
|
115
|
+
true,
|
116
|
+
false)
|
117
|
+
elsif options[:p]
|
118
|
+
list = PathPrinter.string(@table.table.values,
|
119
|
+
true,
|
120
|
+
!options[:E])
|
121
|
+
end
|
122
|
+
puts list
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
desc '(Ex)change key of path to another'
|
127
|
+
arg 'key'
|
128
|
+
arg 'another'
|
129
|
+
command :mv do |c|
|
130
|
+
c.desc 'Exchange keys'
|
131
|
+
c.switch %i[e exchange]
|
132
|
+
c.action do |_global_options, options, args|
|
133
|
+
if args[0] && args[1]
|
134
|
+
@table.favorite = nil if args[0] == @table.favorite && !options[:e]
|
135
|
+
value = @table.table.delete(args[0])
|
136
|
+
another_value = @table.table.delete(args[1])
|
137
|
+
if value
|
138
|
+
puts PathPrinter.str_del([args[0], value]) unless options[:e]
|
139
|
+
value = File.expand_path(value)
|
140
|
+
@table.table[args[1]] = value
|
141
|
+
puts PathPrinter.str([args[1], value])
|
142
|
+
end
|
143
|
+
if options[:e] && another_value
|
144
|
+
another_value = File.expand_path(another_value)
|
145
|
+
@table.table[args[0]] = another_value
|
146
|
+
puts PathPrinter.str([args[0], another_value])
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
desc 'Sort paths by key'
|
153
|
+
command :so do |c|
|
154
|
+
c.action do |_global_options, _options, _args|
|
155
|
+
@table.table = Hash[@table.table.sort_by { |key, _value| key }]
|
156
|
+
puts PathPrinter.string_with_mark(@table.table.to_a,
|
157
|
+
true,
|
158
|
+
true,
|
159
|
+
@table.favorite)
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
desc 'Delete paths with keys'
|
164
|
+
arg 'key, ...'
|
165
|
+
command :rm do |c|
|
166
|
+
c.desc 'Delete all paths'
|
167
|
+
c.switch %i[a all]
|
168
|
+
c.action do |_global_options, options, args|
|
169
|
+
list = (options[:a] ? @table.table.keys : args)
|
170
|
+
list.each do |key|
|
171
|
+
@table.favorite = nil if key == @table.favorite
|
172
|
+
value = @table.table.delete(key)
|
173
|
+
puts PathPrinter.str_del([key, value]) if value
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
command :'.' do |c|
|
179
|
+
c.action do |global_options, _options, args|
|
180
|
+
key = @app.exe_name
|
181
|
+
path = (File.symlink?(__FILE__) ? File.readlink(__FILE__) : __FILE__)
|
182
|
+
path = File.expand_path(path)
|
183
|
+
if args[0] == 'path'
|
184
|
+
puts PathPrinter.str(path)
|
185
|
+
elsif args[0] == 'command'
|
186
|
+
puts @commands_declaration_order.map(&:name).drop(2).join(' ')
|
187
|
+
elsif args[0] == 'file'
|
188
|
+
puts global_options[:file]
|
189
|
+
else
|
190
|
+
puts PathPrinter.str([key, path])
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
exit run(ARGV)
|
data/lib/overpath.rb
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'shellwords'
|
2
|
+
|
3
|
+
# Generator for print key-value pairs
|
4
|
+
class PathPrinter
|
5
|
+
class << self
|
6
|
+
def str(data)
|
7
|
+
string(data, false, true)
|
8
|
+
end
|
9
|
+
|
10
|
+
def str_del(data)
|
11
|
+
string_with_mark_deletion(data, false, true, '', true)
|
12
|
+
end
|
13
|
+
|
14
|
+
def str_mark(data, mark)
|
15
|
+
string_with_mark(data, false, true, mark)
|
16
|
+
end
|
17
|
+
|
18
|
+
def string(data, is_list, escaped)
|
19
|
+
string_with_mark(data, is_list, escaped, '')
|
20
|
+
end
|
21
|
+
|
22
|
+
def string_with_mark(data, is_list, escaped, mark)
|
23
|
+
string_with_mark_deletion(data, is_list, escaped, mark, false)
|
24
|
+
end
|
25
|
+
|
26
|
+
def string_with_mark_deletion(data, is_list, escaped, mark, deletion)
|
27
|
+
output = []
|
28
|
+
if is_list
|
29
|
+
data.each do |o|
|
30
|
+
output << string_from_key_value(o, escaped, mark, deletion)
|
31
|
+
end
|
32
|
+
else
|
33
|
+
output << string_from_key_value(data, escaped, mark, deletion)
|
34
|
+
end
|
35
|
+
output
|
36
|
+
end
|
37
|
+
|
38
|
+
def string_from_key_value(o, escaped, mark, deletion)
|
39
|
+
line = nil
|
40
|
+
if o.is_a?(Array) && o.size == 2
|
41
|
+
line = string_from_key_and_value(o, escaped, mark, deletion)
|
42
|
+
elsif o.is_a?(String)
|
43
|
+
line = string_from_key_or_value(o, escaped, mark, deletion)
|
44
|
+
end
|
45
|
+
line
|
46
|
+
end
|
47
|
+
|
48
|
+
def string_from_key_and_value(key_value, escaped, mark, deletion)
|
49
|
+
value = (escaped ? Shellwords.escape(key_value[1]) : key_value[1])
|
50
|
+
mark = (mark == key_value[0] ? " \u{2764}" : '')
|
51
|
+
deletion_mark = (deletion ? " \u{2716}" : '')
|
52
|
+
"\"#{key_value[0]}\" => \"#{value}\"#{mark}#{deletion_mark}"
|
53
|
+
end
|
54
|
+
|
55
|
+
def string_from_key_or_value(string, escaped, mark, deletion)
|
56
|
+
string += (mark == string ? " \u{2764}" : '')
|
57
|
+
string += (deletion ? " \u{2716}" : '')
|
58
|
+
(escaped ? Shellwords.escape(string) : string)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
# Controller for paths
|
4
|
+
class PathTable
|
5
|
+
def initialize(file_path)
|
6
|
+
@file_path = file_path
|
7
|
+
@table = {}
|
8
|
+
end
|
9
|
+
PATHTABLE_FAVORITE_KEY = 'PATHTABLE_FAVORITE_KEY'.freeze
|
10
|
+
def save
|
11
|
+
File.open(@file_path + '.new', 'w+') do |file|
|
12
|
+
save_to_file(file)
|
13
|
+
end
|
14
|
+
File.rename(@file_path, @file_path + '.old') if File.exist?(@file_path)
|
15
|
+
File.rename(@file_path + '.new', @file_path)
|
16
|
+
end
|
17
|
+
|
18
|
+
def save_to_file(file)
|
19
|
+
favorite = { PATHTABLE_FAVORITE_KEY => @favorite }
|
20
|
+
table = @favorite ? @table.merge(favorite) : @table
|
21
|
+
file.puts JSON.generate(table)
|
22
|
+
File.foreach(@file_path).with_index do |line, i|
|
23
|
+
break if i > 14
|
24
|
+
file.puts line
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def load
|
29
|
+
if File.exist?(@file_path)
|
30
|
+
table = JSON.parse(File.open(@file_path, 'r').gets)
|
31
|
+
if table.is_a?(Hash)
|
32
|
+
@table = table.reject { |key, _value| key == PATHTABLE_FAVORITE_KEY }
|
33
|
+
@table.each_value { |value| value.chomp!('/') }
|
34
|
+
@favorite = table[PATHTABLE_FAVORITE_KEY]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
@table
|
38
|
+
end
|
39
|
+
attr_accessor :table
|
40
|
+
attr_accessor :favorite
|
41
|
+
end
|
data/overpath.rdoc
ADDED
@@ -0,0 +1,120 @@
|
|
1
|
+
== overpath - Valhalla awaits!
|
2
|
+
|
3
|
+
Find your path before Ragnarök comes!
|
4
|
+
|
5
|
+
v0.0.1
|
6
|
+
|
7
|
+
=== Global Options
|
8
|
+
=== --file filepath
|
9
|
+
|
10
|
+
Specify a file to store paths
|
11
|
+
|
12
|
+
[Default Value] /Users/fangqiuming/.overpath/overpath
|
13
|
+
|
14
|
+
|
15
|
+
=== --help
|
16
|
+
Show this message
|
17
|
+
|
18
|
+
|
19
|
+
|
20
|
+
=== --version
|
21
|
+
Display the program version
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
=== Commands
|
26
|
+
==== Command: <tt>add </tt>
|
27
|
+
Set one path with one key
|
28
|
+
|
29
|
+
|
30
|
+
===== Options
|
31
|
+
===== -f|--[no-]favorite
|
32
|
+
Set favorite path
|
33
|
+
|
34
|
+
|
35
|
+
|
36
|
+
==== Command: <tt>fav </tt>
|
37
|
+
Choose your favorite path
|
38
|
+
|
39
|
+
|
40
|
+
===== Options
|
41
|
+
===== -c|--[no-]clean
|
42
|
+
Clean current favorite path
|
43
|
+
|
44
|
+
|
45
|
+
|
46
|
+
==== Command: <tt>get </tt>
|
47
|
+
Get paths with keys
|
48
|
+
|
49
|
+
|
50
|
+
===== Options
|
51
|
+
===== -E
|
52
|
+
Don't escape the path
|
53
|
+
|
54
|
+
|
55
|
+
|
56
|
+
===== -a|--[no-]all
|
57
|
+
List all paths
|
58
|
+
|
59
|
+
|
60
|
+
|
61
|
+
===== -d|--[no-]directory
|
62
|
+
Get the path of directory instead of file
|
63
|
+
|
64
|
+
|
65
|
+
|
66
|
+
==== Command: <tt>help command</tt>
|
67
|
+
Shows a list of commands or help for one command
|
68
|
+
|
69
|
+
Gets help for the application or its commands. Can also list the commands in a way helpful to creating a bash-style completion function
|
70
|
+
===== Options
|
71
|
+
===== -c
|
72
|
+
List commands one per line, to assist with shell completion
|
73
|
+
|
74
|
+
|
75
|
+
|
76
|
+
==== Command: <tt>ls </tt>
|
77
|
+
List paths and their keys
|
78
|
+
|
79
|
+
|
80
|
+
===== Options
|
81
|
+
===== -E
|
82
|
+
Don't escape the paths
|
83
|
+
|
84
|
+
|
85
|
+
|
86
|
+
===== -k|--[no-]keys-only
|
87
|
+
List keys only
|
88
|
+
|
89
|
+
|
90
|
+
|
91
|
+
===== -p|--[no-]paths-only
|
92
|
+
List paths only
|
93
|
+
|
94
|
+
|
95
|
+
|
96
|
+
==== Command: <tt>mv </tt>
|
97
|
+
(Ex)change key of path to another
|
98
|
+
|
99
|
+
|
100
|
+
===== Options
|
101
|
+
===== -e|--[no-]exchange
|
102
|
+
Exchange keys
|
103
|
+
|
104
|
+
|
105
|
+
|
106
|
+
==== Command: <tt>rm </tt>
|
107
|
+
Delete paths with keys
|
108
|
+
|
109
|
+
|
110
|
+
===== Options
|
111
|
+
===== -a|--[no-]all
|
112
|
+
Delete all paths
|
113
|
+
|
114
|
+
|
115
|
+
|
116
|
+
==== Command: <tt>so </tt>
|
117
|
+
Sort paths by key
|
118
|
+
|
119
|
+
|
120
|
+
[Default Command] help
|
metadata
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: overpath
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Fang Qiuming
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-08-03 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: gli
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.16'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.16'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: json
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '2.0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '2.0'
|
41
|
+
description: A manager of your common paths
|
42
|
+
email: fangqiuming@outlook.com
|
43
|
+
executables:
|
44
|
+
- overpath
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files:
|
47
|
+
- overpath.rdoc
|
48
|
+
files:
|
49
|
+
- bin/overpath
|
50
|
+
- lib/overpath.rb
|
51
|
+
- lib/overpath/path_printer.rb
|
52
|
+
- lib/overpath/path_table.rb
|
53
|
+
- overpath.rdoc
|
54
|
+
homepage: http://rubygems.org/gems/overpath
|
55
|
+
licenses:
|
56
|
+
- MIT
|
57
|
+
metadata: {}
|
58
|
+
post_install_message:
|
59
|
+
rdoc_options: []
|
60
|
+
require_paths:
|
61
|
+
- lib
|
62
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '0'
|
67
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: '0'
|
72
|
+
requirements: []
|
73
|
+
rubyforge_project:
|
74
|
+
rubygems_version: 2.6.11
|
75
|
+
signing_key:
|
76
|
+
specification_version: 4
|
77
|
+
summary: Drive in Bash like a Pro
|
78
|
+
test_files: []
|