cmd_executable 1.0.0 → 1.2.2

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
  SHA256:
3
- metadata.gz: 946605fbae86fd31435538a3a032333fd66673b5667e11f20d8c5c5001a5f7f7
4
- data.tar.gz: 85ddeaf7c6f07a9d95dbf6d634967c5ad863660c4fa545fe64181d1d27712de8
3
+ metadata.gz: 66d9c1f30fd634e52392e967c92564f48b5f3d5dad32b48525328772615df8e8
4
+ data.tar.gz: 162f824d3f8c8007416451e56bc21a4baf49b6d7f4ec6c8ac7bd122e2aa9b3f3
5
5
  SHA512:
6
- metadata.gz: 788cf46157ad006a44a6df48d5981393660be6c4b12c62b34afbb58e3864c8ac5e6085b31c942cb49f33d60fc7a6efdab9862e571c41a94d671e6842c3ba284d
7
- data.tar.gz: 45a773c916e5a7b5b6d2db49f4806307d0920be70303f837c5c6269c72132723e734b9ca9e4b88b291d464c3023f666e2cfda7de63d783ec596b67f9ca5c62ac
6
+ metadata.gz: 7f3fd927f9e7f20bd2bade3e088dd237a94c15cea0ca54cdb63d95a42fc32098b9d73bcf60970b3206b5949f967ea73ccccbd3de310997968e3699f2789935d1
7
+ data.tar.gz: c123587be2664391d5e6598ba470f6669abac78fc87cceef24b8d124258b7314528adba13465ed53b76528d4f30160a494af44b2d3dcdabe9b17bd1353f20999
data/README.md CHANGED
@@ -21,18 +21,29 @@ Or install it yourself as:
21
21
  `$ gem install cmd_executable`
22
22
 
23
23
  ## Usage
24
- ### as Module
24
+ ### as Module (include)
25
25
  ```
26
26
  require 'cmd_executable'
27
27
 
28
28
  class Klass
29
- include 'CmdExecutable'
30
-
31
- def instance_method
32
- executable?('ls')
33
- end
29
+ include CmdExecutable
30
+
31
+ def instance_method
32
+ executable?('/bin/ls')
33
+ executable?('ls')
34
+ executable?(:ls)
35
+ executable?('./bin/setup')
36
+ end
34
37
  end
35
38
  ```
39
+ ### as Module method
40
+ ```
41
+ CmdExecutable.executable?('/bin/ls')
42
+ CmdExecutable.executable?('ls')
43
+ CmdExecutable.executable?(:ls)
44
+ CmdExecutable.executable?('./bin/setup')
45
+ ```
46
+
36
47
  ### as CLI
37
48
  Check executable? :
38
49
 
@@ -37,6 +37,7 @@ Gem::Specification.new do |spec|
37
37
  spec.add_development_dependency 'rake', '~> 13.0'
38
38
  spec.add_development_dependency 'rspec', '~> 3.9'
39
39
  spec.add_development_dependency 'rubocop', '~> 0.85.0'
40
+ spec.add_development_dependency 'stream_capture', '~> 1.0'
40
41
 
41
42
  spec.add_dependency 'thor', '~> 1.0'
42
43
  end
@@ -33,7 +33,7 @@ require 'cmd_executable/version'
33
33
  # require 'cmd_executable'
34
34
  #
35
35
  # class Klass
36
- # include 'CmdExecutable'
36
+ # include CmdExecutable
37
37
  #
38
38
  # def instance_method
39
39
  # executable?('ls')
@@ -43,10 +43,14 @@ module CmdExecutable
43
43
  class CmdExecutableError < StandardError; end
44
44
 
45
45
  def executable?(command)
46
+ CmdExecutable.executable?(command)
47
+ end
48
+
49
+ def self.executable?(command)
46
50
  parsed = CmdExecutable::Parser.new(command)
47
- raise ArgumentError unless parsed.validate?
51
+ raise CmdExecutable::ParserError, parsed.raw unless parsed.validate?
48
52
 
49
- `type '#{parsed.command}' > /dev/null 2>&1`.yield_self do
53
+ `type "#{parsed.command}" > /dev/null 2>&1`.yield_self do
50
54
  $CHILD_STATUS.success?
51
55
  end
52
56
  end
@@ -29,6 +29,8 @@ module CmdExecutable
29
29
 
30
30
  # Parser for CmdExecutable
31
31
  class Parser
32
+ attr_reader :raw
33
+
32
34
  def initialize(raw)
33
35
  @raw = raw
34
36
  @raw.freeze
@@ -37,7 +39,8 @@ module CmdExecutable
37
39
  def validate?
38
40
  !@raw.nil? &&
39
41
  command_class_validate? &&
40
- !@raw.empty?
42
+ !@raw.empty? &&
43
+ !include_invalid_char?
41
44
  end
42
45
 
43
46
  def command
@@ -52,10 +55,15 @@ module CmdExecutable
52
55
  @raw.is_a?(Symbol)
53
56
  end
54
57
 
58
+ def include_invalid_char?
59
+ @raw.match?(/\r\n|\r|\n/) ||
60
+ @raw.match?(/\$\(.*\)/)
61
+ end
62
+
55
63
  def parse
56
- raise CmdExecutable::ParserError unless validate?
64
+ raise CmdExecutable::ParserError, @raw unless validate?
57
65
 
58
- path = @raw.to_s.chomp
66
+ path = escape_char(@raw.to_s.chomp)
59
67
  @dirname = parse_dirname(path)
60
68
  @basename = parse_basename(path)
61
69
  @command = @dirname + @basename
@@ -70,6 +78,10 @@ module CmdExecutable
70
78
  /\A\.\Z/
71
79
  end
72
80
 
81
+ def current_path_at_the_left_regex
82
+ /\A\.#{File::SEPARATOR}/
83
+ end
84
+
73
85
  def basename_exist?(path)
74
86
  path.match?(no_separator_at_the_right_end_regex)
75
87
  end
@@ -78,11 +90,15 @@ module CmdExecutable
78
90
  dir.match?(no_separator_at_the_right_end_regex)
79
91
  end
80
92
 
93
+ def current_path?(path)
94
+ path.match?(current_path_at_the_left_regex)
95
+ end
96
+
81
97
  def parse_dirname(path)
82
98
  return path unless basename_exist?(path)
83
99
 
84
100
  dir = File.dirname(path)
85
- return '' if dir.match?(a_dot_only_regex)
101
+ return '' if dir.match?(a_dot_only_regex) && !current_path?(path)
86
102
 
87
103
  no_right_separator_exists?(dir) ? (dir + File::SEPARATOR) : dir
88
104
  end
@@ -92,5 +108,9 @@ module CmdExecutable
92
108
 
93
109
  File.basename(path).split.first
94
110
  end
111
+
112
+ def escape_char(path)
113
+ path.gsub(/"/, '\"')
114
+ end
95
115
  end
96
116
  end
@@ -34,6 +34,10 @@ module CmdExecutable
34
34
  class Runner < Thor
35
35
  include CmdExecutable
36
36
 
37
+ def self.exit_on_failure?
38
+ true
39
+ end
40
+
37
41
  map '-c' => :check
38
42
 
39
43
  desc '-c [/path/to/command]', "It's return true if given command usable on Linux."
@@ -45,12 +49,15 @@ module CmdExecutable
45
49
  puts 'NOT FOUND'
46
50
  exit 1
47
51
  end
52
+ rescue CmdExecutable::ParserError => e
53
+ warn "Invalid command: `#{e.message}'"
54
+ exit 16
48
55
  end
49
56
 
50
57
  map %w[-v --version] => :version
51
58
  desc '-v --version', 'Show version.'
52
59
  def version
53
- STDOUT.puts CmdExecutable::VERSION
60
+ puts CmdExecutable::VERSION
54
61
  end
55
62
  end
56
63
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module CmdExecutable
4
- VERSION = '1.0.0'
4
+ VERSION = '1.2.2'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cmd_executable
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Toshiki
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-06-07 00:00:00.000000000 Z
11
+ date: 2020-06-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: 0.85.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: stream_capture
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '1.0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '1.0'
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: thor
99
113
  requirement: !ruby/object:Gem::Requirement