bitclust-core 1.2.6 → 1.6.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 (160) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -0
  3. data/README.md +65 -0
  4. data/Rakefile +32 -0
  5. data/data/bitclust/catalog/ja_JP.UTF-8 +19 -1
  6. data/data/bitclust/searchpage/index.html +90 -0
  7. data/data/bitclust/template/class +69 -8
  8. data/data/bitclust/template/function +2 -2
  9. data/data/bitclust/template/layout +11 -3
  10. data/data/bitclust/template/method +2 -2
  11. data/data/bitclust/template/search +1 -1
  12. data/data/bitclust/template.epub/class +22 -1
  13. data/data/bitclust/template.epub/function +2 -2
  14. data/data/bitclust/template.epub/layout +1 -3
  15. data/data/bitclust/template.epub/method +2 -2
  16. data/data/bitclust/template.lillia/class +26 -5
  17. data/data/bitclust/template.lillia/layout +1 -3
  18. data/data/bitclust/template.lillia/method +2 -2
  19. data/data/bitclust/template.offline/class +49 -5
  20. data/data/bitclust/template.offline/function +2 -2
  21. data/data/bitclust/template.offline/layout +27 -3
  22. data/data/bitclust/template.offline/method +2 -2
  23. data/lib/bitclust/app.rb +17 -17
  24. data/lib/bitclust/capi_converter.rb +20 -0
  25. data/lib/bitclust/classentry.rb +68 -17
  26. data/lib/bitclust/compat.rb +3 -2
  27. data/lib/bitclust/completion.rb +59 -27
  28. data/lib/bitclust/crossrubyutils.rb +9 -5
  29. data/lib/bitclust/database.rb +29 -8
  30. data/lib/bitclust/doc_converter.rb +63 -0
  31. data/lib/bitclust/docentry.rb +2 -1
  32. data/lib/bitclust/entity_splitter.rb +221 -0
  33. data/lib/bitclust/entry.rb +48 -7
  34. data/lib/bitclust/exception.rb +1 -0
  35. data/lib/bitclust/functiondatabase.rb +14 -1
  36. data/lib/bitclust/functionentry.rb +6 -1
  37. data/lib/bitclust/functionreferenceparser.rb +5 -4
  38. data/lib/bitclust/generators/epub.rb +11 -3
  39. data/lib/bitclust/htmlutils.rb +2 -1
  40. data/lib/bitclust/include_graph.rb +375 -0
  41. data/lib/bitclust/include_pruner.rb +144 -0
  42. data/lib/bitclust/interface.rb +2 -1
  43. data/lib/bitclust/libraryentry.rb +9 -7
  44. data/lib/bitclust/lineinput.rb +8 -5
  45. data/lib/bitclust/link_checker.rb +179 -0
  46. data/lib/bitclust/markdown_bridge.rb +186 -0
  47. data/lib/bitclust/markdown_orchestrator.rb +267 -0
  48. data/lib/bitclust/markdown_to_rrd.rb +824 -0
  49. data/lib/bitclust/markdown_tree.rb +217 -0
  50. data/lib/bitclust/mdcompiler.rb +883 -0
  51. data/lib/bitclust/mdparser.rb +347 -0
  52. data/lib/bitclust/messagecatalog.rb +4 -3
  53. data/lib/bitclust/method_since_calculator.rb +117 -0
  54. data/lib/bitclust/methoddatabase.rb +125 -14
  55. data/lib/bitclust/methodentry.rb +130 -7
  56. data/lib/bitclust/methodid.rb +13 -11
  57. data/lib/bitclust/methodsignature.rb +11 -4
  58. data/lib/bitclust/nameutils.rb +42 -22
  59. data/lib/bitclust/parseutils.rb +1 -0
  60. data/lib/bitclust/preprocessor.rb +70 -32
  61. data/lib/bitclust/progress_bar.rb +1 -0
  62. data/lib/bitclust/rdcompiler.rb +197 -96
  63. data/lib/bitclust/refsdatabase.rb +24 -8
  64. data/lib/bitclust/reloadable_request_handler.rb +72 -0
  65. data/lib/bitclust/requesthandler.rb +22 -16
  66. data/lib/bitclust/ridatabase.rb +11 -4
  67. data/lib/bitclust/rrd_to_markdown.rb +925 -0
  68. data/lib/bitclust/rrdparser.rb +197 -30
  69. data/lib/bitclust/runner.rb +18 -2
  70. data/lib/bitclust/screen.rb +81 -11
  71. data/lib/bitclust/search_index_generator.rb +288 -0
  72. data/lib/bitclust/searcher.rb +72 -22
  73. data/lib/bitclust/server.rb +6 -1
  74. data/lib/bitclust/silent_progress_bar.rb +1 -0
  75. data/lib/bitclust/simplesearcher.rb +25 -12
  76. data/lib/bitclust/subcommand.rb +8 -1
  77. data/lib/bitclust/subcommands/ancestors_command.rb +10 -2
  78. data/lib/bitclust/subcommands/checklink_command.rb +54 -0
  79. data/lib/bitclust/subcommands/chm_command.rb +16 -7
  80. data/lib/bitclust/subcommands/classes_command.rb +6 -0
  81. data/lib/bitclust/subcommands/epub_command.rb +1 -0
  82. data/lib/bitclust/subcommands/extract_command.rb +6 -0
  83. data/lib/bitclust/subcommands/htmlfile_command.rb +22 -7
  84. data/lib/bitclust/subcommands/init_command.rb +5 -1
  85. data/lib/bitclust/subcommands/list_command.rb +13 -4
  86. data/lib/bitclust/subcommands/lookup_command.rb +29 -9
  87. data/lib/bitclust/subcommands/methods_command.rb +11 -2
  88. data/lib/bitclust/subcommands/methodsince_command.rb +80 -0
  89. data/lib/bitclust/subcommands/preproc_command.rb +6 -0
  90. data/lib/bitclust/subcommands/property_command.rb +3 -1
  91. data/lib/bitclust/subcommands/query_command.rb +1 -0
  92. data/lib/bitclust/subcommands/searchpage_command.rb +102 -0
  93. data/lib/bitclust/subcommands/server_command.rb +16 -10
  94. data/lib/bitclust/subcommands/setup_command.rb +25 -10
  95. data/lib/bitclust/subcommands/statichtml_command.rb +132 -6
  96. data/lib/bitclust/subcommands/update_command.rb +111 -2
  97. data/lib/bitclust/syntax_highlighter.rb +52 -5
  98. data/lib/bitclust/textutils.rb +4 -3
  99. data/lib/bitclust/version.rb +2 -1
  100. data/lib/bitclust/version_badges.rb +90 -0
  101. data/lib/bitclust/whole_file_gate.rb +137 -0
  102. data/lib/bitclust.rb +1 -0
  103. data/test/test_app.rb +269 -0
  104. data/test/test_bitclust.rb +2 -0
  105. data/test/test_capi_converter.rb +91 -0
  106. data/test/test_class_screen.rb +413 -0
  107. data/test/test_copy_doc_md.rb +53 -0
  108. data/test/test_doc_converter.rb +78 -0
  109. data/test/test_entity_splitter.rb +231 -0
  110. data/test/test_entry.rb +207 -2
  111. data/test/test_eol_warning.rb +43 -0
  112. data/test/test_functionreferenceparser.rb +11 -0
  113. data/test/test_include_graph.rb +640 -0
  114. data/test/test_include_pruner.rb +133 -0
  115. data/test/test_link_checker.rb +114 -0
  116. data/test/test_lookup_command.rb +135 -0
  117. data/test/test_markdown_bridge.rb +217 -0
  118. data/test/test_markdown_orchestrator.rb +478 -0
  119. data/test/test_markdown_to_rrd.rb +757 -0
  120. data/test/test_markdown_tree.rb +369 -0
  121. data/test/test_mdcompiler.rb +1276 -0
  122. data/test/test_mdparser.rb +538 -0
  123. data/test/test_method_screen.rb +166 -0
  124. data/test/test_method_since_calculator.rb +290 -0
  125. data/test/test_methoddatabase.rb +16 -0
  126. data/test/test_methodentry.rb +328 -0
  127. data/test/test_methodsignature.rb +3 -1
  128. data/test/test_methodsince_command.rb +168 -0
  129. data/test/test_nameutils.rb +22 -0
  130. data/test/test_preprocessor.rb +215 -0
  131. data/test/test_rdcompiler.rb +429 -27
  132. data/test/test_refsdatabase.rb +32 -0
  133. data/test/test_rrd_to_markdown.rb +968 -0
  134. data/test/test_rrdparser.rb +295 -2
  135. data/test/test_run_ruby_wasm.rb +54 -0
  136. data/test/test_run_worker_prelude.rb +83 -0
  137. data/test/test_runner.rb +51 -0
  138. data/test/test_search_index_generator.rb +513 -0
  139. data/test/test_search_screen.rb +48 -0
  140. data/test/test_searcher.rb +153 -0
  141. data/test/test_searchpage_command.rb +167 -0
  142. data/test/test_simplesearcher.rb +28 -0
  143. data/test/test_statichtml_command.rb +204 -0
  144. data/test/test_syntax_highlighter.rb +60 -0
  145. data/test/test_whole_file_gate.rb +175 -0
  146. data/theme/default/js/NOTICE +42 -0
  147. data/theme/default/js/run-worker.js +111 -0
  148. data/theme/default/js/run.js +350 -0
  149. data/theme/default/js/search_controller.js +134 -0
  150. data/theme/default/js/search_init.js +176 -0
  151. data/theme/default/js/search_navigation.js +110 -0
  152. data/theme/default/js/search_page.js +202 -0
  153. data/theme/default/js/search_ranker.js +244 -0
  154. data/theme/default/script.js +91 -18
  155. data/theme/default/search.css +149 -0
  156. data/theme/default/style.css +193 -21
  157. data/theme/default/syntax-highlight.css +8 -0
  158. data/theme/lillia/style.css +45 -1
  159. metadata +178 -21
  160. data/README +0 -32
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # bitclust/reloadable_request_handler.rb
4
+ #
5
+
6
+ require 'bitclust/methoddatabase'
7
+ require 'bitclust/functiondatabase'
8
+ require 'bitclust/requesthandler'
9
+
10
+ module BitClust
11
+
12
+ # `bitclust server` を再起動しなくても `rake generate` で再生成された DB を
13
+ # 読み直せるようにするラッパー(bitclust#275)。
14
+ #
15
+ # MethodDatabase/FunctionDatabase はエントリを一度読むとメモリ上にメモ化
16
+ # し続けるため、App#initialize で一度だけ生成した RequestHandler をずっと
17
+ # 使い回す従来の作りでは、DB をディスク上で再生成してもプロセスは古い内容
18
+ # を返し続けてしまう。
19
+ #
20
+ # 新鮮さの判定は DB ディレクトリ直下の "properties" ファイルの mtime で行う。
21
+ # `rake generate` は対象を rm_rf してから MethodDatabase#init(properties を
22
+ # touch) → update という手順を踏むため、再生成のたびに properties は必ず
23
+ # 書き直される。#handle は毎リクエストその mtime を stat するだけなので
24
+ # コストは無視できる。
25
+ #
26
+ # 再生成の途中(rm_rf 直後〜init 前)は properties が一時的に存在しない。
27
+ # その間は新鮮さを判定できないので、古い RequestHandler をそのまま使い
28
+ # 続けてリクエストを失敗させない。次のリクエストで改めて判定する。
29
+ class ReloadableRequestHandler
30
+
31
+ def initialize(dbpath, capi, manager, request_handler_class)
32
+ @dbpath = dbpath
33
+ @capi = capi
34
+ @manager = manager
35
+ @request_handler_class = request_handler_class
36
+ @properties_mtime = properties_mtime
37
+ @handler = build_handler
38
+ end
39
+
40
+ def handle(req)
41
+ reload_if_stale
42
+ @handler.handle(req)
43
+ end
44
+
45
+ private
46
+
47
+ def reload_if_stale
48
+ mtime = properties_mtime
49
+ return unless mtime # 再生成中で properties が一時的に無い: 判定を諦めて継続
50
+ return if @properties_mtime == mtime
51
+
52
+ @properties_mtime = mtime
53
+ @handler = build_handler
54
+ $bitclust_context_cache = nil # clear cache
55
+ end
56
+
57
+ def properties_mtime
58
+ File.mtime("#{@dbpath}/properties")
59
+ rescue Errno::ENOENT
60
+ nil
61
+ end
62
+
63
+ def build_handler
64
+ db = BitClust::MethodDatabase.new(@dbpath)
65
+ if @capi
66
+ db = [db, BitClust::FunctionDatabase.new(@dbpath)] #: [MethodDatabase, FunctionDatabase]
67
+ end
68
+ @request_handler_class.new(db, @manager)
69
+ end
70
+
71
+ end
72
+ end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  # bitclust/requesthandler.rb
3
4
  #
@@ -58,22 +59,25 @@ module BitClust
58
59
  end
59
60
 
60
61
  def handle_library(req)
61
- return library_index() unless req.library_name
62
- lib = @db.fetch_library(req.library_name)
62
+ library_name = req.library_name
63
+ return library_index() unless library_name
64
+ lib = @db.fetch_library(library_name)
63
65
  @screenmanager.library_screen(lib, @conf).response
64
66
  end
65
67
 
66
68
  def handle_class(req)
67
- return class_index() unless req.class_name
68
- c = @db.fetch_class(req.class_name)
69
- h = @conf.dup
69
+ class_name = req.class_name
70
+ return class_index() unless class_name
71
+ c = @db.fetch_class(class_name)
72
+ h = @conf.dup #: RequestHandler::conf_class
70
73
  h[:level] = req.ancestors_level
71
74
  @screenmanager.class_screen(c, h).response
72
75
  end
73
76
 
74
77
  def handle_method(req)
75
- ms = @db.fetch_methods(req.method_spec)
76
- raise MethodNotFound.new(req.method_spec.to_s) if ms.nil? || ms.empty?
78
+ method_spec = req.method_spec or raise RequestError, 'method request but method_spec is nil'
79
+ ms = @db.fetch_methods(method_spec)
80
+ raise MethodNotFound.new(method_spec.to_s) if ms.nil? || ms.empty?
77
81
  @screenmanager.method_screen(ms, @conf).response
78
82
  end
79
83
 
@@ -90,13 +94,12 @@ module BitClust
90
94
  end
91
95
 
92
96
  def handle_search(req)
93
- ret = []
94
- q0 = req.query['q'] || ''
95
- q = URI.unescape(q0)
97
+ q0 = req.query['q'].to_s
98
+ q = URI.decode_www_form_component(q0)
96
99
  start = Time.now.to_i
97
100
  ret = SimpleSearcher.search_pattern(@db, q)
98
101
  elapsed_time = Time.now.to_f - start.to_f
99
- c = @conf.dup
102
+ c = @conf.dup #: RequestHandler::conf_search
100
103
  c[:q] = q0
101
104
  c[:elapsed_time] = elapsed_time
102
105
  @screenmanager.search_screen(ret, c).response
@@ -106,10 +109,11 @@ module BitClust
106
109
  d = @db.fetch_doc(req.doc_name || 'index' )
107
110
  @screenmanager.doc_screen(d, @conf).response
108
111
  end
109
-
112
+
110
113
  def handle_function(req)
111
- return function_index() unless req.function_name
112
- f = @cdb.fetch_function(req.function_name)
114
+ function_name = req.function_name
115
+ return function_index() unless function_name
116
+ f = @cdb.fetch_function(function_name)
113
117
  @screenmanager.function_screen(f, @conf).response
114
118
  end
115
119
 
@@ -150,7 +154,7 @@ module BitClust
150
154
  end
151
155
 
152
156
  def doc_name
153
- name = path_info.sub(%r!\A/!, '')
157
+ name = (path_info || raise).sub(%r!\A/!, '')
154
158
  name unless name.empty?
155
159
  end
156
160
 
@@ -187,6 +191,7 @@ module BitClust
187
191
  unless typechar?(typechar)
188
192
  raise InvalidKey, "invalid method-type ID: #{typechar.inspect}"
189
193
  end
194
+ # @type var typechar: NameUtils::typechar
190
195
  cname = classid2name(cid)
191
196
  tmark = typechar2mark(typechar)
192
197
  mname = decodename_url(mencoded)
@@ -308,7 +313,8 @@ module BitClust
308
313
  end
309
314
 
310
315
  def update(webrick_res)
311
- webrick_res.status = @screen.status if @screen.status
316
+ status = @screen.status
317
+ webrick_res.status = status if status
312
318
  webrick_res['Content-Type'] = @screen.content_type
313
319
  # webrick_res['Last-Modified'] = @screen.last_modified
314
320
  body = @screen.body
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'rdoc/ri/ri_reader'
2
3
  require 'rdoc/ri/ri_cache'
3
4
  require 'rdoc/ri/ri_paths'
@@ -168,7 +169,7 @@ module RI
168
169
  name = full_name()
169
170
  unless /\#/ =~ name
170
171
  components = name.split('::')
171
- m = components.pop
172
+ m = components.pop || raise
172
173
  components.join('::') + '.' + m
173
174
  else
174
175
  name
@@ -236,7 +237,7 @@ class Formatter
236
237
  line "--- #{m.full_name}#{trim_space(m.params)}"
237
238
  else
238
239
  m.params.lines.each do |sig|
239
- line "--- #{trim_sig(sig)}\#@todo\n"
240
+ line "--- #{trim_sig(sig)}#%todo\n"
240
241
  end
241
242
  end
242
243
  unless m.aliases.empty?
@@ -258,15 +259,17 @@ class Formatter
258
259
  s = trim_space(s)
259
260
  s.sub!(/\A[a-z]\w+\./, '')
260
261
  s.sub!(/=>/, '->')
262
+ # steep:ignore:start
261
263
  s.sub!(/(->.*)\bstr(ing)?\b/){ $1 + 'String' }
262
264
  s.sub!(/(->.*)\bint(eger)?\b/){ $1 + 'Integer' }
263
265
  s.sub!(/(->.*)\b(an_)?obj\b/){ $1 + 'object' }
264
266
  s.sub!(/(->.*)\b(a_)?hash\b/){ $1 + 'Hash' }
265
267
  s.sub!(/(->.*)\b(an_)?array\b/){ $1 + 'Array' }
266
- s.sub!(/ or /, ' | ')
268
+ # steep:ignore:end
269
+ s.sub!(/ or /, ' | ')
267
270
  s
268
271
  end
269
-
272
+
270
273
  def format_elements(elems)
271
274
  return "" unless elems
272
275
  return "" if elems.empty?
@@ -274,6 +277,7 @@ class Formatter
274
277
  end
275
278
 
276
279
  def format_element(e)
280
+ # steep:ignore:start
277
281
  case e
278
282
  when SM::Flow::P, SM::Flow::LI
279
283
  paragraph(e)
@@ -288,6 +292,7 @@ class Formatter
288
292
  else
289
293
  raise "unkwnown markup: #{e.class}"
290
294
  end
295
+ # steep:ignore:end
291
296
  end
292
297
 
293
298
  def headline(e)
@@ -305,6 +310,7 @@ class Formatter
305
310
  end
306
311
 
307
312
  def list(e)
313
+ # steep:ignore:start
308
314
  case e.type
309
315
  when SM::ListBase::BULLET
310
316
  e.contents.map {|item| "* #{format_element(e)}" }.join("\n")
@@ -328,6 +334,7 @@ class Formatter
328
334
  else
329
335
  raise "unknown list type: #{e.type.inspect}"
330
336
  end
337
+ # steep:ignore:end
331
338
  end
332
339
 
333
340
  def remove_inline(str)