yap-shell-parser 0.6.2 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c452309759a871f7506451fd55282318434a5b25
4
- data.tar.gz: 7a9aed6543577d6c8e9b5244320d02877c2502a2
3
+ metadata.gz: 336e650e52d979ad853d6544b7dda9f44253e8ae
4
+ data.tar.gz: ad9cf9b11eab65b0a75e0552082105380cbd31a4
5
5
  SHA512:
6
- metadata.gz: 8219284d09acbb0537f352b33c12aaf52fbd7418b8e3c2562443547fd0d30e012035a4dfe5c981b0ec5c07c797fdd6ec875c637122f99b98cca53db1c7ece7ba
7
- data.tar.gz: c962d71ed8207bd23593a12bb4e9150d370914623a755411527e19fcbbd7515e9e668d5c058c6b4a9e9e9152d08719c84f0cbe3c5792b21d31213f86cf9a3f58
6
+ metadata.gz: a7644b342203f0f98e5eb805756ba49735503f600ee2fc73ef820df291e1343c822bc74f035e713fae091f97d1f364fe507497a137d973ee595526c79a92e4a3
7
+ data.tar.gz: 6996c6b68c34daf2f9aa521650f1cb403b7ebc96c3d903512f5b4264016e934c19d2b5c32d921e24d673176f62022f6225b2286fb051fa7dbb5146f5aa78cd99
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.2.3
1
+ 2.3.1
data/.travis.yml CHANGED
@@ -1,6 +1,6 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.1.5
3
+ - 2.3.1
4
4
  cache: bundler
5
5
  script:
6
6
  - bundle exec rspec -fd spec
@@ -31,7 +31,11 @@ module Yap
31
31
  end
32
32
 
33
33
  $LOAD_PATH.unshift File.dirname(__FILE__) + "/../../"
34
- require 'treefell'
34
+ begin
35
+ require 'treefell'
36
+ rescue LoadError => ex
37
+ nil
38
+ end
35
39
  require 'yap/shell/parser/lexer'
36
40
  require 'yap/shell/parser/nodes'
37
41
  require 'yap/shell/parser_impl'
@@ -52,8 +52,9 @@ module Yap::Shell
52
52
  HEREDOC_START = /\A<<-?([A-z0-9]+)\s*\n/
53
53
  INTERNAL_EVAL = /\A(?:(\!)|([0-9]+))/
54
54
  SUBGROUP = /\A(\(|\))/
55
- REDIRECTION = /\A(([12]?>&?[12]?)\s*(?![12]>)(#{ARG})?)/
56
- REDIRECTION2 = /\A((&>|<)\s*(#{ARG}))/
55
+ REDIRECTION1 = /\A(([12]?>>)\s*(#{ARG}))/
56
+ REDIRECTION2 = /\A(([12]?>&?[12]?)\s*(?![12][\?]?>)(#{ARG})?)/
57
+ REDIRECTION3 = /\A((&>|<|&>>)\s*(#{ARG}))/
57
58
 
58
59
  NUMERIC_RANGE = /\A\(((\d+)\.\.(\d+))\)(\.each)?/
59
60
  NUMERIC_RANGE_W_CALL = /\A\(((\d+)\.\.(\d+))\)(\.each)?\s*:\s*/
@@ -334,14 +335,18 @@ module Yap::Shell
334
335
  end
335
336
 
336
337
  def redirection_token
337
- if md=@chunk.match(REDIRECTION)
338
+ if md=@chunk.match(REDIRECTION1)
339
+ token :Redirection, md[2], attrs: { target: md[3] }
340
+ md[0].length
341
+ elsif md=@chunk.match(REDIRECTION2)
338
342
  target = nil
339
343
  target = md[3] if md[3] && md[3].length > 0
340
344
  token :Redirection, md[2], attrs: { target: target }
341
345
  md[0].length
342
- elsif md=@chunk.match(REDIRECTION2)
346
+ elsif md=@chunk.match(REDIRECTION3)
343
347
  token :Redirection, md[2], attrs: { target: md[3] }
344
348
  md[0].length
349
+ elsif md=@chunk.match(REDIRECTION1)
345
350
  else
346
351
  did_not_match
347
352
  end
@@ -371,16 +376,23 @@ module Yap::Shell
371
376
  str = ''
372
377
  characters_read = 0
373
378
  prev_char = ''
379
+
380
+ escaped = false
381
+ quoted_by = nil
382
+
374
383
  loop do
375
384
  ch = @chunk[characters_read]
376
385
 
377
386
  if %w(' ").include?(ch)
378
- @quoted_by = ch
387
+ quoted_by = ch
379
388
  result = process_string @chunk[characters_read..-1], ch
380
389
  str << result.str
381
390
  characters_read += result.consumed_length
382
391
  elsif ch == '\\'
383
- # no-op
392
+ # We're escaping the argument if this is the first character we
393
+ # see. If this comes any later then we don't care
394
+ escaped = true if characters_read == 0
395
+
384
396
  characters_read += 1
385
397
  elsif prev_char != '\\' && ch =~ /[\s\|;&\(\)]/
386
398
  break
@@ -396,9 +408,8 @@ module Yap::Shell
396
408
 
397
409
  if characters_read > 0
398
410
  attrs = {}
399
- if @quoted_by
400
- attrs.merge!(quoted_by: @quoted_by)
401
- end
411
+ attrs.merge!(escaped: escaped) if escaped
412
+ attrs.merge!(quoted_by: quoted_by) if quoted_by
402
413
  token :Argument, str, attrs: attrs
403
414
  characters_read
404
415
  else
@@ -24,6 +24,10 @@ module Yap::Shell
24
24
  @attrs = token.attrs
25
25
  end
26
26
 
27
+ def escaped?
28
+ @attrs[:escaped]
29
+ end
30
+
27
31
  def quoted?
28
32
  double_quoted? || single_quoted?
29
33
  end
@@ -41,7 +45,7 @@ module Yap::Shell
41
45
  end
42
46
 
43
47
  def to_s
44
- "ArgumentNode(#{lvalue.inspect})"
48
+ "ArgumentNode(#{lvalue.inspect} escaped? #{escaped?} double_quoted? #{double_quoted?} single_quoted? #{single_quoted?})"
45
49
  end
46
50
  end
47
51
 
@@ -3,7 +3,7 @@ require 'yap/shell/parser'
3
3
  module Yap
4
4
  module Shell
5
5
  module Parser
6
- VERSION = "0.6.2"
6
+ VERSION = "0.7.0"
7
7
  end
8
8
  end
9
9
  end
@@ -589,6 +589,16 @@ describe Yap::Shell::Parser::Lexer do
589
589
  end
590
590
  end
591
591
  end
592
+
593
+ context 'escaped arguments' do
594
+ describe 'echo \$FOO' do
595
+ it { should eq [
596
+ t(:Command, "echo", lineno:0),
597
+ t(:Argument, "$FOO", lineno:0, attrs: { escaped: true })
598
+ ]}
599
+ end
600
+
601
+ end
592
602
  end
593
603
 
594
604
  context "statements" do
@@ -946,6 +956,14 @@ describe Yap::Shell::Parser::Lexer do
946
956
  ]}
947
957
  end
948
958
 
959
+ describe "can double up" do
960
+ let(:str){ "ls >> a.txt" }
961
+ it { should eq [
962
+ t(:Command, "ls", lineno: 0),
963
+ t(:Redirection, ">>", lineno: 0, attrs: { target: "a.txt" }),
964
+ ]}
965
+ end
966
+
949
967
  describe "can be the start of a command (for clearing files)" do
950
968
  describe "> a.txt" do
951
969
  it { should eq [
@@ -985,6 +1003,14 @@ describe Yap::Shell::Parser::Lexer do
985
1003
  t(:Redirection, "2>", lineno: 0, attrs: { target: "bar.txt" }),
986
1004
  ]}
987
1005
  end
1006
+
1007
+ describe "can double up" do
1008
+ let(:str){ "ls 2>> a.txt" }
1009
+ it { should eq [
1010
+ t(:Command, "ls", lineno: 0),
1011
+ t(:Redirection, "2>>", lineno: 0, attrs: { target: "a.txt" }),
1012
+ ]}
1013
+ end
988
1014
  end
989
1015
 
990
1016
  describe "stdout / stderr" do
@@ -1048,6 +1074,15 @@ describe Yap::Shell::Parser::Lexer do
1048
1074
  t(:Redirection, "1>", lineno: 0, attrs: { target: "hey.txt" })
1049
1075
  ]}
1050
1076
  end
1077
+
1078
+ describe "redirecting both stdout and stderr with an append: du -sh &>> hey.txt" do
1079
+ let(:str){ "du -sh &>> hey.txt" }
1080
+ it { should eq [
1081
+ t(:Command, "du", lineno: 0),
1082
+ t(:Argument, "-sh", lineno: 0),
1083
+ t(:Redirection, "&>>", lineno: 0, attrs: { target: "hey.txt" })
1084
+ ]}
1085
+ end
1051
1086
  end
1052
1087
  end
1053
1088
 
@@ -67,4 +67,5 @@ describe Yap::Shell::Parser do
67
67
  it { is_expected.to parse("echo 'hi'")}
68
68
  it { is_expected.to parse("ls > foo.txt")}
69
69
  it { is_expected.to parse("ls * { |file1, file2, file3| echo $file1 $file2 $file3 }")}
70
+ it { is_expected.to parse('echo \\$DEBUG')}
70
71
  end
@@ -20,6 +20,7 @@ Gem::Specification.new do |spec|
20
20
  spec.require_paths = ["lib"]
21
21
 
22
22
  spec.add_dependency "treefell", "~> 0.2.3"
23
+ spec.add_dependency "term-ansicolor", "~> 1.3.0"
23
24
 
24
25
  spec.add_development_dependency "bundler", "~> 1.7"
25
26
  spec.add_development_dependency "rake", "~> 10.0"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yap-shell-parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.2
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Zach Dennis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-05-27 00:00:00.000000000 Z
11
+ date: 2016-06-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: treefell
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 0.2.3
27
+ - !ruby/object:Gem::Dependency
28
+ name: term-ansicolor
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 1.3.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 1.3.0
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -128,7 +142,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
128
142
  version: '0'
129
143
  requirements: []
130
144
  rubyforge_project:
131
- rubygems_version: 2.4.5.1
145
+ rubygems_version: 2.5.1
132
146
  signing_key:
133
147
  specification_version: 4
134
148
  summary: The parser for the yap shell