oterm 1.0.0 → 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.
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.