sekka 0.9.1 → 0.9.2

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/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: