lokka-sh 1.0.3 → 1.0.4
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/README.md +1 -3
- data/bin/lokka-sh +7 -7
- data/lib/lokka-sh.rb +18 -0
- data/lib/lokka-sh/bundler.rb +20 -0
- data/lib/lokka-sh/cli.rb +26 -0
- data/lib/lokka-sh/color.rb +12 -0
- data/lib/lokka-sh/command.rb +59 -0
- data/lib/lokka-sh/command/define.rb +68 -0
- data/lib/lokka-sh/forkable.rb +34 -0
- data/lib/lokka-sh/helpers.rb +58 -0
- data/lib/{lokka/sh → lokka-sh}/prompt.rb +9 -9
- data/lib/lokka-sh/rake.rb +37 -0
- data/lib/lokka-sh/sinatra.rb +27 -0
- data/lib/lokka-sh/version.rb +3 -0
- data/lokka-sh.gemspec +8 -7
- data/spec/lokka-sh/command_spec.rb +73 -0
- data/spec/spec_helper.rb +1 -9
- metadata +39 -29
- data/lib/lokka/sh.rb +0 -40
- data/lib/lokka/sh/bundler.rb +0 -22
- data/lib/lokka/sh/color.rb +0 -14
- data/lib/lokka/sh/command.rb +0 -61
- data/lib/lokka/sh/commands.rb +0 -76
- data/lib/lokka/sh/forkable.rb +0 -36
- data/lib/lokka/sh/helpers.rb +0 -60
- data/lib/lokka/sh/rake.rb +0 -39
- data/lib/lokka/sh/sinatra.rb +0 -33
- data/lib/lokka/sh/version.rb +0 -5
- data/spec/lokka/sh/command_spec.rb +0 -73
- data/spec/lokka/sh_spec.rb +0 -5
data/README.md
CHANGED
data/bin/lokka-sh
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
require 'lokka/sh'
|
2
|
+
$:.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
|
3
|
+
require 'lokka-sh'
|
6
4
|
|
7
5
|
puts <<BANNER.gsub("%", "\e[46m \e[0m")
|
8
6
|
|
@@ -12,12 +10,14 @@ puts <<BANNER.gsub("%", "\e[46m \e[0m")
|
|
12
10
|
.%%......%%..%%..%%.%%...%%.%%...%%..%%..............%%..%%..%%.
|
13
11
|
.%%%%%%..%%%%%%..%%..%%..%%..%%..%%..%%...........%%%%...%%..%%.
|
14
12
|
................................................................
|
15
|
-
\e[35m#{
|
13
|
+
\e[35m#{LokkaSh::VERSION.rjust(63, " ")}\e[0m
|
16
14
|
|
17
15
|
BANNER
|
18
16
|
|
19
17
|
APP_PATH = File.expand_path('./init')
|
20
|
-
|
18
|
+
LokkaSh::Color.with(:blue) do
|
19
|
+
"require #{APP_PATH}"
|
20
|
+
end
|
21
21
|
require APP_PATH
|
22
22
|
|
23
|
-
|
23
|
+
LokkaSh::CLI.run
|
data/lib/lokka-sh.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
$:.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
|
2
|
+
require 'readline'
|
3
|
+
require 'stringio'
|
4
|
+
require 'rake/dsl_definition'
|
5
|
+
require 'rake'
|
6
|
+
|
7
|
+
require 'lokka-sh/version'
|
8
|
+
require 'lokka-sh/color'
|
9
|
+
require 'lokka-sh/prompt'
|
10
|
+
require 'lokka-sh/helpers'
|
11
|
+
require 'lokka-sh/forkable'
|
12
|
+
require 'lokka-sh/sinatra'
|
13
|
+
require 'lokka-sh/rake'
|
14
|
+
require 'lokka-sh/bundler'
|
15
|
+
require 'lokka-sh/command'
|
16
|
+
require 'lokka-sh/command/define'
|
17
|
+
require 'lokka-sh/cli'
|
18
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module LokkaSh
|
2
|
+
module Bundler
|
3
|
+
extend Forkable
|
4
|
+
|
5
|
+
class << self
|
6
|
+
def _invoke(line)
|
7
|
+
line ||= 'install'
|
8
|
+
command, *args = line.split(/\s+/)
|
9
|
+
ARGV.clear
|
10
|
+
ARGV.concat args
|
11
|
+
require 'bundler/cli'
|
12
|
+
::Bundler::CLI.new.send(command.to_sym)
|
13
|
+
end
|
14
|
+
|
15
|
+
def sub_commands
|
16
|
+
%w(exec install update open package config check list show console open viz init gem)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/lokka-sh/cli.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
module LokkaSh
|
2
|
+
module CLI
|
3
|
+
class << self
|
4
|
+
def run
|
5
|
+
LokkaSh::Color.with(:cyan) do
|
6
|
+
"Lokka.env: #{::Lokka.env}\n`help` to print help"
|
7
|
+
end
|
8
|
+
Rake.init
|
9
|
+
load_commands
|
10
|
+
LokkaSh::Prompt.invoke
|
11
|
+
end
|
12
|
+
|
13
|
+
def load_commands
|
14
|
+
begin
|
15
|
+
lokkashrc = "#{::Lokka.root}/.lokkashrc"
|
16
|
+
load lokkashrc
|
17
|
+
LokkaSh::Color.with(:blue) do
|
18
|
+
"load #{lokkashrc}"
|
19
|
+
end
|
20
|
+
rescue LoadError => e
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module LokkaSh
|
2
|
+
module Color
|
3
|
+
@colors =
|
4
|
+
{ :r_video => 7, :black => 30, :red => 31, :green => 32, :yellow => 33,
|
5
|
+
:blue => 34, :magenta => 35, :cyan => 36, :white => 27, :default => 39,
|
6
|
+
:bg_black => 40, :bg_red => 41, :bg_green => 42, :bg_default => 49 }
|
7
|
+
|
8
|
+
def self.with(name, &block)
|
9
|
+
puts "\e[#{@colors[name.to_sym]}m" + yield + "\e[0m"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module LokkaSh
|
2
|
+
module Command
|
3
|
+
class << self
|
4
|
+
def commands
|
5
|
+
@commands ||= {}
|
6
|
+
end
|
7
|
+
|
8
|
+
def define(*names, &block)
|
9
|
+
names.each do |name|
|
10
|
+
commands[name.to_sym] = block
|
11
|
+
completions << name.to_s
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def find(line)
|
16
|
+
if name = line.split(/\s+/, 2)[0]
|
17
|
+
commands[name.to_sym]
|
18
|
+
else
|
19
|
+
nil
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def command_names
|
24
|
+
commands.keys
|
25
|
+
end
|
26
|
+
|
27
|
+
def [](name)
|
28
|
+
commands[name.to_sym]
|
29
|
+
end
|
30
|
+
|
31
|
+
def completion_proc
|
32
|
+
lambda { |line|
|
33
|
+
regex = /#{Regexp.quote(line)}/
|
34
|
+
completions.map { |completion|
|
35
|
+
case completion
|
36
|
+
when String
|
37
|
+
completion if completion.match(regex)
|
38
|
+
when Proc
|
39
|
+
completion.call(line)
|
40
|
+
end
|
41
|
+
}.compact
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
def completions
|
46
|
+
@completions ||= []
|
47
|
+
end
|
48
|
+
|
49
|
+
def completions=(completions)
|
50
|
+
@completions = completions
|
51
|
+
end
|
52
|
+
|
53
|
+
def clear
|
54
|
+
commands.clear
|
55
|
+
completions.clear
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
module LokkaSh::Command
|
2
|
+
define 'help' do
|
3
|
+
LokkaSh::Color.with(:blue) do
|
4
|
+
<<-HELP.gsub(/^ {6}/, '')
|
5
|
+
|
6
|
+
help -> print help
|
7
|
+
console -> starting console
|
8
|
+
rake TASK -> execute rake task
|
9
|
+
tasks PATTERN -> print rake tasks
|
10
|
+
bundle -> execute bundler command
|
11
|
+
exit -> exit from lokka-sh
|
12
|
+
restart -> restart lokka-sh
|
13
|
+
! -> execute a system command
|
14
|
+
eval -> eval as ruby script
|
15
|
+
HELP
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
define 'console' do
|
20
|
+
LokkaSh::Sinatra.invoke('console')
|
21
|
+
end
|
22
|
+
|
23
|
+
define 'rake' do |arg|
|
24
|
+
LokkaSh::Rake.invoke(arg)
|
25
|
+
end
|
26
|
+
|
27
|
+
define 'tasks', 't' do |arg|
|
28
|
+
Rake::Task.tasks.each do |task|
|
29
|
+
puts task.name
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
LokkaSh::Rake.task_names.map do |name|
|
34
|
+
self.completions << "rake #{name}"
|
35
|
+
end
|
36
|
+
|
37
|
+
define 'bundle' do |arg|
|
38
|
+
LokkaSh::Bundler.invoke(arg)
|
39
|
+
end
|
40
|
+
|
41
|
+
(LokkaSh::Bundler.sub_commands - ['init']).map do |c|
|
42
|
+
self.completions << "bundle #{c}"
|
43
|
+
end
|
44
|
+
|
45
|
+
define '!' do |arg|
|
46
|
+
system arg
|
47
|
+
end
|
48
|
+
|
49
|
+
define 'eval' do |arg|
|
50
|
+
LokkaSh::Color.with(:blue) { "=> #{eval(arg, binding, __FILE__, __LINE__).inspect}" }
|
51
|
+
end
|
52
|
+
|
53
|
+
define 'log' do |arg|
|
54
|
+
LokkaSh::Color.with(:r_video) { "Ctrl-C to quit" }
|
55
|
+
system 'tail', '-f', Lokka.root + "tmp/#{(arg || 'development')}.log"
|
56
|
+
end
|
57
|
+
|
58
|
+
self.completions += %w(development test production).map { |i| "log #{i}" }
|
59
|
+
|
60
|
+
define 'exit' do
|
61
|
+
exit
|
62
|
+
end
|
63
|
+
|
64
|
+
define 'restart' do
|
65
|
+
puts 'restarting...'
|
66
|
+
exec File.expand_path('../../../bin/lokka-sh', __FILE__)
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module LokkaSh
|
2
|
+
module Forkable
|
3
|
+
include LokkaSh::Helpers
|
4
|
+
|
5
|
+
def invoke(line, options = {})
|
6
|
+
run_before_fork
|
7
|
+
pid = fork do
|
8
|
+
run_after_fork
|
9
|
+
_invoke(line)
|
10
|
+
end
|
11
|
+
Process.waitpid(pid)
|
12
|
+
end
|
13
|
+
|
14
|
+
def _invoke
|
15
|
+
raise NotImplementedError
|
16
|
+
end
|
17
|
+
|
18
|
+
def before_fork(&block)
|
19
|
+
@before_fork = block
|
20
|
+
end
|
21
|
+
|
22
|
+
def after_fork(&block)
|
23
|
+
@after_fork = block
|
24
|
+
end
|
25
|
+
|
26
|
+
def run_before_fork(&block)
|
27
|
+
@before_fork.call if @before_fork
|
28
|
+
end
|
29
|
+
|
30
|
+
def run_after_fork(&block)
|
31
|
+
@after_fork.call if @after_fork
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module LokkaSh
|
2
|
+
module Helpers
|
3
|
+
# copy from pry: https://github.com/pry/pry
|
4
|
+
#
|
5
|
+
# Create scrollable output via less!
|
6
|
+
#
|
7
|
+
# This command runs `less` in a subprocess, and gives you the IO to its STDIN pipe
|
8
|
+
# so that you can communicate with it.
|
9
|
+
#
|
10
|
+
# Example:
|
11
|
+
#
|
12
|
+
# lesspipe do |less|
|
13
|
+
# 50.times { less.puts "Hi mom!" }
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# The default less parameters are:
|
17
|
+
# * Allow colour
|
18
|
+
# * Don't wrap lines longer than the screen
|
19
|
+
# * Quit immediately (without paging) if there's less than one screen of text.
|
20
|
+
#
|
21
|
+
# You can change these options by passing a hash to `lesspipe`, like so:
|
22
|
+
#
|
23
|
+
# lesspipe(:wrap=>false) { |less| less.puts essay.to_s }
|
24
|
+
#
|
25
|
+
# It accepts the following boolean options:
|
26
|
+
# :color => Allow ANSI colour codes?
|
27
|
+
# :wrap => Wrap long lines?
|
28
|
+
# :always => Always page, even if there's less than one page of text?
|
29
|
+
#
|
30
|
+
def lesspipe(*args)
|
31
|
+
if args.any? and args.last.is_a?(Hash)
|
32
|
+
options = args.pop
|
33
|
+
else
|
34
|
+
options = {}
|
35
|
+
end
|
36
|
+
|
37
|
+
output = args.first if args.any?
|
38
|
+
|
39
|
+
params = []
|
40
|
+
params << "-R" unless options[:color] == false
|
41
|
+
params << "-S" unless options[:wrap] == true
|
42
|
+
params << "-F" unless options[:always] == true
|
43
|
+
if options[:tail] == true
|
44
|
+
params << "+\\>"
|
45
|
+
$stderr.puts "Seeking to end of stream..."
|
46
|
+
end
|
47
|
+
params << "-X"
|
48
|
+
|
49
|
+
IO.popen("less #{params * ' '}", "w") do |less|
|
50
|
+
if output
|
51
|
+
less.puts output
|
52
|
+
else
|
53
|
+
yield less
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -1,7 +1,6 @@
|
|
1
|
-
module
|
2
|
-
module
|
3
|
-
|
4
|
-
extend self
|
1
|
+
module LokkaSh
|
2
|
+
module Prompt
|
3
|
+
class << self
|
5
4
|
|
6
5
|
def invoke
|
7
6
|
setup_readline
|
@@ -14,7 +13,7 @@ module Lokka
|
|
14
13
|
rescue SystemExit
|
15
14
|
raise
|
16
15
|
rescue Exception => e
|
17
|
-
|
16
|
+
LokkaSh::Color.with(:bg_red) { "#{e.message}\n#{e.backtrace.join("\n")}" }
|
18
17
|
end
|
19
18
|
end
|
20
19
|
|
@@ -27,19 +26,20 @@ module Lokka
|
|
27
26
|
|
28
27
|
def setup_readline
|
29
28
|
Readline.basic_word_break_characters = ""
|
30
|
-
Readline.completion_proc =
|
29
|
+
Readline.completion_proc = LokkaSh::Command.completion_proc
|
31
30
|
end
|
32
31
|
|
33
32
|
def execute(line)
|
34
|
-
if command =
|
33
|
+
if command = LokkaSh::Command.find(line)
|
35
34
|
start = Time.now
|
36
35
|
arg = line.split(/\s+/, 2)[1] rescue nil
|
37
36
|
command.call(arg)
|
38
|
-
|
37
|
+
LokkaSh::Color.with(:blue) { "#{Time.now - start}sec" }
|
39
38
|
else
|
40
|
-
|
39
|
+
LokkaSh::Color.with(:bg_red) { "Command not found" }
|
41
40
|
end
|
42
41
|
end
|
42
|
+
|
43
43
|
end
|
44
44
|
end
|
45
45
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module LokkaSh
|
2
|
+
module Rake
|
3
|
+
extend Forkable
|
4
|
+
|
5
|
+
class << self
|
6
|
+
def init
|
7
|
+
$stdout = StringIO.new
|
8
|
+
|
9
|
+
before_fork do
|
10
|
+
end
|
11
|
+
after_fork do
|
12
|
+
end
|
13
|
+
|
14
|
+
::Rake.application = ::Rake::Application.new
|
15
|
+
::Rake.application.init
|
16
|
+
::Rake.application.load_rakefile
|
17
|
+
ensure
|
18
|
+
$stdout = STDOUT
|
19
|
+
end
|
20
|
+
|
21
|
+
def _invoke(line)
|
22
|
+
line ||= 'default'
|
23
|
+
name, *args = line.split(/\s+/)
|
24
|
+
args.each do |arg|
|
25
|
+
env, value = arg.split('=')
|
26
|
+
next unless env && !env.empty? && value && !value.empty?
|
27
|
+
ENV[env] = value
|
28
|
+
end
|
29
|
+
::Rake.application[name].invoke
|
30
|
+
end
|
31
|
+
|
32
|
+
def task_names
|
33
|
+
::Rake.application.tasks.map{|t| t.name}
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module LokkaSh
|
2
|
+
module Sinatra
|
3
|
+
extend Forkable
|
4
|
+
|
5
|
+
class << self
|
6
|
+
def init
|
7
|
+
end
|
8
|
+
|
9
|
+
def _invoke(line)
|
10
|
+
case line
|
11
|
+
when "console"
|
12
|
+
require 'irb'
|
13
|
+
IRB.start(Lokka.root)
|
14
|
+
else
|
15
|
+
raise
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def reload!
|
20
|
+
end
|
21
|
+
|
22
|
+
def sub_commands
|
23
|
+
%w(console)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lokka-sh.gemspec
CHANGED
@@ -1,13 +1,13 @@
|
|
1
|
-
$:.
|
2
|
-
require "lokka
|
1
|
+
$:.unshift File.expand_path(File.dirname(__FILE__) + "/lib")
|
2
|
+
require "lokka-sh/version"
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "lokka-sh"
|
6
|
-
s.version =
|
6
|
+
s.version = LokkaSh::VERSION
|
7
7
|
s.authors = ["Dach_h"]
|
8
8
|
s.email = ["bunny.hop.md@gmail.com"]
|
9
9
|
s.homepage = ""
|
10
|
-
s.summary = "excute sub commands of
|
10
|
+
s.summary = "excute sub commands of lokka quickly."
|
11
11
|
s.description = s.summary
|
12
12
|
s.rubyforge_project = "lokka-sh"
|
13
13
|
s.files = `git ls-files`.split("\n")
|
@@ -15,9 +15,10 @@ Gem::Specification.new do |s|
|
|
15
15
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
16
16
|
s.require_paths = ["lib"]
|
17
17
|
|
18
|
-
s.
|
19
|
-
s.add_development_dependency '
|
20
|
-
s.add_development_dependency '
|
18
|
+
s.add_dependency 'rake', '0.9.2'
|
19
|
+
s.add_development_dependency 'rake'
|
20
|
+
s.add_development_dependency 'rspec'
|
21
|
+
s.add_development_dependency 'bundler'
|
21
22
|
end
|
22
23
|
|
23
24
|
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe LokkaSh::Command do
|
4
|
+
before do
|
5
|
+
LokkaSh::Command.clear
|
6
|
+
end
|
7
|
+
|
8
|
+
context 'when define a command' do
|
9
|
+
before do
|
10
|
+
@block = lambda {}
|
11
|
+
LokkaSh::Command.define('foo', &@block)
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'We can find it' do
|
15
|
+
LokkaSh::Command.find('foo').should eq(@block)
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'We can find nil with wrong name' do
|
19
|
+
LokkaSh::Command.find('bar').should eq(nil)
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'We can get command names' do
|
23
|
+
LokkaSh::Command.command_names.should =~ [:foo]
|
24
|
+
end
|
25
|
+
|
26
|
+
describe 'Command.[]' do
|
27
|
+
it 'can get a command' do
|
28
|
+
LokkaSh::Command['foo'].should eq(@block)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '.completions' do
|
34
|
+
context 'when command does not exist' do
|
35
|
+
it 'completions is empty' do
|
36
|
+
LokkaSh::Command.completions.should be_empty
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context 'when commands exist' do
|
41
|
+
before do
|
42
|
+
LokkaSh::Command.define('foo') {}
|
43
|
+
LokkaSh::Command.define('bar') {}
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'completions is empty' do
|
47
|
+
LokkaSh::Command.completions.should =~ ['foo', 'bar']
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe '.completion_proc' do
|
53
|
+
before do
|
54
|
+
['foo', 'lokka generate', 'rake routes', 'rake spec'].each { |c| LokkaSh::Command.completions << c }
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'return completions' do
|
58
|
+
LokkaSh::Command.completion_proc.call('foo').should =~ ['foo']
|
59
|
+
LokkaSh::Command.completion_proc.call('rake').should =~ ['rake routes', 'rake spec']
|
60
|
+
end
|
61
|
+
|
62
|
+
context 'with blocks for completion' do
|
63
|
+
before do
|
64
|
+
LokkaSh::Command.completions.clear
|
65
|
+
LokkaSh::Command.completions << lambda { |line| 'block' }
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'return completions' do
|
69
|
+
LokkaSh::Command.completion_proc.call('foo').should =~ ['block']
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,12 +1,4 @@
|
|
1
1
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
2
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
3
3
|
require 'rspec'
|
4
|
-
require 'lokka
|
5
|
-
|
6
|
-
# Requires supporting files with custom matchers and macros, etc,
|
7
|
-
# in ./support/ and its subdirectories.
|
8
|
-
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
9
|
-
|
10
|
-
RSpec.configure do |config|
|
11
|
-
|
12
|
-
end
|
4
|
+
require 'lokka-sh'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lokka-sh
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,42 +9,53 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-03-12 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
16
|
-
requirement: &
|
16
|
+
requirement: &2163208040 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
|
-
- -
|
19
|
+
- - =
|
20
20
|
- !ruby/object:Gem::Version
|
21
21
|
version: 0.9.2
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *2163208040
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rake
|
27
|
+
requirement: &2163207420 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
22
33
|
type: :development
|
23
34
|
prerelease: false
|
24
|
-
version_requirements: *
|
35
|
+
version_requirements: *2163207420
|
25
36
|
- !ruby/object:Gem::Dependency
|
26
37
|
name: rspec
|
27
|
-
requirement: &
|
38
|
+
requirement: &2163206740 !ruby/object:Gem::Requirement
|
28
39
|
none: false
|
29
40
|
requirements:
|
30
41
|
- - ! '>='
|
31
42
|
- !ruby/object:Gem::Version
|
32
|
-
version:
|
43
|
+
version: '0'
|
33
44
|
type: :development
|
34
45
|
prerelease: false
|
35
|
-
version_requirements: *
|
46
|
+
version_requirements: *2163206740
|
36
47
|
- !ruby/object:Gem::Dependency
|
37
48
|
name: bundler
|
38
|
-
requirement: &
|
49
|
+
requirement: &2163206180 !ruby/object:Gem::Requirement
|
39
50
|
none: false
|
40
51
|
requirements:
|
41
|
-
- -
|
52
|
+
- - ! '>='
|
42
53
|
- !ruby/object:Gem::Version
|
43
|
-
version:
|
54
|
+
version: '0'
|
44
55
|
type: :development
|
45
56
|
prerelease: false
|
46
|
-
version_requirements: *
|
47
|
-
description: excute sub commands of
|
57
|
+
version_requirements: *2163206180
|
58
|
+
description: excute sub commands of lokka quickly.
|
48
59
|
email:
|
49
60
|
- bunny.hop.md@gmail.com
|
50
61
|
executables:
|
@@ -60,20 +71,20 @@ files:
|
|
60
71
|
- README.md
|
61
72
|
- Rakefile
|
62
73
|
- bin/lokka-sh
|
63
|
-
- lib/lokka
|
64
|
-
- lib/lokka
|
65
|
-
- lib/lokka
|
66
|
-
- lib/lokka
|
67
|
-
- lib/lokka
|
68
|
-
- lib/lokka
|
69
|
-
- lib/lokka
|
70
|
-
- lib/lokka
|
71
|
-
- lib/lokka
|
72
|
-
- lib/lokka
|
73
|
-
- lib/lokka
|
74
|
+
- lib/lokka-sh.rb
|
75
|
+
- lib/lokka-sh/bundler.rb
|
76
|
+
- lib/lokka-sh/cli.rb
|
77
|
+
- lib/lokka-sh/color.rb
|
78
|
+
- lib/lokka-sh/command.rb
|
79
|
+
- lib/lokka-sh/command/define.rb
|
80
|
+
- lib/lokka-sh/forkable.rb
|
81
|
+
- lib/lokka-sh/helpers.rb
|
82
|
+
- lib/lokka-sh/prompt.rb
|
83
|
+
- lib/lokka-sh/rake.rb
|
84
|
+
- lib/lokka-sh/sinatra.rb
|
85
|
+
- lib/lokka-sh/version.rb
|
74
86
|
- lokka-sh.gemspec
|
75
|
-
- spec/lokka
|
76
|
-
- spec/lokka/sh_spec.rb
|
87
|
+
- spec/lokka-sh/command_spec.rb
|
77
88
|
- spec/spec_helper.rb
|
78
89
|
homepage: ''
|
79
90
|
licenses: []
|
@@ -98,9 +109,8 @@ rubyforge_project: lokka-sh
|
|
98
109
|
rubygems_version: 1.8.10
|
99
110
|
signing_key:
|
100
111
|
specification_version: 3
|
101
|
-
summary: excute sub commands of
|
112
|
+
summary: excute sub commands of lokka quickly.
|
102
113
|
test_files:
|
103
|
-
- spec/lokka
|
104
|
-
- spec/lokka/sh_spec.rb
|
114
|
+
- spec/lokka-sh/command_spec.rb
|
105
115
|
- spec/spec_helper.rb
|
106
116
|
has_rdoc:
|
data/lib/lokka/sh.rb
DELETED
@@ -1,40 +0,0 @@
|
|
1
|
-
require 'readline'
|
2
|
-
require 'stringio'
|
3
|
-
require 'rake/dsl_definition'
|
4
|
-
require 'rake'
|
5
|
-
|
6
|
-
module Lokka
|
7
|
-
module Sh
|
8
|
-
autoload :VERSION, "lokka/sh/version"
|
9
|
-
autoload :Color, "lokka/sh/color"
|
10
|
-
autoload :Prompt, "lokka/sh/prompt"
|
11
|
-
autoload :Helpers, "lokka/sh/helpers"
|
12
|
-
autoload :Forkable, "lokka/sh/forkable"
|
13
|
-
autoload :Sinatra, "lokka/sh/sinatra"
|
14
|
-
autoload :Rake, "lokka/sh/rake"
|
15
|
-
autoload :Command, "lokka/sh/command"
|
16
|
-
autoload :Bundler, "lokka/sh/bundler"
|
17
|
-
|
18
|
-
def self.start
|
19
|
-
Color.with(:cyan) { "Lokka.env: #{::Lokka.env}\n`help` to print help" }
|
20
|
-
add_load_path
|
21
|
-
Rake.init
|
22
|
-
load_commands
|
23
|
-
Prompt.invoke
|
24
|
-
end
|
25
|
-
|
26
|
-
def self.add_load_path
|
27
|
-
lib = File.expand_path(File.dirname(__FILE__) + '/../../lib')
|
28
|
-
$:.unshift(lib) if File.directory?(lib) && !$:.include?(lib)
|
29
|
-
end
|
30
|
-
|
31
|
-
def self.load_commands
|
32
|
-
require "lokka/sh/commands"
|
33
|
-
lokkashrc = "#{::Lokka.root}/.lokkashrc"
|
34
|
-
load lokkashrc
|
35
|
-
Color.with(:blue) {"load #{lokkashrc}"}
|
36
|
-
rescue LoadError
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
data/lib/lokka/sh/bundler.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
module Lokka
|
2
|
-
module Sh
|
3
|
-
module Bundler
|
4
|
-
extend Forkable
|
5
|
-
|
6
|
-
class << self
|
7
|
-
def _invoke(line)
|
8
|
-
line ||= 'install'
|
9
|
-
command, *args = line.split(/\s+/)
|
10
|
-
ARGV.clear
|
11
|
-
ARGV.concat args
|
12
|
-
require 'bundler/cli'
|
13
|
-
::Bundler::CLI.new.send(command.to_sym)
|
14
|
-
end
|
15
|
-
|
16
|
-
def sub_commands
|
17
|
-
%w(exec install update open package config check list show console open viz init gem)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
data/lib/lokka/sh/color.rb
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
module Lokka
|
2
|
-
module Sh
|
3
|
-
module Color
|
4
|
-
@colors =
|
5
|
-
{ :r_video => 7, :black => 30, :red => 31, :green => 32, :yellow => 33,
|
6
|
-
:blue => 34, :magenta => 35, :cyan => 36, :white => 27, :default => 39,
|
7
|
-
:bg_black => 40, :bg_red => 41, :bg_green => 42, :bg_default => 49 }
|
8
|
-
|
9
|
-
def self.with(name, &block)
|
10
|
-
puts "\e[#{@colors[name.to_sym]}m" + yield + "\e[0m"
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
data/lib/lokka/sh/command.rb
DELETED
@@ -1,61 +0,0 @@
|
|
1
|
-
module Lokka
|
2
|
-
module Sh
|
3
|
-
module Command
|
4
|
-
class << self
|
5
|
-
def commands
|
6
|
-
@commands ||= {}
|
7
|
-
end
|
8
|
-
|
9
|
-
def define(*names, &block)
|
10
|
-
names.each do |name|
|
11
|
-
commands[name.to_sym] = block
|
12
|
-
completions << name.to_s
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
def find(line)
|
17
|
-
if name = line.split(/\s+/, 2)[0]
|
18
|
-
commands[name.to_sym]
|
19
|
-
else
|
20
|
-
nil
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def command_names
|
25
|
-
commands.keys
|
26
|
-
end
|
27
|
-
|
28
|
-
def [](name)
|
29
|
-
commands[name.to_sym]
|
30
|
-
end
|
31
|
-
|
32
|
-
def completion_proc
|
33
|
-
lambda { |line|
|
34
|
-
regex = /#{Regexp.quote(line)}/
|
35
|
-
completions.map { |completion|
|
36
|
-
case completion
|
37
|
-
when String
|
38
|
-
completion if completion.match(regex)
|
39
|
-
when Proc
|
40
|
-
completion.call(line)
|
41
|
-
end
|
42
|
-
}.compact
|
43
|
-
}
|
44
|
-
end
|
45
|
-
|
46
|
-
def completions
|
47
|
-
@completions ||= []
|
48
|
-
end
|
49
|
-
|
50
|
-
def completions=(completions)
|
51
|
-
@completions = completions
|
52
|
-
end
|
53
|
-
|
54
|
-
def clear
|
55
|
-
commands.clear
|
56
|
-
completions.clear
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
data/lib/lokka/sh/commands.rb
DELETED
@@ -1,76 +0,0 @@
|
|
1
|
-
module Lokka
|
2
|
-
module Sh
|
3
|
-
Command.define 'help' do
|
4
|
-
Color.with(:cyan) do
|
5
|
-
<<HELP
|
6
|
-
help -> print help
|
7
|
-
lokka console -> starting console
|
8
|
-
rake TASK -> execute rake task
|
9
|
-
t, tasks PATTERN -> print rake tasks
|
10
|
-
bundle -> execute bundler command
|
11
|
-
exit -> exit from lokka-sh
|
12
|
-
restart -> restart lokka-sh
|
13
|
-
! -> execute a system command
|
14
|
-
eval -> eval as ruby script
|
15
|
-
TODO: reload
|
16
|
-
HELP
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
Command.define 'lokka' do |arg|
|
21
|
-
Lokka::Sh::Sinatra.invoke(arg)
|
22
|
-
end
|
23
|
-
|
24
|
-
Command.define 'rake' do |arg|
|
25
|
-
Lokka::Sh::Rake.invoke(arg)
|
26
|
-
end
|
27
|
-
|
28
|
-
Command.define 'tasks', 't' do |arg|
|
29
|
-
Rake::Task.tasks.each do |task|
|
30
|
-
puts task.name
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
Lokka::Sh::Rake.task_names.map do |name|
|
35
|
-
Command.completions << "rake #{name}"
|
36
|
-
end
|
37
|
-
|
38
|
-
Command.define 'bundle' do |arg|
|
39
|
-
Lokka::Sh::Bundler.invoke(arg)
|
40
|
-
end
|
41
|
-
|
42
|
-
(Lokka::Sh::Bundler.sub_commands - ['init']).map do |c|
|
43
|
-
Command.completions << "bundle #{c}"
|
44
|
-
end
|
45
|
-
|
46
|
-
Command.define '!' do |arg|
|
47
|
-
system arg
|
48
|
-
end
|
49
|
-
|
50
|
-
Command.define 'eval' do |arg|
|
51
|
-
Color.with(:blue) { "=> #{eval(arg, binding, __FILE__, __LINE__).inspect}" }
|
52
|
-
end
|
53
|
-
|
54
|
-
Command.define 'log' do |arg|
|
55
|
-
Color.with(:r_video) { "Ctrl-C to quit" }
|
56
|
-
system 'tail', '-f', Lokka.root + "tmp/#{(arg || 'development')}.log"
|
57
|
-
end
|
58
|
-
|
59
|
-
Command.completions += %w(development test production).map { |i| "log #{i}" }
|
60
|
-
|
61
|
-
Command.define 'exit' do
|
62
|
-
exit
|
63
|
-
end
|
64
|
-
|
65
|
-
Command.define 'restart' do
|
66
|
-
puts 'restarting...'
|
67
|
-
exec File.expand_path('../../../../bin/lokka-sh', __FILE__)
|
68
|
-
end
|
69
|
-
|
70
|
-
=begin
|
71
|
-
Command.define 'reload' do
|
72
|
-
Lokka::Sh::Sinatra.reload!
|
73
|
-
end
|
74
|
-
=end
|
75
|
-
end
|
76
|
-
end
|
data/lib/lokka/sh/forkable.rb
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
module Lokka
|
2
|
-
module Sh
|
3
|
-
module Forkable
|
4
|
-
include Lokka::Sh::Helpers
|
5
|
-
|
6
|
-
def invoke(line, options = {})
|
7
|
-
run_before_fork
|
8
|
-
pid = fork do
|
9
|
-
run_after_fork
|
10
|
-
_invoke(line)
|
11
|
-
end
|
12
|
-
Process.waitpid(pid)
|
13
|
-
end
|
14
|
-
|
15
|
-
def _invoke
|
16
|
-
raise NotImplementedError
|
17
|
-
end
|
18
|
-
|
19
|
-
def before_fork(&block)
|
20
|
-
@before_fork = block
|
21
|
-
end
|
22
|
-
|
23
|
-
def after_fork(&block)
|
24
|
-
@after_fork = block
|
25
|
-
end
|
26
|
-
|
27
|
-
def run_before_fork(&block)
|
28
|
-
@before_fork.call if @before_fork
|
29
|
-
end
|
30
|
-
|
31
|
-
def run_after_fork(&block)
|
32
|
-
@after_fork.call if @after_fork
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
data/lib/lokka/sh/helpers.rb
DELETED
@@ -1,60 +0,0 @@
|
|
1
|
-
module Lokka
|
2
|
-
module Sh
|
3
|
-
module Helpers
|
4
|
-
# copy from pry: https://github.com/pry/pry
|
5
|
-
#
|
6
|
-
# Create scrollable output via less!
|
7
|
-
#
|
8
|
-
# This command runs `less` in a subprocess, and gives you the IO to its STDIN pipe
|
9
|
-
# so that you can communicate with it.
|
10
|
-
#
|
11
|
-
# Example:
|
12
|
-
#
|
13
|
-
# lesspipe do |less|
|
14
|
-
# 50.times { less.puts "Hi mom!" }
|
15
|
-
# end
|
16
|
-
#
|
17
|
-
# The default less parameters are:
|
18
|
-
# * Allow colour
|
19
|
-
# * Don't wrap lines longer than the screen
|
20
|
-
# * Quit immediately (without paging) if there's less than one screen of text.
|
21
|
-
#
|
22
|
-
# You can change these options by passing a hash to `lesspipe`, like so:
|
23
|
-
#
|
24
|
-
# lesspipe(:wrap=>false) { |less| less.puts essay.to_s }
|
25
|
-
#
|
26
|
-
# It accepts the following boolean options:
|
27
|
-
# :color => Allow ANSI colour codes?
|
28
|
-
# :wrap => Wrap long lines?
|
29
|
-
# :always => Always page, even if there's less than one page of text?
|
30
|
-
#
|
31
|
-
def lesspipe(*args)
|
32
|
-
if args.any? and args.last.is_a?(Hash)
|
33
|
-
options = args.pop
|
34
|
-
else
|
35
|
-
options = {}
|
36
|
-
end
|
37
|
-
|
38
|
-
output = args.first if args.any?
|
39
|
-
|
40
|
-
params = []
|
41
|
-
params << "-R" unless options[:color] == false
|
42
|
-
params << "-S" unless options[:wrap] == true
|
43
|
-
params << "-F" unless options[:always] == true
|
44
|
-
if options[:tail] == true
|
45
|
-
params << "+\\>"
|
46
|
-
$stderr.puts "Seeking to end of stream..."
|
47
|
-
end
|
48
|
-
params << "-X"
|
49
|
-
|
50
|
-
IO.popen("less #{params * ' '}", "w") do |less|
|
51
|
-
if output
|
52
|
-
less.puts output
|
53
|
-
else
|
54
|
-
yield less
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
data/lib/lokka/sh/rake.rb
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
module Lokka
|
2
|
-
module Sh
|
3
|
-
module Rake
|
4
|
-
extend Forkable
|
5
|
-
|
6
|
-
class << self
|
7
|
-
def init
|
8
|
-
$stdout = StringIO.new
|
9
|
-
|
10
|
-
before_fork do
|
11
|
-
end
|
12
|
-
after_fork do
|
13
|
-
end
|
14
|
-
|
15
|
-
::Rake.application = ::Rake::Application.new
|
16
|
-
::Rake.application.init
|
17
|
-
::Rake.application.load_rakefile
|
18
|
-
ensure
|
19
|
-
$stdout = STDOUT
|
20
|
-
end
|
21
|
-
|
22
|
-
def _invoke(line)
|
23
|
-
line ||= 'default'
|
24
|
-
name, *args = line.split(/\s+/)
|
25
|
-
args.each do |arg|
|
26
|
-
env, value = arg.split('=')
|
27
|
-
next unless env && !env.empty? && value && !value.empty?
|
28
|
-
ENV[env] = value
|
29
|
-
end
|
30
|
-
::Rake.application[name].invoke
|
31
|
-
end
|
32
|
-
|
33
|
-
def task_names
|
34
|
-
::Rake.application.tasks.map{|t| t.name}
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
data/lib/lokka/sh/sinatra.rb
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
module Lokka
|
2
|
-
module Sh
|
3
|
-
module Sinatra
|
4
|
-
extend Forkable
|
5
|
-
|
6
|
-
class << self
|
7
|
-
def init
|
8
|
-
before_fork do
|
9
|
-
end
|
10
|
-
after_fork do
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
def _invoke(line)
|
15
|
-
case line
|
16
|
-
when "console"
|
17
|
-
require 'irb'
|
18
|
-
IRB.start(Lokka.root)
|
19
|
-
else
|
20
|
-
raise
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def reload!
|
25
|
-
end
|
26
|
-
|
27
|
-
def sub_commands
|
28
|
-
%w(console)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
data/lib/lokka/sh/version.rb
DELETED
@@ -1,73 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Lokka::Sh::Command do
|
4
|
-
before do
|
5
|
-
Lokka::Sh::Command.clear
|
6
|
-
end
|
7
|
-
|
8
|
-
context 'when define a command' do
|
9
|
-
before do
|
10
|
-
@block = lambda {}
|
11
|
-
Lokka::Sh::Command.define('foo', &@block)
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'We can find it' do
|
15
|
-
Lokka::Sh::Command.find('foo').should eq(@block)
|
16
|
-
end
|
17
|
-
|
18
|
-
it 'We can find nil with wrong name' do
|
19
|
-
Lokka::Sh::Command.find('bar').should eq(nil)
|
20
|
-
end
|
21
|
-
|
22
|
-
it 'We can get command names' do
|
23
|
-
Lokka::Sh::Command.command_names.should =~ [:foo]
|
24
|
-
end
|
25
|
-
|
26
|
-
describe 'Command.[]' do
|
27
|
-
it 'can get a command' do
|
28
|
-
Lokka::Sh::Command['foo'].should eq(@block)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
describe '.completions' do
|
34
|
-
context 'when command does not exist' do
|
35
|
-
it 'completions is empty' do
|
36
|
-
Lokka::Sh::Command.completions.should be_empty
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
context 'when commands exist' do
|
41
|
-
before do
|
42
|
-
Lokka::Sh::Command.define('foo') {}
|
43
|
-
Lokka::Sh::Command.define('bar') {}
|
44
|
-
end
|
45
|
-
|
46
|
-
it 'completions is empty' do
|
47
|
-
Lokka::Sh::Command.completions.should =~ ['foo', 'bar']
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
describe '.completion_proc' do
|
53
|
-
before do
|
54
|
-
['foo', 'lokka generate', 'rake routes', 'rake spec'].each { |c| Lokka::Sh::Command.completions << c }
|
55
|
-
end
|
56
|
-
|
57
|
-
it 'return completions' do
|
58
|
-
Lokka::Sh::Command.completion_proc.call('foo').should =~ ['foo']
|
59
|
-
Lokka::Sh::Command.completion_proc.call('rake').should =~ ['rake routes', 'rake spec']
|
60
|
-
end
|
61
|
-
|
62
|
-
context 'with blocks for completion' do
|
63
|
-
before do
|
64
|
-
Lokka::Sh::Command.completions.clear
|
65
|
-
Lokka::Sh::Command.completions << lambda { |line| 'block' }
|
66
|
-
end
|
67
|
-
|
68
|
-
it 'return completions' do
|
69
|
-
Lokka::Sh::Command.completion_proc.call('foo').should =~ ['block']
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|