sekka 0.9.1 → 0.9.2

Sign up to get free protection for your applications and to get access to all the features.
data/bin/sekka-jisyo CHANGED
@@ -65,23 +65,47 @@ core.evalStr( <<";;END-OF-SCRIPT" )
65
65
  (dump-sekka-jisyo-f STDOUT sekka-file))
66
66
 
67
67
 
68
+ (define (restore-sekka-jisyo tsv-file target)
69
+ (with-open
70
+ tsv-file
71
+ (lambda (f)
72
+ (restore-sekka-jisyo-f
73
+ f
74
+ target))))
75
+
76
+
68
77
  (define (display-help)
69
78
  (print "Usage : ")
70
- (print " sekka-jisyo convert SKK-JISYO.X > SEKKA-JISYO.X ... output SEKKA-JISYO to STDOUT")
71
- (print " sekka-jisyo load SEKKA-JISYO.X SEKKA-JISYO.X.tch ... load SEKKA-JISYO to Tokyo Cabinet DB")
72
- (print " sekka-jisyo load SEKKA-JISYO.X SEKKA-JISYO.X.db ... load SEKKA-JISYO to ndbm DB")
73
- (print " sekka-jisyo dump SEKKA-JISYO.X.tch ... dump Tokyo Cabinet DB to SEKKA-JISYO(STDOUT)")
74
- (print " sekka-jisyo dump SEKKA-JISYO.X.db ... dump ndbm DB to SEKKA-JISYO(STDOUT)"))
79
+ (print " sekka-jisyo convert SKK-JISYO.X > SEKKA-JISYO.X ... output SEKKA-JISYO to STDOUT")
80
+ (print " sekka-jisyo load SEKKA-JISYO.X SEKKA-JISYO.X.tch ... load SEKKA-JISYO to Tokyo Cabinet DB")
81
+ (print " sekka-jisyo load SEKKA-JISYO.X SEKKA-JISYO.X.db ... load SEKKA-JISYO to ndbm DB")
82
+ (print " sekka-jisyo load SEKKA-JISYO.X redis:[hostname] ... load SEKKA-JISYO to redis DB on [hostname]")
83
+ (print " sekka-jisyo load SEKKA-JISYO.X redis: ... load SEKKA-JISYO to redis DB on localhost")
84
+ (print " sekka-jisyo dump SEKKA-JISYO.X.tch ... dump Tokyo Cabinet DB to DUMPDATA(STDOUT)")
85
+ (print " sekka-jisyo dump SEKKA-JISYO.X.db ... dump ndbm to DUMPDATA(STDOUT)")
86
+ (print " sekka-jisyo dump redis:[hostname] ... dump redis DB on [hostname] to DUMPDATA(STDOUT)")
87
+ (print " sekka-jisyo dump redis: ... dump redis DB on localhost to DUMPDATE(STDOUT)")
88
+ (print " sekka-jisyo restore SEKKA-JISYO.X.tsv redis:[hostname] ... restore redis DB on [hostname] from tsv-file")
89
+ (print " sekka-jisyo restore SEKKA-JISYO.X.tsv redis: ... restore redis DB on localhost from tsv-file"))
90
+
75
91
 
76
92
  (define (analyze-kvs-type filename)
77
93
  (cond
78
94
  ((rxmatch #/[.]tch$/ filename)
79
- 'tokyocabinet)
95
+ (values 'tokyocabinet filename))
80
96
  ((rxmatch #/[.]db$/ filename)
81
- 'dbm)
97
+ (values 'dbm filename))
98
+ ((rxmatch #/^redis:(.*)$/ filename)
99
+ => (lambda (m)
100
+ (let1 str (rxmatch-substring m 1)
101
+ (let1 hostname (if (< 0 (str.size))
102
+ str
103
+ "localhost")
104
+ (values 'redis hostname)))))
82
105
  (else
83
106
  (errorf "Error: analyze-kvs-type() got unsupported filename [%s] \n" filename))))
84
107
 
108
+
85
109
  (define (main argv)
86
110
  (cond
87
111
  ((= 0 (length argv))
@@ -95,16 +119,28 @@ core.evalStr( <<";;END-OF-SCRIPT" )
95
119
  (convert-skk-jisyo (second argv))))
96
120
  ((eq? 'load command)
97
121
  (let1 filename (third argv)
98
- (set-kvs-type (analyze-kvs-type filename))
99
- (if (< (length argv) 3)
100
- (display-help)
101
- (load-sekka-jisyo (second argv) filename))))
122
+ (receive (type param)
123
+ (analyze-kvs-type filename)
124
+ (set-kvs-type type)
125
+ (if (< (length argv) 3)
126
+ (display-help)
127
+ (load-sekka-jisyo (second argv) param)))))
102
128
  ((eq? 'dump command)
103
129
  (let1 filename (second argv)
104
- (set-kvs-type (analyze-kvs-type filename))
105
- (if (< (length argv) 2)
106
- (display-help)
107
- (dump-sekka-jisyo filename))))
130
+ (receive (type param)
131
+ (analyze-kvs-type filename)
132
+ (set-kvs-type type)
133
+ (if (< (length argv) 2)
134
+ (display-help)
135
+ (dump-sekka-jisyo param)))))
136
+ ((eq? 'restore command)
137
+ (if (< (length argv) 3)
138
+ (display-help)
139
+ (let1 target (third argv)
140
+ (receive (type hostname)
141
+ (analyze-kvs-type target)
142
+ (set-kvs-type type)
143
+ (restore-sekka-jisyo (second argv) hostname)))))
108
144
  (else
109
145
  (errorf "Error: no such command [%s] \n" command )))))))
110
146
 
data/bin/sekka-server CHANGED
@@ -27,6 +27,26 @@ TC_FILE_LIST = [ DICTDIR + "/SEKKA-JISYO.CUSTOM.tch",
27
27
 
28
28
  MEMCACHED = "localhost:11211" # memcahced
29
29
 
30
+ def getSekkaDbInfo( env )
31
+ if env.has_key?( 'SEKKA_DB' )
32
+ m = env['SEKKA_DB'].match( /^redis:(.*)$/ )
33
+ if m
34
+ dictSource = if 0 == m[1].size
35
+ dictSource = "localhost"
36
+ else
37
+ dictSource = m[1]
38
+ end
39
+ [ :redis, dictSource ]
40
+ elsif m = ENV['SEKKA_DB'].match( /^tokyo[a-z]+$/ )
41
+ [ :tokyocabinet, nil ]
42
+ else
43
+ raise RuntimeError, "Error: env var SEKKA_DB requires [redis:hostname] or [redis:] or [tokyocabinet]"
44
+ end
45
+ else
46
+ [ :tokyocabinet, nil ]
47
+ end
48
+ end
49
+
30
50
 
31
51
  def main
32
52
  if not File.directory?( DICTDIR )
@@ -48,7 +68,7 @@ def main
48
68
  proxyHost = uri.host
49
69
  end
50
70
 
51
- if not File.exist?( TC_FILE )
71
+ if not File.exist?( TSVFILE )
52
72
  STDERR.printf( "Info: Downloading SEKKA-JISYO\n" )
53
73
  # 辞書をダウンロードする
54
74
  cmd = sprintf( "curl -o %s %s", TSVFILE, TSVURL )
@@ -76,26 +96,61 @@ def main
76
96
  exit( 1 )
77
97
  end
78
98
  }
79
-
80
- # tsvファイルをTokyo CabinetのHashDB化する
81
- STDERR.printf( "Info: Converting TSV file to Tokyo Cabinet *.tch\n" )
82
- cmd = sprintf( "tchmgr importtsv %s %s", TC_FILE, TSVFILE )
83
- STDERR.printf( "Command : %s\n", cmd )
84
- system( cmd )
85
-
86
- # 中身を確認する(tchmgrで読めるものができている)
87
- STDERR.printf( "Info: inform *.tch\n" )
88
- cmd = sprintf( "tchmgr inform %s", TC_FILE )
89
- STDERR.printf( "Command : %s\n", cmd )
90
- system( cmd )
91
-
92
99
  end
93
100
 
94
- # 辞書ディレクトリに存在している辞書ファイルリストを作る
95
- list = TC_FILE_LIST.select { |name| File.exist?( name ) }
101
+ # 環境変数から、DBの接続先情報を取得する。
102
+ ( dictType, dictSource ) = getSekkaDbInfo( ENV )
103
+
104
+ case dictType
105
+ when :tokyocabinet
106
+ # .tchファイルが存在すうるか調べる
107
+ list = TC_FILE_LIST.select { |name| File.exist?( name ) }
108
+
109
+ if 0 == list.size
110
+ # tsvファイルをTokyo CabinetのHashDB化する
111
+ STDERR.printf( "Info: Converting TSV file to Tokyo Cabinet *.tch\n" )
112
+ cmd = sprintf( "tchmgr importtsv %s %s", TC_FILE, TSVFILE )
113
+ STDERR.printf( "Command : %s\n", cmd )
114
+ system( cmd )
115
+
116
+ # 中身を確認する(tchmgrで読めるものができている)
117
+ STDERR.printf( "Info: inform *.tch\n" )
118
+ cmd = sprintf( "tchmgr inform %s", TC_FILE )
119
+ STDERR.printf( "Command : %s\n", cmd )
120
+ system( cmd )
121
+ end
122
+
123
+ # 存在する.tchファイルの中で一番最初のファイルを使う。
124
+ list = TC_FILE_LIST.select { |name| File.exist?( name ) }
125
+ dictSource = list[0]
126
+ when :redis
127
+ key = "SEKKA::VERSION"
128
+ # redisサーバーに辞書が投入済みか確認する
129
+ STDERR.printf( "Info: Checking SEKKA jisyo on redis server...\n" )
130
+ require 'redis'
131
+ require 'sekka/kvs'
132
+ redis = Kvs.new( :redis )
133
+ begin
134
+ redis.open( dictSource )
135
+ result = redis.get( key )
136
+ rescue => e
137
+ STDERR.printf( "Error: sekka-server can't connect to redis(port=%s)...\n", dictSource )
138
+ exit 1
139
+ end
140
+ unless result
141
+ # tsvファイルをuploadする。
142
+ STDERR.printf( "Info: Uploading...\n" )
143
+ cmd = sprintf( "sekka-jisyo restore %s %s:%s", TSVFILE, dictType, dictSource )
144
+ STDERR.printf( "Command : %s\n", cmd )
145
+ system( cmd )
146
+ end
147
+ STDERR.printf( "Info: [OK]\n" )
148
+ else
149
+ raise RuntimeError, sprintf( "Error: unknown dictType [%s]", dictType )
150
+ end
96
151
 
97
152
  # 設定項目をConfigオブジェクトに代入
98
- SekkaServer::Config.setup( list[0], MEMCACHED, 12929, proxyHost, proxyPort )
153
+ SekkaServer::Config.setup( dictType, dictSource, MEMCACHED, 12929, proxyHost, proxyPort )
99
154
 
100
155
  # サーバースクリプトのrootディレクトリへ移動
101
156
  FileUtils.cd(File.dirname(__FILE__) + "/../")
data/emacs/sekka.el CHANGED
@@ -109,6 +109,11 @@ non-nil で明示的に呼びだすまでGoogleIMEは起動しない。"
109
109
  :type 'boolean
110
110
  :group 'sekka)
111
111
 
112
+ (defcustom sekka-muhenkan-key "q"
113
+ "*Non-nil であれば、リアルタイムガイド表示中はqキーで無変換のままスペースを挿入する。q以外のキーも設定可能。
114
+ 但し、アルファベットのようにバッファにinsert可能な文字のみ設定可能。"
115
+ :type 'string
116
+ :group 'sekka)
112
117
 
113
118
 
114
119
  (defface sekka-guide-face
@@ -1359,6 +1364,21 @@ non-nil で明示的に呼びだすまでGoogleIMEは起動しない。"
1359
1364
  (sekka-insert-space arg))))))
1360
1365
 
1361
1366
 
1367
+ (defun sekka-muhenkan-key-init-function ()
1368
+ (define-key global-map sekka-muhenkan-key
1369
+ '(lambda (&optional arg)(interactive "P")
1370
+ (if (< 0 sekka-timer-rest)
1371
+ ;; qキーで無変換+スペースを入力する
1372
+ (cond
1373
+ ((string= " " (char-to-string (preceding-char)))
1374
+ ;; 2回目のキー入力で本来のsekka-muhenkan-keyで定義された文字を挿入する
1375
+ (insert sekka-muhenkan-key))
1376
+ (t
1377
+ ;; 無変換で進むために、スペースを開ける。
1378
+ (sekka-insert-space 1)))
1379
+ (insert sekka-muhenkan-key)))))
1380
+
1381
+
1362
1382
  (defun sekka-realtime-guide ()
1363
1383
  "リアルタイムで変換中のガイドを出す
1364
1384
  sekka-modeがONの間中呼び出される可能性がある。"
@@ -1484,6 +1504,8 @@ point から行頭方向に同種の文字列が続く間を漢字変換しま
1484
1504
  (add-hook 'sekka-mode-hook 'sekka-sticky-shift-init-function))
1485
1505
 
1486
1506
  (add-hook 'sekka-mode-hook 'sekka-spacekey-init-function)
1507
+ (when sekka-muhenkan-key
1508
+ (add-hook 'sekka-mode-hook 'sekka-muhenkan-key-init-function))
1487
1509
 
1488
1510
  (when sekka-mode (run-hooks 'sekka-mode-hook))
1489
1511
 
@@ -1530,7 +1552,7 @@ point から行頭方向に同種の文字列が続く間を漢字変換しま
1530
1552
  (setq default-input-method "japanese-sekka")
1531
1553
 
1532
1554
  (defconst sekka-version
1533
- "0.9.1" ;;SEKKA-VERSION
1555
+ "0.9.2" ;;SEKKA-VERSION
1534
1556
  )
1535
1557
  (defun sekka-version (&optional arg)
1536
1558
  "入力モード変更"
@@ -34,11 +34,14 @@
34
34
  ;;; $Id:
35
35
  ;;;
36
36
  (use srfi-1)
37
+ (require "progressbar")
37
38
  (require "sekka/kvs")
39
+ (require "sekka/sekkaversion")
38
40
  (use sekka.util)
39
41
 
40
- (define masterid "MASTER")
41
- (define workid "WORK")
42
+ (define masterid "MASTER")
43
+ (define workid "WORK")
44
+ (define versionid "SEKKA::VERSION")
42
45
 
43
46
  (define alphabet-string "abcdefghijklmnopqrstuvwxyz>@;#")
44
47
  (define alphabet-lower-list (to-list (alphabet-string.split "")))
@@ -177,6 +180,7 @@
177
180
  (kvs.clear)
178
181
  (create-keylist kvs f)
179
182
  (setup-ready-made-keylist kvs keylist)
183
+ (kvs.put! versionid SekkaVersion.version)
180
184
  (kvs.close)))
181
185
 
182
186
 
@@ -190,9 +194,43 @@
190
194
  (kvs.close)))
191
195
 
192
196
 
193
- (define (openSekkaJisyo dictSource cacheSource)
194
- (when (not (rxmatch #/tch$/ dictSource))
195
- (set-kvs-type 'memcache))
197
+
198
+ (define (restore-sekka-jisyo-f f filename-or-hostname)
199
+ (define (file-length f)
200
+ (let1 total 0
201
+ (for-each
202
+ (lambda (x)
203
+ (set! total (+ 1 total)))
204
+ f)
205
+ (f.rewind)
206
+ total))
207
+
208
+ (define (restore f kvs progress)
209
+ (let loop ([line (f.readline.chomp)])
210
+ (let* (
211
+ [key-value
212
+ (to-list (line.split #/[\t]+/))]
213
+ [key (first key-value)]
214
+ [value (if (> 2 (length key-value))
215
+ ""
216
+ (second key-value))])
217
+ (kvs.put! key value)
218
+ (progress.inc))
219
+ (when (not (f.eof))
220
+ (loop (f.readline.chomp)))))
221
+
222
+
223
+ (let1 total (file-length f)
224
+ (let ([kvs (Kvs.new (get-kvs-type))]
225
+ [progress (ProgressBar.new "Restore" total STDERR)])
226
+ (kvs.open filename-or-hostname)
227
+ (kvs.clear)
228
+ (restore f kvs progress)
229
+ (kvs.close))))
230
+
231
+
232
+ (define (openSekkaJisyo dictType dictSource cacheSource)
233
+ (set-kvs-type dictType)
196
234
  (let1 kvs (Kvs.new (get-kvs-type))
197
235
  (kvs.open #?=dictSource)
198
236
  (let1 cachesv (if cacheSource
data/lib/sekka/kvs.rb CHANGED
@@ -42,6 +42,13 @@ class Kvs
42
42
  @tcFlag = false
43
43
  end
44
44
 
45
+ @redisFlag = true
46
+ begin
47
+ require 'redis'
48
+ rescue LoadError
49
+ @redisFlag = false
50
+ end
51
+
45
52
  @dbmFlag = true
46
53
  begin
47
54
  require 'dbm'
@@ -58,6 +65,11 @@ class Kvs
58
65
  raise RuntimeError, "Kvs.new() missed require( 'tokyocabinet' )."
59
66
  end
60
67
 
68
+ when :redis
69
+ if not @redisFlag
70
+ raise RuntimeError, "Kvs.new() missed require( 'redis' )."
71
+ end
72
+
61
73
  when :memcache
62
74
  # do nothing
63
75
 
@@ -67,7 +79,7 @@ class Kvs
67
79
  else
68
80
  raise RuntimeError, "Kvs.new() missed require( 'dbm' )."
69
81
  end
70
-
82
+
71
83
  # do nothing
72
84
 
73
85
  when :pure
@@ -83,6 +95,8 @@ class Kvs
83
95
  if not @db.open( name, TokyoCabinet::HDB::OWRITER | TokyoCabinet::HDB::OCREAT )
84
96
  raise RuntimeError, sprintf( "TokyoCabinet::HDB.open error: file=%s", name )
85
97
  end
98
+ when :redis
99
+ @db = Redis.new( :host => name )
86
100
  when :memcache
87
101
  @db = MemCache.new( name )
88
102
  when :dbm
@@ -103,8 +117,11 @@ class Kvs
103
117
  end
104
118
 
105
119
  def fixdb( )
106
- if not @db.optimize( )
107
- raise RuntimeError, sprintf( "TokyoCabinet::HDB.optimize error: file=%s", name )
120
+ case @dbtype
121
+ when :tokyocabinet
122
+ if not @db.optimize( )
123
+ raise RuntimeError, sprintf( "TokyoCabinet::HDB.optimize error: file=%s", name )
124
+ end
108
125
  end
109
126
  true
110
127
  end
@@ -119,7 +136,7 @@ class Kvs
119
136
  def pure_put!( key, value, timeout = 0 )
120
137
  if 0 < key.size
121
138
  case @dbtype
122
- when :tokyocabinet, :dbm
139
+ when :tokyocabinet, :dbm, :redis
123
140
  @db[ key.force_encoding("ASCII-8BIT") ] = value.force_encoding("ASCII-8BIT")
124
141
  when :memcache
125
142
  @db.set( key.force_encoding("ASCII-8BIT"), value.force_encoding("ASCII-8BIT"), timeout )
@@ -146,13 +163,21 @@ class Kvs
146
163
  end
147
164
 
148
165
  def delete( key )
149
- @db.delete( key )
166
+ case @dbtype
167
+ when :redis
168
+ @db.del( key )
169
+ else
170
+ @db.delete( key )
171
+ end
172
+ true
150
173
  end
151
174
 
152
175
  def clear()
153
176
  case @dbtype
154
177
  when :tokyocabinet, :dbm, :pure
155
178
  @db.clear
179
+ when :redis
180
+ @db.flushall
156
181
  when :memcache
157
182
  # do nothing
158
183
  else
@@ -163,7 +188,7 @@ class Kvs
163
188
  # return array of key string
164
189
  def keys()
165
190
  case @dbtype
166
- when :tokyocabinet, :dbm
191
+ when :tokyocabinet, :dbm, :redis
167
192
  @db.keys.map { |k|
168
193
  k.force_encoding("UTF-8")
169
194
  }
@@ -182,6 +207,10 @@ class Kvs
182
207
  @db.fwmkeys( prefix ).each { |k|
183
208
  k.force_encoding("UTF-8")
184
209
  }
210
+ when :redis
211
+ @db.keys( prefix + "*" ).each { |k|
212
+ k.force_encoding("UTF-8")
213
+ }
185
214
  when :memcache
186
215
  raise RuntimeError, "Kvs#forward_match_keys method was not implemented for memcache."
187
216
  when :dbm, :pure
@@ -197,7 +226,7 @@ class Kvs
197
226
  case @dbtype
198
227
  when :tokyocabinet, :dbm
199
228
  @db.close
200
- when :memcache
229
+ when :memcache, :redis
201
230
  # do nothign
202
231
  when :pure
203
232
  File.open( @name, "w" ) { |f|
@@ -1,6 +1,5 @@
1
1
  class SekkaVersion
2
- include Singleton
3
2
  def self.version
4
- "0.9.1"
3
+ "0.9.2"
5
4
  end
6
5
  end
data/lib/sekkaconfig.rb CHANGED
@@ -40,7 +40,8 @@ module SekkaServer
40
40
  class Config
41
41
  include Singleton
42
42
 
43
- def self.setup( dictSource, cacheSource = false, listenPort, proxyHost, proxyPort )
43
+ def self.setup( dictType, dictSource, cacheSource = false, listenPort, proxyHost, proxyPort )
44
+ @@dictType = dictType
44
45
  @@dictSource = dictSource
45
46
  @@cacheSource = cacheSource
46
47
  @@listenPort = listenPort
@@ -48,6 +49,10 @@ module SekkaServer
48
49
  @@proxyPort = proxyPort
49
50
  end
50
51
 
52
+ def self.dictType
53
+ @@dictType
54
+ end
55
+
51
56
  def self.dictSource
52
57
  @@dictSource
53
58
  end
data/lib/sekkaserver.rb CHANGED
@@ -54,7 +54,8 @@ module SekkaServer
54
54
  @core.evalStr( "(use sekka.henkan)" )
55
55
  @core.evalStr( '(define (writeToString sexp) (write-to-string sexp))' )
56
56
  @core.evalStr( '(export-to-ruby writeToString)' )
57
- (@kvs,@cachesv) = @core.openSekkaJisyo( SekkaServer::Config.dictSource,
57
+ (@kvs,@cachesv) = @core.openSekkaJisyo( SekkaServer::Config.dictType,
58
+ SekkaServer::Config.dictSource,
58
59
  SekkaServer::Config.cacheSource )
59
60
  @queue = EM::Queue.new
60
61
  @mutex = Mutex.new
@@ -62,6 +63,7 @@ module SekkaServer
62
63
  STDERR.puts( "----- Sekka Server Started -----" )
63
64
  STDERR.printf( " Sekka version : %s\n", SekkaVersion.version )
64
65
  STDERR.printf( " Nendo version : %s\n", Nendo::Core.version )
66
+ STDERR.printf( " dict-type : %s\n", SekkaServer::Config.dictType )
65
67
  STDERR.printf( " dict-db : %s\n", SekkaServer::Config.dictSource )
66
68
  STDERR.printf( " memcached : %s\n", SekkaServer::Config.cacheSource )
67
69
  STDERR.printf( " listenPort : %s\n", SekkaServer::Config.listenPort )
data/test/henkan-main.nnd CHANGED
@@ -51,6 +51,8 @@
51
51
  (cond
52
52
  ((eq? dbtype 'tokyocabinet)
53
53
  (set! target "./test.tch"))
54
+ ((eq? dbtype 'redis)
55
+ (set! target "localhost"))
54
56
  ((eq? dbtype 'dbm)
55
57
  (set! target "./test"))
56
58
  ((eq? dbtype 'pure)
@@ -89,20 +91,39 @@
89
91
  (with-open "./test/sekka-dump-out-1.txt"
90
92
  (lambda (f)
91
93
  (let ((_input (f.read))
92
- (_output (StringIO.new)))
93
- (_output.set_encoding "utf-8")
94
+ (_output1 (StringIO.new))
95
+ (_output2 (StringIO.new)))
96
+ (_output1.set_encoding "utf-8")
97
+ (_output2.set_encoding "utf-8")
94
98
  (when (or (eq? dbtype 'tokyocabinet)
99
+ (eq? dbtype 'redis)
95
100
  (eq? dbtype 'dbm)
96
101
  (eq? dbtype 'pure))
97
102
  (test-section "dump db")
103
+
98
104
  (test* "dump DB to SEKKA jisyo file. (1)"
99
105
  _input
100
106
  (begin
101
- (dump-sekka-jisyo-f _output target)
107
+ (dump-sekka-jisyo-f _output1 target)
102
108
  (with-open "./test/sekka-dump-out-1.tmp"
103
- (lambda (f) (f.write (_output.string)))
109
+ (lambda (f) (f.write (_output1.string)))
110
+ "w")
111
+ (_output1.string)))
112
+
113
+ (test* "dump/restore DB to SEKKA jisyo file. (1)"
114
+ _input
115
+ (begin
116
+ ;; ---- RESTORE ----
117
+ (f.rewind)
118
+ (restore-sekka-jisyo-f f target)
119
+
120
+ ;; ---- DUMP ----
121
+ (dump-sekka-jisyo-f _output2 target)
122
+ (with-open "./test/sekka-dump-out-2.tmp"
123
+ (lambda (f) (f.write (_output2.string)))
104
124
  "w")
105
- (_output.string)))))))
125
+ (_output2.string)))))))
126
+
106
127
 
107
128
 
108
129
  (test-section "Open the test-suite DB")
@@ -112,6 +133,9 @@
112
133
  ((eq? dbtype 'tokyocabinet)
113
134
  (kvs.open target)
114
135
  (require "tokyocabinet"))
136
+ ((eq? dbtype 'redis)
137
+ (kvs.open target)
138
+ (require "redis"))
115
139
  ((eq? dbtype 'dbm)
116
140
  (kvs.open target)
117
141
  (require "dbm"))
@@ -122,8 +146,6 @@
122
146
  (else
123
147
  (errorf "Unsupported db type [%s]" (symbol->string dbtype))))
124
148
 
125
- (define db (kvs._db))
126
-
127
149
 
128
150
  ;;-------------------------------------------------------------------
129
151
  (test-section "Register User dict")
@@ -171,63 +193,63 @@
171
193
  (test-section "simple db fetch")
172
194
  (test* "db fetch 1"
173
195
  "Cへんかん"
174
- (. (hash-table-get db "MASTER::henkan" #f) force_encoding "UTF-8"))
196
+ (kvs.get "MASTER::henkan"))
175
197
 
176
198
  (test* "db fetch 2"
177
199
  "Cかに/かんい"
178
- (. (hash-table-get db "MASTER::kani" #f) force_encoding "UTF-8"))
200
+ (kvs.get "MASTER::kani"))
179
201
 
180
202
  (test* "db fetch 3"
181
203
  "Cかんい"
182
- (. (hash-table-get db "MASTER::kanni" #f) force_encoding "UTF-8"))
204
+ (kvs.get "MASTER::kanni"))
183
205
 
184
206
  (test* "db fetch 4"
185
207
  #f
186
- (hash-table-get db "MASTER::aaaa" #f))
208
+ (kvs.get "MASTER::aaaa"))
187
209
 
188
210
  (test* "db fetch 5"
189
211
  "Cへんかんえんじん"
190
- (. (hash-table-get db "dummy::henkanenjin" #f) force_encoding "UTF-8"))
212
+ (kvs.get "dummy::henkanenjin"))
191
213
 
192
214
  (test* "db fetch 6"
193
215
  "ka;ko ka@ko kakko kani kanni kaqi"
194
- (. (hash-table-get db "MASTER::(ka)" #f) force_encoding "UTF-8"))
216
+ (kvs.get "MASTER::(ka)"))
195
217
 
196
218
  (test* "db fetch 7"
197
219
  "ka+ kaT ka`"
198
- (. (hash-table-get db "MASTER::(KA)" #f) force_encoding "UTF-8"))
220
+ (kvs.get "MASTER::(KA)"))
199
221
 
200
222
  (test* "db fetch 8"
201
223
  "#kaime #kara# #kqme #kr#"
202
- (. (hash-table-get db "MASTER::(#k)" #f) force_encoding "UTF-8"))
224
+ (kvs.get "MASTER::(#k)"))
203
225
 
204
226
  (test* "db fetch 9"
205
227
  "burogu+ buroguR buroguT burogu`"
206
- (. (hash-table-get db "dummy::(BU)" #f) force_encoding "UTF-8"))
228
+ (kvs.get "dummy::(BU)"))
207
229
 
208
230
  (test* "db fetch 10"
209
231
  "/ユーザー辞書"
210
- (. (hash-table-get db "dummy::ゆーざーじしょ" #f) force_encoding "UTF-8"))
232
+ (kvs.get "dummy::ゆーざーじしょ"))
211
233
 
212
234
  (test* "db fetch 11"
213
235
  "yu'za'jisho yu'za'jisyo yu'za'jixo yu'za'zisho yu'za'zisyo yu'za'zixo yu'za-jisho yu'za-jisyo yu'za-jixo yu'za-zisho yu'za-zisyo yu'za-zixo yu'za:jisho yu'za:jisyo yu'za:jixo yu'za:zisho yu'za:zisyo yu'za:zixo yu'za^jisho yu'za^jisyo yu'za^jixo yu'za^zisho yu'za^zisyo yu'za^zixo yu'zc'jisho yu'zc'jisyo yu'zc'jixo yu'zc'zisho yu'zc'zisyo yu'zc'zixo yu'zc-jisho yu'zc-jisyo yu'zc-jixo yu'zc-zisho yu'zc-zisyo yu'zc-zixo yu'zc:jisho yu'zc:jisyo yu'zc:jixo yu'zc:zisho yu'zc:zisyo yu'zc:zixo yu'zc^jisho yu'zc^jisyo yu'zc^jixo yu'zc^zisho yu'zc^zisyo yu'zc^zixo yu-za'jisho yu-za'jisyo yu-za'jixo yu-za'zisho yu-za'zisyo yu-za'zixo yu-za-jisho yu-za-jisyo yu-za-jixo yu-za-zisho yu-za-zisyo yu-za-zixo yu-za:jisho yu-za:jisyo yu-za:jixo yu-za:zisho yu-za:zisyo yu-za:zixo yu-za^jisho yu-za^jisyo yu-za^jixo yu-za^zisho yu-za^zisyo yu-za^zixo yu-zc'jisho yu-zc'jisyo yu-zc'jixo yu-zc'zisho yu-zc'zisyo yu-zc'zixo yu-zc-jisho yu-zc-jisyo yu-zc-jixo yu-zc-zisho yu-zc-zisyo yu-zc-zixo yu-zc:jisho yu-zc:jisyo yu-zc:jixo yu-zc:zisho yu-zc:zisyo yu-zc:zixo yu-zc^jisho yu-zc^jisyo yu-zc^jixo yu-zc^zisho yu-zc^zisyo yu-zc^zixo yu:za'jisho yu:za'jisyo yu:za'jixo yu:za'zisho yu:za'zisyo yu:za'zixo yu:za-jisho yu:za-jisyo yu:za-jixo yu:za-zisho yu:za-zisyo yu:za-zixo yu:za:jisho yu:za:jisyo yu:za:jixo yu:za:zisho yu:za:zisyo yu:za:zixo yu:za^jisho yu:za^jisyo yu:za^jixo yu:za^zisho yu:za^zisyo yu:za^zixo yu:zc'jisho yu:zc'jisyo yu:zc'jixo yu:zc'zisho yu:zc'zisyo yu:zc'zixo yu:zc-jisho yu:zc-jisyo yu:zc-jixo yu:zc-zisho yu:zc-zisyo yu:zc-zixo yu:zc:jisho yu:zc:jisyo yu:zc:jixo yu:zc:zisho yu:zc:zisyo yu:zc:zixo yu:zc^jisho yu:zc^jisyo yu:zc^jixo yu:zc^zisho yu:zc^zisyo yu:zc^zixo yu^za'jisho yu^za'jisyo yu^za'jixo yu^za'zisho yu^za'zisyo yu^za'zixo yu^za-jisho yu^za-jisyo yu^za-jixo yu^za-zisho yu^za-zisyo yu^za-zixo yu^za:jisho yu^za:jisyo yu^za:jixo yu^za:zisho yu^za:zisyo yu^za:zixo yu^za^jisho yu^za^jisyo yu^za^jixo yu^za^zisho yu^za^zisyo yu^za^zixo yu^zc'jisho yu^zc'jisyo yu^zc'jixo yu^zc'zisho yu^zc'zisyo yu^zc'zixo yu^zc-jisho yu^zc-jisyo yu^zc-jixo yu^zc-zisho yu^zc-zisyo yu^zc-zixo yu^zc:jisho yu^zc:jisyo yu^zc:jixo yu^zc:zisho yu^zc:zisyo yu^zc:zixo yu^zc^jisho yu^zc^jisyo yu^zc^jixo yu^zc^zisho yu^zc^zisyo yu^zc^zixo"
214
- (. (hash-table-get db "dummy::(yu)" #f) force_encoding "UTF-8"))
236
+ (kvs.get "dummy::(yu)"))
215
237
 
216
238
  (test* "db fetch 12"
217
239
  "する"
218
- (. (hash-table-get db "dummy::=sr" #f) force_encoding "UTF-8"))
240
+ (kvs.get "dummy::=sr"))
219
241
 
220
242
  (test* "db fetch 13"
221
243
  "=suru"
222
- (. (hash-table-get db "dummy::{su}" #f) force_encoding "UTF-8"))
244
+ (kvs.get "dummy::{su}"))
223
245
 
224
246
  (test* "db fetch 14"
225
247
  "したい"
226
- (. (hash-table-get db "dummy::=shitai" #f) force_encoding "UTF-8"))
248
+ (kvs.get "dummy::=shitai"))
227
249
 
228
250
  (test* "db fetch 15"
229
251
  "=shita =shitai"
230
- (. (hash-table-get db "dummy::{sh}" #f) force_encoding "UTF-8"))
252
+ (kvs.get "dummy::{sh}"))
231
253
 
232
254
 
233
255
 
@@ -241,11 +263,11 @@
241
263
 
242
264
  (test* "check user dict 1"
243
265
  "/エントリA/エントリB/エントリC"
244
- (. (hash-table-get db "dummy2::てすとようえんとり" #f) force_encoding "UTF-8"))
266
+ (kvs.get "dummy2::てすとようえんとり"))
245
267
 
246
268
  (test* "check user dict 2"
247
269
  "tesutoyouenntori tesutoyouentori tesutoyoueqtori tesutoyowhuenntori tesutoyowhuentori tesutoyowhueqtori tesutoypenntori tesutoypentori tesutoypeqtori"
248
- (. (hash-table-get db "dummy2::(te)" #f) force_encoding "UTF-8"))
270
+ (kvs.get "dummy2::(te)"))
249
271
 
250
272
  (test* "flush user dict"
251
273
  12
@@ -254,11 +276,11 @@
254
276
  ;; getに失敗しないといけない。
255
277
  (test* "check user dict 3"
256
278
  :no-entry
257
- (hash-table-get db "dummy2::てすとようえんとり" :no-entry))
279
+ (kvs.get "dummy2::てすとようえんとり" :no-entry))
258
280
 
259
281
  (test* "check user dict 4"
260
282
  :no-entry
261
- (hash-table-get db "dummy2::(te)" :no-entry))
283
+ (kvs.get "dummy2::(te)" :no-entry))
262
284
 
263
285
  (test* "register user dict 2"
264
286
  #t
@@ -268,11 +290,11 @@
268
290
  ;; "エントリB" という単語が消えないといけない。
269
291
  (test* "check user dict 5"
270
292
  "/エントリA/エントリC"
271
- (. (hash-table-get db "dummy2::てすとようえんとり" #f) force_encoding "UTF-8"))
293
+ (kvs.get "dummy2::てすとようえんとり"))
272
294
 
273
295
  (test* "check user dict 6"
274
296
  "tesutoyouenntori tesutoyouentori tesutoyoueqtori tesutoyowhuenntori tesutoyowhuentori tesutoyowhueqtori tesutoypenntori tesutoypentori tesutoypeqtori"
275
- (. (hash-table-get db "dummy2::(te)" #f) force_encoding "UTF-8"))
297
+ (kvs.get "dummy2::(te)"))
276
298
 
277
299
 
278
300
  ;;-------------------------------------------------------------------
@@ -1132,7 +1154,7 @@
1132
1154
 
1133
1155
  (test* "DB check after henkan kakutei 1"
1134
1156
  "/返還/変換"
1135
- (. (hash-table-get db (+ userid "::へんかん") #f) force_encoding "UTF-8"))
1157
+ (kvs.get (+ userid "::へんかん")))
1136
1158
 
1137
1159
  (test* "henkan kakutei(for Elisp) 2"
1138
1160
  '(("変換" nil "へんかん" j 0) ("返還" nil "へんかん" j 1) ("変化" nil "へんか" j 2) ("返歌" nil "へんか" j 3) ("へんかん" nil "henkan" h 4) ("ヘンカン" nil "henkan" k 5) ("へにんあん" nil "henkan" h 6) ("ヘニンアン" nil "henkan" k 7) ("Henkan" nil "Henkan" z 8) ("Henkan" nil "Henkan" l 9))
@@ -1142,7 +1164,7 @@
1142
1164
 
1143
1165
  (test* "DB check after henkan kakutei 2"
1144
1166
  "/変換/返還"
1145
- (. (hash-table-get db (+ userid "::へんかん") #f) force_encoding "UTF-8"))
1167
+ (kvs.get (+ userid "::へんかん")))
1146
1168
 
1147
1169
  (test* "henkan kakutei(for Elisp) 3"
1148
1170
  '(("デベロッパ" nil "developer" j 0) ("デベロッパー" nil "developer" j 1) ("ディベロッパー" nil "developer" j 2) ("developer" nil "developer" z 3) ("developer" nil "developer" l 4))
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sekka
3
3
  version: !ruby/object:Gem::Version
4
- hash: 57
4
+ hash: 63
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 9
9
- - 1
10
- version: 0.9.1
9
+ - 2
10
+ version: 0.9.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Kiyoka Nishiyama
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-09-02 00:00:00 Z
18
+ date: 2011-09-15 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: rspec
@@ -116,7 +116,7 @@ dependencies:
116
116
  prerelease: false
117
117
  version_requirements: *id007
118
118
  - !ruby/object:Gem::Dependency
119
- name: rubyforge
119
+ name: redis
120
120
  requirement: &id008 !ruby/object:Gem::Requirement
121
121
  none: false
122
122
  requirements:
@@ -126,11 +126,11 @@ dependencies:
126
126
  segments:
127
127
  - 0
128
128
  version: "0"
129
- type: :development
129
+ type: :runtime
130
130
  prerelease: false
131
131
  version_requirements: *id008
132
132
  - !ruby/object:Gem::Dependency
133
- name: eventmachine
133
+ name: ruby-progressbar
134
134
  requirement: &id009 !ruby/object:Gem::Requirement
135
135
  none: false
136
136
  requirements:
@@ -144,7 +144,7 @@ dependencies:
144
144
  prerelease: false
145
145
  version_requirements: *id009
146
146
  - !ruby/object:Gem::Dependency
147
- name: fuzzy-string-match
147
+ name: rubyforge
148
148
  requirement: &id010 !ruby/object:Gem::Requirement
149
149
  none: false
150
150
  requirements:
@@ -154,11 +154,11 @@ dependencies:
154
154
  segments:
155
155
  - 0
156
156
  version: "0"
157
- type: :runtime
157
+ type: :development
158
158
  prerelease: false
159
159
  version_requirements: *id010
160
160
  - !ruby/object:Gem::Dependency
161
- name: jeweler
161
+ name: eventmachine
162
162
  requirement: &id011 !ruby/object:Gem::Requirement
163
163
  none: false
164
164
  requirements:
@@ -172,7 +172,7 @@ dependencies:
172
172
  prerelease: false
173
173
  version_requirements: *id011
174
174
  - !ruby/object:Gem::Dependency
175
- name: memcache-client
175
+ name: fuzzy-string-match
176
176
  requirement: &id012 !ruby/object:Gem::Requirement
177
177
  none: false
178
178
  requirements:
@@ -186,8 +186,36 @@ dependencies:
186
186
  prerelease: false
187
187
  version_requirements: *id012
188
188
  - !ruby/object:Gem::Dependency
189
- name: nendo
189
+ name: jeweler
190
190
  requirement: &id013 !ruby/object:Gem::Requirement
191
+ none: false
192
+ requirements:
193
+ - - ">="
194
+ - !ruby/object:Gem::Version
195
+ hash: 3
196
+ segments:
197
+ - 0
198
+ version: "0"
199
+ type: :runtime
200
+ prerelease: false
201
+ version_requirements: *id013
202
+ - !ruby/object:Gem::Dependency
203
+ name: memcache-client
204
+ requirement: &id014 !ruby/object:Gem::Requirement
205
+ none: false
206
+ requirements:
207
+ - - ">="
208
+ - !ruby/object:Gem::Version
209
+ hash: 3
210
+ segments:
211
+ - 0
212
+ version: "0"
213
+ type: :runtime
214
+ prerelease: false
215
+ version_requirements: *id014
216
+ - !ruby/object:Gem::Dependency
217
+ name: nendo
218
+ requirement: &id015 !ruby/object:Gem::Requirement
191
219
  none: false
192
220
  requirements:
193
221
  - - "="
@@ -200,10 +228,10 @@ dependencies:
200
228
  version: 0.5.3
201
229
  type: :runtime
202
230
  prerelease: false
203
- version_requirements: *id013
231
+ version_requirements: *id015
204
232
  - !ruby/object:Gem::Dependency
205
233
  name: rack
206
- requirement: &id014 !ruby/object:Gem::Requirement
234
+ requirement: &id016 !ruby/object:Gem::Requirement
207
235
  none: false
208
236
  requirements:
209
237
  - - ">="
@@ -214,10 +242,10 @@ dependencies:
214
242
  version: "0"
215
243
  type: :runtime
216
244
  prerelease: false
217
- version_requirements: *id014
245
+ version_requirements: *id016
218
246
  - !ruby/object:Gem::Dependency
219
- name: tokyocabinet
220
- requirement: &id015 !ruby/object:Gem::Requirement
247
+ name: ruby-progressbar
248
+ requirement: &id017 !ruby/object:Gem::Requirement
221
249
  none: false
222
250
  requirements:
223
251
  - - ">="
@@ -228,7 +256,7 @@ dependencies:
228
256
  version: "0"
229
257
  type: :runtime
230
258
  prerelease: false
231
- version_requirements: *id015
259
+ version_requirements: *id017
232
260
  description: Sekka is a SKK like input method. Sekka server provides REST Based API. If you are SKK user, let's try it.
233
261
  email: kiyoka@sumibi.org
234
262
  executables: