milkode 0.7.1 → 0.8.0

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.
Files changed (53) hide show
  1. data/Gemfile +17 -4
  2. data/HISTORY.ja.rdoc +27 -0
  3. data/HISTORY.rdoc +27 -0
  4. data/LICENSE.txt +23 -1
  5. data/Rakefile +1 -16
  6. data/VERSION +1 -1
  7. data/bin/gmilk +1 -1
  8. data/bin/milk +1 -1
  9. data/lib/milkode/cdstk/cdstk.rb +171 -168
  10. data/lib/milkode/cdstk/milkode_yaml.rb +1 -1
  11. data/lib/milkode/cdweb/app.rb +11 -3
  12. data/lib/milkode/cdweb/lib/command.rb +43 -0
  13. data/lib/milkode/cdweb/lib/database.rb +58 -210
  14. data/lib/milkode/cdweb/lib/mkurl.rb +10 -1
  15. data/lib/milkode/cdweb/lib/package_list.rb +61 -0
  16. data/lib/milkode/cdweb/lib/search_files.rb +2 -1
  17. data/lib/milkode/cdweb/public/css/bootstrap-responsive.min.css +9 -0
  18. data/lib/milkode/cdweb/public/css/bootstrap.min.css +9 -0
  19. data/lib/milkode/cdweb/public/css/milkode.css +44 -9
  20. data/lib/milkode/cdweb/public/img/glyphicons-halflings-white.png +0 -0
  21. data/lib/milkode/cdweb/public/img/glyphicons-halflings.png +0 -0
  22. data/lib/milkode/cdweb/public/js/bootstrap.min.js +6 -0
  23. data/lib/milkode/cdweb/views/index.haml +52 -16
  24. data/lib/milkode/cdweb/views/packages.haml +11 -0
  25. data/lib/milkode/cli.rb +8 -0
  26. data/lib/milkode/common/array_diff.rb +18 -0
  27. data/lib/milkode/common/util.rb +16 -0
  28. data/lib/milkode/database/document_record.rb +64 -0
  29. data/lib/milkode/database/document_table.rb +341 -0
  30. data/lib/milkode/database/groonga_database.rb +105 -0
  31. data/lib/milkode/database/package_table.rb +98 -0
  32. data/lib/milkode/findgrep/findgrep.rb +20 -124
  33. data/lib/milkode/grep/cli_grep.rb +3 -1
  34. data/milkode.gemspec +32 -2
  35. data/test/data/.gitignore +4 -0
  36. data/test/data/c_project/a.txt +1 -0
  37. data/test/data/c_project/abc.c +2 -0
  38. data/test/data/c_project/abc.h +3 -0
  39. data/test/data/c_project/b.txt +1 -0
  40. data/test/data/c_project/c.txt +1 -0
  41. data/test/data/c_project/cc.txt +1 -0
  42. data/test/data/c_project/to/file.rb +1 -0
  43. data/test/test_cdstk.rb +4 -4
  44. data/test/test_cli.rb +9 -2
  45. data/test/test_database.rb +5 -14
  46. data/test/test_document_record.rb +77 -0
  47. data/test/test_document_table.rb +317 -0
  48. data/test/test_groonga_database.rb +58 -0
  49. data/test/test_mkurl.rb +2 -0
  50. data/test/test_package_list.rb +21 -0
  51. data/test/test_package_table.rb +215 -0
  52. data/test/test_util.rb +8 -0
  53. metadata +57 -5
@@ -0,0 +1,105 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # @file
4
+ # @brief
5
+ # @author ongaeshi
6
+ # @date 2012/05/28
7
+
8
+ require 'rubygems'
9
+ require 'groonga'
10
+ require 'milkode/common/dbdir'
11
+ require 'fileutils'
12
+ require 'milkode/database/package_table.rb'
13
+ require 'milkode/database/document_table.rb'
14
+ require 'milkode/database/document_record.rb'
15
+
16
+ module Milkode
17
+ class GroongaDatabase
18
+ def initialize
19
+ @database = nil
20
+ end
21
+
22
+ # ディレクトリを指定して開く
23
+ def open(base_dir)
24
+ open_file Dbdir.groonga_path(base_dir)
25
+ end
26
+
27
+ # データベースファイルを指定して開く
28
+ def open_file(filename)
29
+ if File.exist?(filename)
30
+ @database = Groonga::Database.open(filename)
31
+ compatible?(filename)
32
+ define_schema
33
+ else
34
+ FileUtils.mkdir_p(File.dirname filename)
35
+ @database = Groonga::Database.create(:path => filename)
36
+ define_schema
37
+ end
38
+
39
+ @packages = nil
40
+ @documents = nil
41
+
42
+ if block_given?
43
+ begin
44
+ yield self
45
+ ensure
46
+ close unless closed?
47
+ end
48
+ end
49
+ end
50
+
51
+ # あらかじめ GroongaDatabase#open しておく必要がある
52
+ def yaml_sync(yaml_contents)
53
+ yaml_contents.each do |yp|
54
+ packages.add(yp.name, yp.directory, yp.options) if packages[yp.name].nil?
55
+ end
56
+ end
57
+
58
+ def close
59
+ @database.close
60
+ @database = nil
61
+ end
62
+
63
+ def closed?
64
+ @database.nil? or @database.closed?
65
+ end
66
+
67
+ def documents
68
+ @documents ||= DocumentTable.new(Groonga["documents"])
69
+ end
70
+
71
+ def packages
72
+ @packages ||= PackageTable.new(Groonga["packages"])
73
+ end
74
+
75
+ def compatible?(filename, no_exit = nil)
76
+ unless Groonga["documents"] && Groonga["packages"]
77
+ unless no_exit
78
+ puts <<EOF
79
+ Milkode repository is old -> #{filename}.
80
+ Please rebuild repository,
81
+
82
+ milk rebuild --all
83
+
84
+ See 'milk --help' or http://milkode.ongaeshi.me .
85
+ EOF
86
+ exit -1
87
+ else
88
+ nil
89
+ end
90
+ else
91
+ true
92
+ end
93
+ end
94
+
95
+ private
96
+
97
+ def define_schema
98
+ DocumentTable.define_schema
99
+ PackageTable.define_schema
100
+ end
101
+
102
+ end
103
+ end
104
+
105
+
@@ -0,0 +1,98 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # @file
4
+ # @brief
5
+ # @author ongaeshi
6
+ # @date 2012/05/29
7
+
8
+ module Milkode
9
+ class PackageTable
10
+ include Enumerable
11
+
12
+ def self.define_schema
13
+ Groonga::Schema.define do |schema|
14
+ schema.create_table("packages", :type => :hash) do |table|
15
+ table.string("name")
16
+ table.string("directory")
17
+ table.time("addtime")
18
+ table.time("updatetime")
19
+ table.time("viewtime")
20
+ table.time("favtime")
21
+ end
22
+ end
23
+ end
24
+
25
+ def initialize(table)
26
+ @table = table
27
+ end
28
+
29
+ def size
30
+ @table.size
31
+ end
32
+
33
+ def add(name, directory, options)
34
+ @table.add(name,
35
+ :name => name,
36
+ :directory => directory,
37
+ :addtime => Time.now,
38
+ :favtime => options[:fav] ? Time.now : Time.at(0))
39
+ end
40
+
41
+ def remove(name)
42
+ @table[name].delete
43
+ end
44
+
45
+ def remove_all
46
+ self.each do |r|
47
+ r.record_id.delete
48
+ end
49
+ end
50
+
51
+ def [](name)
52
+ @table[name]
53
+ end
54
+
55
+ def each
56
+ @table.select.each do |r|
57
+ yield r
58
+ end
59
+ end
60
+
61
+ def sort(kind, order = "descending")
62
+ @table.sort([{:key => kind, :order => order}])
63
+ end
64
+
65
+ def dump
66
+ self.each do |r|
67
+ p [r.name, r.addtime, r.updatetime, r.viewtime, r.favtime]
68
+ end
69
+ end
70
+
71
+ def touch(name, kind, time = Time.now)
72
+ @table[name][kind] = time
73
+ end
74
+
75
+ def touch_if(name, kind, time = Time.now)
76
+ record = @table[name]
77
+
78
+ if record
79
+ record[kind] = time
80
+ else
81
+ nil
82
+ end
83
+ end
84
+
85
+ def favs
86
+ sorted = sort('favtime')
87
+ zero_time = Time.at(0)
88
+ index = sorted.find_index {|v| v.favtime == zero_time}
89
+ unless index.nil?
90
+ sorted[0...index]
91
+ else
92
+ sorted
93
+ end
94
+ end
95
+ end
96
+ end
97
+
98
+
@@ -7,11 +7,11 @@ require 'kconv'
7
7
  require 'milkode/common/platform'
8
8
  require 'milkode/common/grenfiletest'
9
9
  require 'milkode/common/grensnip'
10
- require 'groonga'
11
10
  require 'milkode/common/util'
12
11
  include Gren
13
12
  require 'cgi'
14
13
  require 'pathname'
14
+ require 'milkode/database/groonga_database'
15
15
 
16
16
  module FindGrep
17
17
  class FindGrep
@@ -79,18 +79,20 @@ module FindGrep
79
79
  end
80
80
 
81
81
  def open_database()
82
- # データベース開く
82
+ # データベースファイル
83
83
  dbfile = Pathname(File.expand_path(@option.dbFile))
84
-
84
+
85
+ # データベース開く
85
86
  if dbfile.exist?
86
- Groonga::Database.open(dbfile.to_s)
87
- puts "open : #{dbfile} open." unless @option.isSilent
87
+ if !@grndb || @grndb.closed?
88
+ @grndb = GroongaDatabase.new
89
+ @grndb.open_file(dbfile.to_s)
90
+ @documents = @grndb.documents
91
+ puts "open : #{dbfile.to_s} open." unless @option.isSilent
92
+ end
88
93
  else
89
94
  raise "error : #{dbfile.to_s} not found!!"
90
95
  end
91
-
92
- # ドキュメントを取
93
- @documents = Groonga::Context.default["documents"]
94
96
  end
95
97
 
96
98
  def strs2regs(strs, ignore = false)
@@ -205,124 +207,18 @@ module FindGrep
205
207
  end
206
208
 
207
209
  def searchDatabase
208
- # 全てのパターンを検索
209
- table = @documents.select do |record|
210
- expression = nil
211
-
212
- # パターン(マッチ行)
213
- @patterns.each do |word|
214
- sub_expression = record.content =~ word
215
- if expression.nil?
216
- expression = sub_expression
217
- else
218
- expression &= sub_expression
219
- end
220
- end
221
-
222
- # キーワード(絞り込むための手がかり)
223
- @option.keywords.each do |word|
224
- sub_expression = record.content =~ word
225
- sub_expression |= record.path =~ word
226
- if expression.nil?
227
- expression = sub_expression
228
- else
229
- expression &= sub_expression
230
- end
231
- end
232
-
233
- # パッケージ(OR)
234
- pe = package_expression(record, @option.packages)
235
- if (pe)
236
- if expression.nil?
237
- expression = pe
238
- else
239
- expression &= pe
240
- end
241
- end
242
-
243
- # パス
244
- @option.filePatterns.each do |word|
245
- sub_expression = record.path =~ word
246
- if expression.nil?
247
- expression = sub_expression
248
- else
249
- expression &= sub_expression
250
- end
251
- end
252
-
253
- # 拡張子(OR)
254
- se = suffix_expression(record)
255
- if (se)
256
- if expression.nil?
257
- expression = se
258
- else
259
- expression &= se
260
- end
261
- end
262
-
263
- # 検索式
264
- expression
265
- end
266
-
267
- # @todo オプションで出来るようにする?
268
- # タイムスタンプでソート
269
- # records = table.sort([{:key => "_score", :order => "descending"},
270
- # {:key => "timestamp", :order => "descending"}])
271
-
272
- # ファイル名でソート
273
- table.sort([{:key => "shortpath", :order => "ascending"}])
210
+ @documents.search(
211
+ :patterns => @patterns,
212
+ :keywords => @option.keywords,
213
+ :paths => @option.filePatterns,
214
+ :packages => @option.packages,
215
+ # :restpaths => ,
216
+ :suffixs => @option.suffixs
217
+ # :offset => ,
218
+ # :limit => ,
219
+ )
274
220
  end
275
221
 
276
- def and_expression(key, list)
277
- sub = nil
278
-
279
- list.each do |word|
280
- e = key =~ word
281
- if sub.nil?
282
- sub = e
283
- else
284
- sub &= e
285
- end
286
- end
287
-
288
- sub
289
- end
290
-
291
- def package_expression(record, packages)
292
- sub = nil
293
-
294
- # @todo 専用カラム package が欲しいところ
295
- # でも今でもpackageはORとして機能してるからいいっちゃいい
296
- packages.each do |word|
297
- e = record.path =~ word
298
- if sub.nil?
299
- sub = e
300
- else
301
- sub |= e
302
- end
303
- end
304
-
305
- sub
306
- end
307
- private :package_expression
308
-
309
- def suffix_expression(record)
310
- sub = nil
311
-
312
- @option.suffixs.each do |word|
313
- e = record.suffix =~ word
314
- if sub.nil?
315
- sub = e
316
- else
317
- sub |= e
318
- end
319
- end
320
-
321
- sub
322
- end
323
- private :suffix_expression
324
-
325
-
326
222
  def searchFromDir(stdout, dir, depth)
327
223
  if (@option.depth != -1 && depth > @option.depth)
328
224
  return
@@ -154,7 +154,9 @@ EOF
154
154
  private
155
155
 
156
156
  def self.setup_package(option, my_option, keyword)
157
- dirs = yaml_load.contents.find_all {|p| p.name.include? keyword }.map{|p| p.directory}
157
+ # @memo package指定が簡単になった
158
+ # dirs = yaml_load.contents.find_all {|p| p.name.include? keyword }.map{|p| p.directory}
159
+ dirs = yaml_load.contents.find_all {|p| p.name.include? keyword }.map{|p| p.name}
158
160
  raise NotFoundPackage.new keyword if (dirs.empty?)
159
161
  option.packages += dirs
160
162
  my_option[:packages] += dirs
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{milkode}
8
- s.version = "0.7.1"
8
+ s.version = "0.8.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["ongaeshi"]
12
- s.date = %q{2012-05-15}
12
+ s.date = %q{2012-06-20}
13
13
  s.description = %q{Line based local source code search engine & grep-command & web-app.}
14
14
  s.email = %q{ongaeshi0621@gmail.com}
15
15
  s.executables = ["gmilk", "milk"]
@@ -42,10 +42,13 @@ Gem::Specification.new do |s|
42
42
  "lib/milkode/cdweb/lib/database.rb",
43
43
  "lib/milkode/cdweb/lib/grep.rb",
44
44
  "lib/milkode/cdweb/lib/mkurl.rb",
45
+ "lib/milkode/cdweb/lib/package_list.rb",
45
46
  "lib/milkode/cdweb/lib/query.rb",
46
47
  "lib/milkode/cdweb/lib/search_contents.rb",
47
48
  "lib/milkode/cdweb/lib/search_files.rb",
48
49
  "lib/milkode/cdweb/lib/web_setting.rb",
50
+ "lib/milkode/cdweb/public/css/bootstrap-responsive.min.css",
51
+ "lib/milkode/cdweb/public/css/bootstrap.min.css",
49
52
  "lib/milkode/cdweb/public/css/coderay-patch.css",
50
53
  "lib/milkode/cdweb/public/css/coderay.css",
51
54
  "lib/milkode/cdweb/public/css/milkode.css",
@@ -55,17 +58,22 @@ Gem::Specification.new do |s|
55
58
  "lib/milkode/cdweb/public/images/file.png",
56
59
  "lib/milkode/cdweb/public/images/go-home-5.png",
57
60
  "lib/milkode/cdweb/public/images/help.png",
61
+ "lib/milkode/cdweb/public/img/glyphicons-halflings-white.png",
62
+ "lib/milkode/cdweb/public/img/glyphicons-halflings.png",
63
+ "lib/milkode/cdweb/public/js/bootstrap.min.js",
58
64
  "lib/milkode/cdweb/public/js/milkode.js",
59
65
  "lib/milkode/cdweb/views/filelist.haml",
60
66
  "lib/milkode/cdweb/views/header_menu.haml",
61
67
  "lib/milkode/cdweb/views/help.haml",
62
68
  "lib/milkode/cdweb/views/index.haml",
63
69
  "lib/milkode/cdweb/views/layout.haml",
70
+ "lib/milkode/cdweb/views/packages.haml",
64
71
  "lib/milkode/cdweb/views/search.haml",
65
72
  "lib/milkode/cdweb/views/search_form.haml",
66
73
  "lib/milkode/cdweb/views/view.haml",
67
74
  "lib/milkode/cli.rb",
68
75
  "lib/milkode/common/archive-zip.rb",
76
+ "lib/milkode/common/array_diff.rb",
69
77
  "lib/milkode/common/dbdir.rb",
70
78
  "lib/milkode/common/dir.rb",
71
79
  "lib/milkode/common/display_util.rb",
@@ -76,6 +84,10 @@ Gem::Specification.new do |s|
76
84
  "lib/milkode/common/platform.rb",
77
85
  "lib/milkode/common/string_snip.rb",
78
86
  "lib/milkode/common/util.rb",
87
+ "lib/milkode/database/document_record.rb",
88
+ "lib/milkode/database/document_table.rb",
89
+ "lib/milkode/database/groonga_database.rb",
90
+ "lib/milkode/database/package_table.rb",
79
91
  "lib/milkode/findgrep/findgrep.rb",
80
92
  "lib/milkode/findgrep/result.rb",
81
93
  "lib/milkode/grep/cli_grep.rb",
@@ -86,6 +98,13 @@ Gem::Specification.new do |s|
86
98
  "test/data/abc.zip",
87
99
  "test/data/b_project/runner.rb",
88
100
  "test/data/b_project/test_dir.rb",
101
+ "test/data/c_project/a.txt",
102
+ "test/data/c_project/abc.c",
103
+ "test/data/c_project/abc.h",
104
+ "test/data/c_project/b.txt",
105
+ "test/data/c_project/c.txt",
106
+ "test/data/c_project/cc.txt",
107
+ "test/data/c_project/to/file.rb",
89
108
  "test/data/no_auto_ignore/.gitignore",
90
109
  "test/data/no_auto_ignore/a.txt",
91
110
  "test/data/nodir_abc.zip",
@@ -104,14 +123,19 @@ Gem::Specification.new do |s|
104
123
  "test/test_database.rb",
105
124
  "test/test_dbdir.rb",
106
125
  "test/test_dir.rb",
126
+ "test/test_document_record.rb",
127
+ "test/test_document_table.rb",
107
128
  "test/test_findgrep.rb",
108
129
  "test/test_gren_util.rb",
130
+ "test/test_groonga_database.rb",
109
131
  "test/test_helper.rb",
110
132
  "test/test_ignore_checker.rb",
111
133
  "test/test_ignore_setting.rb",
112
134
  "test/test_milkode_yaml.rb",
113
135
  "test/test_mkurl.rb",
114
136
  "test/test_package.rb",
137
+ "test/test_package_list.rb",
138
+ "test/test_package_table.rb",
115
139
  "test/test_query.rb",
116
140
  "test/test_string_snip.rb",
117
141
  "test/test_util.rb",
@@ -139,6 +163,8 @@ Gem::Specification.new do |s|
139
163
  s.add_runtime_dependency(%q<haml>, [">= 3.1.2"])
140
164
  s.add_runtime_dependency(%q<sass>, [">= 3.1.3"])
141
165
  s.add_runtime_dependency(%q<thor>, ["~> 0.15.0"])
166
+ s.add_development_dependency(%q<bundler>, [">= 0"])
167
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
142
168
  else
143
169
  s.add_dependency(%q<termcolor>, [">= 1.2.0"])
144
170
  s.add_dependency(%q<rroonga>, [">= 1.1.0"])
@@ -151,6 +177,8 @@ Gem::Specification.new do |s|
151
177
  s.add_dependency(%q<haml>, [">= 3.1.2"])
152
178
  s.add_dependency(%q<sass>, [">= 3.1.3"])
153
179
  s.add_dependency(%q<thor>, ["~> 0.15.0"])
180
+ s.add_dependency(%q<bundler>, [">= 0"])
181
+ s.add_dependency(%q<jeweler>, [">= 0"])
154
182
  end
155
183
  else
156
184
  s.add_dependency(%q<termcolor>, [">= 1.2.0"])
@@ -164,6 +192,8 @@ Gem::Specification.new do |s|
164
192
  s.add_dependency(%q<haml>, [">= 3.1.2"])
165
193
  s.add_dependency(%q<sass>, [">= 3.1.3"])
166
194
  s.add_dependency(%q<thor>, ["~> 0.15.0"])
195
+ s.add_dependency(%q<bundler>, [">= 0"])
196
+ s.add_dependency(%q<jeweler>, [">= 0"])
167
197
  end
168
198
  end
169
199