sfl 1.1 → 1.2

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.
Files changed (2) hide show
  1. data/lib/sfl.rb +70 -24
  2. metadata +15 -4
data/lib/sfl.rb CHANGED
@@ -1,31 +1,46 @@
1
1
  class SFL
2
2
  attr_reader :command, :environment, :argument, :option
3
3
 
4
+ # SFL.new('ls', '-a') becomes
5
+ # @environment = {}
6
+ # @command = ['ls', 'ls']
7
+ # @argument = ['-a']
8
+ # @option = {}
4
9
  def initialize(*cmdandarg)
5
10
  raise ArgumentError if cmdandarg.size == 0
6
11
  cmdandarg = cmdandarg.dup
7
12
 
8
- tmp = cmdandarg.shift
9
- if Hash === tmp
10
- @environment = tmp
11
- tmp = cmdandarg.shift
12
- else
13
- @environment = {}
14
- end
13
+ @environment =
14
+ if Hash === cmdandarg.first
15
+ cmdandarg.shift
16
+ else
17
+ {}
18
+ end
15
19
 
16
- if String === tmp
17
- @command = [tmp, tmp]
18
- else
19
- @command = tmp
20
- end
20
+ @option =
21
+ if Hash === cmdandarg.last
22
+ cmdandarg.pop
23
+ else
24
+ {}
25
+ end
21
26
 
22
- if Hash === cmdandarg.last
23
- @option = cmdandarg.pop
27
+ if cmdandarg.size == 1
28
+ cmdandarg = cmdandarg.first
29
+ if String === cmdandarg
30
+ cmd, *arg = self.class.parse_command_with_arg(cmdandarg)
31
+ @command = [cmd, cmd]
32
+ @argument = arg
33
+ else
34
+ @command = cmdandarg
35
+ @argument = []
36
+ end
24
37
  else
25
- @option = {}
38
+ # 'ls', '.' -> [['ls', 'ls'], '.']
39
+ cmd = cmdandarg.shift
40
+ cmd = (String === cmd) ? [cmd, cmd] : cmd
41
+ @command = cmd
42
+ @argument = cmdandarg
26
43
  end
27
-
28
- @argument = cmdandarg
29
44
  end
30
45
 
31
46
  def run
@@ -98,17 +113,48 @@ class SFL
98
113
  ast
99
114
  end
100
115
  end
116
+
117
+ def parse_command_with_arg(x)
118
+ in_squote = false
119
+ in_dquote = false
120
+ tmp = ''
121
+ cmdargs = []
122
+ x.strip.split(//).each do |c|
123
+ case c
124
+ when '"'
125
+ if in_dquote
126
+ in_dquote = false
127
+ else
128
+ in_dquote = true
129
+ end
130
+ when "'"
131
+ if in_squote
132
+ in_squote = false
133
+ else
134
+ in_squote = true
135
+ end
136
+ when ' '
137
+ if in_dquote || in_squote
138
+ tmp << ' '
139
+ else
140
+ cmdargs << tmp
141
+ tmp = ''
142
+ end
143
+ else
144
+ tmp << c
145
+ end
146
+ end
147
+ cmdargs << tmp
148
+ end
101
149
  end
102
150
  end
103
151
 
104
- if RUBY_VERSION < '1.9'
105
- def spawn(*x)
106
- SFL.new(*x).run
107
- end
152
+ def spawn(*x)
153
+ SFL.new(*x).run
154
+ end
108
155
 
109
- def Process.spawn(*x)
110
- SFL.new(*x).run
111
- end
156
+ def Process.spawn(*x)
157
+ SFL.new(*x).run
112
158
  end
113
159
 
114
160
  if RUBY_VERSION <= '1.8.6'
metadata CHANGED
@@ -1,7 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sfl
3
3
  version: !ruby/object:Gem::Version
4
- version: "1.1"
4
+ hash: 11
5
+ prerelease: false
6
+ segments:
7
+ - 1
8
+ - 2
9
+ version: "1.2"
5
10
  platform: ruby
6
11
  authors:
7
12
  - ujihisa
@@ -34,21 +39,27 @@ rdoc_options: []
34
39
  require_paths:
35
40
  - lib
36
41
  required_ruby_version: !ruby/object:Gem::Requirement
42
+ none: false
37
43
  requirements:
38
44
  - - ">="
39
45
  - !ruby/object:Gem::Version
46
+ hash: 3
47
+ segments:
48
+ - 0
40
49
  version: "0"
41
- version:
42
50
  required_rubygems_version: !ruby/object:Gem::Requirement
51
+ none: false
43
52
  requirements:
44
53
  - - ">="
45
54
  - !ruby/object:Gem::Version
55
+ hash: 3
56
+ segments:
57
+ - 0
46
58
  version: "0"
47
- version:
48
59
  requirements: []
49
60
 
50
61
  rubyforge_project:
51
- rubygems_version: 1.3.5
62
+ rubygems_version: 1.3.7
52
63
  signing_key:
53
64
  specification_version: 3
54
65
  summary: Spawn For Ruby 1.8