rubysl-shellwords 0.0.1 → 1.0.1

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,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7218a87d72d7ebbf3905a49f386ca8e8ff85b3d3
4
+ data.tar.gz: 1bf9fa5994639347dc7f5ea40c7fc3e5ce4b5aa9
5
+ SHA512:
6
+ metadata.gz: 0be3c1d16ecb39bb9a64ace53f6156f953b754c41579471752bbfdc2164b55d082715697a4df271d18c3627be530bf5be999a55a40a7e27dd9ab06f40f730db9
7
+ data.tar.gz: 29b72f1bbc93adcdf7011f757fceded2e35fd49e464052bb6dd3d7203488db7dc7362be297cb9a057edb2acf14d422fb4fdebbe6d890f9ad6b4ff7acc9719775
data/.gitignore CHANGED
@@ -15,4 +15,3 @@ spec/reports
15
15
  test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
- .rbx
@@ -0,0 +1,7 @@
1
+ language: ruby
2
+ env:
3
+ - RUBYLIB=lib
4
+ script: bundle exec mspec
5
+ rvm:
6
+ - 1.8.7
7
+ - rbx-nightly-18mode
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # RubySL::Shellwords
1
+ # Rubysl::Shellwords
2
2
 
3
3
  TODO: Write a gem description
4
4
 
@@ -24,6 +24,6 @@ TODO: Write usage instructions here
24
24
 
25
25
  1. Fork it
26
26
  2. Create your feature branch (`git checkout -b my-new-feature`)
27
- 3. Commit your changes (`git commit -am 'Added some feature'`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
28
  4. Push to the branch (`git push origin my-new-feature`)
29
29
  5. Create new Pull Request
data/Rakefile CHANGED
@@ -1,2 +1 @@
1
- #!/usr/bin/env rake
2
1
  require "bundler/gem_tasks"
@@ -0,0 +1,2 @@
1
+ require "rubysl/shellwords/version"
2
+ require "rubysl/shellwords/shellwords"
@@ -0,0 +1,172 @@
1
+ #
2
+ # shellwords.rb: Manipulates strings a la UNIX Bourne shell
3
+ #
4
+
5
+ #
6
+ # This module manipulates strings according to the word parsing rules
7
+ # of the UNIX Bourne shell.
8
+ #
9
+ # The shellwords() function was originally a port of shellwords.pl,
10
+ # but modified to conform to POSIX / SUSv3 (IEEE Std 1003.1-2001).
11
+ #
12
+ # Authors:
13
+ # - Wakou Aoyama
14
+ # - Akinori MUSHA <knu@iDaemons.org>
15
+ #
16
+ # Contact:
17
+ # - Akinori MUSHA <knu@iDaemons.org> (current maintainer)
18
+ #
19
+ module Shellwords
20
+ #
21
+ # Splits a string into an array of tokens in the same way the UNIX
22
+ # Bourne shell does.
23
+ #
24
+ # argv = Shellwords.split('here are "two words"')
25
+ # argv #=> ["here", "are", "two words"]
26
+ #
27
+ # +String#shellsplit+ is a shorthand for this function.
28
+ #
29
+ # argv = 'here are "two words"'.shellsplit
30
+ # argv #=> ["here", "are", "two words"]
31
+ #
32
+ def shellsplit(line)
33
+ line = String.new(line) rescue
34
+ raise(ArgumentError, "Argument must be a string")
35
+ line.lstrip!
36
+ words = []
37
+ until line.empty?
38
+ field = ''
39
+ loop do
40
+ if line.sub!(/\A"(([^"\\]|\\.)*)"/, '') then
41
+ snippet = $1.gsub(/\\(.)/, '\1')
42
+ elsif line =~ /\A"/ then
43
+ raise ArgumentError, "Unmatched double quote: #{line}"
44
+ elsif line.sub!(/\A'([^']*)'/, '') then
45
+ snippet = $1
46
+ elsif line =~ /\A'/ then
47
+ raise ArgumentError, "Unmatched single quote: #{line}"
48
+ elsif line.sub!(/\A\\(.)?/, '') then
49
+ snippet = $1 || '\\'
50
+ elsif line.sub!(/\A([^\s\\'"]+)/, '') then
51
+ snippet = $1
52
+ else
53
+ line.lstrip!
54
+ break
55
+ end
56
+ field.concat(snippet)
57
+ end
58
+ words.push(field)
59
+ end
60
+ words
61
+ end
62
+
63
+ alias shellwords shellsplit
64
+
65
+ module_function :shellsplit, :shellwords
66
+
67
+ class << self
68
+ alias split shellsplit
69
+ end
70
+
71
+ #
72
+ # Escapes a string so that it can be safely used in a Bourne shell
73
+ # command line.
74
+ #
75
+ # Note that a resulted string should be used unquoted and is not
76
+ # intended for use in double quotes nor in single quotes.
77
+ #
78
+ # open("| grep #{Shellwords.escape(pattern)} file") { |pipe|
79
+ # # ...
80
+ # }
81
+ #
82
+ # +String#shellescape+ is a shorthand for this function.
83
+ #
84
+ # open("| grep #{pattern.shellescape} file") { |pipe|
85
+ # # ...
86
+ # }
87
+ #
88
+ def shellescape(str)
89
+ # An empty argument will be skipped, so return empty quotes.
90
+ return "''" if str.empty?
91
+
92
+ str = str.dup
93
+
94
+ # Process as a single byte sequence because not all shell
95
+ # implementations are multibyte aware.
96
+ str.gsub!(/([^A-Za-z0-9_\-.,:\/@\n])/n, "\\\\\\1")
97
+
98
+ # A LF cannot be escaped with a backslash because a backslash + LF
99
+ # combo is regarded as line continuation and simply ignored.
100
+ str.gsub!(/\n/, "'\n'")
101
+
102
+ return str
103
+ end
104
+
105
+ module_function :shellescape
106
+
107
+ class << self
108
+ alias escape shellescape
109
+ end
110
+
111
+ #
112
+ # Builds a command line string from an argument list +array+ joining
113
+ # all elements escaped for Bourne shell and separated by a space.
114
+ #
115
+ # open('|' + Shellwords.join(['grep', pattern, *files])) { |pipe|
116
+ # # ...
117
+ # }
118
+ #
119
+ # +Array#shelljoin+ is a shorthand for this function.
120
+ #
121
+ # open('|' + ['grep', pattern, *files].shelljoin) { |pipe|
122
+ # # ...
123
+ # }
124
+ #
125
+ def shelljoin(array)
126
+ array.map { |arg| shellescape(arg) }.join(' ')
127
+ end
128
+
129
+ module_function :shelljoin
130
+
131
+ class << self
132
+ alias join shelljoin
133
+ end
134
+ end
135
+
136
+ class String
137
+ #
138
+ # call-seq:
139
+ # str.shellsplit => array
140
+ #
141
+ # Splits +str+ into an array of tokens in the same way the UNIX
142
+ # Bourne shell does. See +Shellwords::shellsplit+ for details.
143
+ #
144
+ def shellsplit
145
+ Shellwords.split(self)
146
+ end
147
+
148
+ #
149
+ # call-seq:
150
+ # str.shellescape => string
151
+ #
152
+ # Escapes +str+ so that it can be safely used in a Bourne shell
153
+ # command line. See +Shellwords::shellescape+ for details.
154
+ #
155
+ def shellescape
156
+ Shellwords.escape(self)
157
+ end
158
+ end
159
+
160
+ class Array
161
+ #
162
+ # call-seq:
163
+ # array.shelljoin => string
164
+ #
165
+ # Builds a command line string from an argument list +array+ joining
166
+ # all elements escaped for Bourne shell and separated by a space.
167
+ # See +Shellwords::shelljoin+ for details.
168
+ #
169
+ def shelljoin
170
+ Shellwords.join(self)
171
+ end
172
+ end
@@ -1,5 +1,5 @@
1
1
  module RubySL
2
2
  module Shellwords
3
- VERSION = "0.0.1"
3
+ VERSION = "1.0.1"
4
4
  end
5
5
  end
@@ -0,0 +1 @@
1
+ require "rubysl/shellwords"
@@ -1,22 +1,22 @@
1
- # -*- encoding: utf-8 -*-
2
- require File.expand_path('../lib/rubysl-shellwords/version', __FILE__)
1
+ # coding: utf-8
2
+ require './lib/rubysl/shellwords/version'
3
3
 
4
- Gem::Specification.new do |gem|
5
- gem.authors = ["Brian Shirai"]
6
- gem.email = ["brixen@gmail.com"]
7
- gem.description = %q{Ruby Standard Library - shellwords}
8
- gem.summary = %q{Ruby Standard Library - shellwords}
9
- gem.homepage = ""
4
+ Gem::Specification.new do |spec|
5
+ spec.name = "rubysl-shellwords"
6
+ spec.version = RubySL::Shellwords::VERSION
7
+ spec.authors = ["Brian Shirai"]
8
+ spec.email = ["brixen@gmail.com"]
9
+ spec.description = %q{Ruby standard library shellwords.}
10
+ spec.summary = %q{Ruby standard library shellwords.}
11
+ spec.homepage = "https://github.com/rubysl/rubysl-shellwords"
12
+ spec.license = "BSD"
10
13
 
11
- gem.files = `git ls-files`.split($\)
12
- gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
- gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
- gem.name = "rubysl-shellwords"
15
- gem.require_paths = ["lib"]
16
- gem.version = RubySL::Shellwords::VERSION
14
+ spec.files = `git ls-files`.split($/)
15
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
16
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
17
+ spec.require_paths = ["lib"]
17
18
 
18
- gem.add_runtime_dependency "redcard", "~> 1.0"
19
-
20
- gem.add_development_dependency "rake", "~> 10.0"
21
- gem.add_development_dependency "mspec", "~> 1.5"
19
+ spec.add_development_dependency "bundler", "~> 1.3"
20
+ spec.add_development_dependency "rake", "~> 10.0"
21
+ spec.add_development_dependency "mspec", "~> 1.5"
22
22
  end
@@ -0,0 +1,28 @@
1
+ require 'shellwords'
2
+ include Shellwords
3
+
4
+ describe "Shellwords#shellwords" do
5
+ it "honors quoted strings" do
6
+ shellwords('a "b b" a').should == ['a', 'b b', 'a']
7
+ end
8
+
9
+ it "honors escaped double quotes" do
10
+ shellwords('a "\"b\" c" d').should == ['a', '"b" c', 'd']
11
+ end
12
+
13
+ it "honors escaped single quotes" do
14
+ shellwords("a \"'b' c\" d").should == ['a', "'b' c", 'd']
15
+ end
16
+
17
+ it "honors escaped spaces" do
18
+ shellwords('a b\ c d').should == ['a', 'b c', 'd']
19
+ end
20
+
21
+ it "raises ArgumentError when double quoted strings are misquoted" do
22
+ lambda { shellwords('a "b c d e') }.should raise_error(ArgumentError)
23
+ end
24
+
25
+ it "raises ArgumentError when single quoted strings are misquoted" do
26
+ lambda { shellwords("a 'b c d e") }.should raise_error(ArgumentError)
27
+ end
28
+ end
metadata CHANGED
@@ -1,118 +1,99 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: rubysl-shellwords
3
- version: !ruby/object:Gem::Version
4
- hash: 856480538658449761
5
- prerelease:
6
- segments:
7
- - 0
8
- - 0
9
- - 1
10
- version: 0.0.1
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.1
11
5
  platform: ruby
12
- authors:
6
+ authors:
13
7
  - Brian Shirai
14
8
  autorequire:
15
9
  bindir: bin
16
10
  cert_chain: []
17
-
18
- date: 2013-04-15 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
21
- name: redcard
11
+ date: 2013-08-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
22
21
  prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
- none: false
25
- requirements:
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
26
24
  - - ~>
27
- - !ruby/object:Gem::Version
28
- hash: 4428665182548103036
29
- segments:
30
- - 1
31
- - 0
32
- version: "1.0"
33
- type: :runtime
34
- version_requirements: *id001
35
- - !ruby/object:Gem::Dependency
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
36
28
  name: rake
37
- prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
39
- none: false
40
- requirements:
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
41
31
  - - ~>
42
- - !ruby/object:Gem::Version
43
- hash: 1510892033553700768
44
- segments:
45
- - 10
46
- - 0
47
- version: "10.0"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
48
34
  type: :development
49
- version_requirements: *id002
50
- - !ruby/object:Gem::Dependency
51
- name: mspec
52
35
  prerelease: false
53
- requirement: &id003 !ruby/object:Gem::Requirement
54
- none: false
55
- requirements:
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
56
38
  - - ~>
57
- - !ruby/object:Gem::Version
58
- hash: 1660815245844205030
59
- segments:
60
- - 1
61
- - 5
62
- version: "1.5"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: mspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '1.5'
63
48
  type: :development
64
- version_requirements: *id003
65
- description: Ruby Standard Library - shellwords
66
- email:
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '1.5'
55
+ description: Ruby standard library shellwords.
56
+ email:
67
57
  - brixen@gmail.com
68
58
  executables: []
69
-
70
59
  extensions: []
71
-
72
60
  extra_rdoc_files: []
73
-
74
- files:
61
+ files:
75
62
  - .gitignore
63
+ - .travis.yml
76
64
  - Gemfile
77
65
  - LICENSE
78
66
  - README.md
79
67
  - Rakefile
80
- - lib/rubysl-shellwords.rb
81
- - lib/rubysl-shellwords/version.rb
68
+ - lib/rubysl/shellwords.rb
69
+ - lib/rubysl/shellwords/shellwords.rb
70
+ - lib/rubysl/shellwords/version.rb
71
+ - lib/shellwords.rb
82
72
  - rubysl-shellwords.gemspec
83
- homepage: ""
84
- licenses: []
85
-
73
+ - spec/shellwords_spec.rb
74
+ homepage: https://github.com/rubysl/rubysl-shellwords
75
+ licenses:
76
+ - BSD
77
+ metadata: {}
86
78
  post_install_message:
87
79
  rdoc_options: []
88
-
89
- require_paths:
80
+ require_paths:
90
81
  - lib
91
- required_ruby_version: !ruby/object:Gem::Requirement
92
- none: false
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- hash: 2002549777813010636
97
- segments:
98
- - 0
99
- version: "0"
100
- required_rubygems_version: !ruby/object:Gem::Requirement
101
- none: false
102
- requirements:
103
- - - ">="
104
- - !ruby/object:Gem::Version
105
- hash: 2002549777813010636
106
- segments:
107
- - 0
108
- version: "0"
82
+ required_ruby_version: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - '>='
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ required_rubygems_version: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - '>='
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
109
92
  requirements: []
110
-
111
93
  rubyforge_project:
112
- rubygems_version: 1.8.25
94
+ rubygems_version: 2.0.7
113
95
  signing_key:
114
- specification_version: 3
115
- summary: Ruby Standard Library - shellwords
116
- test_files: []
117
-
118
- has_rdoc:
96
+ specification_version: 4
97
+ summary: Ruby standard library shellwords.
98
+ test_files:
99
+ - spec/shellwords_spec.rb
@@ -1,7 +0,0 @@
1
- require "rubysl-shellwords/version"
2
-
3
- module RubySL
4
- module Shellwords
5
- # Your code goes here...
6
- end
7
- end