apohllo-cyc-console 0.0.2 → 0.0.3
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/changelog.txt +8 -0
- data/cyc-console.gemspec +8 -5
- data/lib/cyc/console.rb +154 -0
- metadata +3 -1
data/changelog.txt
ADDED
data/cyc-console.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "cyc-console"
|
3
|
-
s.version = "0.0.
|
3
|
+
s.version = "0.0.3"
|
4
4
|
s.date = "2009-07-15"
|
5
5
|
s.summary = "Ruby console for the Cyc ontology"
|
6
6
|
s.email = "apohllo@o2.pl"
|
@@ -10,10 +10,13 @@ Gem::Specification.new do |s|
|
|
10
10
|
# the lib path is added to the LOAD_PATH
|
11
11
|
s.require_path = "lib"
|
12
12
|
# include Rakefile, gemspec, README and all the source files
|
13
|
-
s.files = [
|
14
|
-
|
15
|
-
|
16
|
-
|
13
|
+
s.files = [
|
14
|
+
'lib/cyc/console.rb',
|
15
|
+
"Rakefile",
|
16
|
+
"cyc-console.gemspec",
|
17
|
+
"README.txt",
|
18
|
+
"changelog.txt"
|
19
|
+
]
|
17
20
|
# include README while generating rdoc
|
18
21
|
s.rdoc_options = ["--main", "README.txt"]
|
19
22
|
s.has_rdoc = true
|
data/lib/cyc/console.rb
ADDED
@@ -0,0 +1,154 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
require 'readline'
|
4
|
+
require 'colors'
|
5
|
+
require 'net/telnet'
|
6
|
+
|
7
|
+
module Cyc
|
8
|
+
class ParenthesisNotMatched < RuntimeError; end
|
9
|
+
#
|
10
|
+
# Stolen (with permission for the author:) from Wirble history for IRB
|
11
|
+
# http://pablotron.org/software/wirble/
|
12
|
+
#
|
13
|
+
class History
|
14
|
+
DEFAULTS = {
|
15
|
+
:history_path => ENV['CYC_HISTORY_FILE'] || "~/.cyc_history",
|
16
|
+
:history_size => (ENV['CYC_HISTORY_SIZE'] || 1000).to_i,
|
17
|
+
:history_perms => File::WRONLY | File::CREAT | File::TRUNC,
|
18
|
+
}
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def say(*args)
|
23
|
+
puts *args if @verbose
|
24
|
+
end
|
25
|
+
|
26
|
+
def cfg(key)
|
27
|
+
@opt["history_#{key}".intern]
|
28
|
+
end
|
29
|
+
|
30
|
+
def save_history
|
31
|
+
path, max_size, perms = %w{path size perms}.map { |v| cfg(v) }
|
32
|
+
|
33
|
+
# read lines from history, and truncate the list (if necessary)
|
34
|
+
lines = Readline::HISTORY.to_a.uniq
|
35
|
+
lines = lines[-max_size, -1] if lines.size > max_size
|
36
|
+
|
37
|
+
# write the history file
|
38
|
+
real_path = File.expand_path(path)
|
39
|
+
File.open(real_path, perms) { |fh| fh.puts lines }
|
40
|
+
say 'Saved %d lines to history file %s.' % [lines.size, path]
|
41
|
+
end
|
42
|
+
|
43
|
+
def load_history
|
44
|
+
# expand history file and make sure it exists
|
45
|
+
real_path = File.expand_path(cfg('path'))
|
46
|
+
unless File.exist?(real_path)
|
47
|
+
say "History file #{real_path} doesn't exist."
|
48
|
+
return
|
49
|
+
end
|
50
|
+
|
51
|
+
# read lines from file and add them to history
|
52
|
+
lines = File.readlines(real_path).map { |line| line.chomp }
|
53
|
+
Readline::HISTORY.push(*lines)
|
54
|
+
|
55
|
+
say 'Read %d lines from history file %s' % [lines.size, cfg('path')]
|
56
|
+
end
|
57
|
+
|
58
|
+
public
|
59
|
+
|
60
|
+
def initialize(opt = nil)
|
61
|
+
@opt = DEFAULTS.merge(opt || {})
|
62
|
+
return unless defined? Readline::HISTORY
|
63
|
+
load_history
|
64
|
+
Kernel.at_exit { save_history }
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
class Console
|
69
|
+
@@constants = []
|
70
|
+
|
71
|
+
API_QUIT = "(api-quit)"
|
72
|
+
|
73
|
+
# Initializes connection with Cyc runing on host :host: on port :port:
|
74
|
+
def initialize(host, port)
|
75
|
+
History.new({})
|
76
|
+
@host = host
|
77
|
+
@port = port
|
78
|
+
@conn = Net::Telnet.new("Port" => @port, "Telnetmode" => false,
|
79
|
+
"Host" => @host, "Timeout" => 600)
|
80
|
+
@line = ""
|
81
|
+
@count = 0
|
82
|
+
end
|
83
|
+
|
84
|
+
# Scans the :str: to find out if the parenthesis are matched
|
85
|
+
# raises ParenthesisNotMatched exception if there is not matched closing
|
86
|
+
# parenthesis. The message of the exception contains the string with the
|
87
|
+
# unmatched parenthesis highlighted.
|
88
|
+
def match_par(str)
|
89
|
+
position = 0
|
90
|
+
str.scan(/./) do |char|
|
91
|
+
position += 1
|
92
|
+
next if char !~ /\(|\)/
|
93
|
+
@count += (char == "(" ? 1 : -1)
|
94
|
+
if @count < 0
|
95
|
+
@count = 0
|
96
|
+
raise ParenthesisNotMatched.
|
97
|
+
new((position > 1 ? str[0..position-2] : "") +
|
98
|
+
")".hl(:red) + str[position..-1])
|
99
|
+
end
|
100
|
+
end
|
101
|
+
@count == 0
|
102
|
+
end
|
103
|
+
|
104
|
+
def add_autocompletion(str)
|
105
|
+
@@constants |= str.split(/[() ]/).select{|e| e =~ /\#\$/}
|
106
|
+
end
|
107
|
+
|
108
|
+
# The main loop of the console
|
109
|
+
def main_loop
|
110
|
+
loop do
|
111
|
+
begin
|
112
|
+
line = Readline::readline(("cyc@" + "#{@host}:#{@port}" +
|
113
|
+
(@count > 0 ? ":#{"("*@count}" : "") + "> ").hl(:blue))
|
114
|
+
case line
|
115
|
+
when API_QUIT
|
116
|
+
@conn.puts(line)
|
117
|
+
break
|
118
|
+
when "exit"
|
119
|
+
@conn.puts(API_QUIT)
|
120
|
+
break
|
121
|
+
else
|
122
|
+
@line += "\n" unless @line.empty?
|
123
|
+
@line += line
|
124
|
+
letters = @line.split("")
|
125
|
+
Readline::HISTORY.push(@line) if line
|
126
|
+
if match_par(line)
|
127
|
+
@conn.puts(@line)
|
128
|
+
@line = ""
|
129
|
+
answer = @conn.waitfor(/\d\d\d/)
|
130
|
+
message = answer.sub(/(\d\d\d) (.*)\n/,"\\2") if answer
|
131
|
+
if($1.to_i == 200)
|
132
|
+
puts message
|
133
|
+
add_autocompletion(message)
|
134
|
+
else
|
135
|
+
puts "Error: " + answer.to_s
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
rescue ParenthesisNotMatched => exception
|
140
|
+
puts exception
|
141
|
+
@line = ""
|
142
|
+
# rescue Exception => exception
|
143
|
+
# puts exception
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
CompletionProc = proc {|input|
|
149
|
+
candidates = %w{denotation-mapper}
|
150
|
+
@@constants.grep(/^#{Regexp.quote(input)}/)
|
151
|
+
}
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: apohllo-cyc-console
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aleksander Pohl
|
@@ -31,9 +31,11 @@ extensions: []
|
|
31
31
|
extra_rdoc_files:
|
32
32
|
- README.txt
|
33
33
|
files:
|
34
|
+
- lib/cyc/console.rb
|
34
35
|
- Rakefile
|
35
36
|
- cyc-console.gemspec
|
36
37
|
- README.txt
|
38
|
+
- changelog.txt
|
37
39
|
has_rdoc: true
|
38
40
|
homepage: http://apohllo.pl
|
39
41
|
post_install_message:
|