shr 0.1.3 → 0.1.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.
@@ -0,0 +1,49 @@
1
+ #coding: utf-8
2
+ require 'stringio'
3
+
4
+ module Shr
5
+ module Builtin
6
+
7
+ def capture(&block)
8
+ proc = Proc.new do |environment|
9
+ output = relay capture_stdout(&block)
10
+ if environment.key? :out
11
+ File.write(environment[:out], output.read)
12
+ end
13
+ [output, nil]
14
+ end
15
+ @commands << [:capture, proc]
16
+ self
17
+ end
18
+
19
+ def cd!(path=nil)
20
+ proc = Proc.new do
21
+ path ? Dir.chdir(path) : Dir.chdir
22
+ [nil, nil]
23
+ end
24
+ @commands << ["#cd! #{path}".strip, proc]
25
+ force
26
+ self
27
+ end
28
+
29
+ private
30
+
31
+ def capture_stdout
32
+ begin
33
+ $stdout = StringIO.new
34
+ yield
35
+ out = $stdout.string
36
+ ensure
37
+ $stdout = STDOUT
38
+ end
39
+ out
40
+ end
41
+
42
+ def relay(source)
43
+ r, w = IO.pipe
44
+ w.write source
45
+ w.close
46
+ r
47
+ end
48
+ end
49
+ end
data/lib/shr/command.rb CHANGED
@@ -30,23 +30,24 @@ module Shr
30
30
  @command.end_with? '!'
31
31
  end
32
32
 
33
- # xxx
34
- def run(environment, command_out)
35
- io_r, io_w = IO.pipe
36
- options = { :out => io_w }
37
- options[:in] = command_out if command_out
38
- options.merge!(environment)
39
-
40
- pid = spawn(self.to_s, options)
41
- watcher = Process.detach(pid)
42
- io_w.close
43
-
44
- [io_r, watcher]
45
- end
46
-
47
- # xxx
48
- def run!
49
- Open3.pipeline(self.to_s)
33
+ def to_proc
34
+ Proc.new do |environment, command_out|
35
+ if release?
36
+ Open3.pipeline(self.to_s)
37
+ [nil, nil]
38
+ else
39
+ io_r, io_w = IO.pipe
40
+ options = { :out => io_w }
41
+ options[:in] = command_out if command_out
42
+ options.merge!(environment)
43
+
44
+ pid = spawn(self.to_s, options)
45
+ watcher = Process.detach(pid)
46
+ io_w.close
47
+
48
+ [io_r, watcher]
49
+ end
50
+ end
50
51
  end
51
52
  end
52
53
  end
data/lib/shr/shell.rb CHANGED
@@ -1,9 +1,12 @@
1
1
  #coding: utf-8
2
2
  require 'shr/command'
3
+ require 'shr/builtin'
3
4
 
4
5
  module Shr
5
6
  class Shell
6
7
 
8
+ include Builtin
9
+
7
10
  def initialize
8
11
  @commands = []
9
12
  end
@@ -14,7 +17,7 @@ module Shr
14
17
  super
15
18
  else
16
19
  delay command
17
- force! if command.release?
20
+ force if command.release?
18
21
  self
19
22
  end
20
23
  end
@@ -25,7 +28,7 @@ module Shr
25
28
  end
26
29
 
27
30
  def inspect
28
- command_line = @commands.join(' | ').strip
31
+ command_line = @commands.map {|c| c.first }.join(' | ').strip
29
32
  force
30
33
  res = "#<Shr::Shell>"
31
34
  res << "<:command => #{command_line}>" if command_line.size > 0
@@ -61,6 +64,14 @@ module Shr
61
64
  alias_method :<, :redirect_from
62
65
  alias_method :>, :redirect_to
63
66
 
67
+ def bake(name, command, options=[])
68
+ Shell.class_eval do
69
+ define_method(name) do |*args|
70
+ self.method_missing(command, *(options + args))
71
+ end
72
+ end
73
+ end
74
+
64
75
  private
65
76
 
66
77
  def filled?
@@ -68,23 +79,16 @@ module Shr
68
79
  end
69
80
 
70
81
  def delay(command)
71
- @commands << command
82
+ @commands << [command, command.to_proc]
72
83
  end
73
84
 
74
85
  def force(args={})
75
86
  return if @commands.empty?
76
87
 
77
- @commands.each do |command|
78
- @command_out, @wait_thread = command.run(args, @command_out)
88
+ @commands.each do |_, command|
89
+ @command_out, @wait_thread = command.call(args, @command_out)
79
90
  end
80
- @wait_thread.join
81
- @commands.clear
82
- end
83
-
84
- def force!
85
- return if @commands.empty?
86
-
87
- @commands[-1].run!
91
+ @wait_thread.join if @wait_thread
88
92
  @commands.clear
89
93
  end
90
94
  end
data/lib/shr/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Shr
2
- VERSION = "0.1.3"
2
+ VERSION = "0.1.4"
3
3
  end
@@ -0,0 +1,51 @@
1
+ #coding: utf-8
2
+ require 'spec_helper'
3
+ require 'tempfile'
4
+
5
+ module Shr
6
+ describe Builtin do
7
+ let(:sh) { Shell.new }
8
+
9
+ before(:all) do
10
+ @original = Dir.pwd
11
+ end
12
+
13
+ it 'has the following methods' do
14
+ m = sh.methods
15
+ m.should include(:capture)
16
+ m.should include(:cd!)
17
+ end
18
+
19
+ describe '#capture' do
20
+ it 'captures output from block' do
21
+ sh.capture { print 'hello capture' }.to_s.should eq("hello capture")
22
+ end
23
+
24
+ it 'redirects output from block to file' do
25
+ tempfile = Tempfile.new('temp')
26
+ sh.capture { print 'hello capture' }.redirect_to(tempfile.path)
27
+ File.read(tempfile.path).should eq('hello capture')
28
+ tempfile.close!
29
+ end
30
+ end
31
+
32
+ describe '#cd!' do
33
+ it 'changes the current working directory' do
34
+ sh.cd! Dir.home
35
+ Dir.pwd.should eq(Dir.home)
36
+ Dir.chdir @original
37
+ end
38
+
39
+ context 'with no argument' do
40
+ it 'changes the current working directory to users home' do
41
+ sh.cd!
42
+ Dir.pwd.should eq(Dir.home)
43
+ end
44
+ end
45
+ end
46
+
47
+ after(:all) do
48
+ Dir.chdir @original
49
+ end
50
+ end
51
+ end
@@ -11,7 +11,7 @@ module Shr
11
11
  m.should include(:to_s)
12
12
  m.should include(:exist?)
13
13
  m.should include(:release?)
14
- m.should include(:run)
14
+ m.should include(:to_proc)
15
15
  end
16
16
 
17
17
  describe '#command' do
@@ -16,6 +16,7 @@ module Shr
16
16
  m.should include(:<)
17
17
  m.should include(:redirect_to)
18
18
  m.should include(:>)
19
+ m.should include(:bake)
19
20
  end
20
21
 
21
22
  unless OS.windows?
@@ -89,6 +90,18 @@ module Shr
89
90
  end
90
91
  end
91
92
 
93
+ describe '#bake' do
94
+ it 'bakes new command' do
95
+ sh.bake(:sort_r, :sort, [:r])
96
+
97
+ files = []
98
+ sh.ls(@tmpdir).sort_r.each do |file|
99
+ files << file.strip
100
+ end
101
+ files.should eq(['ruby.rb', 'python.py', 'perl.pl'])
102
+ end
103
+ end
104
+
92
105
  after(:all) do
93
106
  FileUtils.remove_entry_secure @tmpdir
94
107
  end
@@ -72,6 +72,19 @@ module Shr
72
72
  end
73
73
  end
74
74
 
75
+ describe '#bake' do
76
+ it 'bakes new command' do
77
+ sh.bake(:dir_B, :dir, [:B])
78
+ sh.bake(:sort_R, :sort, [:R])
79
+
80
+ files = []
81
+ sh.dir_B(@tmpdir.gsub('/', '\\')).sort_R.each do |file|
82
+ files << file.strip
83
+ end
84
+ files.should eq(['ruby.rb', 'python.py', 'perl.pl'])
85
+ end
86
+ end
87
+
75
88
  after(:all) do
76
89
  FileUtils.remove_entry_secure @tmpdir
77
90
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-01-22 00:00:00.000000000 Z
12
+ date: 2013-01-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: os
@@ -41,12 +41,14 @@ files:
41
41
  - README.md
42
42
  - Rakefile
43
43
  - lib/shr.rb
44
+ - lib/shr/builtin.rb
44
45
  - lib/shr/command.rb
45
46
  - lib/shr/option.rb
46
47
  - lib/shr/shell.rb
47
48
  - lib/shr/version.rb
48
49
  - lib/shr/which.rb
49
50
  - shr.gemspec
51
+ - spec/lib/shr/builtin_spec.rb
50
52
  - spec/lib/shr/command_spec.rb
51
53
  - spec/lib/shr/option_spec.rb
52
54
  - spec/lib/shr/shell_spec.rb
@@ -79,6 +81,7 @@ signing_key:
79
81
  specification_version: 3
80
82
  summary: Make controlling subprocess easier in Ruby.
81
83
  test_files:
84
+ - spec/lib/shr/builtin_spec.rb
82
85
  - spec/lib/shr/command_spec.rb
83
86
  - spec/lib/shr/option_spec.rb
84
87
  - spec/lib/shr/shell_spec.rb