bashir 0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +0 -0
- data/Manifest +28 -0
- data/README.rdoc +13 -0
- data/Rakefile +19 -0
- data/bashir.gemspec +32 -0
- data/bin/bashir +22 -0
- data/lib/bashir.rb +58 -0
- data/lib/bashir/api.rb +25 -0
- data/lib/bashir/commands.rb +47 -0
- data/lib/bashir/constructs.rb +36 -0
- data/lib/bashir/consts.rb +34 -0
- data/lib/bashir/core-extensions.rb +11 -0
- data/lib/bashir/evaluator.rb +9 -0
- data/lib/bashir/function.rb +44 -0
- data/lib/bashir/globals.rb +7 -0
- data/lib/bashir/persistant.rb +15 -0
- data/lib/bashir/reader.rb +123 -0
- data/lib/bashir/script.rb +28 -0
- data/lib/bashir/variable.rb +35 -0
- data/mit-license.txt +19 -0
- data/test/bs/ideas +6 -0
- data/test/bs/source1 +5 -0
- data/test/data/codes +0 -0
- data/test/experiments/test-reader.rb +11 -0
- data/test/experiments/testing +5 -0
- data/test/read.rb +18 -0
- data/test/verify-api.rb +73 -0
- data/test/verify-dsl.rb +24 -0
- data/test/verify-reader.rb +39 -0
- metadata +103 -0
data/CHANGELOG
ADDED
File without changes
|
data/Manifest
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
CHANGELOG
|
2
|
+
Manifest
|
3
|
+
README.rdoc
|
4
|
+
Rakefile
|
5
|
+
bin/bashir
|
6
|
+
lib/bashir.rb
|
7
|
+
lib/bashir/api.rb
|
8
|
+
lib/bashir/commands.rb
|
9
|
+
lib/bashir/constructs.rb
|
10
|
+
lib/bashir/consts.rb
|
11
|
+
lib/bashir/core-extensions.rb
|
12
|
+
lib/bashir/evaluator.rb
|
13
|
+
lib/bashir/function.rb
|
14
|
+
lib/bashir/globals.rb
|
15
|
+
lib/bashir/persistant.rb
|
16
|
+
lib/bashir/reader.rb
|
17
|
+
lib/bashir/script.rb
|
18
|
+
lib/bashir/variable.rb
|
19
|
+
mit-license.txt
|
20
|
+
test/bs/ideas
|
21
|
+
test/bs/source1
|
22
|
+
test/data/codes
|
23
|
+
test/experiments/test-reader.rb
|
24
|
+
test/experiments/testing
|
25
|
+
test/read.rb
|
26
|
+
test/verify-api.rb
|
27
|
+
test/verify-dsl.rb
|
28
|
+
test/verify-reader.rb
|
data/README.rdoc
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "rake"
|
3
|
+
require "echoe"
|
4
|
+
|
5
|
+
Echoe.new "bashir", "0.0.0" do | b |
|
6
|
+
b.description = "Bashir, BASH In Ruby"
|
7
|
+
b.summary = "Never, ever program in bash again"
|
8
|
+
b.url = "http://github.com/RobertDober/bashir"
|
9
|
+
b.author = "Robert Dober"
|
10
|
+
b.email = "robert.dober@gmail.com"
|
11
|
+
b.ignore_pattern = %w{ tmp/* .*.sw? }
|
12
|
+
b.development_dependencies = []
|
13
|
+
end
|
14
|
+
|
15
|
+
Dir[ File.join( File.dirname( __FILE__ ), %w{ tasks *.rake } ) ].
|
16
|
+
sort.
|
17
|
+
each do | ext |
|
18
|
+
load ext
|
19
|
+
end
|
data/bashir.gemspec
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{bashir}
|
5
|
+
s.version = "0.0.0"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Robert Dober"]
|
9
|
+
s.date = %q{2009-10-30}
|
10
|
+
s.default_executable = %q{bashir}
|
11
|
+
s.description = %q{Bashir, BASH In Ruby}
|
12
|
+
s.email = %q{robert.dober@gmail.com}
|
13
|
+
s.executables = ["bashir"]
|
14
|
+
s.extra_rdoc_files = ["CHANGELOG", "README.rdoc", "bin/bashir", "lib/bashir.rb", "lib/bashir/api.rb", "lib/bashir/commands.rb", "lib/bashir/constructs.rb", "lib/bashir/consts.rb", "lib/bashir/core-extensions.rb", "lib/bashir/evaluator.rb", "lib/bashir/function.rb", "lib/bashir/globals.rb", "lib/bashir/persistant.rb", "lib/bashir/reader.rb", "lib/bashir/script.rb", "lib/bashir/variable.rb"]
|
15
|
+
s.files = ["CHANGELOG", "Manifest", "README.rdoc", "Rakefile", "bin/bashir", "lib/bashir.rb", "lib/bashir/api.rb", "lib/bashir/commands.rb", "lib/bashir/constructs.rb", "lib/bashir/consts.rb", "lib/bashir/core-extensions.rb", "lib/bashir/evaluator.rb", "lib/bashir/function.rb", "lib/bashir/globals.rb", "lib/bashir/persistant.rb", "lib/bashir/reader.rb", "lib/bashir/script.rb", "lib/bashir/variable.rb", "mit-license.txt", "test/bs/ideas", "test/bs/source1", "test/data/codes", "test/experiments/test-reader.rb", "test/experiments/testing", "test/read.rb", "test/verify-api.rb", "test/verify-dsl.rb", "test/verify-reader.rb", "bashir.gemspec"]
|
16
|
+
s.homepage = %q{http://github.com/RobertDober/bashir}
|
17
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Bashir", "--main", "README.rdoc"]
|
18
|
+
s.require_paths = ["lib"]
|
19
|
+
s.rubyforge_project = %q{bashir}
|
20
|
+
s.rubygems_version = %q{1.3.5}
|
21
|
+
s.summary = %q{Never, ever program in bash again}
|
22
|
+
|
23
|
+
if s.respond_to? :specification_version then
|
24
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
25
|
+
s.specification_version = 3
|
26
|
+
|
27
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
28
|
+
else
|
29
|
+
end
|
30
|
+
else
|
31
|
+
end
|
32
|
+
end
|
data/bin/bashir
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
|
4
|
+
def usage
|
5
|
+
puts "usage:"
|
6
|
+
puts " #{$0} help|configure"
|
7
|
+
end
|
8
|
+
|
9
|
+
def configure
|
10
|
+
puts "setting up your bash startup file(s), source them again, or exec bash, to load the changes"
|
11
|
+
end
|
12
|
+
case ARGV.first
|
13
|
+
when /help\z/
|
14
|
+
usage
|
15
|
+
exit( -1 )
|
16
|
+
when /\Aconfig\z/
|
17
|
+
configure
|
18
|
+
else
|
19
|
+
$stderr.puts "Error missing or illegal command"
|
20
|
+
usage
|
21
|
+
exit( 1 )
|
22
|
+
end
|
data/lib/bashir.rb
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
#!/usr/local/bin/ruby -w
|
2
|
+
# encoding: utf-8
|
3
|
+
# Copyright (c) 2009 Robert Dober <author.downcase.sub(" ", ".") + "@gmail.com">
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
# of this software and associated documentation files (the "Software"), to deal
|
7
|
+
# in the Software without restriction, including without limitation the rights
|
8
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
# copies of the Software, and to permit persons to whom the Software is
|
10
|
+
# furnished to do so, subject to the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be included in
|
13
|
+
# all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
# THE SOFTWARE.
|
22
|
+
|
23
|
+
#
|
24
|
+
# All API is defined in the api subdirectory
|
25
|
+
|
26
|
+
require 'logger'
|
27
|
+
|
28
|
+
require 'bashir/globals'
|
29
|
+
require 'bashir/api'
|
30
|
+
require 'bashir/commands'
|
31
|
+
require 'bashir/core-extensions'
|
32
|
+
require 'bashir/reader'
|
33
|
+
|
34
|
+
#
|
35
|
+
# In this topfile we only implement the main API constructurs
|
36
|
+
#
|
37
|
+
module Bashir
|
38
|
+
File.unlink( "bashir.log" ) rescue nil
|
39
|
+
@logger = Logger::new( "bashir.log", 2, 1 << 23 )
|
40
|
+
@logger.formatter = " "
|
41
|
+
class << self
|
42
|
+
include Reader
|
43
|
+
def __log *msg
|
44
|
+
msg.each do | one_msg |
|
45
|
+
@logger.info one_msg
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
begin
|
51
|
+
loop do
|
52
|
+
x = Bashir::read_line
|
53
|
+
system( x )
|
54
|
+
break if x.nil?
|
55
|
+
end
|
56
|
+
rescue Interrupt
|
57
|
+
puts "<C-C> ends bashir command, bye for now"
|
58
|
+
end
|
data/lib/bashir/api.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
#!/usr/local/bin/ruby -w
|
2
|
+
# encoding: utf-8
|
3
|
+
# Copyright (c) 2009 Robert Dober <author.downcase.sub(" ", ".") + "@gmail.com">
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
# of this software and associated documentation files (the "Software"), to deal
|
7
|
+
# in the Software without restriction, including without limitation the rights
|
8
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
# copies of the Software, and to permit persons to whom the Software is
|
10
|
+
# furnished to do so, subject to the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be included in
|
13
|
+
# all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
# THE SOFTWARE.
|
22
|
+
|
23
|
+
%w{ constructs function script variable }.each do | mod |
|
24
|
+
require "bashir/#{mod}"
|
25
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
#!/usr/local/bin/ruby -w
|
2
|
+
# encoding: utf-8
|
3
|
+
# file: /home/robert/git/ruby/bashir/lib/bashir/commands.rb
|
4
|
+
#
|
5
|
+
|
6
|
+
require 'bashir/persistant'
|
7
|
+
@variables = Hash::new
|
8
|
+
|
9
|
+
def set_variable name, args
|
10
|
+
@variables[ name.to_sym ] = args.join( " " )
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
def execute_command cmd, *args
|
15
|
+
case cmd
|
16
|
+
when /\A_sys\Z/
|
17
|
+
system args.join( " " )
|
18
|
+
when /\A\w+=\Z/
|
19
|
+
set_variable cmd.sub(/=\Z/, ""), args
|
20
|
+
store @variables
|
21
|
+
args
|
22
|
+
when "first"
|
23
|
+
|
24
|
+
puts args.first
|
25
|
+
|
26
|
+
when "get"
|
27
|
+
@variables = retrieve
|
28
|
+
puts @variables[ args.first.to_sym ]
|
29
|
+
|
30
|
+
when "set"
|
31
|
+
eval_in_sandbox args.join( " " )
|
32
|
+
else
|
33
|
+
$stderr.puts "Bashir: Illegal Command \"#{cmd}\""
|
34
|
+
exit 1
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
module Bashir
|
39
|
+
module Commands
|
40
|
+
AllCommands = { ls: "ls --color=auto", vi: "/usr/bin/vi" }
|
41
|
+
def _command? word
|
42
|
+
AllCommands[ word.to_sym ]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# vim: sts=2 sw=2 ft=ruby expandtab nu :
|
@@ -0,0 +1,36 @@
|
|
1
|
+
#!/usr/local/bin/ruby -w
|
2
|
+
# encoding: utf-8
|
3
|
+
# Copyright (c) 2009 Robert Dober <author.downcase.sub(" ", ".") + "@gmail.com">
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
# of this software and associated documentation files (the "Software"), to deal
|
7
|
+
# in the Software without restriction, including without limitation the rights
|
8
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
# copies of the Software, and to permit persons to whom the Software is
|
10
|
+
# furnished to do so, subject to the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be included in
|
13
|
+
# all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
# THE SOFTWARE.
|
22
|
+
|
23
|
+
|
24
|
+
module Bashir
|
25
|
+
IllegalConstruct = Class::new StandardError
|
26
|
+
LegalConstructs = %w{ case for if while }
|
27
|
+
class Construct
|
28
|
+
private
|
29
|
+
def initialize constr_type
|
30
|
+
raise IllegalConstruct, "cannot create a construct of type #{constr_type}" unless
|
31
|
+
LegalConstructs.include? constr_type.to_s
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# vim: sts=2 sw=2 ft=ruby expandtab nu :
|
@@ -0,0 +1,34 @@
|
|
1
|
+
#!/usr/local/bin/ruby -w
|
2
|
+
# encoding: utf-8
|
3
|
+
# file: /home/robert/git/ruby/bashir/lib/bashir/consts.rb
|
4
|
+
|
5
|
+
|
6
|
+
module Bashir
|
7
|
+
module Reader
|
8
|
+
|
9
|
+
ReadExit = Class::new RuntimeError
|
10
|
+
SwitchToRubyMode = Class::new RuntimeError
|
11
|
+
|
12
|
+
module Codes
|
13
|
+
BS = 127
|
14
|
+
Space = 32
|
15
|
+
EOL = 13
|
16
|
+
Tab = 9
|
17
|
+
Back = 8
|
18
|
+
end
|
19
|
+
|
20
|
+
Space = " "
|
21
|
+
|
22
|
+
EOLRgx = /\n\r?/
|
23
|
+
WhitespaceRgx = /\s/
|
24
|
+
|
25
|
+
SpecialCodes = [*33..64, *91..94, *123..126]
|
26
|
+
class << SpecialCodes
|
27
|
+
def === other
|
28
|
+
include? other
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# vim: sts=2 sw=2 ft=ruby expandtab nu :
|
@@ -0,0 +1,44 @@
|
|
1
|
+
#!/usr/local/bin/ruby -w
|
2
|
+
# encoding: utf-8
|
3
|
+
# Copyright (c) 2009 Robert Dober <author.downcase.sub(" ", ".") + "@gmail.com">
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
# of this software and associated documentation files (the "Software"), to deal
|
7
|
+
# in the Software without restriction, including without limitation the rights
|
8
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
# copies of the Software, and to permit persons to whom the Software is
|
10
|
+
# furnished to do so, subject to the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be included in
|
13
|
+
# all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
# THE SOFTWARE.
|
22
|
+
|
23
|
+
module Bashir
|
24
|
+
class Function
|
25
|
+
def as_bash indent=nil
|
26
|
+
%<function #{@name}
|
27
|
+
{
|
28
|
+
> + body_as_bash + %<}>
|
29
|
+
end
|
30
|
+
def name; "#@name" end
|
31
|
+
|
32
|
+
private
|
33
|
+
def body_as_bash
|
34
|
+
""
|
35
|
+
end
|
36
|
+
|
37
|
+
def initialize name, in_script=nil
|
38
|
+
@name = name
|
39
|
+
@in_script = in_script
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# vim: sts=2 sw=2 ft=ruby expandtab nu :
|
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/usr/local/bin/ruby -w
|
2
|
+
# encoding: utf-8
|
3
|
+
# file: /home/robert/git/ruby/bashir/lib/bashir/persistant.rb
|
4
|
+
|
5
|
+
def retrieve
|
6
|
+
Marshal.load( File.open( StoreURL ) )
|
7
|
+
end
|
8
|
+
|
9
|
+
def store data
|
10
|
+
File.open StoreURL, "w" do | f |
|
11
|
+
Marshal.dump data, f
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
# vim: sts=2 sw=2 ft=ruby expandtab nu :
|
@@ -0,0 +1,123 @@
|
|
1
|
+
#!/usr/local/bin/ruby -w
|
2
|
+
# encoding: utf-8
|
3
|
+
# file: /home/robert/git/ruby/bashir/lib/bashir/reader.rb
|
4
|
+
|
5
|
+
require 'highline/system_extensions'
|
6
|
+
|
7
|
+
require 'bashir/consts'
|
8
|
+
|
9
|
+
module Bashir
|
10
|
+
module Reader
|
11
|
+
include HighLine::SystemExtensions
|
12
|
+
include Bashir::Commands
|
13
|
+
|
14
|
+
def echo char
|
15
|
+
print char if char
|
16
|
+
end
|
17
|
+
def read_up_to delim = /\s/, echo = true, escapes =
|
18
|
+
[].tap{ | result |
|
19
|
+
loop do
|
20
|
+
ch = _read
|
21
|
+
result << ch
|
22
|
+
p ch
|
23
|
+
print ch.chr
|
24
|
+
break if delim === ch.chr
|
25
|
+
end
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
|
+
def read_command_line start
|
30
|
+
__log ">>>read_command_line #{start}"
|
31
|
+
result = start.chr
|
32
|
+
_read_with_handlers( result,
|
33
|
+
Codes::Tab => lambda{ | read_sofar, ch | __log "caught <Tab>"
|
34
|
+
""
|
35
|
+
},
|
36
|
+
Codes::EOL => lambda{ | read_sofar, ch | __log "caught <CR>"
|
37
|
+
print ch.chr
|
38
|
+
_exit_read
|
39
|
+
},
|
40
|
+
Codes::BS => lambda{ | read_sofar, ch | __log "caught <BS>"
|
41
|
+
print( Codes::Back.chr + Space + Codes::Back.chr ) unless read_sofar.empty?
|
42
|
+
read_sofar.drop
|
43
|
+
},
|
44
|
+
Codes::Space => lambda{ | read_so_far, ch | __log "end of command"
|
45
|
+
print ch.chr
|
46
|
+
read_so_far.replace( _check_command read_so_far )
|
47
|
+
__log "replaced: #{read_so_far}"
|
48
|
+
ch.chr
|
49
|
+
}
|
50
|
+
)
|
51
|
+
rescue SwitchToRubyMode
|
52
|
+
_finish_command_in_rb_mode result
|
53
|
+
rescue ReadExit
|
54
|
+
__log "<<<read_command_line: #{result}"
|
55
|
+
result
|
56
|
+
end
|
57
|
+
|
58
|
+
def read_line
|
59
|
+
__log ">>>read_line"
|
60
|
+
result = ""
|
61
|
+
ch = _skip_chars( end: EOLRgx, skip: WhitespaceRgx )
|
62
|
+
case ch
|
63
|
+
when SpecialCodes
|
64
|
+
__log "special #{ch}"
|
65
|
+
read_special ch
|
66
|
+
else
|
67
|
+
__log "start parsing"
|
68
|
+
read_command_line ch
|
69
|
+
end
|
70
|
+
rescue Interrupt
|
71
|
+
return nil
|
72
|
+
end # read_line
|
73
|
+
|
74
|
+
def read_special special_char
|
75
|
+
__log ">>>read_special #{special_char}"
|
76
|
+
end
|
77
|
+
|
78
|
+
private
|
79
|
+
def _check_command word
|
80
|
+
_command?( word ).tap{ | real_command |
|
81
|
+
raise SwithToRubyMode, "#{word} is not a command" unless real_command
|
82
|
+
}
|
83
|
+
end
|
84
|
+
def _exit_read
|
85
|
+
raise ReadExit, "I got a exit handler"
|
86
|
+
end
|
87
|
+
def _read
|
88
|
+
get_character.tap do | ch |
|
89
|
+
__log "raw char read: #{ch}"
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def _finish_command_in_rb_mode sofar
|
94
|
+
puts "Sorry Ruby Mode not implemented yet"
|
95
|
+
end
|
96
|
+
|
97
|
+
def _read_with_handlers r, handlers={}
|
98
|
+
__log '>>>_read_with_handlers'
|
99
|
+
loop do
|
100
|
+
ch = _read
|
101
|
+
hdler = handlers[ ch ]
|
102
|
+
__log "c: #{hdler.inspect}"
|
103
|
+
if hdler then
|
104
|
+
r << hdler[ r, ch ]
|
105
|
+
else
|
106
|
+
print ch.chr
|
107
|
+
r << ch.chr
|
108
|
+
end
|
109
|
+
__log "read so far: \"#{r}\""
|
110
|
+
end
|
111
|
+
end
|
112
|
+
def _skip_chars params={}
|
113
|
+
loop do
|
114
|
+
ch = _read
|
115
|
+
print ch.chr
|
116
|
+
return "" if params[ :end ] === ch.chr
|
117
|
+
return ch unless params[ :skip ] === ch.chr
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
# vim: sts=3 sw=2 ft=ruby expandtab nu :
|
@@ -0,0 +1,28 @@
|
|
1
|
+
#!/usr/local/bin/ruby -w
|
2
|
+
# encoding: utf-8
|
3
|
+
# Copyright (c) 2009 Robert Dober <author.downcase.sub(" ", ".") + "@gmail.com">
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
# of this software and associated documentation files (the "Software"), to deal
|
7
|
+
# in the Software without restriction, including without limitation the rights
|
8
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
# copies of the Software, and to permit persons to whom the Software is
|
10
|
+
# furnished to do so, subject to the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be included in
|
13
|
+
# all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
# THE SOFTWARE.
|
22
|
+
|
23
|
+
module Bashir
|
24
|
+
class Script
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# vim: sts=2 sw=2 ft=ruby expandtab nu :
|
@@ -0,0 +1,35 @@
|
|
1
|
+
#!/usr/local/bin/ruby -w
|
2
|
+
# encoding: utf-8
|
3
|
+
# Copyright (c) 2009 Robert Dober <author.downcase.sub(" ", ".") + "@gmail.com">
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
# of this software and associated documentation files (the "Software"), to deal
|
7
|
+
# in the Software without restriction, including without limitation the rights
|
8
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
# copies of the Software, and to permit persons to whom the Software is
|
10
|
+
# furnished to do so, subject to the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be included in
|
13
|
+
# all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
# THE SOFTWARE.
|
22
|
+
|
23
|
+
module Bashir
|
24
|
+
class Variable
|
25
|
+
attr_reader :value
|
26
|
+
private
|
27
|
+
def initialize name, value="", type=:local
|
28
|
+
@name = name
|
29
|
+
@value = value.to_s
|
30
|
+
@type = type
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# vim: sts=2 sw=2 ft=ruby expandtab nu :
|
data/mit-license.txt
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
Copyright (c) 2009 Robert Dober <author.downcase.sub(" ", ".") + "@gmail.com">
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
of this software and associated documentation files (the "Software"), to deal
|
5
|
+
in the Software without restriction, including without limitation the rights
|
6
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
copies of the Software, and to permit persons to whom the Software is
|
8
|
+
furnished to do so, subject to the following conditions:
|
9
|
+
|
10
|
+
The above copyright notice and this permission notice shall be included in
|
11
|
+
all copies or substantial portions of the Software.
|
12
|
+
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
|
+
THE SOFTWARE.
|
data/test/bs/ideas
ADDED
data/test/bs/source1
ADDED
data/test/data/codes
ADDED
Binary file
|
@@ -0,0 +1,11 @@
|
|
1
|
+
#!/usr/local/bin/ruby -w
|
2
|
+
# encoding: utf-8
|
3
|
+
# file: /home/robert/git/ruby/bashir/test/experiments/test-reader.rb
|
4
|
+
|
5
|
+
$:.unshift( File::join( File::dirname( __FILE__ ), "..", "..", "lib" ) )
|
6
|
+
|
7
|
+
require 'bashir/reader'
|
8
|
+
|
9
|
+
include Bashir::Reader
|
10
|
+
|
11
|
+
# vim: sts=2 sw=2 ft=ruby expandtab nu :
|
data/test/read.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/local/bin/ruby -w
|
2
|
+
# encoding: utf-8
|
3
|
+
# file: /home/robert/git/ruby/bashir/lib/bashir/reader.rb
|
4
|
+
|
5
|
+
require 'highline/system_extensions'
|
6
|
+
|
7
|
+
include HighLine::SystemExtensions
|
8
|
+
|
9
|
+
def read_upto endset = [ 13 ]
|
10
|
+
loop do
|
11
|
+
ch = get_character
|
12
|
+
puts ch
|
13
|
+
puts ch.chr
|
14
|
+
return if endset === ch
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
read_upto
|
data/test/verify-api.rb
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
#!/usr/local/bin/ruby -w
|
2
|
+
# encoding: utf-8
|
3
|
+
# Copyright (c) 2009 Robert Dober <author.downcase.sub(" ", ".") + "@gmail.com">
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
# of this software and associated documentation files (the "Software"), to deal
|
7
|
+
# in the Software without restriction, including without limitation the rights
|
8
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
# copies of the Software, and to permit persons to whom the Software is
|
10
|
+
# furnished to do so, subject to the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be included in
|
13
|
+
# all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
# THE SOFTWARE.
|
22
|
+
|
23
|
+
require 'lab419/tools/verify'
|
24
|
+
require 'lab419/tools/mockify'
|
25
|
+
project_home_directory = ENV[ "project_home" ]
|
26
|
+
$:.unshift( File::join( project_home_directory, "lib" ) )
|
27
|
+
|
28
|
+
require 'bashir'
|
29
|
+
|
30
|
+
Verify "existence" do
|
31
|
+
verify "shell instances can be created" do
|
32
|
+
Bashir::Script::new
|
33
|
+
end
|
34
|
+
verify "function instances can be created" do
|
35
|
+
Bashir::Function::new :dummy
|
36
|
+
end
|
37
|
+
verify "functions have sticky names" do
|
38
|
+
Bashir::Function::new( :fourtytwo ).name == "fourtytwo"
|
39
|
+
end
|
40
|
+
verify "functions have string representations" do
|
41
|
+
Bashir::Function::new( :alpha ).as_bash == %<function alpha
|
42
|
+
{
|
43
|
+
}>
|
44
|
+
end
|
45
|
+
|
46
|
+
verify "variables can be created" do
|
47
|
+
Bashir::Variable::new :x, 42
|
48
|
+
end
|
49
|
+
|
50
|
+
verify "variables can be read" do
|
51
|
+
Bashir::Variable::new( :y, 42 ).value == "42"
|
52
|
+
end
|
53
|
+
|
54
|
+
verify "constructs can be created" do
|
55
|
+
Bashir::Construct::new( :case )
|
56
|
+
Bashir::Construct::new( :for )
|
57
|
+
Bashir::Construct::new( :if )
|
58
|
+
Bashir::Construct::new( :while )
|
59
|
+
end
|
60
|
+
|
61
|
+
verify_exceptions Bashir::IllegalConstruct do
|
62
|
+
Bashir::Construct::new( :xxx )
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
Verify "API for variables" do
|
68
|
+
%w{ local global script exported }.each do | var_type |
|
69
|
+
v = Bashir::Variable::new :a, 42, var_type
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
# vim: sts=2 sw=2 ft=verify expandtab nu :
|
data/test/verify-dsl.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
#!/usr/local/bin/ruby -w
|
2
|
+
Copyright (c) 2009 Robert Dober <author.downcase.sub(" ", ".") + "@gmail.com">
|
3
|
+
|
4
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
5
|
+
of this software and associated documentation files (the "Software"), to deal
|
6
|
+
in the Software without restriction, including without limitation the rights
|
7
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8
|
+
copies of the Software, and to permit persons to whom the Software is
|
9
|
+
furnished to do so, subject to the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be included in
|
12
|
+
all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
15
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
16
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
17
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
18
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
19
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
20
|
+
THE SOFTWARE.
|
21
|
+
# encoding: utf-8
|
22
|
+
|
23
|
+
|
24
|
+
# vim: sts=2 sw=2 ft=ruby expandtab nu :
|
@@ -0,0 +1,39 @@
|
|
1
|
+
#!/usr/local/bin/ruby -w
|
2
|
+
# encoding: utf-8
|
3
|
+
# file: /home/robert/git/ruby/bashir/test/verify-reader.rb
|
4
|
+
|
5
|
+
require 'tempfile'
|
6
|
+
|
7
|
+
$:.unshift( File::join( File::dirname( __FILE__ ), %w{ .. lib } ) )
|
8
|
+
|
9
|
+
|
10
|
+
require 'bashir/reader'
|
11
|
+
include Bashir::Reader
|
12
|
+
MYSELF = "ruby #{__FILE__}"
|
13
|
+
|
14
|
+
def echo_into echo_string, testcase
|
15
|
+
t = Tempfile::new( testcase )
|
16
|
+
t.print echo_string
|
17
|
+
system %<cat #{t.path} | #{MYSELF} #{testcase}>
|
18
|
+
end
|
19
|
+
|
20
|
+
def execute_tests
|
21
|
+
echo_into "abcd ef", "1"
|
22
|
+
end
|
23
|
+
|
24
|
+
case ARGV.first
|
25
|
+
when nil
|
26
|
+
execute_tests
|
27
|
+
when "1"
|
28
|
+
require 'mockify'
|
29
|
+
require 'verify'
|
30
|
+
Verify "read up to" do
|
31
|
+
verify msg: "read up to space",
|
32
|
+
target: "abcd ".split("").map(&:ord),
|
33
|
+
actual: read_up_to
|
34
|
+
end
|
35
|
+
else
|
36
|
+
raise RuntimeError, "testcase not supported: #{ARGV.first}"
|
37
|
+
end
|
38
|
+
|
39
|
+
# vim: sts=2 sw=2 ft=ruby expandtab nu :
|
metadata
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: bashir
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Robert Dober
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-10-30 00:00:00 +01:00
|
13
|
+
default_executable: bashir
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: Bashir, BASH In Ruby
|
17
|
+
email: robert.dober@gmail.com
|
18
|
+
executables:
|
19
|
+
- bashir
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files:
|
23
|
+
- CHANGELOG
|
24
|
+
- README.rdoc
|
25
|
+
- bin/bashir
|
26
|
+
- lib/bashir.rb
|
27
|
+
- lib/bashir/api.rb
|
28
|
+
- lib/bashir/commands.rb
|
29
|
+
- lib/bashir/constructs.rb
|
30
|
+
- lib/bashir/consts.rb
|
31
|
+
- lib/bashir/core-extensions.rb
|
32
|
+
- lib/bashir/evaluator.rb
|
33
|
+
- lib/bashir/function.rb
|
34
|
+
- lib/bashir/globals.rb
|
35
|
+
- lib/bashir/persistant.rb
|
36
|
+
- lib/bashir/reader.rb
|
37
|
+
- lib/bashir/script.rb
|
38
|
+
- lib/bashir/variable.rb
|
39
|
+
files:
|
40
|
+
- CHANGELOG
|
41
|
+
- Manifest
|
42
|
+
- README.rdoc
|
43
|
+
- Rakefile
|
44
|
+
- bin/bashir
|
45
|
+
- lib/bashir.rb
|
46
|
+
- lib/bashir/api.rb
|
47
|
+
- lib/bashir/commands.rb
|
48
|
+
- lib/bashir/constructs.rb
|
49
|
+
- lib/bashir/consts.rb
|
50
|
+
- lib/bashir/core-extensions.rb
|
51
|
+
- lib/bashir/evaluator.rb
|
52
|
+
- lib/bashir/function.rb
|
53
|
+
- lib/bashir/globals.rb
|
54
|
+
- lib/bashir/persistant.rb
|
55
|
+
- lib/bashir/reader.rb
|
56
|
+
- lib/bashir/script.rb
|
57
|
+
- lib/bashir/variable.rb
|
58
|
+
- mit-license.txt
|
59
|
+
- test/bs/ideas
|
60
|
+
- test/bs/source1
|
61
|
+
- test/data/codes
|
62
|
+
- test/experiments/test-reader.rb
|
63
|
+
- test/experiments/testing
|
64
|
+
- test/read.rb
|
65
|
+
- test/verify-api.rb
|
66
|
+
- test/verify-dsl.rb
|
67
|
+
- test/verify-reader.rb
|
68
|
+
- bashir.gemspec
|
69
|
+
has_rdoc: true
|
70
|
+
homepage: http://github.com/RobertDober/bashir
|
71
|
+
licenses: []
|
72
|
+
|
73
|
+
post_install_message:
|
74
|
+
rdoc_options:
|
75
|
+
- --line-numbers
|
76
|
+
- --inline-source
|
77
|
+
- --title
|
78
|
+
- Bashir
|
79
|
+
- --main
|
80
|
+
- README.rdoc
|
81
|
+
require_paths:
|
82
|
+
- lib
|
83
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - ">="
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: "0"
|
88
|
+
version:
|
89
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
90
|
+
requirements:
|
91
|
+
- - ">="
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: "1.2"
|
94
|
+
version:
|
95
|
+
requirements: []
|
96
|
+
|
97
|
+
rubyforge_project: bashir
|
98
|
+
rubygems_version: 1.3.5
|
99
|
+
signing_key:
|
100
|
+
specification_version: 3
|
101
|
+
summary: Never, ever program in bash again
|
102
|
+
test_files: []
|
103
|
+
|