yap-shell-parser 0.6.2 → 0.7.0

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.
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