gren 0.2.3 → 0.2.4
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/History.ja.txt +18 -0
- data/Manifest.txt +1 -0
- data/bin/grendb +1 -1
- data/bin/mkgrendb +1 -1
- data/lib/common/display_util.rb +14 -0
- data/lib/common/util.rb +98 -0
- data/lib/findgrep/findgrep.rb +111 -30
- data/lib/findgrep/result.rb +3 -3
- data/lib/gren.rb +1 -1
- data/lib/grendb/cli.rb +7 -0
- data/lib/mkgrendb/cli.rb +4 -0
- data/lib/mkgrendb/mkgrendb.rb +14 -5
- metadata +4 -3
data/History.ja.txt
CHANGED
@@ -1,3 +1,21 @@
|
|
1
|
+
=== 0.2.4 2010/10/09
|
2
|
+
|
3
|
+
* mkgrendb
|
4
|
+
* データベースの形式を変更
|
5
|
+
* 古いmkgrendbで作成したデータベースは、 'mkgrendb --full' で再構築をして下さい。
|
6
|
+
* yamlに、ディレクトリではなく単一ファイルの指定もOKに
|
7
|
+
|
8
|
+
* grendb
|
9
|
+
* マッチ対象を行では無くファイルとする --match-file モードを追加
|
10
|
+
* 今までのモードは --match-line
|
11
|
+
* デフォルトのモードを --match-file に変更
|
12
|
+
* 今までの行マッチモードを使う場合は、 -l or --ml or --match-line と指定する
|
13
|
+
* 拡張子をキーとする検索モードを追加
|
14
|
+
* -s, --suffix
|
15
|
+
* --groonga-only オプションを作成
|
16
|
+
* 実際のファイルを辿らず、データベースの情報のみで探索出来るように
|
17
|
+
* 検索結果を更新時刻順で表示するように
|
18
|
+
|
1
19
|
=== 0.2.3 2010/09/25
|
2
20
|
|
3
21
|
* mkgrendb
|
data/Manifest.txt
CHANGED
data/bin/grendb
CHANGED
data/bin/mkgrendb
CHANGED
data/lib/common/display_util.rb
CHANGED
@@ -44,5 +44,19 @@ module Gren
|
|
44
44
|
end
|
45
45
|
end
|
46
46
|
module_function :size_s
|
47
|
+
|
48
|
+
def dump_methods(c)
|
49
|
+
unless c.is_a?(Class)
|
50
|
+
c = c.class
|
51
|
+
end
|
52
|
+
|
53
|
+
while (true)
|
54
|
+
p c
|
55
|
+
break if (c == Object)
|
56
|
+
puts "↓ " + c.public_instance_methods(false).inspect
|
57
|
+
c = c.superclass
|
58
|
+
end
|
59
|
+
end
|
60
|
+
module_function :dump_methods
|
47
61
|
end
|
48
62
|
end
|
data/lib/common/util.rb
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
module Gren
|
4
|
+
module Util
|
5
|
+
def time_s(time)
|
6
|
+
t = time.truncate
|
7
|
+
h = t / 3600
|
8
|
+
t = t % 3600
|
9
|
+
m = t / 60
|
10
|
+
t = t % 60
|
11
|
+
t += round(time - time.prec_i, 2)
|
12
|
+
|
13
|
+
if (h > 0 && m > 0)
|
14
|
+
"#{h}h #{m}m #{t}s"
|
15
|
+
elsif (m > 0)
|
16
|
+
"#{m}m #{t}s"
|
17
|
+
else
|
18
|
+
"#{t}sec"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
module_function :time_s
|
22
|
+
|
23
|
+
def round(n, d)
|
24
|
+
(n * 10 ** d).round / 10.0 ** d
|
25
|
+
end
|
26
|
+
module_function :round
|
27
|
+
|
28
|
+
def size_s(size)
|
29
|
+
tb = 1024 ** 4
|
30
|
+
gb = 1024 ** 3
|
31
|
+
mb = 1024 ** 2
|
32
|
+
kb = 1024
|
33
|
+
|
34
|
+
if (size >= tb)
|
35
|
+
round(size / tb.prec_f, 2).to_s + "TB"
|
36
|
+
elsif (size >= gb)
|
37
|
+
round(size / gb.prec_f, 2).to_s + "GB"
|
38
|
+
elsif (size >= mb)
|
39
|
+
round(size / mb.prec_f, 2).to_s + "MB"
|
40
|
+
elsif (size >= kb)
|
41
|
+
round(size / kb.prec_f, 2).to_s + "KB"
|
42
|
+
else
|
43
|
+
size.to_s + "Byte"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
module_function :size_s
|
47
|
+
|
48
|
+
# アルファベットと演算子で表示する数を変える
|
49
|
+
ALPHABET_DISP_NUM = 5
|
50
|
+
OPERATOR_DISP_NUM = 10
|
51
|
+
|
52
|
+
def p_classtree(c)
|
53
|
+
unless c.is_a?(Class)
|
54
|
+
c = c.class
|
55
|
+
end
|
56
|
+
|
57
|
+
while (true)
|
58
|
+
puts c.name
|
59
|
+
break if (c == Object)
|
60
|
+
p_classtree_sub(c)
|
61
|
+
c = c.superclass
|
62
|
+
end
|
63
|
+
end
|
64
|
+
module_function :p_classtree
|
65
|
+
|
66
|
+
def p_classtree_sub(c)
|
67
|
+
# メソッドの一覧を得る
|
68
|
+
group = c.public_instance_methods(false).sort.partition { |m| m =~ /\w/ }
|
69
|
+
array = group.flatten
|
70
|
+
operator_start_index = group[0].size
|
71
|
+
limit = ALPHABET_DISP_NUM
|
72
|
+
|
73
|
+
print (array.size > limit) ? "| " : "↓ "
|
74
|
+
|
75
|
+
counter = 0
|
76
|
+
array.each_with_index do |v, index|
|
77
|
+
if (index == operator_start_index)
|
78
|
+
limit = OPERATOR_DISP_NUM
|
79
|
+
counter = 0
|
80
|
+
puts
|
81
|
+
print (array.size - index > limit) ? "| " : "↓ "
|
82
|
+
end
|
83
|
+
|
84
|
+
if (counter >= limit)
|
85
|
+
counter = 0
|
86
|
+
puts
|
87
|
+
print (array.size - index > limit) ? "| " : "↓ "
|
88
|
+
end
|
89
|
+
|
90
|
+
print v + ", "
|
91
|
+
counter += 1
|
92
|
+
end
|
93
|
+
puts
|
94
|
+
end
|
95
|
+
module_function :p_classtree_sub
|
96
|
+
|
97
|
+
end
|
98
|
+
end
|
data/lib/findgrep/findgrep.rb
CHANGED
@@ -8,6 +8,8 @@ require File.join(File.dirname(__FILE__), '../common/platform')
|
|
8
8
|
require File.join(File.dirname(__FILE__), '../common/grenfiletest')
|
9
9
|
require File.join(File.dirname(__FILE__), '../common/grensnip')
|
10
10
|
require 'groonga'
|
11
|
+
require File.join(File.dirname(__FILE__), '../common/util')
|
12
|
+
include Gren
|
11
13
|
|
12
14
|
module FindGrep
|
13
15
|
class FindGrep
|
@@ -20,11 +22,14 @@ module FindGrep
|
|
20
22
|
:isSilent,
|
21
23
|
:debugMode,
|
22
24
|
:filePatterns,
|
25
|
+
:suffixs,
|
23
26
|
:ignoreFiles,
|
24
27
|
:ignoreDirs,
|
25
28
|
:kcode,
|
26
29
|
:noSnip,
|
27
|
-
:dbFile
|
30
|
+
:dbFile,
|
31
|
+
:groongaOnly,
|
32
|
+
:isMatchFile)
|
28
33
|
|
29
34
|
DEFAULT_OPTION = Option.new([],
|
30
35
|
[],
|
@@ -37,9 +42,12 @@ module FindGrep
|
|
37
42
|
[],
|
38
43
|
[],
|
39
44
|
[],
|
45
|
+
[],
|
40
46
|
Platform.get_shell_kcode,
|
41
47
|
false,
|
42
|
-
nil
|
48
|
+
nil,
|
49
|
+
false,
|
50
|
+
false)
|
43
51
|
|
44
52
|
def initialize(patterns, option)
|
45
53
|
@patterns = patterns
|
@@ -112,9 +120,9 @@ module FindGrep
|
|
112
120
|
|
113
121
|
# ドキュメントを検索
|
114
122
|
documents = Groonga::Context.default["documents"]
|
115
|
-
|
123
|
+
|
116
124
|
# 全てのパターンを検索
|
117
|
-
|
125
|
+
table = documents.select do |record|
|
118
126
|
expression = nil
|
119
127
|
|
120
128
|
# キーワード
|
@@ -137,21 +145,62 @@ module FindGrep
|
|
137
145
|
end
|
138
146
|
end
|
139
147
|
|
140
|
-
#
|
148
|
+
# 拡張子(OR)
|
149
|
+
se = suffix_expression(record)
|
150
|
+
expression &= se if (se)
|
151
|
+
|
152
|
+
# 検索式
|
141
153
|
expression
|
142
154
|
end
|
143
155
|
|
156
|
+
# タイムスタンプでソート
|
157
|
+
records = table.sort([{:key => "timestamp", :order => "descending"}])
|
158
|
+
|
144
159
|
# データベースにヒット
|
145
160
|
stdout.puts "Found : #{records.size} records."
|
146
161
|
|
147
162
|
# 検索にヒットしたファイルを実際に検索
|
148
163
|
records.each do |record|
|
149
|
-
if
|
150
|
-
|
164
|
+
if (@option.groongaOnly)
|
165
|
+
searchGroongaOnly(stdout, record)
|
166
|
+
else
|
167
|
+
searchFile(stdout, record.path, record.path) if FileTest.exist?(record.path)
|
151
168
|
end
|
152
169
|
end
|
153
170
|
end
|
154
171
|
|
172
|
+
def and_expression(key, list)
|
173
|
+
sub = nil
|
174
|
+
|
175
|
+
list.each do |word|
|
176
|
+
e = key =~ word
|
177
|
+
if sub.nil?
|
178
|
+
sub = e
|
179
|
+
else
|
180
|
+
sub &= e
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
sub
|
185
|
+
end
|
186
|
+
|
187
|
+
def suffix_expression(record)
|
188
|
+
sub = nil
|
189
|
+
|
190
|
+
@option.suffixs.each do |word|
|
191
|
+
e = record.suffix =~ word
|
192
|
+
if sub.nil?
|
193
|
+
sub = e
|
194
|
+
else
|
195
|
+
sub |= e
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
sub
|
200
|
+
end
|
201
|
+
private :suffix_expression
|
202
|
+
|
203
|
+
|
155
204
|
def searchFromDir(stdout, dir, depth)
|
156
205
|
if (@option.depth != -1 && depth > @option.depth)
|
157
206
|
return
|
@@ -237,37 +286,57 @@ module FindGrep
|
|
237
286
|
@result.search_count += 1
|
238
287
|
@result.search_size += FileTest.size(fpath)
|
239
288
|
|
240
|
-
# 検索本体
|
241
289
|
@result.search_files << fpath_disp if (@option.debugMode)
|
242
290
|
|
243
|
-
open(fpath, "r")
|
244
|
-
|
291
|
+
open(fpath, "r") do |file|
|
292
|
+
searchData(stdout, file2data(file), fpath_disp)
|
293
|
+
end
|
294
|
+
end
|
295
|
+
private :searchFile
|
296
|
+
|
297
|
+
def searchGroongaOnly(stdout, record)
|
298
|
+
file_size = record.content.size
|
299
|
+
|
300
|
+
@result.count += 1
|
301
|
+
@result.size += file_size
|
302
|
+
|
303
|
+
@result.search_count += 1
|
304
|
+
@result.search_size += file_size
|
305
|
+
|
306
|
+
@result.search_files << record.path if (@option.debugMode)
|
307
|
+
|
308
|
+
searchData(stdout, record.content, record.path)
|
309
|
+
end
|
310
|
+
private :searchGroongaOnly
|
245
311
|
|
246
|
-
|
247
|
-
|
312
|
+
def searchData(stdout, data, path)
|
313
|
+
match_file = false
|
248
314
|
|
249
|
-
|
250
|
-
|
251
|
-
line = GrenSnip::snip(line, match_datas) unless (@option.noSnip)
|
315
|
+
data.each_with_index { |line, index|
|
316
|
+
result, match_datas = match?(line)
|
252
317
|
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
stdout.puts HighLine::BLUE + header + HighLine::CLEAR + GrenSnip::coloring(line, match_datas)
|
257
|
-
end
|
318
|
+
if ( result )
|
319
|
+
header = "#{path}:#{index + 1}:"
|
320
|
+
line = GrenSnip::snip(line, match_datas) unless (@option.noSnip)
|
258
321
|
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
322
|
+
unless (@option.colorHighlight)
|
323
|
+
stdout.puts header + line
|
324
|
+
else
|
325
|
+
stdout.puts HighLine::BLUE + header + HighLine::CLEAR + GrenSnip::coloring(line, match_datas)
|
326
|
+
end
|
264
327
|
|
265
|
-
|
328
|
+
unless match_file
|
329
|
+
@result.match_file_count += 1
|
330
|
+
@result.match_files << path if (@option.debugMode)
|
331
|
+
match_file = true
|
332
|
+
break if (@option.isMatchFile)
|
266
333
|
end
|
267
|
-
|
334
|
+
|
335
|
+
@result.match_count += 1
|
336
|
+
end
|
268
337
|
}
|
269
338
|
end
|
270
|
-
private :
|
339
|
+
private :searchData
|
271
340
|
|
272
341
|
def file2data(file)
|
273
342
|
data = file.read
|
@@ -294,13 +363,25 @@ module FindGrep
|
|
294
363
|
|
295
364
|
or_matchs = []
|
296
365
|
@orRegexps.each {|v| or_matchs << v.match(line)}
|
297
|
-
|
298
|
-
|
366
|
+
|
367
|
+
unless (@option.isMatchFile)
|
368
|
+
result = match_datas.all? && !sub_matchs.any? && (or_matchs.empty? || or_matchs.any?)
|
369
|
+
else
|
370
|
+
result = first_condition(match_datas, sub_matchs, or_matchs)
|
371
|
+
end
|
299
372
|
result_match = match_datas + or_matchs
|
300
373
|
result_match.delete(nil)
|
301
374
|
|
302
375
|
return result, result_match
|
303
376
|
end
|
304
377
|
private :match?
|
378
|
+
|
379
|
+
def first_condition(match_datas, sub_matchs, or_matchs)
|
380
|
+
unless match_datas.empty?
|
381
|
+
match_datas[0]
|
382
|
+
else
|
383
|
+
or_matchs[0]
|
384
|
+
end
|
385
|
+
end
|
305
386
|
end
|
306
387
|
end
|
data/lib/findgrep/result.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
require 'find'
|
3
|
-
require File.join(File.dirname(__FILE__), '../common/
|
3
|
+
require File.join(File.dirname(__FILE__), '../common/util')
|
4
4
|
include Gren
|
5
5
|
|
6
6
|
module FindGrep
|
@@ -34,8 +34,8 @@ module FindGrep
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def print(stdout)
|
37
|
-
stdout.puts "dir : #{@start_dir} (#{
|
38
|
-
stdout.puts "files : #{@search_count} in #{@count} (#{
|
37
|
+
stdout.puts "dir : #{@start_dir} (#{Util::time_s(time)})"
|
38
|
+
stdout.puts "files : #{@search_count} in #{@count} (#{Util::size_s(@search_size)} in #{Util::size_s(@size)})"
|
39
39
|
stdout.puts "match : #{@match_file_count} files, #{match_count} hit"
|
40
40
|
end
|
41
41
|
|
data/lib/gren.rb
CHANGED
data/lib/grendb/cli.rb
CHANGED
@@ -8,14 +8,21 @@ module Grendb
|
|
8
8
|
# オプション
|
9
9
|
option = FindGrep::FindGrep::DEFAULT_OPTION
|
10
10
|
option.dbFile = ENV['GRENDB_DEFAULT_DB']
|
11
|
+
|
12
|
+
# デフォルトのマッチモードは'File'
|
13
|
+
option.isMatchFile = true
|
11
14
|
|
12
15
|
# オプション解析
|
13
16
|
opt = OptionParser.new("#{File.basename($0)} [option] keyword1 [keyword2 ...]")
|
14
17
|
opt.on('--db [GREN_DB_FILE]', 'Search from the grendb database.') {|v| option.dbFile = v }
|
15
18
|
opt.on('-f KEYWORD', '--file-keyword KEYWORD', 'Path keyword. (Enable multiple call)') {|v| option.filePatterns << v}
|
19
|
+
opt.on('-s SUFFIX', '--suffix SUFFIX', 'Search suffix.') {|v| option.suffixs << v }
|
16
20
|
opt.on('-i', '--ignore', 'Ignore case.') {|v| option.ignoreCase = true}
|
17
21
|
opt.on('-c', '--color', 'Color highlight.') {|v| option.colorHighlight = true}
|
18
22
|
opt.on('--no-snip', 'There being a long line, it does not snip.') {|v| option.noSnip = true }
|
23
|
+
opt.on('-g', '--groonga-only', 'Search only groonga db.') {|v| option.groongaOnly = true }
|
24
|
+
opt.on('--mf', '--match-file', 'Match file. (Default)') {|v| option.isMatchFile = true }
|
25
|
+
opt.on('-l', '--ml', '--match-line', 'Match line, same mode as "gren".') {|v| option.isMatchFile = false }
|
19
26
|
|
20
27
|
opt.parse!(arguments)
|
21
28
|
|
data/lib/mkgrendb/cli.rb
CHANGED
@@ -9,12 +9,14 @@ module Mkgrendb
|
|
9
9
|
isDump = false
|
10
10
|
isFull = false
|
11
11
|
isDelete = false
|
12
|
+
isReport = false
|
12
13
|
|
13
14
|
opt = OptionParser.new "#{File.basename($0)} INPUT_YAML1 [INPUT_YAML2 ...]"
|
14
15
|
opt.on('--ddb', "--default-db", "Create or Update default DB. (Plase set ENV['GRENDB_DEFAULT_DB'])") {|v| input_yamls << ENV['GRENDB_DEFAULT_DB']}
|
15
16
|
opt.on('--full', "Full update DB. (Delete and create)") {|v| isFull = true }
|
16
17
|
opt.on('--delete', "Delete DB. (Not delete yaml)") {|v| isDelete = true }
|
17
18
|
opt.on('--dump', "Dump DB.") {|v| isDump = true }
|
19
|
+
opt.on('--report', "Database Report.") {|v| isReport = true }
|
18
20
|
opt.parse!(arguments)
|
19
21
|
|
20
22
|
input_yamls.concat arguments
|
@@ -31,6 +33,8 @@ module Mkgrendb
|
|
31
33
|
stdout.puts
|
32
34
|
elsif (isDump)
|
33
35
|
obj.dump
|
36
|
+
elsif (isReport)
|
37
|
+
obj.report
|
34
38
|
else
|
35
39
|
obj.update
|
36
40
|
stdout.puts
|
data/lib/mkgrendb/mkgrendb.rb
CHANGED
@@ -5,7 +5,7 @@ require 'pathname'
|
|
5
5
|
require 'rubygems'
|
6
6
|
require 'groonga'
|
7
7
|
require File.join(File.dirname(__FILE__), '../common/grenfiletest')
|
8
|
-
require File.join(File.dirname(__FILE__), '../common/
|
8
|
+
require File.join(File.dirname(__FILE__), '../common/util')
|
9
9
|
include Gren
|
10
10
|
|
11
11
|
module Mkgrendb
|
@@ -25,7 +25,12 @@ module Mkgrendb
|
|
25
25
|
db_create(@output_db)
|
26
26
|
db_open(@output_db)
|
27
27
|
@src["directory"].each do |dir|
|
28
|
-
|
28
|
+
dir = File.expand_path(dir)
|
29
|
+
if (FileTest.directory? dir)
|
30
|
+
db_add_dir(dir)
|
31
|
+
else
|
32
|
+
db_add_file(STDOUT, dir)
|
33
|
+
end
|
29
34
|
end
|
30
35
|
@end_time = Time.now
|
31
36
|
print_result
|
@@ -46,7 +51,7 @@ module Mkgrendb
|
|
46
51
|
|
47
52
|
def print_result
|
48
53
|
puts
|
49
|
-
puts "input_yaml : #{@input_yaml} (#{
|
54
|
+
puts "input_yaml : #{@input_yaml} (#{Util::time_s(time)})"
|
50
55
|
puts "output_db : #{@output_db}*"
|
51
56
|
puts "files : #{@file_count}"
|
52
57
|
puts "updates : #{@update_count}"
|
@@ -58,9 +63,11 @@ module Mkgrendb
|
|
58
63
|
documents = Groonga::Context.default["documents"]
|
59
64
|
records = documents.select
|
60
65
|
records.each do |record|
|
66
|
+
p record
|
61
67
|
puts "path : #{record.path}"
|
68
|
+
puts "suffix : #{record.suffix}"
|
62
69
|
puts "timestamp : #{record.timestamp.strftime('%Y/%m/%d %H:%M:%S')}"
|
63
|
-
puts "content :", record.content[0..64]
|
70
|
+
puts "content :", record.content ? record.content[0..64] : nil
|
64
71
|
puts
|
65
72
|
end
|
66
73
|
end
|
@@ -77,6 +84,7 @@ module Mkgrendb
|
|
77
84
|
table.string("path")
|
78
85
|
table.text("content")
|
79
86
|
table.time("timestamp")
|
87
|
+
table.text("suffix")
|
80
88
|
end
|
81
89
|
|
82
90
|
schema.create_table("terms",
|
@@ -85,7 +93,7 @@ module Mkgrendb
|
|
85
93
|
:default_tokenizer => "TokenBigram") do |table|
|
86
94
|
table.index("documents.path", :with_position => true)
|
87
95
|
table.index("documents.content", :with_position => true)
|
88
|
-
table.index("documents.
|
96
|
+
table.index("documents.suffix", :with_position => true)
|
89
97
|
end
|
90
98
|
end
|
91
99
|
puts "create : #{filename} created."
|
@@ -127,6 +135,7 @@ module Mkgrendb
|
|
127
135
|
:path => filename,
|
128
136
|
:content => nil,
|
129
137
|
:timestamp => File.mtime(filename),
|
138
|
+
:suffix => File::extname(filename),
|
130
139
|
}
|
131
140
|
|
132
141
|
# 検索するデータベース
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 2
|
8
|
-
-
|
9
|
-
version: 0.2.
|
8
|
+
- 4
|
9
|
+
version: 0.2.4
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- ongaeshi
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-
|
17
|
+
date: 2010-10-10 00:00:00 +09:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -103,6 +103,7 @@ files:
|
|
103
103
|
- lib/common/grensnip.rb
|
104
104
|
- lib/common/platform.rb
|
105
105
|
- lib/common/string_snip.rb
|
106
|
+
- lib/common/util.rb
|
106
107
|
- lib/findgrep/findgrep.rb
|
107
108
|
- lib/findgrep/result.rb
|
108
109
|
- lib/gren.rb
|