live 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.
- data/.gitignore +5 -0
- data/Gemfile +4 -0
- data/README.rdoc +36 -0
- data/Rakefile +2 -0
- data/bin/live +6 -0
- data/lib/ext/object.rb +21 -0
- data/lib/live/version.rb +3 -0
- data/lib/live.rb +90 -0
- data/live.gemspec +24 -0
- metadata +88 -0
data/Gemfile
ADDED
data/README.rdoc
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
Live
|
2
|
+
====
|
3
|
+
|
4
|
+
Live is like IRC only it is meant to be used from a text editor, it essentially polls a *nix pipe and evaluates its contents.
|
5
|
+
It was devised for audiovisual livecoding (ruby-processing and scruby), a block can be bound to a key and can be called later by a keystroke.
|
6
|
+
|
7
|
+
Usage
|
8
|
+
-----
|
9
|
+
|
10
|
+
$ live
|
11
|
+
|
12
|
+
open a new terminal
|
13
|
+
|
14
|
+
$ echo 'hello' > /tmp/live-rb
|
15
|
+
|
16
|
+
You will see the code evaluated in the first terminal
|
17
|
+
|
18
|
+
$ echo 'bind_key(:a){ 'key a was pressed' }' > /tmp/live-rb
|
19
|
+
|
20
|
+
When you press the key 'a' with focus on the first terminal it will call the block
|
21
|
+
|
22
|
+
Vim
|
23
|
+
---
|
24
|
+
|
25
|
+
To use from vim paste this in your .vimrc file
|
26
|
+
|
27
|
+
function EvalLiveRuby() range
|
28
|
+
let text = [join(getline(a:firstline, a:lastline), ';')]
|
29
|
+
return writefile(text, '/tmp/live-rb')
|
30
|
+
endfunction
|
31
|
+
|
32
|
+
map <Leader>x :call EvalLiveRuby()<enter>
|
33
|
+
|
34
|
+
Then by pressing leader and x you will execute the file or range in the live session
|
35
|
+
|
36
|
+
|
data/Rakefile
ADDED
data/bin/live
ADDED
data/lib/ext/object.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
class Object
|
2
|
+
# Outputs an ANSI colored string with the object representation
|
3
|
+
def colored_inspect
|
4
|
+
case self
|
5
|
+
when Exception
|
6
|
+
"\e[41;33m#{self.inspect}\e[0m"
|
7
|
+
when Numeric, Symbol, TrueClass, FalseClass, NilClass
|
8
|
+
"\e[35m#{self.inspect}\e[0m"
|
9
|
+
when Live::Notice
|
10
|
+
"\e[42;30m#{self}\e[0m"
|
11
|
+
when String
|
12
|
+
"\e[32m#{self.inspect}\e[0m"
|
13
|
+
when Array
|
14
|
+
"[#{ self.collect{ |i| i.colored_inspect}.join(', ') }]"
|
15
|
+
when Hash
|
16
|
+
"{#{ self.collect{ |i| i.collect{|e| e.colored_inspect}.join(' => ') }.join(', ') }}"
|
17
|
+
else
|
18
|
+
"\e[36m#{self}\e[0m"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/live/version.rb
ADDED
data/lib/live.rb
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
require 'tempfile'
|
2
|
+
require 'highline'
|
3
|
+
|
4
|
+
$LOAD_PATH.unshift File.dirname(__FILE__)
|
5
|
+
require 'ext/object'
|
6
|
+
|
7
|
+
module Live
|
8
|
+
class Notice < String; end
|
9
|
+
|
10
|
+
class Context
|
11
|
+
def initialize session
|
12
|
+
@session = session
|
13
|
+
@binding = binding
|
14
|
+
end
|
15
|
+
|
16
|
+
def eval string
|
17
|
+
begin
|
18
|
+
super string, @binding
|
19
|
+
rescue Exception => exception
|
20
|
+
SystemExit === exception ? quit! : exception
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# Binds a proc to a keystroke
|
25
|
+
def bind_key key, &block
|
26
|
+
@session.key_bindings[key.to_s.unpack('c').first] = block
|
27
|
+
Notice.new "Key '#{key}' is bound to an action" if block
|
28
|
+
end
|
29
|
+
|
30
|
+
def quit!
|
31
|
+
@session.quit!
|
32
|
+
end
|
33
|
+
|
34
|
+
def reset!
|
35
|
+
@session.key_bindings.clear
|
36
|
+
@session.new_context
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
class Session
|
41
|
+
include HighLine::SystemExtensions
|
42
|
+
attr_reader :path, :key_bindings
|
43
|
+
|
44
|
+
# Starts a live session using a named pipe to receive code from a remote source and evaluates it within a context, a bit like an IRB session but evaluates code sent from a text editor
|
45
|
+
def initialize path = "#{Dir.tmpdir}/live-rb"
|
46
|
+
raise Exception.new("Another session sems to be running: #{path}") if File.exist? path
|
47
|
+
puts Notice.new("Live Session: #{path}")
|
48
|
+
|
49
|
+
%x{mkfifo #{path}}
|
50
|
+
@pipe, @path, @key_bindings = File.open(path, 'r+'), path, {}
|
51
|
+
|
52
|
+
begin
|
53
|
+
new_context and key_listen and run!
|
54
|
+
ensure
|
55
|
+
File.delete(path) if File.exists? path
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def quit!
|
60
|
+
File.delete(@path) && exit
|
61
|
+
end
|
62
|
+
|
63
|
+
def puts obj
|
64
|
+
super obj.colored_inspect
|
65
|
+
# Hackish solution for cursor position
|
66
|
+
super "\e[200D"
|
67
|
+
super "\e[2A"
|
68
|
+
end
|
69
|
+
|
70
|
+
def new_context
|
71
|
+
@context = Context.new(self)
|
72
|
+
end
|
73
|
+
|
74
|
+
private
|
75
|
+
# Starts a loop that checks the named pipe and evaluate its contents, will be called on initialize
|
76
|
+
def run!
|
77
|
+
loop { puts @context.eval(@pipe.gets) }
|
78
|
+
end
|
79
|
+
|
80
|
+
# Listen for keystrokes and calls bound procs
|
81
|
+
def key_listen
|
82
|
+
Thread.new do
|
83
|
+
loop do
|
84
|
+
block = @key_bindings[get_character]
|
85
|
+
puts block.call if block
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
data/live.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "live/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "live"
|
7
|
+
s.version = Live::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Macario Ortega"]
|
10
|
+
s.email = ["macarui@gmail.com"]
|
11
|
+
s.homepage = ""
|
12
|
+
s.summary = %q{Live is like IRC only it is meant to be used from a text editor}
|
13
|
+
s.description = %q{Live is like IRC only it is meant to be used from a text editor, it essentially polls a *nix pipe and evaluates its contents.
|
14
|
+
It was devised for audiovisual livecoding (ruby-processing and scruby), a block can be bound to a key and can be called later by a keystroke.
|
15
|
+
}
|
16
|
+
|
17
|
+
s.add_dependency 'highline'
|
18
|
+
|
19
|
+
s.rubyforge_project = "live"
|
20
|
+
s.files = `git ls-files`.split("\n")
|
21
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
22
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
23
|
+
s.require_paths = ["lib"]
|
24
|
+
end
|
metadata
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: live
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
version: 0.1.0
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Macario Ortega
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2011-03-14 00:00:00 -06:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: highline
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
segments:
|
29
|
+
- 0
|
30
|
+
version: "0"
|
31
|
+
type: :runtime
|
32
|
+
version_requirements: *id001
|
33
|
+
description: |
|
34
|
+
Live is like IRC only it is meant to be used from a text editor, it essentially polls a *nix pipe and evaluates its contents.
|
35
|
+
It was devised for audiovisual livecoding (ruby-processing and scruby), a block can be bound to a key and can be called later by a keystroke.
|
36
|
+
|
37
|
+
email:
|
38
|
+
- macarui@gmail.com
|
39
|
+
executables:
|
40
|
+
- live
|
41
|
+
extensions: []
|
42
|
+
|
43
|
+
extra_rdoc_files: []
|
44
|
+
|
45
|
+
files:
|
46
|
+
- .gitignore
|
47
|
+
- Gemfile
|
48
|
+
- README.rdoc
|
49
|
+
- Rakefile
|
50
|
+
- bin/live
|
51
|
+
- lib/ext/object.rb
|
52
|
+
- lib/live.rb
|
53
|
+
- lib/live/version.rb
|
54
|
+
- live.gemspec
|
55
|
+
has_rdoc: true
|
56
|
+
homepage: ""
|
57
|
+
licenses: []
|
58
|
+
|
59
|
+
post_install_message:
|
60
|
+
rdoc_options: []
|
61
|
+
|
62
|
+
require_paths:
|
63
|
+
- lib
|
64
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
segments:
|
70
|
+
- 0
|
71
|
+
version: "0"
|
72
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
segments:
|
78
|
+
- 0
|
79
|
+
version: "0"
|
80
|
+
requirements: []
|
81
|
+
|
82
|
+
rubyforge_project: live
|
83
|
+
rubygems_version: 1.3.7
|
84
|
+
signing_key:
|
85
|
+
specification_version: 3
|
86
|
+
summary: Live is like IRC only it is meant to be used from a text editor
|
87
|
+
test_files: []
|
88
|
+
|