qwikdoc 0.0.1

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 (335) hide show
  1. data/.gitignore +5 -0
  2. data/.rspec +2 -0
  3. data/CHANGES +3 -0
  4. data/COPYING +340 -0
  5. data/Gemfile +3 -0
  6. data/README.md +10 -0
  7. data/Rakefile +10 -0
  8. data/TextFormattingRules +137 -0
  9. data/TextFormattingRules.ja +143 -0
  10. data/bin/qwikdoc +34 -0
  11. data/lib/qwik_doc.rb +15 -0
  12. data/lib/qwik_doc/hack.rb +184 -0
  13. data/qwikdoc.gemspec +26 -0
  14. data/spec/qwik_doc_spec.rb +305 -0
  15. data/spec/spec_helper.rb +12 -0
  16. data/vendor/qwik/Makefile +63 -0
  17. data/vendor/qwik/Rakefile +17 -0
  18. data/vendor/qwik/act-aa.rb +83 -0
  19. data/vendor/qwik/act-archive.rb +386 -0
  20. data/vendor/qwik/act-attach.rb +304 -0
  21. data/vendor/qwik/act-backup.rb +236 -0
  22. data/vendor/qwik/act-basic.rb +325 -0
  23. data/vendor/qwik/act-book.rb +161 -0
  24. data/vendor/qwik/act-calc.rb +371 -0
  25. data/vendor/qwik/act-charset.rb +251 -0
  26. data/vendor/qwik/act-christel.rb +112 -0
  27. data/vendor/qwik/act-chronology.rb +149 -0
  28. data/vendor/qwik/act-code.rb +155 -0
  29. data/vendor/qwik/act-comment.rb +554 -0
  30. data/vendor/qwik/act-config.rb +49 -0
  31. data/vendor/qwik/act-counter.rb +125 -0
  32. data/vendor/qwik/act-day.rb +96 -0
  33. data/vendor/qwik/act-describe.rb +135 -0
  34. data/vendor/qwik/act-diary.rb +109 -0
  35. data/vendor/qwik/act-edit.rb +317 -0
  36. data/vendor/qwik/act-embed-html.rb +296 -0
  37. data/vendor/qwik/act-emode.rb +150 -0
  38. data/vendor/qwik/act-event.rb +187 -0
  39. data/vendor/qwik/act-file.rb +303 -0
  40. data/vendor/qwik/act-files.rb +771 -0
  41. data/vendor/qwik/act-getpass.rb +295 -0
  42. data/vendor/qwik/act-history.rb +136 -0
  43. data/vendor/qwik/act-html.rb +204 -0
  44. data/vendor/qwik/act-httpauth.rb +147 -0
  45. data/vendor/qwik/act-include.rb +142 -0
  46. data/vendor/qwik/act-interwiki.rb +189 -0
  47. data/vendor/qwik/act-isearch.rb +109 -0
  48. data/vendor/qwik/act-keywords.rb +137 -0
  49. data/vendor/qwik/act-lang.rb +81 -0
  50. data/vendor/qwik/act-license.rb +63 -0
  51. data/vendor/qwik/act-list.rb +287 -0
  52. data/vendor/qwik/act-login.rb +410 -0
  53. data/vendor/qwik/act-logout.rb +60 -0
  54. data/vendor/qwik/act-mail.rb +159 -0
  55. data/vendor/qwik/act-map.rb +292 -0
  56. data/vendor/qwik/act-md5.rb +42 -0
  57. data/vendor/qwik/act-mdlb.rb +741 -0
  58. data/vendor/qwik/act-media.rb +416 -0
  59. data/vendor/qwik/act-member.rb +157 -0
  60. data/vendor/qwik/act-menu.rb +142 -0
  61. data/vendor/qwik/act-metadata.rb +323 -0
  62. data/vendor/qwik/act-mlsubmitform.rb +49 -0
  63. data/vendor/qwik/act-monitor.rb +167 -0
  64. data/vendor/qwik/act-new.rb +418 -0
  65. data/vendor/qwik/act-pagelist.rb +248 -0
  66. data/vendor/qwik/act-password.rb +145 -0
  67. data/vendor/qwik/act-plan.rb +210 -0
  68. data/vendor/qwik/act-povray.rb +230 -0
  69. data/vendor/qwik/act-presen.rb +380 -0
  70. data/vendor/qwik/act-redirect.rb +133 -0
  71. data/vendor/qwik/act-ring.rb +1071 -0
  72. data/vendor/qwik/act-rrefs.rb +255 -0
  73. data/vendor/qwik/act-ruby.rb +116 -0
  74. data/vendor/qwik/act-sample.rb +170 -0
  75. data/vendor/qwik/act-save.rb +295 -0
  76. data/vendor/qwik/act-schedule.rb +374 -0
  77. data/vendor/qwik/act-search.rb +180 -0
  78. data/vendor/qwik/act-searchwords.rb +51 -0
  79. data/vendor/qwik/act-sendpass.rb +83 -0
  80. data/vendor/qwik/act-site.rb +89 -0
  81. data/vendor/qwik/act-sitebackup.rb +419 -0
  82. data/vendor/qwik/act-sitelog.rb +118 -0
  83. data/vendor/qwik/act-smil.rb +299 -0
  84. data/vendor/qwik/act-status.rb +220 -0
  85. data/vendor/qwik/act-style.rb +608 -0
  86. data/vendor/qwik/act-table.rb +263 -0
  87. data/vendor/qwik/act-tableform.rb +241 -0
  88. data/vendor/qwik/act-tag.rb +103 -0
  89. data/vendor/qwik/act-text.rb +70 -0
  90. data/vendor/qwik/act-textarea.rb +164 -0
  91. data/vendor/qwik/act-theme.rb +346 -0
  92. data/vendor/qwik/act-toc.rb +112 -0
  93. data/vendor/qwik/act-typekey.rb +198 -0
  94. data/vendor/qwik/act-under-const.rb +94 -0
  95. data/vendor/qwik/act-webservice.rb +321 -0
  96. data/vendor/qwik/act-wema.rb +558 -0
  97. data/vendor/qwik/act-wysiwyg.rb +238 -0
  98. data/vendor/qwik/action.rb +325 -0
  99. data/vendor/qwik/autoreload.rb +98 -0
  100. data/vendor/qwik/bench-bench.rb +28 -0
  101. data/vendor/qwik/bench-emode.rb +47 -0
  102. data/vendor/qwik/bench-format-xml.rb +70 -0
  103. data/vendor/qwik/bench-large-table.rb +62 -0
  104. data/vendor/qwik/bench-md5.rb +14 -0
  105. data/vendor/qwik/bench-module-session.rb +19 -0
  106. data/vendor/qwik/bench-page.rb +50 -0
  107. data/vendor/qwik/bench-s-md5.rb +28 -0
  108. data/vendor/qwik/bench-session.rb +25 -0
  109. data/vendor/qwik/bench-textformat.rb +31 -0
  110. data/vendor/qwik/catalog-factory.rb +91 -0
  111. data/vendor/qwik/catalog-ja.rb +479 -0
  112. data/vendor/qwik/catalog-ml-ja.rb +145 -0
  113. data/vendor/qwik/check-act-monitor.rb +112 -0
  114. data/vendor/qwik/check-act-monitor2.rb +46 -0
  115. data/vendor/qwik/check-act-theme.rb +27 -0
  116. data/vendor/qwik/check-event.rb +112 -0
  117. data/vendor/qwik/check-event2.rb +55 -0
  118. data/vendor/qwik/check-htree-rexml.rb +77 -0
  119. data/vendor/qwik/check-htree.rb +51 -0
  120. data/vendor/qwik/check-libxml.rb +135 -0
  121. data/vendor/qwik/check-many-pages.rb +47 -0
  122. data/vendor/qwik/check-monitor.rb +33 -0
  123. data/vendor/qwik/check-observer.rb +67 -0
  124. data/vendor/qwik/check-server.rb +61 -0
  125. data/vendor/qwik/check-uuencode.rb +33 -0
  126. data/vendor/qwik/check-webdav.rb +65 -0
  127. data/vendor/qwik/check-xml-xpath.rb +27 -0
  128. data/vendor/qwik/common-backtrace.rb +94 -0
  129. data/vendor/qwik/common-basic.rb +111 -0
  130. data/vendor/qwik/common-condition.rb +142 -0
  131. data/vendor/qwik/common-error.rb +48 -0
  132. data/vendor/qwik/common-gettext.rb +50 -0
  133. data/vendor/qwik/common-javascript.rb +45 -0
  134. data/vendor/qwik/common-notice.rb +132 -0
  135. data/vendor/qwik/common-plain.rb +105 -0
  136. data/vendor/qwik/common-plugin.rb +111 -0
  137. data/vendor/qwik/common-res.rb +76 -0
  138. data/vendor/qwik/common-resolve.rb +92 -0
  139. data/vendor/qwik/common-send.rb +171 -0
  140. data/vendor/qwik/common-session.rb +139 -0
  141. data/vendor/qwik/common-surface.rb +261 -0
  142. data/vendor/qwik/common-url.rb +90 -0
  143. data/vendor/qwik/compat/Makefile +12 -0
  144. data/vendor/qwik/compat/add_load_path.rb +1 -0
  145. data/vendor/qwik/config.rb +299 -0
  146. data/vendor/qwik/db-b-backup.rb +142 -0
  147. data/vendor/qwik/db-backup.rb +184 -0
  148. data/vendor/qwik/db-berkeley.rb +306 -0
  149. data/vendor/qwik/db-filesystem.rb +305 -0
  150. data/vendor/qwik/db-indexer.rb +154 -0
  151. data/vendor/qwik/db-searchwords.rb +238 -0
  152. data/vendor/qwik/description-ja.rb +267 -0
  153. data/vendor/qwik/description.rb +256 -0
  154. data/vendor/qwik/dev-add-copyright.rb +23 -0
  155. data/vendor/qwik/dev-backup.rb +24 -0
  156. data/vendor/qwik/dev-bench.rb +175 -0
  157. data/vendor/qwik/dev-calctime.rb +52 -0
  158. data/vendor/qwik/dev-css-compressor.rb +60 -0
  159. data/vendor/qwik/dev-extract-catalog.rb +102 -0
  160. data/vendor/qwik/dev-js-compressor.rb +73 -0
  161. data/vendor/qwik/dev-release.rb +235 -0
  162. data/vendor/qwik/dev-replace.rb +353 -0
  163. data/vendor/qwik/dev-sendmail.rb +25 -0
  164. data/vendor/qwik/farm.rb +283 -0
  165. data/vendor/qwik/gettext.rb +56 -0
  166. data/vendor/qwik/group-cond.rb +157 -0
  167. data/vendor/qwik/group-config.rb +247 -0
  168. data/vendor/qwik/group-confirm.rb +147 -0
  169. data/vendor/qwik/group-db.rb +326 -0
  170. data/vendor/qwik/group-mail.rb +195 -0
  171. data/vendor/qwik/group-member.rb +307 -0
  172. data/vendor/qwik/group-sendmail.rb +231 -0
  173. data/vendor/qwik/group-site.rb +374 -0
  174. data/vendor/qwik/group-sweep.rb +63 -0
  175. data/vendor/qwik/group.rb +157 -0
  176. data/vendor/qwik/helper.rb +6 -0
  177. data/vendor/qwik/html-generator.rb +104 -0
  178. data/vendor/qwik/html-to-wabisabi.rb +149 -0
  179. data/vendor/qwik/htree-diff.rb +87 -0
  180. data/vendor/qwik/htree-format-xml.rb +57 -0
  181. data/vendor/qwik/htree-generator.rb +144 -0
  182. data/vendor/qwik/htree-get.rb +251 -0
  183. data/vendor/qwik/htree-html-generator.rb +179 -0
  184. data/vendor/qwik/htree-template.rb +263 -0
  185. data/vendor/qwik/htree-to-wabisabi.rb +171 -0
  186. data/vendor/qwik/loadlib.rb +79 -0
  187. data/vendor/qwik/logger.rb +115 -0
  188. data/vendor/qwik/mail-body.rb +171 -0
  189. data/vendor/qwik/mail-header.rb +474 -0
  190. data/vendor/qwik/mail-multipart.rb +193 -0
  191. data/vendor/qwik/mail-parse.rb +147 -0
  192. data/vendor/qwik/mail.rb +341 -0
  193. data/vendor/qwik/mailaddress.rb +83 -0
  194. data/vendor/qwik/mdlb-model.rb +81 -0
  195. data/vendor/qwik/mdlb-sample.rb +324 -0
  196. data/vendor/qwik/ml-catalog-factory.rb +27 -0
  197. data/vendor/qwik/ml-exception.rb +15 -0
  198. data/vendor/qwik/ml-generator.rb +28 -0
  199. data/vendor/qwik/ml-gettext.rb +137 -0
  200. data/vendor/qwik/ml-logger.rb +82 -0
  201. data/vendor/qwik/ml-memory.rb +65 -0
  202. data/vendor/qwik/ml-msg-validator.rb +86 -0
  203. data/vendor/qwik/ml-processor.rb +609 -0
  204. data/vendor/qwik/ml-quickml-server.rb +122 -0
  205. data/vendor/qwik/ml-sendmail.rb +0 -0
  206. data/vendor/qwik/ml-server.rb +107 -0
  207. data/vendor/qwik/ml-session.rb +348 -0
  208. data/vendor/qwik/ml-sweeper.rb +101 -0
  209. data/vendor/qwik/mock-logger.rb +65 -0
  210. data/vendor/qwik/mock-sendmail.rb +78 -0
  211. data/vendor/qwik/mock-socket.rb +82 -0
  212. data/vendor/qwik/modulobe.rb +406 -0
  213. data/vendor/qwik/mongrel-server.rb +72 -0
  214. data/vendor/qwik/page-files.rb +249 -0
  215. data/vendor/qwik/page-generate.rb +82 -0
  216. data/vendor/qwik/page-get.rb +262 -0
  217. data/vendor/qwik/page-images.rb +168 -0
  218. data/vendor/qwik/page-put.rb +128 -0
  219. data/vendor/qwik/page-rrefs.rb +154 -0
  220. data/vendor/qwik/page-title.rb +0 -0
  221. data/vendor/qwik/page-wikidb.rb +234 -0
  222. data/vendor/qwik/page.rb +67 -0
  223. data/vendor/qwik/pages.rb +444 -0
  224. data/vendor/qwik/parse-plugin.rb +249 -0
  225. data/vendor/qwik/parser-emode.rb +116 -0
  226. data/vendor/qwik/parser-inline.rb +273 -0
  227. data/vendor/qwik/parser.rb +350 -0
  228. data/vendor/qwik/password.rb +183 -0
  229. data/vendor/qwik/periodic.rb +79 -0
  230. data/vendor/qwik/qp.rb +56 -0
  231. data/vendor/qwik/qwik-service.rb +341 -0
  232. data/vendor/qwik/qwik.rb +5 -0
  233. data/vendor/qwik/qwikweb-adduser.rb +34 -0
  234. data/vendor/qwik/qwikweb-catalog-validator.rb +110 -0
  235. data/vendor/qwik/qwikweb-incgen.rb +28 -0
  236. data/vendor/qwik/qwikweb-makesite.rb +41 -0
  237. data/vendor/qwik/qwikweb-server.rb +44 -0
  238. data/vendor/qwik/qwikweb-showpassword.rb +26 -0
  239. data/vendor/qwik/qwikweb-watchlog.rb +67 -0
  240. data/vendor/qwik/request-path.rb +304 -0
  241. data/vendor/qwik/request-ua.rb +76 -0
  242. data/vendor/qwik/request-webrick.rb +81 -0
  243. data/vendor/qwik/request.rb +91 -0
  244. data/vendor/qwik/resolve-tdiary.rb +292 -0
  245. data/vendor/qwik/resolve.rb +121 -0
  246. data/vendor/qwik/response.rb +228 -0
  247. data/vendor/qwik/server-memory.rb +57 -0
  248. data/vendor/qwik/server-webrick.rb +102 -0
  249. data/vendor/qwik/server.rb +252 -0
  250. data/vendor/qwik/site-config.rb +149 -0
  251. data/vendor/qwik/site-db.rb +136 -0
  252. data/vendor/qwik/site-event.rb +162 -0
  253. data/vendor/qwik/site-files.rb +86 -0
  254. data/vendor/qwik/site-group.rb +103 -0
  255. data/vendor/qwik/site-index.rb +47 -0
  256. data/vendor/qwik/site-log.rb +64 -0
  257. data/vendor/qwik/site-member.rb +230 -0
  258. data/vendor/qwik/site-monitor.rb +97 -0
  259. data/vendor/qwik/site-pages.rb +62 -0
  260. data/vendor/qwik/site-plan.rb +139 -0
  261. data/vendor/qwik/site-report.rb +282 -0
  262. data/vendor/qwik/site-resolve.rb +230 -0
  263. data/vendor/qwik/site-rrefs.rb +18 -0
  264. data/vendor/qwik/site-search.rb +180 -0
  265. data/vendor/qwik/site-timeline.rb +153 -0
  266. data/vendor/qwik/site-url.rb +189 -0
  267. data/vendor/qwik/site.rb +76 -0
  268. data/vendor/qwik/smil-time.rb +105 -0
  269. data/vendor/qwik/smtp-session.rb +331 -0
  270. data/vendor/qwik/template-generator.rb +149 -0
  271. data/vendor/qwik/template.rb +85 -0
  272. data/vendor/qwik/test-common.rb +10 -0
  273. data/vendor/qwik/test-ml-info.rb +225 -0
  274. data/vendor/qwik/test-module-ml.rb +142 -0
  275. data/vendor/qwik/test-module-path.rb +110 -0
  276. data/vendor/qwik/test-module-public.rb +70 -0
  277. data/vendor/qwik/test-module-server.rb +98 -0
  278. data/vendor/qwik/test-module-session.rb +264 -0
  279. data/vendor/qwik/test-module-suite.rb +91 -0
  280. data/vendor/qwik/test-ms-applemail.rb +59 -0
  281. data/vendor/qwik/test-ms-attach.rb +174 -0
  282. data/vendor/qwik/test-ms-basic.rb +40 -0
  283. data/vendor/qwik/test-ms-close.rb +35 -0
  284. data/vendor/qwik/test-ms-confirm.rb +75 -0
  285. data/vendor/qwik/test-ms-ignore-spam.rb +57 -0
  286. data/vendor/qwik/test-ms-japanese.rb +97 -0
  287. data/vendor/qwik/test-ms-jfilename.rb +82 -0
  288. data/vendor/qwik/test-ms-large.rb +58 -0
  289. data/vendor/qwik/test-ms-member.rb +103 -0
  290. data/vendor/qwik/test-ms-multipart.rb +84 -0
  291. data/vendor/qwik/test-ms-org.rb +129 -0
  292. data/vendor/qwik/test-ms-plan.rb +130 -0
  293. data/vendor/qwik/test-ms-post.rb +53 -0
  294. data/vendor/qwik/test-ms-quopri.rb +76 -0
  295. data/vendor/qwik/test-sub-quopri.rb +45 -0
  296. data/vendor/qwik/test-submit-base64.rb +59 -0
  297. data/vendor/qwik/test-submit-forward.rb +61 -0
  298. data/vendor/qwik/test-submit-html-mail.rb +52 -0
  299. data/vendor/qwik/test-submit-japanese.rb +135 -0
  300. data/vendor/qwik/test-submit-jfilename.rb +144 -0
  301. data/vendor/qwik/test-submit-uuencode.rb +71 -0
  302. data/vendor/qwik/test-suite-all.rb +8 -0
  303. data/vendor/qwik/test-suite-basic.rb +9 -0
  304. data/vendor/qwik/test-suite-ml.rb +9 -0
  305. data/vendor/qwik/test-typekey.rb +64 -0
  306. data/vendor/qwik/testunit.rb +45 -0
  307. data/vendor/qwik/tokenizer-inline.rb +294 -0
  308. data/vendor/qwik/tokenizer.rb +332 -0
  309. data/vendor/qwik/typekey.rb +160 -0
  310. data/vendor/qwik/util-basic.rb +135 -0
  311. data/vendor/qwik/util-charset.rb +332 -0
  312. data/vendor/qwik/util-css.rb +56 -0
  313. data/vendor/qwik/util-csv-tokenizer.rb +113 -0
  314. data/vendor/qwik/util-filename.rb +112 -0
  315. data/vendor/qwik/util-pathname.rb +202 -0
  316. data/vendor/qwik/util-pid.rb +58 -0
  317. data/vendor/qwik/util-safe.rb +67 -0
  318. data/vendor/qwik/util-sendmail.rb +273 -0
  319. data/vendor/qwik/util-string.rb +203 -0
  320. data/vendor/qwik/util-time.rb +125 -0
  321. data/vendor/qwik/util-webrick.rb +176 -0
  322. data/vendor/qwik/version.rb +11 -0
  323. data/vendor/qwik/wabisabi-basic.rb +163 -0
  324. data/vendor/qwik/wabisabi-diff.rb +130 -0
  325. data/vendor/qwik/wabisabi-format-xml.rb +310 -0
  326. data/vendor/qwik/wabisabi-generator.rb +262 -0
  327. data/vendor/qwik/wabisabi-index.rb +174 -0
  328. data/vendor/qwik/wabisabi-table.rb +212 -0
  329. data/vendor/qwik/wabisabi-template.rb +295 -0
  330. data/vendor/qwik/wabisabi-to-htree.rb +111 -0
  331. data/vendor/qwik/wabisabi-to-wiki.rb +690 -0
  332. data/vendor/qwik/wabisabi-traverse.rb +207 -0
  333. data/vendor/qwik/wabisabi-validator.rb +116 -0
  334. data/vendor/qwik/wabisabi.rb +5 -0
  335. metadata +416 -0
@@ -0,0 +1,147 @@
1
+ #
2
+ # Copyright (C) 2002-2004 Satoru Takabayashi <satoru@namazu.org>
3
+ # Copyright (C) 2003-2006 Kouichirou Eto
4
+ # All rights reserved.
5
+ # This is free software with ABSOLUTELY NO WARRANTY.
6
+ #
7
+ # You can redistribute it and/or modify it under the terms of
8
+ # the GNU General Public License version 2.
9
+ #
10
+
11
+ $LOAD_PATH.unshift '..' unless $LOAD_PATH.include? '..'
12
+ require 'qwik/group'
13
+ require 'qwik/group-db'
14
+
15
+ module QuickML
16
+ class Group
17
+ # ml-processor.rb:115: ml.prepare_confirmation(@mail)
18
+ def prepare_confirmation (mail)
19
+ # Create empty ML files.
20
+ @members.save
21
+
22
+ waiting_message_put(mail.bare)
23
+ str = waiting_message_get # FIXME: Why?
24
+
25
+ add_waiting_member(mail.from)
26
+ mail.collect_cc.each {|address|
27
+ add_waiting_member(address)
28
+ }
29
+ send_confirmation(mail.from)
30
+ end
31
+
32
+ def validate_confirmation(time)
33
+ return waiting_message_exist? && waiting_message_mtime.to_i == time.to_i
34
+ end
35
+
36
+ # ml-processor.rb:98: ml.accept_confirmation
37
+ def accept_confirmation
38
+ # Add suspended members.
39
+ waiting_members = (waiting_members_get || '').to_a.map {|line|
40
+ line.chomp
41
+ }
42
+ waiting_members.each {|address|
43
+ begin
44
+ add_member(address)
45
+ rescue TooManyMembers
46
+ end
47
+ }
48
+
49
+ # Read suspended message.
50
+ waiting_message = waiting_message_get || ''
51
+ mail = Mail.create { waiting_message }
52
+
53
+ submit(mail) # Send it.
54
+
55
+ waiting_members_delete
56
+ waiting_message_delete
57
+ @logger.log "[#{@name}]: Accept confirmation: #{@address}"
58
+ end
59
+
60
+ private
61
+
62
+ def confirmation_address
63
+ t = waiting_message_mtime.to_i
64
+ return "confirm+#{t}+#{@address}"
65
+ end
66
+
67
+ # waiting_message
68
+ def waiting_message_exist?
69
+ return @db.exist?(:WaitingMessage)
70
+ end
71
+ def waiting_message_mtime
72
+ return @db.mtime(:WaitingMessage)
73
+ end
74
+ def waiting_message_put(content)
75
+ @db.put(:WaitingMessage, content)
76
+ end
77
+ def waiting_message_get
78
+ return @db.get(:WaitingMessage)
79
+ end
80
+ def waiting_message_delete
81
+ @db.delete(:WaitingMessage)
82
+ end
83
+
84
+ # waiting_member
85
+ def add_waiting_member (address)
86
+ waiting_members_add(address+"\n")
87
+ end
88
+ def waiting_members_exist?
89
+ return @db.exist?(:WaitingMembers)
90
+ end
91
+ def waiting_members_get
92
+ return @db.get(:WaitingMembers)
93
+ end
94
+ def waiting_members_add(content)
95
+ @db.add(:WaitingMembers, content)
96
+ end
97
+ def waiting_members_delete
98
+ @db.delete(:WaitingMembers)
99
+ end
100
+ end
101
+ end
102
+
103
+ if $0 == __FILE__
104
+ require 'qwik/test-module-ml'
105
+ $test = true
106
+ end
107
+
108
+ if defined?($test) && $test
109
+ class TestGroupConfirmation < Test::Unit::TestCase
110
+ include TestModuleML
111
+
112
+ def setup_group
113
+ return QuickML::Group.new(@ml_config, 'test@example.com')
114
+ end
115
+
116
+ def test_all
117
+ group = setup_group
118
+
119
+ t_make_readable(QuickML::Group, :db)
120
+
121
+ # test_prepare_confirmation
122
+ message =
123
+ 'Date: Mon, 3 Feb 2001 12:34:56 +0900
124
+ From: user@e.com
125
+ To: test@example.com
126
+ Subject: create
127
+
128
+ Create a new mailing list.
129
+ '
130
+ mail = QuickML::Mail.generate { message }
131
+ group.prepare_confirmation(mail)
132
+ ok_eq(message, group.db.get(:WaitingMessage))
133
+ ok_eq("user@e.com\n", group.db.get(:WaitingMembers))
134
+
135
+ # test_validate_confirmation
136
+ t_make_public(QuickML::Group, :waiting_message_mtime)
137
+ time = group.waiting_message_mtime
138
+ ok_eq(true, group.validate_confirmation(time))
139
+
140
+ # test_accept_confirmation
141
+ t_make_public(QuickML::Group, :get_active_members)
142
+ ok_eq([], group.get_active_members)
143
+ group.accept_confirmation
144
+ ok_eq(['user@e.com'], group.get_active_members)
145
+ end
146
+ end
147
+ end
@@ -0,0 +1,326 @@
1
+ # Copyright (C) 2003-2006 Kouichirou Eto, All rights reserved.
2
+ # This is free software with ABSOLUTELY NO WARRANTY.
3
+ # You can redistribute it and/or modify it under the terms of the GNU GPL 2.
4
+
5
+ $LOAD_PATH.unshift '..' unless $LOAD_PATH.include? '..'
6
+
7
+ module QuickML
8
+ class GroupDB
9
+ =begin
10
+ FILENAME = {
11
+ :Members => ',members',
12
+ :Count => ',count',
13
+ :Config => ',config',
14
+ :Charset => ',charset',
15
+ :Alerted => ',alerted',
16
+ :Forward => ',forward',
17
+ :Permanent => ',permanent',
18
+ :Unlimited => ',unlimited',
19
+ :WaitingMembers => ',waiting-members',
20
+ :WaitingMessage => ',waiting-message',
21
+ }
22
+ =end
23
+
24
+ PAGENAME = {
25
+ :Members => '_GroupMembers',
26
+ :Count => '_GroupCount',
27
+ :Config => '_GroupConfig',
28
+ :Charset => '_GroupCharset',
29
+ :Alerted => '_GroupAlerted',
30
+ :Forward => '_GroupForward',
31
+ :Permanent => '_GroupPermanent',
32
+ :Unlimited => '_GroupUnlimited',
33
+ :WaitingMembers => '_GroupWaitingMembers',
34
+ :WaitingMessage => '_GroupWaitingMessage',
35
+ }
36
+
37
+ def initialize(sites_dir, group_name)
38
+ @sites_dir = sites_dir
39
+ @group_name = group_name
40
+ @site = nil
41
+ get_dirpath.mkpath # Make a new directory here.
42
+ end
43
+
44
+ def set_site(site)
45
+ @site = site
46
+ end
47
+
48
+ =begin
49
+ def update_files
50
+ if false
51
+ FILENAME.keys.each {|s|
52
+ sync(s)
53
+ }
54
+ end
55
+ end
56
+ =end
57
+
58
+ # read
59
+ def exist?(s)
60
+ #sync(s)
61
+
62
+ # f = get_filpath(s)
63
+ # return true if f.exist?
64
+
65
+ pagename = get_pagename(s)
66
+ page = @site[pagename]
67
+ return true if page
68
+
69
+ return false
70
+ end
71
+
72
+ def mtime(s)
73
+ # return [file_mtime(s), page_mtime(s)].max
74
+ return page_mtime(s)
75
+ end
76
+
77
+ def get(s) # with sync.
78
+ #sync(s)
79
+
80
+ # file_content = nil
81
+ # f = get_filepath(s)
82
+ # file_content = f.read if f.exist?
83
+
84
+ page_content = nil
85
+ pagename = get_pagename(s)
86
+ page = @site[pagename]
87
+ page_content = page.get if page
88
+ return page_content
89
+
90
+ # Both is nil.
91
+ # return nil if file_content.nil? && page_content.nil? # Do nothing.
92
+
93
+ # fmt = file_mtime(s)
94
+ # pmt = page_mtime(s)
95
+
96
+ # File is exist, but the page is not exist.
97
+ # if file_content && page_content.nil?
98
+ # page = @site.create(pagename)
99
+ # page.put_with_time(file_content, fmt)
100
+ # # FIXME: delete file?
101
+ # return file_content
102
+ # end
103
+
104
+ # File is not exist, but page is exist.
105
+ # if file_content.nil? && page_content
106
+ # # Do not create file.
107
+ # #f.put(page_content)
108
+ # #f.utime(pmt, pmt)
109
+ # return page_content
110
+ # end
111
+
112
+ # Both exist.
113
+ # if file_content == page_content
114
+ # return page_content
115
+ # end
116
+
117
+ # if fmt < pmt # The page is new.
118
+ # f.put(page_content)
119
+ # begin
120
+ # f.utime(pmt, pmt)
121
+ # rescue
122
+ # p 'error to set time'
123
+ # end
124
+ # return page_content
125
+ # end
126
+
127
+ # page.put_with_time(file_content, fmt)
128
+ # return file_content
129
+ end
130
+
131
+ # write
132
+ def put(s, content)
133
+ # f = get_filepath(s)
134
+ # f.put(content)
135
+
136
+ pagename = get_pagename(s)
137
+ page = @site[pagename]
138
+ page = @site.create(pagename) if page.nil?
139
+ page.put(content)
140
+ end
141
+
142
+ def add(s, content)
143
+ # f = get_filepath(s)
144
+ # f.add(content)
145
+
146
+ pagename = get_pagename(s)
147
+ page = @site[pagename]
148
+ page = @site.create(pagename) if page.nil?
149
+ page.add(content)
150
+ end
151
+
152
+ def delete(s)
153
+ return if ! exist?(s)
154
+ # f = get_filepath(s)
155
+ # f.unlink
156
+
157
+ pagename = get_pagename(s)
158
+ page = @site[pagename]
159
+ @site.delete(pagename) if page
160
+ end
161
+
162
+ # the mtime of the newest file in the directory
163
+ def last_article_time
164
+ max = nil
165
+ dir = get_dirpath
166
+ dir.each_entry {|f|
167
+ fs = f.to_s
168
+
169
+ next if /\A\./ =~ fs ||
170
+ # /,config/ =~ fs ||
171
+ /_GroupConfig.txt/ =~ fs ||
172
+ # /,charset/ =~ fs ||
173
+ /_GroupCharset.txt/ =~ fs
174
+
175
+ file = dir+f
176
+ mt = file.mtime
177
+ if max.nil? || max < mt
178
+ max = mt
179
+ end
180
+ }
181
+ return max || Time.now
182
+ end
183
+
184
+ private
185
+
186
+ def get_pagename(symbol)
187
+ return PAGENAME[symbol]
188
+ end
189
+
190
+ def get_dirpath
191
+ return "#{@sites_dir}/#{@group_name}".path
192
+ end
193
+
194
+ =begin
195
+ def get_filepath(symbol)
196
+ dir = get_dirpath
197
+ base = FILENAME[symbol]
198
+ return nil if base.nil?
199
+ return dir+base
200
+ end
201
+
202
+ def file_mtime(s)
203
+ f = get_filepath(s)
204
+ return f.mtime if f.exist?
205
+ return Time.at(0)
206
+ end
207
+ =end
208
+
209
+ def page_mtime(s)
210
+ pagename = get_pagename(s)
211
+ page = @site[pagename]
212
+ return page.mtime if page
213
+ return Time.at(0)
214
+ end
215
+
216
+ =begin
217
+ def sync(s)
218
+ file_content = nil
219
+ f = get_filepath(s)
220
+ file_content = f.read if f.exist?
221
+
222
+ page_content = nil
223
+ pagename = get_pagename(s)
224
+ page = @site[pagename]
225
+ page_content = page.get if page
226
+
227
+ # Both is nil.
228
+ return if file_content.nil? && page_content.nil? # Do nothing.
229
+
230
+ fmt = file_mtime(s)
231
+ pmt = page_mtime(s)
232
+
233
+ # File is exist, but the page is not exist.
234
+ if file_content && page_content.nil?
235
+ page = @site.create(pagename)
236
+ page.put_with_time(file_content, fmt)
237
+ # FIXME: delete file?
238
+ return
239
+ end
240
+
241
+ # File is not exist, but page is exist.
242
+ if file_content.nil? && page_content
243
+ f.put(page_content)
244
+ f.utime(pmt, pmt)
245
+ return
246
+ end
247
+
248
+ # Both exist.
249
+ if file_content == page_content
250
+ return # The two contents are already synced.
251
+ end
252
+
253
+ if fmt < pmt # The page is new.
254
+ f.put(page_content)
255
+ f.utime(pmt, pmt)
256
+ return
257
+ end
258
+
259
+ page.put_with_time(file_content, fmt)
260
+ return
261
+ end
262
+ =end
263
+ end
264
+ end
265
+
266
+ if $0 == __FILE__
267
+ require 'qwik/farm'
268
+ require 'qwik/server-memory'
269
+ require 'qwik/test-module-session'
270
+ $test = true
271
+ end
272
+
273
+ if defined?($test) && $test
274
+ class TestGroupDB < Test::Unit::TestCase
275
+ include TestSession
276
+
277
+ def test_db
278
+ sites_dir = './.test/data'
279
+ group_name = 'test'
280
+
281
+ db = QuickML::GroupDB.new(sites_dir, group_name)
282
+
283
+ ok_eq(true, './.test/data/test'.path.exist?)
284
+
285
+ db.set_site(@site)
286
+
287
+ t_make_public(QuickML::GroupDB, :get_dirpath)
288
+ ok_eq('./.test/data/test', db.get_dirpath.to_s)
289
+
290
+ # test_put
291
+ db.put(:Count, 'v')
292
+
293
+ # test_exist?
294
+ ok_eq(true, db.exist?(:Count))
295
+
296
+ # test_get
297
+ ok_eq('v', db.get(:Count))
298
+
299
+ # test_add
300
+ db.add(:Count, 'w')
301
+ #ok_eq('vw', db.get(:Count))
302
+ ok_eq("v\nw\n", db.get(:Count))
303
+
304
+ # test_last_article_time
305
+ t = db.last_article_time
306
+ assert_instance_of(Time, t)
307
+
308
+ # test_delete
309
+ db.delete(:Count)
310
+ ok_eq(false, db.exist?(:Count))
311
+
312
+ # test_use_site
313
+ site = @site
314
+ page = site['_GroupCount']
315
+ ok_eq(nil, page)
316
+
317
+ db.put(:Count, 'v2')
318
+ page = site['_GroupCount']
319
+ ok_eq('v2', page.get)
320
+
321
+ page.put_with_time('v3', Time.at(Time.now.to_i+10))
322
+ ok_eq('v3', db.get(:Count))
323
+
324
+ end
325
+ end
326
+ end