lightning 0.2.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.
- data/CHANGELOG.rdoc +13 -0
- data/LICENSE.txt +22 -0
- data/README.rdoc +150 -0
- data/Rakefile +69 -0
- data/VERSION.yml +4 -0
- data/bin/lightning-complete +13 -0
- data/bin/lightning-full_path +18 -0
- data/bin/lightning-install +7 -0
- data/lib/lightning.rb +68 -0
- data/lib/lightning/bolt.rb +33 -0
- data/lib/lightning/bolts.rb +12 -0
- data/lib/lightning/commands.rb +92 -0
- data/lib/lightning/completion.rb +43 -0
- data/lib/lightning/completion_map.rb +59 -0
- data/lib/lightning/config.rb +72 -0
- data/lib/lightning/generator.rb +48 -0
- data/lightning.yml.example +87 -0
- data/lightning_completions.example +147 -0
- data/test/bolt_test.rb +36 -0
- data/test/completion_map_test.rb +58 -0
- data/test/completion_test.rb +49 -0
- data/test/config_test.rb +62 -0
- data/test/lightning.yml +39 -0
- data/test/lightning_test.rb +58 -0
- data/test/test_helper.rb +24 -0
- metadata +87 -0
@@ -0,0 +1,43 @@
|
|
1
|
+
# derived from http://github.com/ryanb/dotfiles/tree/master/bash/completion_scripts/project_completion
|
2
|
+
#This class handles completions given a path key and the text already typed.
|
3
|
+
class Lightning
|
4
|
+
class Completion
|
5
|
+
def self.complete(text_to_complete, bolt_key)
|
6
|
+
new(text_to_complete, bolt_key).matches
|
7
|
+
end
|
8
|
+
|
9
|
+
def initialize(text_typed, bolt_key)
|
10
|
+
@text_typed = text_typed
|
11
|
+
@bolt_key = bolt_key
|
12
|
+
end
|
13
|
+
|
14
|
+
def matches
|
15
|
+
if Lightning.config[:complete_regex]
|
16
|
+
begin
|
17
|
+
possible_completions.grep(/#{blob_to_regex(typed)}/)
|
18
|
+
rescue RegexpError
|
19
|
+
['#Error: Invalid regular expression']
|
20
|
+
end
|
21
|
+
else
|
22
|
+
possible_completions.select do |e|
|
23
|
+
e[0, typed.length] == typed
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
#just converts * to .* to make a glob-like regex
|
29
|
+
def blob_to_regex(string)
|
30
|
+
string.gsub(/^\*|([^\.])\*/) {|e| $1 ? $1 + ".*" : ".*" }
|
31
|
+
end
|
32
|
+
|
33
|
+
def typed
|
34
|
+
# @text_typed[/\s(.+?)$/, 1] || ''
|
35
|
+
text = @text_typed[/^(\S+)\s+(#{Lightning::TEST_FLAG})?\s*(.+?)$/, 3] || ''
|
36
|
+
text.strip
|
37
|
+
end
|
38
|
+
|
39
|
+
def possible_completions
|
40
|
+
Lightning.bolts[@bolt_key].completions
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
#This class maps completions to their full paths for the given blobs
|
2
|
+
class Lightning
|
3
|
+
class CompletionMap
|
4
|
+
attr_accessor :map
|
5
|
+
attr_reader :alias_map
|
6
|
+
|
7
|
+
def initialize(*globs)
|
8
|
+
options = globs[-1].is_a?(Hash) ? globs.pop : {}
|
9
|
+
globs.flatten!
|
10
|
+
@map = create_map_for_globs(globs)
|
11
|
+
@alias_map = (options[:global_aliases] || {}).merge(options[:aliases] || {})
|
12
|
+
end
|
13
|
+
|
14
|
+
def [](completion)
|
15
|
+
@map[completion] || @alias_map[completion]
|
16
|
+
end
|
17
|
+
|
18
|
+
def keys
|
19
|
+
(@map.keys + @alias_map.keys).uniq
|
20
|
+
end
|
21
|
+
|
22
|
+
#should return hash
|
23
|
+
def create_map_for_globs(globs)
|
24
|
+
path_hash = {}
|
25
|
+
ignore_paths = ['.', '..'] + Lightning.ignore_paths
|
26
|
+
globs.each do |d|
|
27
|
+
Dir.glob(d, File::FNM_DOTMATCH).each do |e|
|
28
|
+
basename = File.basename(e)
|
29
|
+
unless ignore_paths.include?(basename)
|
30
|
+
#save paths of duplicate basenames to process later
|
31
|
+
if path_hash.has_key?(basename)
|
32
|
+
if path_hash[basename].is_a?(Array)
|
33
|
+
path_hash[basename] << e
|
34
|
+
else
|
35
|
+
path_hash[basename] = [path_hash[basename], e]
|
36
|
+
end
|
37
|
+
else
|
38
|
+
path_hash[basename] = e
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
map_duplicate_basenames(path_hash)
|
44
|
+
path_hash
|
45
|
+
end
|
46
|
+
|
47
|
+
#map saved duplicates
|
48
|
+
def map_duplicate_basenames(path_hash)
|
49
|
+
path_hash.select {|k,v| v.is_a?(Array)}.each do |key,paths|
|
50
|
+
paths.each do |e|
|
51
|
+
new_key = "#{key}/#{File.dirname(e)}"
|
52
|
+
path_hash[new_key] = e
|
53
|
+
end
|
54
|
+
path_hash.delete(key)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
class Lightning
|
2
|
+
class Config < ::Hash
|
3
|
+
class <<self
|
4
|
+
attr_accessor :config_file
|
5
|
+
def config_file
|
6
|
+
@config_file ||= (File.exists?('lightning.yml') ? 'lightning.yml' : File.expand_path(File.join("~",".lightning.yml")))
|
7
|
+
end
|
8
|
+
|
9
|
+
def create(options={})
|
10
|
+
hash = read_config_file
|
11
|
+
obj = new(hash)
|
12
|
+
configure_commands_and_paths(obj) if options[:read_only]
|
13
|
+
obj
|
14
|
+
end
|
15
|
+
|
16
|
+
def read_config_file(file=nil)
|
17
|
+
default_config = {'shell'=>'bash', 'generated_file'=>File.expand_path(File.join('~', '.lightning_completions')),
|
18
|
+
'complete_regex'=>true}
|
19
|
+
@config_file = file if file
|
20
|
+
hash = YAML::load_file(config_file)
|
21
|
+
default_config.merge(hash)
|
22
|
+
end
|
23
|
+
|
24
|
+
def commands_to_bolt_key(map_to_command, new_command)
|
25
|
+
"#{map_to_command}-#{new_command}"
|
26
|
+
end
|
27
|
+
|
28
|
+
def configure_commands_and_paths(hash)
|
29
|
+
hash[:paths] ||= {}
|
30
|
+
hash[:commands].each do |e|
|
31
|
+
#mapping a referenced path
|
32
|
+
if e['paths'].is_a?(String)
|
33
|
+
e['bolt_key'] = e['paths'].dup
|
34
|
+
end
|
35
|
+
#create a path entry + key if none exists
|
36
|
+
if e['bolt_key'].nil?
|
37
|
+
#extract command in case it has options after it
|
38
|
+
e['map_to'] =~ /\s*(\w+)/
|
39
|
+
bolt_key = commands_to_bolt_key($1, e['name'])
|
40
|
+
e['bolt_key'] = bolt_key
|
41
|
+
hash[:paths][bolt_key] = e['paths'] || []
|
42
|
+
end
|
43
|
+
end
|
44
|
+
hash
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def save
|
49
|
+
File.open(self.class.config_file, "w") { |f| f.puts self.to_hash.to_yaml }
|
50
|
+
end
|
51
|
+
|
52
|
+
def initialize(hash)
|
53
|
+
super
|
54
|
+
replace(hash)
|
55
|
+
self.replace(self.symbolize_keys)
|
56
|
+
end
|
57
|
+
|
58
|
+
def to_hash
|
59
|
+
hash = Hash.new
|
60
|
+
hash.replace(self)
|
61
|
+
end
|
62
|
+
|
63
|
+
#from Rails' ActiveSupport
|
64
|
+
def symbolize_keys
|
65
|
+
inject({}) do |options, (key, value)|
|
66
|
+
options[(key.to_sym rescue key) || key] = value
|
67
|
+
options
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
#This class generates shell scripts from a configuration.
|
2
|
+
class Lightning
|
3
|
+
class Generator
|
4
|
+
class<<self
|
5
|
+
def generate_completions(generated_file=nil)
|
6
|
+
generated_file ||= Lightning.config[:generated_file]
|
7
|
+
output = generate(Lightning.config[:shell], Lightning.config[:commands])
|
8
|
+
File.open(generated_file, 'w'){|f| f.write(output) }
|
9
|
+
output
|
10
|
+
end
|
11
|
+
|
12
|
+
def generate(*args)
|
13
|
+
shell = args.shift
|
14
|
+
send("#{shell}_generator", *args)
|
15
|
+
end
|
16
|
+
|
17
|
+
def bash_generator(commands)
|
18
|
+
body = <<-INIT
|
19
|
+
#### This file was generated by Lightning. ####
|
20
|
+
#LBIN_PATH="$PWD/bin/" #only use for development
|
21
|
+
LBIN_PATH=""
|
22
|
+
|
23
|
+
INIT
|
24
|
+
commands.each do |e|
|
25
|
+
body += <<-EOS
|
26
|
+
|
27
|
+
#{'#' + e['description'] if e['description']}
|
28
|
+
#{e['name']} () {
|
29
|
+
if [ -z "$1" ]; then
|
30
|
+
echo "No arguments given"
|
31
|
+
return
|
32
|
+
fi
|
33
|
+
FULL_PATH="`${LBIN_PATH}lightning-full_path #{e['name']} $@`#{e['post_path'] if e['post_path']}"
|
34
|
+
if [ $1 == '#{Lightning::TEST_FLAG}' ]; then
|
35
|
+
CMD="#{e['map_to']} '$FULL_PATH'#{' '+ e['add_to_command'] if e['add_to_command']}"
|
36
|
+
echo $CMD
|
37
|
+
else
|
38
|
+
#{e['map_to']} "$FULL_PATH"#{' '+ e['add_to_command'] if e['add_to_command']}
|
39
|
+
fi
|
40
|
+
}
|
41
|
+
complete -o default -C "${LBIN_PATH}lightning-complete #{e['name']}" #{e['name']}
|
42
|
+
EOS
|
43
|
+
end
|
44
|
+
body.gsub(/^\s{6,10}/, '')
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
---
|
2
|
+
generated_file: lightning_completions
|
3
|
+
|
4
|
+
ignore_paths:
|
5
|
+
- .DS_Store
|
6
|
+
- .git
|
7
|
+
|
8
|
+
# You'll notice that most commands have the format of "#{original_command_alias}-#{path_alias}"
|
9
|
+
# I recommend this for most of these commands as you can then easily autocomplete them for recall.
|
10
|
+
commands:
|
11
|
+
- name : c
|
12
|
+
map_to : cd
|
13
|
+
description : my code directories
|
14
|
+
paths:
|
15
|
+
- /Users/bozo/code/gems/*
|
16
|
+
- /Users/bozo/code/repo/*
|
17
|
+
- /Users/bozo/code/tds/gems/*
|
18
|
+
|
19
|
+
- name : cd-g
|
20
|
+
map_to : cd
|
21
|
+
paths: gem
|
22
|
+
|
23
|
+
- name : m-g
|
24
|
+
map_to : mate
|
25
|
+
paths: gem
|
26
|
+
|
27
|
+
- name : o-g
|
28
|
+
map_to : open
|
29
|
+
description : open gem's doc in browser
|
30
|
+
post_path : /rdoc/index.html
|
31
|
+
paths: gem_rdoc
|
32
|
+
|
33
|
+
- name : v-r
|
34
|
+
map_to : vim
|
35
|
+
description : ruby core files
|
36
|
+
paths:
|
37
|
+
#picked from $LOAD_PATH
|
38
|
+
- /Library/Ruby/Site/1.8/**/*.rb
|
39
|
+
- /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/**/*.rb
|
40
|
+
|
41
|
+
- name : cd-r
|
42
|
+
map_to : cd
|
43
|
+
description : ruby core directories
|
44
|
+
paths:
|
45
|
+
- /Library/Ruby/Site/1.8/**/
|
46
|
+
- /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/**/
|
47
|
+
aliases:
|
48
|
+
r1: /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8
|
49
|
+
|
50
|
+
- name : oa
|
51
|
+
map_to : open -a
|
52
|
+
description : open mac applications
|
53
|
+
paths:
|
54
|
+
- /Applications/*.app
|
55
|
+
- /Applications/Utilities/*.app
|
56
|
+
|
57
|
+
- name : v-g
|
58
|
+
map_to : vim
|
59
|
+
description : open files when in the base directory of a ruby gem project
|
60
|
+
paths:
|
61
|
+
- lib/**/*.rb
|
62
|
+
- test/**/*.rb
|
63
|
+
- spec/**/*.rb
|
64
|
+
- bin/**
|
65
|
+
|
66
|
+
- name : v-rr
|
67
|
+
map_to : vim
|
68
|
+
description: open files when in the base directory of a rails project
|
69
|
+
paths:
|
70
|
+
- config/**/*.rb
|
71
|
+
- app/**/*.{rb,erb,rhtml}
|
72
|
+
- lib/**/*.rb
|
73
|
+
- test/**/*.rb
|
74
|
+
- spec/**/*.rb
|
75
|
+
|
76
|
+
paths:
|
77
|
+
# to obtain your own paths to your ruby gems:
|
78
|
+
# `gem environment path`.split(":").map {|e| e +"/gems/*" }
|
79
|
+
gem:
|
80
|
+
- /Users/bozo/.gem/ruby/1.8/gems/*
|
81
|
+
- /Library/Ruby/Gems/1.8/gems/*
|
82
|
+
- /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/gems/1.8/gems/*
|
83
|
+
|
84
|
+
gem_rdoc:
|
85
|
+
- /Users/bozo/.gem/ruby/1.8/doc/*
|
86
|
+
- /Library/Ruby/Gems/1.8/doc/*
|
87
|
+
- /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/gems/1.8/doc/*
|
@@ -0,0 +1,147 @@
|
|
1
|
+
#### This file was generated by Lightning. ####
|
2
|
+
#LBIN_PATH="$PWD/bin/" #only use for development
|
3
|
+
LBIN_PATH=""
|
4
|
+
|
5
|
+
#my code directories
|
6
|
+
c () {
|
7
|
+
if [ -z "$1" ]; then
|
8
|
+
echo "No arguments given"
|
9
|
+
return
|
10
|
+
fi
|
11
|
+
FULL_PATH="`${LBIN_PATH}lightning-full_path cd-c $@`"
|
12
|
+
if [ $1 == '-test' ]; then
|
13
|
+
CMD="cd '$FULL_PATH'"
|
14
|
+
echo $CMD
|
15
|
+
else
|
16
|
+
cd "$FULL_PATH"
|
17
|
+
fi
|
18
|
+
}
|
19
|
+
complete -o default -C "${LBIN_PATH}lightning-complete cd-c" c
|
20
|
+
|
21
|
+
|
22
|
+
cd-g () {
|
23
|
+
if [ -z "$1" ]; then
|
24
|
+
echo "No arguments given"
|
25
|
+
return
|
26
|
+
fi
|
27
|
+
FULL_PATH="`${LBIN_PATH}lightning-full_path gem $@`"
|
28
|
+
if [ $1 == '-test' ]; then
|
29
|
+
CMD="cd '$FULL_PATH'"
|
30
|
+
echo $CMD
|
31
|
+
else
|
32
|
+
cd "$FULL_PATH"
|
33
|
+
fi
|
34
|
+
}
|
35
|
+
complete -o default -C "${LBIN_PATH}lightning-complete gem" cd-g
|
36
|
+
|
37
|
+
|
38
|
+
m-g () {
|
39
|
+
if [ -z "$1" ]; then
|
40
|
+
echo "No arguments given"
|
41
|
+
return
|
42
|
+
fi
|
43
|
+
FULL_PATH="`${LBIN_PATH}lightning-full_path gem $@`"
|
44
|
+
if [ $1 == '-test' ]; then
|
45
|
+
CMD="mate '$FULL_PATH'"
|
46
|
+
echo $CMD
|
47
|
+
else
|
48
|
+
mate "$FULL_PATH"
|
49
|
+
fi
|
50
|
+
}
|
51
|
+
complete -o default -C "${LBIN_PATH}lightning-complete gem" m-g
|
52
|
+
|
53
|
+
#open gem's doc in browser
|
54
|
+
o-g () {
|
55
|
+
if [ -z "$1" ]; then
|
56
|
+
echo "No arguments given"
|
57
|
+
return
|
58
|
+
fi
|
59
|
+
FULL_PATH="`${LBIN_PATH}lightning-full_path gem_rdoc $@`/rdoc/index.html"
|
60
|
+
if [ $1 == '-test' ]; then
|
61
|
+
CMD="open '$FULL_PATH'"
|
62
|
+
echo $CMD
|
63
|
+
else
|
64
|
+
open "$FULL_PATH"
|
65
|
+
fi
|
66
|
+
}
|
67
|
+
complete -o default -C "${LBIN_PATH}lightning-complete gem_rdoc" o-g
|
68
|
+
|
69
|
+
#ruby core files
|
70
|
+
v-r () {
|
71
|
+
if [ -z "$1" ]; then
|
72
|
+
echo "No arguments given"
|
73
|
+
return
|
74
|
+
fi
|
75
|
+
FULL_PATH="`${LBIN_PATH}lightning-full_path vim-v-r $@`"
|
76
|
+
if [ $1 == '-test' ]; then
|
77
|
+
CMD="vim '$FULL_PATH'"
|
78
|
+
echo $CMD
|
79
|
+
else
|
80
|
+
vim "$FULL_PATH"
|
81
|
+
fi
|
82
|
+
}
|
83
|
+
complete -o default -C "${LBIN_PATH}lightning-complete vim-v-r" v-r
|
84
|
+
|
85
|
+
#ruby core directories
|
86
|
+
cd-r () {
|
87
|
+
if [ -z "$1" ]; then
|
88
|
+
echo "No arguments given"
|
89
|
+
return
|
90
|
+
fi
|
91
|
+
FULL_PATH="`${LBIN_PATH}lightning-full_path cd-cd-r $@`"
|
92
|
+
if [ $1 == '-test' ]; then
|
93
|
+
CMD="cd '$FULL_PATH'"
|
94
|
+
echo $CMD
|
95
|
+
else
|
96
|
+
cd "$FULL_PATH"
|
97
|
+
fi
|
98
|
+
}
|
99
|
+
complete -o default -C "${LBIN_PATH}lightning-complete cd-cd-r" cd-r
|
100
|
+
|
101
|
+
#open mac applications
|
102
|
+
oa () {
|
103
|
+
if [ -z "$1" ]; then
|
104
|
+
echo "No arguments given"
|
105
|
+
return
|
106
|
+
fi
|
107
|
+
FULL_PATH="`${LBIN_PATH}lightning-full_path open-oa $@`"
|
108
|
+
if [ $1 == '-test' ]; then
|
109
|
+
CMD="open -a '$FULL_PATH'"
|
110
|
+
echo $CMD
|
111
|
+
else
|
112
|
+
open -a "$FULL_PATH"
|
113
|
+
fi
|
114
|
+
}
|
115
|
+
complete -o default -C "${LBIN_PATH}lightning-complete open-oa" oa
|
116
|
+
|
117
|
+
#open files when in the base directory of a ruby gem project
|
118
|
+
v-g () {
|
119
|
+
if [ -z "$1" ]; then
|
120
|
+
echo "No arguments given"
|
121
|
+
return
|
122
|
+
fi
|
123
|
+
FULL_PATH="`${LBIN_PATH}lightning-full_path vim-v-g $@`"
|
124
|
+
if [ $1 == '-test' ]; then
|
125
|
+
CMD="vim '$FULL_PATH'"
|
126
|
+
echo $CMD
|
127
|
+
else
|
128
|
+
vim "$FULL_PATH"
|
129
|
+
fi
|
130
|
+
}
|
131
|
+
complete -o default -C "${LBIN_PATH}lightning-complete vim-v-g" v-g
|
132
|
+
|
133
|
+
#open files when in the base directory of a rails project
|
134
|
+
v-rr () {
|
135
|
+
if [ -z "$1" ]; then
|
136
|
+
echo "No arguments given"
|
137
|
+
return
|
138
|
+
fi
|
139
|
+
FULL_PATH="`${LBIN_PATH}lightning-full_path vim-v-rr $@`"
|
140
|
+
if [ $1 == '-test' ]; then
|
141
|
+
CMD="vim '$FULL_PATH'"
|
142
|
+
echo $CMD
|
143
|
+
else
|
144
|
+
vim "$FULL_PATH"
|
145
|
+
fi
|
146
|
+
}
|
147
|
+
complete -o default -C "${LBIN_PATH}lightning-complete vim-v-rr" v-rr
|