oterm 1.0.0 → 1.0.1

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: c57083633eb77e165e8331ee3b28ce62a2a25c41
4
- data.tar.gz: db9c45d79b15fa85e8c5a82c413e29108e7e1d41
3
+ metadata.gz: c4ffb3d022acd1a1c9d19c8fe681e244bd5776c4
4
+ data.tar.gz: 9ccc958e6be60b2901b09d1d7cae2149d0abe2d6
5
5
  SHA512:
6
- metadata.gz: 59fb9a821cde9ba1c4974ecf18fa32cef38a1db7d3c187b8a274273c4459d225be3f308d4132cb4f4f126751d1a75eb786869542ffedb88f830ed63f2855d6df
7
- data.tar.gz: 5702073e0ce8e0afe661019d0da7f8c42a845cbd2d9c09297332290996217b954ad7b063b944d4d1d13575225c0c55fef8ab941d9db8a1720e4c8369d224ac5c
6
+ metadata.gz: 29ce77069d8db5bc35118f5019136fce4d411855cb94b5fc3610e1909b45d7f389b2d015c39d4597924af04e4b1e44d472303f203a62b5a5d69f7e4e6e3a8a84
7
+ data.tar.gz: 9fa38ef102e1fcd4de434e016c256efa6cecfcae73d119aec5e056eb8eb783b58130f627e1fef4f36980da0086888f297dbd195d7860b980b906a11ec9b53fa7
data/README.md CHANGED
@@ -35,12 +35,18 @@ soon in the ODisk application and later in a more interesting project.
35
35
 
36
36
  *RubyGems* *repo*: https://rubygems.org/gems/oterm
37
37
 
38
- Follow [@peterohler on Twitter](http://twitter.com/#!/peterohler) for announcements and news about the Oj gem.
38
+ Follow [@peterohler on Twitter](http://twitter.com/#!/peterohler) for announcements and news about the OTerm gem.
39
39
 
40
40
  ## <a name="build_status">Build Status</a>
41
41
 
42
42
  [![Build Status](https://secure.travis-ci.org/ohler55/oterm.png?branch=master)](http://travis-ci.org/ohler55/oterm)
43
43
 
44
+ ### Current Release 1.0.1 - December 27, 2013
45
+
46
+ - Improved completion handling
47
+
48
+ - Fixed some bugs
49
+
44
50
  ### Current Release 1.0.0 - December 22, 2013
45
51
 
46
52
  - First release. There will be rough edges.
@@ -20,7 +20,7 @@ module OTerm
20
20
  def execute(cmd, listener)
21
21
  name, args = cmd.split(' ', 2)
22
22
  c = @cmds[name]
23
- if nil == c
23
+ if c.nil?
24
24
  missing(cmd, listener)
25
25
  return
26
26
  end
@@ -29,9 +29,9 @@ module OTerm
29
29
 
30
30
  def help(listener, arg=nil)
31
31
  listener.out.pl()
32
- if nil != arg
32
+ if !arg.nil?
33
33
  c = @cmds[arg]
34
- if nil != c
34
+ if !c.nil?
35
35
  listener.out.pl("#{arg} - #{c.summary}")
36
36
  c.desc.each do |line|
37
37
  listener.out.pl(" #{line}")
@@ -81,6 +81,8 @@ module OTerm
81
81
  @cmds.each_key do |name|
82
82
  comp << name if name.start_with?(cmd)
83
83
  end
84
+ return if 0 == comp.size
85
+
84
86
  if 1 == comp.size
85
87
  listener.move_col(1000)
86
88
  listener.insert(comp[0][listener.buf.size..-1])
@@ -91,7 +93,15 @@ module OTerm
91
93
  comp.each do |name|
92
94
  listener.out.pl(name)
93
95
  end
94
- listener.update_cmd(0)
96
+ best = best_completion(cmd, comp)
97
+ if best == cmd
98
+ listener.update_cmd(0)
99
+ else
100
+ listener.move_col(1000)
101
+ listener.insert(best[listener.buf.size..-1])
102
+ listener.out.prompt()
103
+ listener.out.p(listener.buf)
104
+ end
95
105
  end
96
106
  end
97
107
 
@@ -99,6 +109,22 @@ module OTerm
99
109
  @cmds[cmd] = Cmd.new(target, op, summary, desc)
100
110
  end
101
111
 
112
+ def best_completion(pre, names)
113
+ plen = pre.size
114
+ # Must make a copy as pre is not frozen.
115
+ pre = String.new(pre)
116
+ target = names[0]
117
+ names = names[1..-1]
118
+ for i in plen..target.size
119
+ c = target[i]
120
+ names.each do |n|
121
+ return pre unless c == n[i]
122
+ end
123
+ pre << c
124
+ end
125
+ pre
126
+ end
127
+
102
128
  class Cmd
103
129
  attr_accessor :target
104
130
  attr_accessor :op
@@ -109,7 +135,11 @@ module OTerm
109
135
  @target = target
110
136
  @op = op
111
137
  @summary = summary
112
- @desc = desc.split("\n")
138
+ if desc.nil?
139
+ @desc = summary
140
+ else
141
+ @desc = desc.split("\n")
142
+ end
113
143
  end
114
144
  end # Cmd
115
145
 
@@ -27,13 +27,13 @@ module OTerm
27
27
  @done = false
28
28
 
29
29
  greeting = executor.greeting()
30
- @out.pl(greeting) if nil != greeting
30
+ @out.pl(greeting) unless greeting.nil?
31
31
 
32
32
  # initiate negotiations for single character mode and no echo
33
33
  @out.p(Telnet.msg(Telnet::DO, Telnet::SGA) + Telnet.msg(Telnet::DO, Telnet::ECHO))
34
34
 
35
35
  out.prompt()
36
- while !@done
36
+ until @done
37
37
  line = con.recv(100)
38
38
  begin
39
39
  len = line.size()
@@ -104,8 +104,19 @@ module OTerm
104
104
  end
105
105
 
106
106
  def vt100_cmd(line)
107
- puts "*** vt100 command"
108
- # TBD
107
+ # Possible arrow key.
108
+ if 3 == line.size() && '[' == line[1]
109
+ case line[2]
110
+ when 'A' # up arrow
111
+ history_back()
112
+ when 'B' # down arrow
113
+ history_forward()
114
+ when 'C' # right arrow
115
+ move_col(1)
116
+ when 'D' # left arrow
117
+ move_col(-1)
118
+ end
119
+ end
109
120
  end
110
121
 
111
122
  def exec_cmd(cmd)
@@ -156,23 +167,9 @@ module OTerm
156
167
  update_cmd(blen)
157
168
  end
158
169
  when 14 # ^n
159
- if 0 < @hp && @hp <= @history.size()
160
- @hp -= 1
161
- blen = @buf.size()
162
- if 0 == @hp
163
- @buf = ''
164
- else
165
- @buf = @history[-@hp]
166
- end
167
- update_cmd(blen)
168
- end
170
+ history_forward()
169
171
  when 16 # ^p
170
- if @hp < @history.size()
171
- @hp += 1
172
- blen = @buf.size()
173
- @buf = @history[-@hp]
174
- update_cmd(blen)
175
- end
172
+ history_back()
176
173
  when 21 # ^u
177
174
  @hp -= 1
178
175
  @buf = ''
@@ -210,6 +207,28 @@ module OTerm
210
207
  end
211
208
  end
212
209
 
210
+ def history_back()
211
+ if @hp < @history.size()
212
+ @hp += 1
213
+ blen = @buf.size()
214
+ @buf = @history[-@hp]
215
+ update_cmd(blen)
216
+ end
217
+ end
218
+
219
+ def history_forward()
220
+ if 0 < @hp && @hp <= @history.size()
221
+ @hp -= 1
222
+ blen = @buf.size()
223
+ if 0 == @hp
224
+ @buf = ''
225
+ else
226
+ @buf = @history[-@hp]
227
+ end
228
+ update_cmd(blen)
229
+ end
230
+ end
231
+
213
232
  def insert(str)
214
233
  # TBD be smarter with vt100
215
234
  if 0 == @col
@@ -7,7 +7,9 @@ module OTerm
7
7
  end
8
8
 
9
9
  def prompt()
10
+ dim()
10
11
  @con.print("\r> ")
12
+ attrs_off()
11
13
  end
12
14
 
13
15
  def p(str)
@@ -32,5 +32,9 @@ module OTerm
32
32
  @listeners.delete(listener)
33
33
  end
34
34
 
35
+ def join()
36
+ @acceptThread.join()
37
+ end
38
+
35
39
  end # Server
36
40
  end # OTerm
@@ -1,4 +1,4 @@
1
1
  module OTerm
2
2
  # Current version of the module.
3
- VERSION = '1.0.0'
3
+ VERSION = '1.0.1'
4
4
  end
@@ -3,7 +3,7 @@ module OTerm
3
3
 
4
4
  class VT100
5
5
  ESC = 27.chr
6
- MAX_DIM = 10000
6
+ MAX_DIM = 9999
7
7
 
8
8
  # graphic font characters
9
9
  BLANK = '_'
@@ -140,7 +140,6 @@ module OTerm
140
140
  def bold()
141
141
  @con.print("\x1b[1m") if @is_vt100
142
142
  end
143
- alias bright bold
144
143
 
145
144
  def dim()
146
145
  @con.print("\x1b[2m") if @is_vt100
@@ -158,6 +157,10 @@ module OTerm
158
157
  @con.print("\x1b[7m") if @is_vt100
159
158
  end
160
159
 
160
+ def invisible()
161
+ @con.print("\x1b[8m") if @is_vt100
162
+ end
163
+
161
164
  def big_top()
162
165
  @con.print("\x1b#3") if @is_vt100
163
166
  end
@@ -39,13 +39,15 @@ class Ex < OTerm::Executor
39
39
  o.restore_cursor()
40
40
  end
41
41
 
42
+ =begin
42
43
  def missing(cmd, listener)
43
- listerner.out.pl("'#{cmd}' is not a recognized command.")
44
+ listener.out.pl("'#{cmd}' is not a recognized command.")
44
45
  end
46
+ =end
45
47
 
46
48
  end # Ex
47
49
 
48
50
  executor = Ex.new()
49
51
 
50
52
  server = OTerm::Server.new(executor, 6060, true)
51
- server.acceptThread.join()
53
+ server.join()
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oterm
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Ohler
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-12-22 00:00:00.000000000 Z
11
+ date: 2013-12-27 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: 'A remote terminal that can be used for interacting with an application
14
14
  and invoking operations remotely. Telnet and VT100 over a telnet connection are
@@ -19,6 +19,9 @@ extensions: []
19
19
  extra_rdoc_files:
20
20
  - README.md
21
21
  files:
22
+ - LICENSE
23
+ - README.md
24
+ - lib/oterm.rb
22
25
  - lib/oterm/errors.rb
23
26
  - lib/oterm/executor.rb
24
27
  - lib/oterm/listener.rb
@@ -28,10 +31,7 @@ files:
28
31
  - lib/oterm/telnet.rb
29
32
  - lib/oterm/version.rb
30
33
  - lib/oterm/vt100.rb
31
- - lib/oterm.rb
32
34
  - test/server_test.rb
33
- - LICENSE
34
- - README.md
35
35
  homepage: http://www.ohler.com/oterm
36
36
  licenses:
37
37
  - MIT
@@ -39,23 +39,23 @@ licenses:
39
39
  metadata: {}
40
40
  post_install_message:
41
41
  rdoc_options:
42
- - --main
42
+ - "--main"
43
43
  - README.md
44
44
  require_paths:
45
45
  - lib
46
46
  required_ruby_version: !ruby/object:Gem::Requirement
47
47
  requirements:
48
- - - '>='
48
+ - - ">="
49
49
  - !ruby/object:Gem::Version
50
50
  version: '0'
51
51
  required_rubygems_version: !ruby/object:Gem::Requirement
52
52
  requirements:
53
- - - '>='
53
+ - - ">="
54
54
  - !ruby/object:Gem::Version
55
55
  version: '0'
56
56
  requirements: []
57
57
  rubyforge_project: oterm
58
- rubygems_version: 2.0.14
58
+ rubygems_version: 2.2.0
59
59
  signing_key:
60
60
  specification_version: 4
61
61
  summary: A operations terminal server.