eggsh 0.1.3 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -6,10 +6,11 @@ source "http://rubygems.org"
6
6
  # Add dependencies to develop your gem here.
7
7
  # Include everything needed to run rake, tests, features, etc.
8
8
  group :development do
9
- gem "shoulda", ">= 0"
9
+ gem "bacon", ">= 0"
10
10
  gem "bundler", "~> 1.0.0"
11
11
  gem "jeweler", "~> 1.5.2"
12
12
  gem "rcov", ">= 0"
13
13
  end
14
14
 
15
15
  gem "rb-readline"
16
+ gem "sfl"
@@ -1,6 +1,7 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
+ bacon (1.1.0)
4
5
  git (1.2.5)
5
6
  jeweler (1.5.2)
6
7
  bundler (~> 1.0.0)
@@ -9,14 +10,15 @@ GEM
9
10
  rake (0.8.7)
10
11
  rb-readline (0.4.0)
11
12
  rcov (0.9.9)
12
- shoulda (2.11.3)
13
+ sfl (2.0)
13
14
 
14
15
  PLATFORMS
15
16
  ruby
16
17
 
17
18
  DEPENDENCIES
19
+ bacon
18
20
  bundler (~> 1.0.0)
19
21
  jeweler (~> 1.5.2)
20
22
  rb-readline
21
23
  rcov
22
- shoulda
24
+ sfl
@@ -11,21 +11,21 @@ do this in base:
11
11
 
12
12
  The solution is not so obvious , and it requires the knowledge of the tools like
13
13
  grep, sed, awk, xargs ... etc. If ruby expressions are available in the command
14
- line environment, things will be much easy:
14
+ line environment, things will be much easier:
15
15
 
16
16
  rm -rf { ls['*'] - ls['*.c'] }
17
- // ruby expression inside {}
17
+ # ruby expression inside {}
18
18
 
19
19
  == Usage
20
20
 
21
- Ruby 1.9 interpreter is required.
22
-
23
21
  gem install eggsh
24
22
 
25
23
  Call 'eggsh' to start the shell.
26
24
  Settings of the shell are placed under ~/.eggshrc.
27
25
 
28
- {} brackets are used to evaluate ruby expressions.
26
+ { } brackets are used to evaluate ruby expressions.
27
+ {> } brackets are used to evaluate ruby expressions, too, except for the output
28
+ will not be executed.
29
29
 
30
30
  == Example
31
31
 
data/Rakefile CHANGED
@@ -26,11 +26,9 @@ Jeweler::Tasks.new do |gem|
26
26
  end
27
27
  Jeweler::RubygemsDotOrgTasks.new
28
28
 
29
- require 'rake/testtask'
30
- Rake::TestTask.new(:test) do |test|
31
- test.libs << 'lib' << 'test'
32
- test.pattern = 'test/**/test_*.rb'
33
- test.verbose = true
29
+ desc 'Run tests'
30
+ task :test do
31
+ sh 'bacon -Itest --automatic'
34
32
  end
35
33
 
36
34
  require 'rcov/rcovtask'
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.3
1
+ 0.2.0
data/bin/eggsh CHANGED
@@ -1,10 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- if RUBY_VERSION < '1.9'
4
- puts 'Ruby interpreter version 1.9 is needed!'
5
- exit
6
- end
7
-
8
3
  require File.dirname(__FILE__) + '/../lib/runner'
9
4
 
10
5
  # Store the state of the terminal
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{eggsh}
8
- s.version = "0.1.3"
8
+ s.version = "0.2.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Andrew Liu"]
@@ -34,7 +34,8 @@ Gem::Specification.new do |s|
34
34
  "lib/translator.rb",
35
35
  "lib/util.rb",
36
36
  "test/helper.rb",
37
- "test/test_eggsh.rb"
37
+ "test/test_translator.rb",
38
+ "test/test_util.rb"
38
39
  ]
39
40
  s.homepage = %q{http://github.com/eggegg/eggsh}
40
41
  s.licenses = ["MIT"]
@@ -43,7 +44,8 @@ Gem::Specification.new do |s|
43
44
  s.summary = %q{An interactive shell with Ruby power}
44
45
  s.test_files = [
45
46
  "test/helper.rb",
46
- "test/test_eggsh.rb"
47
+ "test/test_translator.rb",
48
+ "test/test_util.rb"
47
49
  ]
48
50
 
49
51
  if s.respond_to? :specification_version then
@@ -52,20 +54,23 @@ Gem::Specification.new do |s|
52
54
 
53
55
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
54
56
  s.add_runtime_dependency(%q<rb-readline>, [">= 0"])
55
- s.add_development_dependency(%q<shoulda>, [">= 0"])
57
+ s.add_runtime_dependency(%q<sfl>, [">= 0"])
58
+ s.add_development_dependency(%q<bacon>, [">= 0"])
56
59
  s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
57
60
  s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
58
61
  s.add_development_dependency(%q<rcov>, [">= 0"])
59
62
  else
60
63
  s.add_dependency(%q<rb-readline>, [">= 0"])
61
- s.add_dependency(%q<shoulda>, [">= 0"])
64
+ s.add_dependency(%q<sfl>, [">= 0"])
65
+ s.add_dependency(%q<bacon>, [">= 0"])
62
66
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
63
67
  s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
64
68
  s.add_dependency(%q<rcov>, [">= 0"])
65
69
  end
66
70
  else
67
71
  s.add_dependency(%q<rb-readline>, [">= 0"])
68
- s.add_dependency(%q<shoulda>, [">= 0"])
72
+ s.add_dependency(%q<sfl>, [">= 0"])
73
+ s.add_dependency(%q<bacon>, [">= 0"])
69
74
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
70
75
  s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
71
76
  s.add_dependency(%q<rcov>, [">= 0"])
@@ -1,5 +1,5 @@
1
- require_relative 'shell'
2
- require_relative 'util'
1
+ require File.expand_path('../shell.rb', __FILE__)
2
+ require File.expand_path('../util.rb', __FILE__)
3
3
  require 'readline'
4
4
 
5
5
  module Eggsh
@@ -18,11 +18,7 @@ module Eggsh
18
18
  Readline.basic_word_break_characters = ''
19
19
 
20
20
  while line = read
21
- if line =~ /^(?<p>[^\{\}]*(\{\g<p>*\})*)*$/
22
- @shell.exec line
23
- else
24
- puts 'eggsh: Unbalanced parentheses'
25
- end
21
+ @shell.exec line
26
22
  end
27
23
  end
28
24
 
@@ -1,4 +1,6 @@
1
- require_relative 'translator'
1
+ require 'rubygems'
2
+ require 'sfl'
3
+ require File.expand_path('../translator.rb', __FILE__)
2
4
 
3
5
  module Eggsh
4
6
  class Shell
@@ -36,8 +38,11 @@ module Eggsh
36
38
  elsif line.empty?
37
39
  else
38
40
  begin
39
- spawn(@env, @translator.translate(line).gsub("\n", ' '), :chdir => @pwd)
40
- Process.wait
41
+ shell_line = @translator.translate(line)
42
+ unless shell_line.empty?
43
+ Kernel.spawn(@env, shell_line, :chdir => @pwd)
44
+ Process.wait
45
+ end
41
46
  rescue Exception => e
42
47
  puts e.display
43
48
  end
@@ -47,8 +52,8 @@ module Eggsh
47
52
 
48
53
  private
49
54
  def pwd arg = ''
50
- short = @pwd.split '/'
51
- (0...(short.size - 1)).each {|i| short[i] = short[i][0]}
55
+ short = @pwd.sub(/^#{ENV['HOME']}/, '~').split '/'
56
+ (0...(short.size - 1)).each {|i| short[i] = short[i][0..0]}
52
57
  short.join '/'
53
58
  end
54
59
 
@@ -1,13 +1,36 @@
1
- require_relative 'ls'
1
+ require File.expand_path('../ls.rb', __FILE__)
2
2
 
3
3
  module Eggsh
4
4
  class Translator
5
+ # translate a certain line with ruby expression
5
6
  def translate line
6
- ls = Eggsh::Ls.new
7
+ eval_str, result, count = "", "", 0
8
+ for i in line.split ''
9
+ count += 1 if i == '{'
10
+ if count == 0
11
+ result += eval_part(eval_str).to_cmd + i
12
+ eval_str = ''
13
+ else
14
+ eval_str += i
15
+ end
16
+ count -= 1 if i == '}'
17
+ end
18
+ result += eval_part(eval_str).to_cmd
19
+ raise 'eggsh: Unbalanced parenthesis' if count != 0
20
+ result
21
+ end
7
22
 
8
- nested = /(\{[^\{\}]*\})/
9
- if line =~ nested
10
- translate(line.sub(nested, eval($1[1..-2]).to_cmd))
23
+ private
24
+ def eval_part line
25
+ return '' if line.empty?
26
+ ls = Eggsh::Ls.new
27
+ if line =~ /\{\>?(.*)\}/
28
+ str = eval($1) unless line.empty?
29
+ if line =~ /\{\>(.*)\}/
30
+ return nil
31
+ else
32
+ return str
33
+ end
11
34
  else
12
35
  line
13
36
  end
@@ -7,12 +7,7 @@ rescue Bundler::BundlerError => e
7
7
  $stderr.puts "Run `bundle install` to install missing gems"
8
8
  exit e.status_code
9
9
  end
10
- require 'test/unit'
11
- require 'shoulda'
12
10
 
13
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
14
- $LOAD_PATH.unshift(File.dirname(__FILE__))
15
- require 'eggsh'
11
+ require 'bacon'
12
+ Dir[File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', '*.rb'))].each {|f| require f }
16
13
 
17
- class Test::Unit::TestCase
18
- end
@@ -0,0 +1,45 @@
1
+ require 'helper'
2
+
3
+ describe 'translator' do
4
+ before do
5
+ @translator = Eggsh::Translator.new
6
+ end
7
+
8
+ it 'should translate empty string' do
9
+ @translator.translate('').should.equal ''
10
+ end
11
+
12
+ it 'should translate ruby with bracket' do
13
+ @translator.translate('{ 123 }').should.equal '123'
14
+ end
15
+
16
+ it 'should not have problem with nested bracket' do
17
+ @translator.translate('{(1..3).to_a.join}').should.equal '123'
18
+ @translator.translate('{(0..2).to_a.map{|i| i + 1}.join}').should.equal '123'
19
+ end
20
+
21
+ it 'should not evaluate expressions not in bracket' do
22
+ @translator.translate('(1..3).to_a.join').should.equal '(1..3).to_a.join'
23
+ end
24
+
25
+ it 'should work with two sets of brackets' do
26
+ @translator.translate('{(0..2).to_a.map{|i| i + 1}.map{|i| i + 1}.join}').should.equal '234'
27
+ end
28
+
29
+ it 'should no return with {>}' do
30
+ @translator.translate('{> 123 }').should.equal ''
31
+ end
32
+
33
+ it 'should execute within {>}' do
34
+ $TEST = nil
35
+ @translator.translate('{> $TEST = "abc"}').should.equal ''
36
+ $TEST.should.equal 'abc'
37
+ end
38
+
39
+ it 'should raise error with unbalanced parenthesis' do
40
+ should.raise(RuntimeError) { @translator.translate('{') }
41
+ should.raise(RuntimeError) { @translator.translate('}') }
42
+ should.raise(RuntimeError) { @translator.translate('{}}') }
43
+ end
44
+ end
45
+
@@ -0,0 +1,18 @@
1
+ require 'helper'
2
+
3
+ describe 'to_cmd' do
4
+ it 'should convert array to command line with to_cmd' do
5
+ %[ab cd ef].to_cmd.should.equal 'ab cd ef'
6
+ end
7
+
8
+ it 'should remain string with to_cmd' do
9
+ 'abc'.to_cmd.should.equal 'abc'
10
+ end
11
+ end
12
+
13
+ describe 'to_color' do
14
+ it 'should output color escape with red' do
15
+ 'abc'.to_color(:red).should.equal "\x1b[31mabc\x1b[m"
16
+ end
17
+ end
18
+
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eggsh
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 23
4
5
  prerelease: false
5
6
  segments:
6
7
  - 0
7
- - 1
8
- - 3
9
- version: 0.1.3
8
+ - 2
9
+ - 0
10
+ version: 0.2.0
10
11
  platform: ruby
11
12
  authors:
12
13
  - Andrew Liu
@@ -18,74 +19,93 @@ date: 2011-01-25 00:00:00 +08:00
18
19
  default_executable: eggsh
19
20
  dependencies:
20
21
  - !ruby/object:Gem::Dependency
22
+ type: :runtime
23
+ prerelease: false
21
24
  name: rb-readline
22
- requirement: &id001 !ruby/object:Gem::Requirement
25
+ version_requirements: &id001 !ruby/object:Gem::Requirement
23
26
  none: false
24
27
  requirements:
25
28
  - - ">="
26
29
  - !ruby/object:Gem::Version
30
+ hash: 3
27
31
  segments:
28
32
  - 0
29
33
  version: "0"
34
+ requirement: *id001
35
+ - !ruby/object:Gem::Dependency
30
36
  type: :runtime
31
37
  prerelease: false
32
- version_requirements: *id001
33
- - !ruby/object:Gem::Dependency
34
- name: shoulda
35
- requirement: &id002 !ruby/object:Gem::Requirement
38
+ name: sfl
39
+ version_requirements: &id002 !ruby/object:Gem::Requirement
36
40
  none: false
37
41
  requirements:
38
42
  - - ">="
39
43
  - !ruby/object:Gem::Version
44
+ hash: 3
40
45
  segments:
41
46
  - 0
42
47
  version: "0"
48
+ requirement: *id002
49
+ - !ruby/object:Gem::Dependency
43
50
  type: :development
44
51
  prerelease: false
45
- version_requirements: *id002
52
+ name: bacon
53
+ version_requirements: &id003 !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ hash: 3
59
+ segments:
60
+ - 0
61
+ version: "0"
62
+ requirement: *id003
46
63
  - !ruby/object:Gem::Dependency
64
+ type: :development
65
+ prerelease: false
47
66
  name: bundler
48
- requirement: &id003 !ruby/object:Gem::Requirement
67
+ version_requirements: &id004 !ruby/object:Gem::Requirement
49
68
  none: false
50
69
  requirements:
51
70
  - - ~>
52
71
  - !ruby/object:Gem::Version
72
+ hash: 23
53
73
  segments:
54
74
  - 1
55
75
  - 0
56
76
  - 0
57
77
  version: 1.0.0
78
+ requirement: *id004
79
+ - !ruby/object:Gem::Dependency
58
80
  type: :development
59
81
  prerelease: false
60
- version_requirements: *id003
61
- - !ruby/object:Gem::Dependency
62
82
  name: jeweler
63
- requirement: &id004 !ruby/object:Gem::Requirement
83
+ version_requirements: &id005 !ruby/object:Gem::Requirement
64
84
  none: false
65
85
  requirements:
66
86
  - - ~>
67
87
  - !ruby/object:Gem::Version
88
+ hash: 7
68
89
  segments:
69
90
  - 1
70
91
  - 5
71
92
  - 2
72
93
  version: 1.5.2
94
+ requirement: *id005
95
+ - !ruby/object:Gem::Dependency
73
96
  type: :development
74
97
  prerelease: false
75
- version_requirements: *id004
76
- - !ruby/object:Gem::Dependency
77
98
  name: rcov
78
- requirement: &id005 !ruby/object:Gem::Requirement
99
+ version_requirements: &id006 !ruby/object:Gem::Requirement
79
100
  none: false
80
101
  requirements:
81
102
  - - ">="
82
103
  - !ruby/object:Gem::Version
104
+ hash: 3
83
105
  segments:
84
106
  - 0
85
107
  version: "0"
86
- type: :development
87
- prerelease: false
88
- version_requirements: *id005
108
+ requirement: *id006
89
109
  description: Use Ruby expressions instead of unfriendly shell script
90
110
  email: andrewliu33@gmail.com
91
111
  executables:
@@ -111,7 +131,8 @@ files:
111
131
  - lib/translator.rb
112
132
  - lib/util.rb
113
133
  - test/helper.rb
114
- - test/test_eggsh.rb
134
+ - test/test_translator.rb
135
+ - test/test_util.rb
115
136
  has_rdoc: true
116
137
  homepage: http://github.com/eggegg/eggsh
117
138
  licenses:
@@ -126,7 +147,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
126
147
  requirements:
127
148
  - - ">="
128
149
  - !ruby/object:Gem::Version
129
- hash: 4197712127916392614
150
+ hash: 3
130
151
  segments:
131
152
  - 0
132
153
  version: "0"
@@ -135,6 +156,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
135
156
  requirements:
136
157
  - - ">="
137
158
  - !ruby/object:Gem::Version
159
+ hash: 3
138
160
  segments:
139
161
  - 0
140
162
  version: "0"
@@ -147,4 +169,5 @@ specification_version: 3
147
169
  summary: An interactive shell with Ruby power
148
170
  test_files:
149
171
  - test/helper.rb
150
- - test/test_eggsh.rb
172
+ - test/test_translator.rb
173
+ - test/test_util.rb
@@ -1,7 +0,0 @@
1
- require 'helper'
2
-
3
- class TestEggsh < Test::Unit::TestCase
4
- should "probably rename this file and start testing for real" do
5
- flunk "hey buddy, you should probably rename this file and start testing for real"
6
- end
7
- end