cmd_matcher 0.0.2 → 0.0.4

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.
data/Rakefile CHANGED
@@ -13,7 +13,7 @@ require 'spec/rake/spectask'
13
13
 
14
14
  spec = Gem::Specification.new do |s|
15
15
  s.name = 'cmd_matcher'
16
- s.version = '0.0.2'
16
+ s.version = '0.0.4'
17
17
  s.has_rdoc = true
18
18
  s.extra_rdoc_files = ['README', 'LICENSE']
19
19
  s.summary = 'command line response to hash'
data/lib/cmd_matcher.rb CHANGED
@@ -1,15 +1,24 @@
1
1
  class CmdMatcher
2
2
  attr_reader :matches
3
3
 
4
+ # match command line prompt line by line
4
5
  def initialize
5
6
  @matchers = []
6
7
  @matches = {}
7
8
  end
8
9
 
10
+ ## options
11
+ # :names => hash keys
12
+ # :at_most => has xxx lines at most
13
+ # :at_least => has xxx lines at least
14
+ # :no_newline => match line more than 1 times
9
15
  def has(line, opt = {})
10
16
  @matchers << [line, opt]
11
17
  end
12
18
 
19
+ ## options
20
+ # :names => hash keys
21
+ # :no_newline => match line more than 1 times
13
22
  def has_one(line, opt = {})
14
23
  arg = opt.clone
15
24
  arg[:at_most] = nil
@@ -17,10 +26,14 @@ class CmdMatcher
17
26
  has(line, arg)
18
27
  end
19
28
 
29
+ ## options
30
+ # :names => hash keys
31
+ # :at_least => has xxx lines at least
32
+ # :no_newline => match line more than 1 times
20
33
  def has_many(line, opt = {})
21
34
  arg = opt.clone
22
35
  arg[:at_most] = nil
23
- arg[:at_least] = 1
36
+ arg[:at_least] ||= 1
24
37
  has(line, arg)
25
38
  end
26
39
 
@@ -28,16 +41,29 @@ class CmdMatcher
28
41
  lines = prompts.split("\n")
29
42
  @matchers.each {|expect, opt|
30
43
  if opt[:at_most] == nil && opt[:at_least] == nil
31
- if line_match(lines, expect, opt)
32
- lines.shift
44
+ if m = line_match(lines, expect, opt)
45
+ if opt[:no_newline]
46
+ line = lines[0]
47
+ index = line.index(m)
48
+ lines[0] = line[index + m.size..-1]
49
+ else
50
+ lines.shift
51
+ end
33
52
  else
34
53
  return false
35
54
  end
36
55
  else
37
56
  times = 0
38
57
  while true
39
- if line_match(lines, expect, opt)
40
- lines.shift
58
+ if m = line_match(lines, expect, opt)
59
+ if opt[:no_newline]
60
+ line = lines[0]
61
+ index = line.index(m)
62
+ lines[0] = line[index + m.size..-1]
63
+ else
64
+ lines.shift
65
+ end
66
+
41
67
  times += 1
42
68
  else
43
69
  if opt[:at_least] && opt[:at_least] > times
@@ -56,6 +82,7 @@ class CmdMatcher
56
82
  return true
57
83
  end
58
84
 
85
+ private
59
86
  def line_match(lines, expect, opt = {})
60
87
  if expect.is_a?(Regexp)
61
88
  line_regex(lines, expect, opt)
@@ -66,10 +93,14 @@ class CmdMatcher
66
93
 
67
94
  def line_regex(lines, expect, opt = {})
68
95
  line = lines[0]
96
+ unless line
97
+ puts lines.inspect
98
+ end
99
+
69
100
  line_matcher = LineMatcher.new(expect, opt)
70
- if line_matcher.match(line)
101
+ if m = line_matcher.match(line)
71
102
  line_matcher.append_to(@matches)
72
- return true
103
+ return m[0]
73
104
  else
74
105
  puts "<expect>#{expect},\n <but got>#{line}" if $DEBUG
75
106
  return false
@@ -80,7 +111,7 @@ class CmdMatcher
80
111
  line = lines[0]
81
112
  line_equaler = LineEqualer.new(expect, opt)
82
113
  if line_equaler.match(line)
83
- return true
114
+ return line
84
115
  else
85
116
  puts "<expect>#{expect},\n <but got>#{line}" if $DEBUG
86
117
  return false
@@ -101,6 +132,7 @@ class CmdMatcher
101
132
  end
102
133
 
103
134
  def match(line)
135
+ return false unless line
104
136
  m = line.match(@matcher)
105
137
  return false unless m
106
138
  @matches = {}
@@ -111,7 +143,7 @@ class CmdMatcher
111
143
  @matches[name] = m[index + 1]
112
144
  end
113
145
  }
114
- return true
146
+ return m
115
147
  end
116
148
 
117
149
  def append_to(matches)
@@ -0,0 +1,28 @@
1
+ require "rubygems"
2
+ require "benchmark"
3
+ require 'cmd_matcher'
4
+
5
+ n = 10000
6
+
7
+ Benchmark.bm do |x|
8
+ x.report {
9
+ n.times { |i|
10
+ cm = CmdMatcher.new
11
+ cm.has_one "++++++++++++++++++++++++++++++++++"
12
+ cm.has_one "sn type id"
13
+ cm.has_one "++++++++++++++++++++++++++++++++++"
14
+ cm.has_many /(\d+)\s+(trunk|access)\s+(\d+)/, :names => [:sn, :type, :id]
15
+ cm.has "++++++++++++++++++++++++++++++++++", :at_most => 1
16
+ cm.has_one /total\s*(\d+)/, :names => [:total]
17
+
18
+ cm.match(%Q{++++++++++++++++++++++++++++++++++
19
+ sn type id
20
+ ++++++++++++++++++++++++++++++++++
21
+ 1 trunk 100
22
+ 2 access 200
23
+ ++++++++++++++++++++++++++++++++++
24
+ total 2
25
+ })
26
+ }
27
+ }
28
+ end
@@ -3,7 +3,7 @@
3
3
 
4
4
  require "rubygems"
5
5
  require 'cmd_matcher'
6
-
6
+ $DEBUG = true
7
7
  describe "CmdMatcher" do
8
8
  it "should desc" do
9
9
  cm = CmdMatcher.new
@@ -26,5 +26,16 @@ total 2
26
26
  cm.matches[:type][0].should == "trunk"
27
27
  cm.matches[:type][1].should == "access"
28
28
  end
29
+
30
+ it "should no newline" do
31
+ cm = CmdMatcher.new
32
+ cm.has_one /hello (\w+), and/, :no_newline => true, :names => [:name]
33
+ cm.has_many /(\w+)/, :names => [:other], :no_newline => true
34
+
35
+ cm.match(%Q{hello world, and a b c d e}).should == true
36
+ cm.matches[:name].should == "world"
37
+ cm.matches[:other][0].should == "a"
38
+ cm.matches[:other][1].should == "b"
39
+ end
29
40
  end
30
41
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cmd_matcher
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 23
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 2
10
- version: 0.0.2
9
+ - 4
10
+ version: 0.0.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - YuZhenpin
@@ -32,6 +32,7 @@ files:
32
32
  - README
33
33
  - Rakefile
34
34
  - lib/cmd_matcher.rb
35
+ - spec/cmd_matcher_benchmark.rb
35
36
  - spec/cmd_matcher_spec.rb
36
37
  - spec/line_matcher_spec.rb
37
38
  homepage: