ruby-zoom 3.5.0 → 4.0.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/bin/z +189 -147
- data/bin/zc +189 -147
- data/bin/zf +189 -147
- data/bin/zg +189 -147
- data/bin/zl +189 -147
- data/bin/zr +189 -147
- data/lib/zoom.rb +48 -604
- data/lib/zoom/cache.rb +253 -0
- data/lib/zoom/cache/result.rb +49 -0
- data/lib/zoom/config.rb +156 -0
- data/lib/zoom/editor.rb +121 -0
- data/lib/zoom/error.rb +6 -6
- data/lib/zoom/error/{executable_not_found_error.rb → executable_not_found.rb} +1 -3
- data/lib/zoom/error/invalid_color.rb +5 -0
- data/lib/zoom/error/{invalid_tag_error.rb → invalid_tag.rb} +1 -3
- data/lib/zoom/error/{profile_class_unknown_error.rb → profile_class_unknown.rb} +1 -3
- data/lib/zoom/error/{profile_does_not_exist_error.rb → profile_does_not_exist.rb} +1 -3
- data/lib/zoom/error/profile_not_named.rb +7 -0
- data/lib/zoom/profile.rb +162 -66
- data/lib/zoom/profile/ack.rb +5 -30
- data/lib/zoom/profile/ag.rb +2 -37
- data/lib/zoom/profile/find.rb +2 -25
- data/lib/zoom/profile/grep.rb +2 -44
- data/lib/zoom/profile/passwords.rb +27 -59
- data/lib/zoom/profile/pt.rb +2 -26
- data/lib/zoom/profile_manager.rb +49 -0
- data/lib/zoom/wish/add_wish.rb +58 -0
- data/lib/zoom/wish/color_wish.rb +147 -0
- data/lib/zoom/wish/copy_wish.rb +57 -0
- data/lib/zoom/wish/delete_wish.rb +51 -0
- data/lib/zoom/wish/edit_wish.rb +130 -0
- data/lib/zoom/wish/editor_wish.rb +31 -0
- data/lib/zoom/wish/list_wish.rb +58 -0
- data/lib/zoom/wish/rename_wish.rb +69 -0
- data/lib/zoom/wish/reset_wish.rb +40 -0
- data/lib/zoom/wish/use_wish.rb +61 -0
- metadata +118 -24
- data/lib/string.rb +0 -48
- data/lib/zoom/error/profile_already_exists_error.rb +0 -8
- data/lib/zoom/error/profile_can_not_be_modified_error.rb +0 -8
@@ -0,0 +1,57 @@
|
|
1
|
+
require "djinni"
|
2
|
+
|
3
|
+
class CopyWish < Djinni::Wish
|
4
|
+
def aliases
|
5
|
+
return ["copy", "cp"]
|
6
|
+
end
|
7
|
+
|
8
|
+
def description
|
9
|
+
return "Copy the specified profile"
|
10
|
+
end
|
11
|
+
|
12
|
+
def execute(args, djinni_env = {})
|
13
|
+
if (args.split(" ").length != 2)
|
14
|
+
usage
|
15
|
+
return
|
16
|
+
end
|
17
|
+
|
18
|
+
config = djinni_env["config"]
|
19
|
+
|
20
|
+
name, new = args.split(" ")
|
21
|
+
if (!config.has_profile?(name))
|
22
|
+
puts "Profile does not exist: #{name}"
|
23
|
+
elsif (config.has_profile?(new))
|
24
|
+
puts "Profile already exists: #{new}"
|
25
|
+
else
|
26
|
+
profiles = config.get_profiles
|
27
|
+
profiles[new] = profiles[name].clone
|
28
|
+
profiles[new].name(new)
|
29
|
+
config.set_profiles(profiles)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def tab_complete(input, djinni_env = {})
|
34
|
+
return [{}, "", ""] if (input.include?(" "))
|
35
|
+
|
36
|
+
profiles = djinni_env["config"].get_profiles
|
37
|
+
completions = Hash.new
|
38
|
+
|
39
|
+
profiles.keys.sort do |a, b|
|
40
|
+
a.downcase <=> b.downcase
|
41
|
+
end.each do |name|
|
42
|
+
profile = profiles[name]
|
43
|
+
completions[name] = profile.to_s.split("\n")[1].strip
|
44
|
+
end
|
45
|
+
|
46
|
+
completions.keep_if do |name, desc|
|
47
|
+
name.downcase.start_with?(input.downcase)
|
48
|
+
end
|
49
|
+
|
50
|
+
return [completions, input, " "]
|
51
|
+
end
|
52
|
+
|
53
|
+
def usage
|
54
|
+
puts "#{aliases.join(", ")} <name> <new_name>"
|
55
|
+
puts " #{description}."
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require "djinni"
|
2
|
+
|
3
|
+
class DeleteWish < Djinni::Wish
|
4
|
+
def aliases
|
5
|
+
return ["delete", "rm"]
|
6
|
+
end
|
7
|
+
|
8
|
+
def description
|
9
|
+
return "Delete the specifed profile"
|
10
|
+
end
|
11
|
+
|
12
|
+
def execute(args, djinni_env = {})
|
13
|
+
config = djinni_env["config"]
|
14
|
+
profiles = config.get_profiles
|
15
|
+
args.split(" ").each do |arg|
|
16
|
+
if (!config.has_profile?(arg))
|
17
|
+
puts "Profile does not exist: #{arg}"
|
18
|
+
elsif (config.current_profile_name == arg)
|
19
|
+
puts "Can't delete current profile: #{arg}"
|
20
|
+
else
|
21
|
+
profiles.delete(arg)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
config.set_profiles(profiles)
|
25
|
+
end
|
26
|
+
|
27
|
+
def tab_complete(input, djinni_env = {})
|
28
|
+
profiles = djinni_env["config"].get_profiles
|
29
|
+
completions = Hash.new
|
30
|
+
|
31
|
+
profiles.keys.sort do |a, b|
|
32
|
+
a.downcase <=> b.downcase
|
33
|
+
end.each do |name|
|
34
|
+
profile = profiles[name]
|
35
|
+
completions[name] = profile.to_s.split("\n")[1].strip
|
36
|
+
end
|
37
|
+
|
38
|
+
last = input.rpartition(" ")[-1]
|
39
|
+
|
40
|
+
completions.keep_if do |name, desc|
|
41
|
+
name.downcase.start_with?(last.downcase)
|
42
|
+
end
|
43
|
+
|
44
|
+
return [completions, last, " "]
|
45
|
+
end
|
46
|
+
|
47
|
+
def usage
|
48
|
+
puts "#{aliases.join(", ")} <name>...[name]"
|
49
|
+
puts " #{description}."
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,130 @@
|
|
1
|
+
require "djinni"
|
2
|
+
|
3
|
+
class EditWish < Djinni::Wish
|
4
|
+
def aliases
|
5
|
+
return ["config", "edit", "set"]
|
6
|
+
end
|
7
|
+
|
8
|
+
def description
|
9
|
+
return "Configure profile"
|
10
|
+
end
|
11
|
+
|
12
|
+
def execute(args, djinni_env = {})
|
13
|
+
n, args = args.split(" ", 2)
|
14
|
+
|
15
|
+
if (args.nil?)
|
16
|
+
usage
|
17
|
+
return
|
18
|
+
end
|
19
|
+
|
20
|
+
config = djinni_env["config"]
|
21
|
+
if (!config.has_profile?(n))
|
22
|
+
puts "Profile does not exist: #{n}"
|
23
|
+
return
|
24
|
+
end
|
25
|
+
|
26
|
+
f, found, v = args.partition(" ")
|
27
|
+
|
28
|
+
case f
|
29
|
+
when "class", "operator"
|
30
|
+
if (found.empty?)
|
31
|
+
usage
|
32
|
+
return
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
profiles = config.get_profiles
|
37
|
+
profile = profiles[n]
|
38
|
+
|
39
|
+
case f
|
40
|
+
when "after"
|
41
|
+
profile.after(v)
|
42
|
+
when "before"
|
43
|
+
profile.before(v)
|
44
|
+
when "class"
|
45
|
+
if (!@classes.has_key?(v))
|
46
|
+
puts "Class does not exist: #{v}"
|
47
|
+
return
|
48
|
+
end
|
49
|
+
|
50
|
+
profile = Zoom::Profile.profile_by_name(v).new(n)
|
51
|
+
profiles[n] = profile
|
52
|
+
when "flags"
|
53
|
+
profile.flags(v)
|
54
|
+
when "operator"
|
55
|
+
profile.operator(v)
|
56
|
+
else
|
57
|
+
usage
|
58
|
+
return
|
59
|
+
end
|
60
|
+
|
61
|
+
config.set_profiles(profiles)
|
62
|
+
end
|
63
|
+
|
64
|
+
def initialize
|
65
|
+
@classes = Hash.new
|
66
|
+
[Zoom::Profile].concat(Zoom::Profile.subclasses).each do |c|
|
67
|
+
@classes[c.to_s] = c.new(c.to_s).to_s.split("\n")[1].strip
|
68
|
+
end
|
69
|
+
@fields = {
|
70
|
+
"after" => "Append any follow up commands",
|
71
|
+
"before" => "Prepend any ENV vars",
|
72
|
+
"class" => "Modify the class",
|
73
|
+
"flags" => "Specify any additional flags",
|
74
|
+
"operator" => "Specify an alternative operator"
|
75
|
+
}
|
76
|
+
end
|
77
|
+
|
78
|
+
def tab_complete(input, djinni_env = {})
|
79
|
+
n, input = input.split(" ", 2)
|
80
|
+
n ||= ""
|
81
|
+
|
82
|
+
if (input.nil?)
|
83
|
+
profiles = djinni_env["config"].get_profiles
|
84
|
+
completions = Hash.new
|
85
|
+
|
86
|
+
profiles.keys.sort do |a, b|
|
87
|
+
a.downcase <=> b.downcase
|
88
|
+
end.each do |name|
|
89
|
+
profile = profiles[name]
|
90
|
+
completions[name] = profile.to_s.split("\n")[1].strip
|
91
|
+
end
|
92
|
+
|
93
|
+
completions.keep_if do |name, desc|
|
94
|
+
name.downcase.start_with?(n.downcase)
|
95
|
+
end
|
96
|
+
|
97
|
+
return [completions, n, " "]
|
98
|
+
end
|
99
|
+
|
100
|
+
f, found, v = input.rpartition(" ")
|
101
|
+
|
102
|
+
if (found.empty?)
|
103
|
+
f = v
|
104
|
+
completions = @fields.select do |field, desc|
|
105
|
+
field.downcase.start_with?(f.downcase)
|
106
|
+
end
|
107
|
+
return [completions, f, " "]
|
108
|
+
end
|
109
|
+
|
110
|
+
case f
|
111
|
+
when "class"
|
112
|
+
completions = @classes.select do |clas, desc|
|
113
|
+
clas.downcase.start_with?(v.downcase)
|
114
|
+
end
|
115
|
+
return [completions, v, ""]
|
116
|
+
else
|
117
|
+
return [{}, "", ""]
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def usage
|
122
|
+
puts "#{aliases.join(", ")} <name> <field> <value>"
|
123
|
+
puts " #{description}."
|
124
|
+
puts
|
125
|
+
puts "FIELDS"
|
126
|
+
@fields.each do |field, desc|
|
127
|
+
puts " #{field}"
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require "djinni"
|
2
|
+
require "scoobydoo"
|
3
|
+
|
4
|
+
class EditorWish < Djinni::Wish
|
5
|
+
def aliases
|
6
|
+
return ["editor"]
|
7
|
+
end
|
8
|
+
|
9
|
+
def description
|
10
|
+
return "Configure editor"
|
11
|
+
end
|
12
|
+
|
13
|
+
def execute(args, djinni_env = {})
|
14
|
+
if (args.include?(" "))
|
15
|
+
usage
|
16
|
+
return
|
17
|
+
end
|
18
|
+
|
19
|
+
config = djinni_env["config"]
|
20
|
+
if (ScoobyDoo.where_are_you(args))
|
21
|
+
config.editor(args)
|
22
|
+
else
|
23
|
+
puts "Editor not found: #{args}"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def usage
|
28
|
+
puts "#{aliases.join(", ")} <value>"
|
29
|
+
puts " #{description}."
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require "djinni"
|
2
|
+
|
3
|
+
class ListWish < Djinni::Wish
|
4
|
+
def aliases
|
5
|
+
return ["la", "list", "ls"]
|
6
|
+
end
|
7
|
+
|
8
|
+
def description
|
9
|
+
return "List details for current/all profiles"
|
10
|
+
end
|
11
|
+
|
12
|
+
def execute(args, djinni_env = {})
|
13
|
+
if (!args.empty? && (args != "all"))
|
14
|
+
usage
|
15
|
+
return
|
16
|
+
end
|
17
|
+
|
18
|
+
config = djinni_env["config"]
|
19
|
+
input = djinni_env["djinni_input"]
|
20
|
+
input = "la" if (!args.empty?)
|
21
|
+
|
22
|
+
case input
|
23
|
+
when "la"
|
24
|
+
profiles = config.get_profiles
|
25
|
+
profiles.keys.sort do |a, b|
|
26
|
+
a.downcase <=> b.downcase
|
27
|
+
end.each do |name|
|
28
|
+
print_profile(profiles[name])
|
29
|
+
end
|
30
|
+
else
|
31
|
+
profile = config.get_profiles[config.current_profile_name]
|
32
|
+
print_profile(profile)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def print_profile(profile)
|
37
|
+
first = true
|
38
|
+
profile.to_s.scan(/\S.{0,76}\S(?=\s|$)|\S+/).each do |line|
|
39
|
+
if (first)
|
40
|
+
puts line
|
41
|
+
first = false
|
42
|
+
else
|
43
|
+
puts " #{line}"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
private :print_profile
|
48
|
+
|
49
|
+
def tab_complete(input, djinni_env = {})
|
50
|
+
return [{}, "", ""] if (input.include?(" "))
|
51
|
+
return [{"all" => "List all profiles"}, input, ""]
|
52
|
+
end
|
53
|
+
|
54
|
+
def usage
|
55
|
+
puts "#{aliases.join(", ")} [all]"
|
56
|
+
puts " #{description}."
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require "djinni"
|
2
|
+
|
3
|
+
class RenameWish < Djinni::Wish
|
4
|
+
def aliases
|
5
|
+
return ["mv", "rename"]
|
6
|
+
end
|
7
|
+
|
8
|
+
def description
|
9
|
+
return "Rename the specified profile"
|
10
|
+
end
|
11
|
+
|
12
|
+
def execute(args, djinni_env = {})
|
13
|
+
if (args.split(" ").length != 2)
|
14
|
+
usage
|
15
|
+
return
|
16
|
+
end
|
17
|
+
|
18
|
+
config = djinni_env["config"]
|
19
|
+
|
20
|
+
old, new = args.split(" ")
|
21
|
+
if (!config.has_profile?(old))
|
22
|
+
puts "Profile does not exist: #{old}"
|
23
|
+
elsif (config.has_profile?(new))
|
24
|
+
puts "Profile already exists: #{new}"
|
25
|
+
else
|
26
|
+
profiles = config.get_profiles
|
27
|
+
profiles[new] = profiles.delete(old)
|
28
|
+
profiles[new].name(new)
|
29
|
+
config.set_profiles(profiles)
|
30
|
+
|
31
|
+
# Update prompt
|
32
|
+
if (config.current_profile_name == old)
|
33
|
+
config.current_profile_name(new)
|
34
|
+
prompt_color = djinni_env["prompt_color"]
|
35
|
+
if (prompt_color)
|
36
|
+
prompt = "zoom(#{new})> ".send(prompt_color)
|
37
|
+
else
|
38
|
+
prompt = "zoom(#{new})> "
|
39
|
+
end
|
40
|
+
djinni_env["djinni_prompt"] = prompt
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def tab_complete(input, djinni_env = {})
|
46
|
+
return [{}, "", ""] if (input.include?(" "))
|
47
|
+
|
48
|
+
profiles = djinni_env["config"].get_profiles
|
49
|
+
completions = Hash.new
|
50
|
+
|
51
|
+
profiles.keys.sort do |a, b|
|
52
|
+
a.downcase <=> b.downcase
|
53
|
+
end.each do |name|
|
54
|
+
profile = profiles[name]
|
55
|
+
completions[name] = profile.to_s.split("\n")[1].strip
|
56
|
+
end
|
57
|
+
|
58
|
+
completions.keep_if do |name, desc|
|
59
|
+
name.downcase.start_with?(input.downcase)
|
60
|
+
end
|
61
|
+
|
62
|
+
return [completions, input, " "]
|
63
|
+
end
|
64
|
+
|
65
|
+
def usage
|
66
|
+
puts "#{aliases.join(", ")} <old_name> <new_name>"
|
67
|
+
puts " #{description}."
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require "djinni"
|
2
|
+
|
3
|
+
class ResetWish < Djinni::Wish
|
4
|
+
def aliases
|
5
|
+
return ["default", "reset"]
|
6
|
+
end
|
7
|
+
|
8
|
+
def description
|
9
|
+
return "Create default profiles"
|
10
|
+
end
|
11
|
+
|
12
|
+
def execute(args, djinni_env = {})
|
13
|
+
if (!args.empty?)
|
14
|
+
usage
|
15
|
+
return
|
16
|
+
end
|
17
|
+
|
18
|
+
FileUtils.rm_f(Pathname.new("~/.zoomrc").expand_path)
|
19
|
+
config = djinni_env["config"]
|
20
|
+
config.default_config
|
21
|
+
|
22
|
+
cache = djinni_env["cache"]
|
23
|
+
cache.clear
|
24
|
+
|
25
|
+
# Update prompt
|
26
|
+
default = config.current_profile_name
|
27
|
+
prompt_color = djinni_env["prompt_color"]
|
28
|
+
if (prompt_color)
|
29
|
+
prompt = "zoom(#{default})> ".send(prompt_color)
|
30
|
+
else
|
31
|
+
prompt = "zoom(#{default})> "
|
32
|
+
end
|
33
|
+
djinni_env["djinni_prompt"] = prompt
|
34
|
+
end
|
35
|
+
|
36
|
+
def usage
|
37
|
+
puts "#{aliases.join(", ")}"
|
38
|
+
puts " #{description}."
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require "djinni"
|
2
|
+
|
3
|
+
class UseWish < Djinni::Wish
|
4
|
+
def aliases
|
5
|
+
return ["use"]
|
6
|
+
end
|
7
|
+
|
8
|
+
def description
|
9
|
+
return "Set the specifed profile as the current profile name"
|
10
|
+
end
|
11
|
+
|
12
|
+
def execute(args, djinni_env = {})
|
13
|
+
if (args.include?(" "))
|
14
|
+
usage
|
15
|
+
return
|
16
|
+
end
|
17
|
+
|
18
|
+
config = djinni_env["config"]
|
19
|
+
|
20
|
+
if (!config.has_profile?(args))
|
21
|
+
puts "Profile does not exist: #{args}"
|
22
|
+
return
|
23
|
+
end
|
24
|
+
|
25
|
+
config.current_profile_name(args)
|
26
|
+
|
27
|
+
# Update prompt
|
28
|
+
prompt_color = djinni_env["prompt_color"]
|
29
|
+
if (prompt_color)
|
30
|
+
prompt = "zoom(#{args})> ".send(prompt_color)
|
31
|
+
else
|
32
|
+
prompt = "zoom(#{args})> "
|
33
|
+
end
|
34
|
+
djinni_env["djinni_prompt"] = prompt
|
35
|
+
end
|
36
|
+
|
37
|
+
def tab_complete(input, djinni_env = {})
|
38
|
+
return [{}, "", ""] if (input.include?(" "))
|
39
|
+
|
40
|
+
profiles = djinni_env["config"].get_profiles
|
41
|
+
completions = Hash.new
|
42
|
+
|
43
|
+
profiles.keys.sort do |a, b|
|
44
|
+
a.downcase <=> b.downcase
|
45
|
+
end.each do |name|
|
46
|
+
profile = profiles[name]
|
47
|
+
completions[name] = profile.to_s.split("\n")[1].strip
|
48
|
+
end
|
49
|
+
|
50
|
+
completions.keep_if do |name, desc|
|
51
|
+
name.downcase.start_with?(input.downcase)
|
52
|
+
end
|
53
|
+
|
54
|
+
return [completions, input, " "]
|
55
|
+
end
|
56
|
+
|
57
|
+
def usage
|
58
|
+
puts "#{aliases.join(", ")} <name>"
|
59
|
+
puts " #{description}."
|
60
|
+
end
|
61
|
+
end
|