de.oddb 2.0.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 (431) hide show
  1. data/Guide.txt +3 -0
  2. data/History.txt +5 -0
  3. data/LICENCE.txt +339 -0
  4. data/Manifest.txt +430 -0
  5. data/README +423 -0
  6. data/README.txt +25 -0
  7. data/Rakefile +28 -0
  8. data/bin/admin +71 -0
  9. data/bin/exportd +44 -0
  10. data/bin/oddbd +33 -0
  11. data/data/fulltext/data/dicts/french/fulltext.aff +1057 -0
  12. data/data/fulltext/data/dicts/french/fulltext.dict +91189 -0
  13. data/data/fulltext/data/dicts/french/fulltext.stop +135 -0
  14. data/data/fulltext/data/dicts/german/fulltext.aff +1233 -0
  15. data/data/fulltext/data/dicts/german/fulltext.dict +287574 -0
  16. data/data/fulltext/data/dicts/german/fulltext.stop +133 -0
  17. data/data/fulltext/data/german_compound/README +15 -0
  18. data/data/fulltext/data/german_compound/compound.pl +63 -0
  19. data/data/fulltext/data/german_compound/german.stop +20 -0
  20. data/data/fulltext/data/ispell-german-compound.tar.gz +0 -0
  21. data/data/fulltext/redist/dict_french/Makefile +12 -0
  22. data/data/fulltext/redist/dict_french/README.french +1 -0
  23. data/data/fulltext/redist/dict_french/dict_french.sql.in +7 -0
  24. data/data/fulltext/redist/dict_french/dict_snowball.c +56 -0
  25. data/data/fulltext/redist/dict_french/french_stem.c +1222 -0
  26. data/data/fulltext/redist/dict_french/french_stem.h +16 -0
  27. data/data/fulltext/redist/dict_french/subinclude.h +2 -0
  28. data/data/fulltext/redist/dict_german/Makefile +12 -0
  29. data/data/fulltext/redist/dict_german/README.german +1 -0
  30. data/data/fulltext/redist/dict_german/dict_german.sql.in +7 -0
  31. data/data/fulltext/redist/dict_german/dict_snowball.c +56 -0
  32. data/data/fulltext/redist/dict_german/german_stem.c +527 -0
  33. data/data/fulltext/redist/dict_german/german_stem.h +16 -0
  34. data/data/fulltext/redist/dict_german/subinclude.h +1 -0
  35. data/data/fulltext/redist/french_stem.c +1222 -0
  36. data/data/fulltext/redist/french_stem.h +16 -0
  37. data/data/fulltext/redist/german_stem.c +527 -0
  38. data/data/fulltext/redist/german_stem.h +16 -0
  39. data/jobs/export_chde_xls +20 -0
  40. data/jobs/export_csv +20 -0
  41. data/jobs/export_fachinfo_yaml +20 -0
  42. data/jobs/export_patinfo_yaml +20 -0
  43. data/jobs/export_yaml +20 -0
  44. data/jobs/import_dimdi +15 -0
  45. data/jobs/import_gkv +19 -0
  46. data/jobs/import_pharma24 +15 -0
  47. data/jobs/import_pharmnet +30 -0
  48. data/jobs/import_whocc +18 -0
  49. data/lib/fixes/singular.rb +9 -0
  50. data/lib/fixes/yaml.rb +13 -0
  51. data/lib/oddb.rb +13 -0
  52. data/lib/oddb/business/company.rb +18 -0
  53. data/lib/oddb/business/grant_download.rb +27 -0
  54. data/lib/oddb/business/invoice.rb +75 -0
  55. data/lib/oddb/config.rb +112 -0
  56. data/lib/oddb/currency.rb +6 -0
  57. data/lib/oddb/drugs.rb +16 -0
  58. data/lib/oddb/drugs/active_agent.rb +37 -0
  59. data/lib/oddb/drugs/atc.rb +53 -0
  60. data/lib/oddb/drugs/composition.rb +41 -0
  61. data/lib/oddb/drugs/ddd.rb +24 -0
  62. data/lib/oddb/drugs/dose.rb +107 -0
  63. data/lib/oddb/drugs/galenic_form.rb +21 -0
  64. data/lib/oddb/drugs/galenic_group.rb +17 -0
  65. data/lib/oddb/drugs/package.rb +111 -0
  66. data/lib/oddb/drugs/part.rb +55 -0
  67. data/lib/oddb/drugs/product.rb +25 -0
  68. data/lib/oddb/drugs/sequence.rb +68 -0
  69. data/lib/oddb/drugs/substance.rb +31 -0
  70. data/lib/oddb/drugs/substance_group.rb +13 -0
  71. data/lib/oddb/drugs/unit.rb +12 -0
  72. data/lib/oddb/export.rb +4 -0
  73. data/lib/oddb/export/csv.rb +94 -0
  74. data/lib/oddb/export/l10n_sessions.rb +30 -0
  75. data/lib/oddb/export/rss.rb +44 -0
  76. data/lib/oddb/export/server.rb +137 -0
  77. data/lib/oddb/export/xls.rb +127 -0
  78. data/lib/oddb/export/yaml.rb +212 -0
  79. data/lib/oddb/html/state/download.rb +13 -0
  80. data/lib/oddb/html/state/drugs/admin/package.rb +190 -0
  81. data/lib/oddb/html/state/drugs/admin/product.rb +56 -0
  82. data/lib/oddb/html/state/drugs/admin/sequence.rb +253 -0
  83. data/lib/oddb/html/state/drugs/ajax/explain_ddd_price.rb +19 -0
  84. data/lib/oddb/html/state/drugs/ajax/explain_price.rb +19 -0
  85. data/lib/oddb/html/state/drugs/ajax/global.rb +18 -0
  86. data/lib/oddb/html/state/drugs/ajax/package_infos.rb +19 -0
  87. data/lib/oddb/html/state/drugs/ajax/remote_infos.rb +19 -0
  88. data/lib/oddb/html/state/drugs/atc_browser.rb +39 -0
  89. data/lib/oddb/html/state/drugs/atc_guidelines.rb +21 -0
  90. data/lib/oddb/html/state/drugs/compare.rb +52 -0
  91. data/lib/oddb/html/state/drugs/download_export.rb +18 -0
  92. data/lib/oddb/html/state/drugs/downloads.rb +42 -0
  93. data/lib/oddb/html/state/drugs/fachinfo.rb +21 -0
  94. data/lib/oddb/html/state/drugs/feedback.rb +91 -0
  95. data/lib/oddb/html/state/drugs/global.rb +270 -0
  96. data/lib/oddb/html/state/drugs/init.rb +18 -0
  97. data/lib/oddb/html/state/drugs/login.rb +17 -0
  98. data/lib/oddb/html/state/drugs/package.rb +32 -0
  99. data/lib/oddb/html/state/drugs/patinfo.rb +21 -0
  100. data/lib/oddb/html/state/drugs/products.rb +51 -0
  101. data/lib/oddb/html/state/drugs/result.rb +125 -0
  102. data/lib/oddb/html/state/global.rb +206 -0
  103. data/lib/oddb/html/state/global_predefine.rb +17 -0
  104. data/lib/oddb/html/state/limit.rb +17 -0
  105. data/lib/oddb/html/state/login.rb +56 -0
  106. data/lib/oddb/html/state/paypal/checkout.rb +97 -0
  107. data/lib/oddb/html/state/paypal/collect.rb +19 -0
  108. data/lib/oddb/html/state/paypal/download.rb +61 -0
  109. data/lib/oddb/html/state/paypal/redirect.rb +18 -0
  110. data/lib/oddb/html/state/register_download.rb +24 -0
  111. data/lib/oddb/html/state/register_export.rb +38 -0
  112. data/lib/oddb/html/state/register_poweruser.rb +17 -0
  113. data/lib/oddb/html/state/viral/admin.rb +79 -0
  114. data/lib/oddb/html/state/viral/poweruser.rb +16 -0
  115. data/lib/oddb/html/util/annotated_list.rb +39 -0
  116. data/lib/oddb/html/util/know_it_all.rb +28 -0
  117. data/lib/oddb/html/util/known_user.rb +55 -0
  118. data/lib/oddb/html/util/lookandfeel.rb +698 -0
  119. data/lib/oddb/html/util/need_all_input.rb +29 -0
  120. data/lib/oddb/html/util/session.rb +84 -0
  121. data/lib/oddb/html/util/sort.rb +72 -0
  122. data/lib/oddb/html/util/unsaved_helper.rb +20 -0
  123. data/lib/oddb/html/util/validator.rb +59 -0
  124. data/lib/oddb/html/view/ajax/json.rb +22 -0
  125. data/lib/oddb/html/view/alpha_header.rb +28 -0
  126. data/lib/oddb/html/view/document.rb +117 -0
  127. data/lib/oddb/html/view/download.rb +33 -0
  128. data/lib/oddb/html/view/drugs/admin/package.rb +245 -0
  129. data/lib/oddb/html/view/drugs/admin/product.rb +104 -0
  130. data/lib/oddb/html/view/drugs/admin/sequence.rb +305 -0
  131. data/lib/oddb/html/view/drugs/ajax/explain_ddd_price.rb +87 -0
  132. data/lib/oddb/html/view/drugs/ajax/explain_price.rb +61 -0
  133. data/lib/oddb/html/view/drugs/ajax/package_infos.rb +105 -0
  134. data/lib/oddb/html/view/drugs/ajax/remote_infos.rb +44 -0
  135. data/lib/oddb/html/view/drugs/atc_browser.rb +68 -0
  136. data/lib/oddb/html/view/drugs/atc_guidelines.rb +94 -0
  137. data/lib/oddb/html/view/drugs/compare.rb +95 -0
  138. data/lib/oddb/html/view/drugs/download_export.rb +28 -0
  139. data/lib/oddb/html/view/drugs/downloads.rb +128 -0
  140. data/lib/oddb/html/view/drugs/fachinfo.rb +46 -0
  141. data/lib/oddb/html/view/drugs/feedback.rb +235 -0
  142. data/lib/oddb/html/view/drugs/init.rb +51 -0
  143. data/lib/oddb/html/view/drugs/legend.rb +24 -0
  144. data/lib/oddb/html/view/drugs/package.rb +403 -0
  145. data/lib/oddb/html/view/drugs/patinfo.rb +46 -0
  146. data/lib/oddb/html/view/drugs/products.rb +97 -0
  147. data/lib/oddb/html/view/drugs/result.rb +296 -0
  148. data/lib/oddb/html/view/drugs/search.rb +33 -0
  149. data/lib/oddb/html/view/drugs/template.rb +15 -0
  150. data/lib/oddb/html/view/foot.rb +52 -0
  151. data/lib/oddb/html/view/google.rb +23 -0
  152. data/lib/oddb/html/view/google_ads.rb +40 -0
  153. data/lib/oddb/html/view/head.rb +78 -0
  154. data/lib/oddb/html/view/limit.rb +109 -0
  155. data/lib/oddb/html/view/list.rb +59 -0
  156. data/lib/oddb/html/view/login.rb +38 -0
  157. data/lib/oddb/html/view/navigation.rb +67 -0
  158. data/lib/oddb/html/view/offset_header.rb +35 -0
  159. data/lib/oddb/html/view/paypal/collect.rb +95 -0
  160. data/lib/oddb/html/view/paypal/redirect.rb +51 -0
  161. data/lib/oddb/html/view/paypal/register_form.rb +149 -0
  162. data/lib/oddb/html/view/register_download.rb +29 -0
  163. data/lib/oddb/html/view/register_export.rb +29 -0
  164. data/lib/oddb/html/view/register_poweruser.rb +29 -0
  165. data/lib/oddb/html/view/rss/feedback.rb +64 -0
  166. data/lib/oddb/html/view/rss_preview.rb +61 -0
  167. data/lib/oddb/html/view/search.rb +104 -0
  168. data/lib/oddb/html/view/snapback.rb +24 -0
  169. data/lib/oddb/html/view/template.rb +56 -0
  170. data/lib/oddb/import/dimdi.rb +583 -0
  171. data/lib/oddb/import/excel.rb +45 -0
  172. data/lib/oddb/import/gkv.rb +463 -0
  173. data/lib/oddb/import/importer.rb +36 -0
  174. data/lib/oddb/import/pharma24.rb +211 -0
  175. data/lib/oddb/import/pharmnet.rb +1186 -0
  176. data/lib/oddb/import/rtf.rb +409 -0
  177. data/lib/oddb/import/whocc.rb +148 -0
  178. data/lib/oddb/import/xml.rb +15 -0
  179. data/lib/oddb/model.rb +179 -0
  180. data/lib/oddb/persistence.rb +22 -0
  181. data/lib/oddb/persistence/odba.rb +32 -0
  182. data/lib/oddb/persistence/odba/business/company.rb +13 -0
  183. data/lib/oddb/persistence/odba/business/grant_download.rb +14 -0
  184. data/lib/oddb/persistence/odba/business/invoice.rb +15 -0
  185. data/lib/oddb/persistence/odba/drugs/atc.rb +15 -0
  186. data/lib/oddb/persistence/odba/drugs/galenic_form.rb +18 -0
  187. data/lib/oddb/persistence/odba/drugs/galenic_group.rb +13 -0
  188. data/lib/oddb/persistence/odba/drugs/package.rb +25 -0
  189. data/lib/oddb/persistence/odba/drugs/product.rb +13 -0
  190. data/lib/oddb/persistence/odba/drugs/sequence.rb +21 -0
  191. data/lib/oddb/persistence/odba/drugs/substance.rb +21 -0
  192. data/lib/oddb/persistence/odba/drugs/substance_group.rb +13 -0
  193. data/lib/oddb/persistence/odba/drugs/unit.rb +13 -0
  194. data/lib/oddb/persistence/odba/export.rb +26 -0
  195. data/lib/oddb/persistence/odba/model.rb +68 -0
  196. data/lib/oddb/persistence/odba/text/document.rb +11 -0
  197. data/lib/oddb/persistence/odba/util/code.rb +11 -0
  198. data/lib/oddb/persistence/odba/util/m10l_document.rb +13 -0
  199. data/lib/oddb/persistence/og.rb +16 -0
  200. data/lib/oddb/persistence/og/drugs/composition.rb +14 -0
  201. data/lib/oddb/persistence/og/drugs/product.rb +14 -0
  202. data/lib/oddb/persistence/og/drugs/sequence.rb +15 -0
  203. data/lib/oddb/persistence/og/model.rb +25 -0
  204. data/lib/oddb/persistence/og/util/multilingual.rb +13 -0
  205. data/lib/oddb/redist/rtf_tools/reader.rb +139 -0
  206. data/lib/oddb/remote/business/company.rb +17 -0
  207. data/lib/oddb/remote/drugs/active_agent.rb +27 -0
  208. data/lib/oddb/remote/drugs/atc.rb +31 -0
  209. data/lib/oddb/remote/drugs/dose.rb +8 -0
  210. data/lib/oddb/remote/drugs/galenic_form.rb +24 -0
  211. data/lib/oddb/remote/drugs/package.rb +128 -0
  212. data/lib/oddb/remote/drugs/part.rb +30 -0
  213. data/lib/oddb/remote/drugs/substance.rb +20 -0
  214. data/lib/oddb/remote/drugs/unit.rb +20 -0
  215. data/lib/oddb/remote/object.rb +36 -0
  216. data/lib/oddb/text/chapter.rb +23 -0
  217. data/lib/oddb/text/document.rb +42 -0
  218. data/lib/oddb/text/format.rb +37 -0
  219. data/lib/oddb/text/paragraph.rb +53 -0
  220. data/lib/oddb/text/picture.rb +89 -0
  221. data/lib/oddb/text/table.rb +68 -0
  222. data/lib/oddb/util.rb +9 -0
  223. data/lib/oddb/util/annotated_list.rb +37 -0
  224. data/lib/oddb/util/code.rb +69 -0
  225. data/lib/oddb/util/comparison.rb +36 -0
  226. data/lib/oddb/util/download.rb +17 -0
  227. data/lib/oddb/util/exporter.rb +8 -0
  228. data/lib/oddb/util/feedback.rb +23 -0
  229. data/lib/oddb/util/ipn.rb +53 -0
  230. data/lib/oddb/util/job.rb +23 -0
  231. data/lib/oddb/util/logger.rb +20 -0
  232. data/lib/oddb/util/m10l_document.rb +41 -0
  233. data/lib/oddb/util/mail.rb +87 -0
  234. data/lib/oddb/util/money.rb +64 -0
  235. data/lib/oddb/util/multilingual.rb +70 -0
  236. data/lib/oddb/util/quanty.rb +3 -0
  237. data/lib/oddb/util/quanty/fact.rb +242 -0
  238. data/lib/oddb/util/quanty/main.rb +164 -0
  239. data/lib/oddb/util/quanty/parse.rb +872 -0
  240. data/lib/oddb/util/quanty/units.dump +0 -0
  241. data/lib/oddb/util/server.rb +150 -0
  242. data/lib/oddb/util/smtp_tls.rb +58 -0
  243. data/lib/oddb/util/updater.rb +161 -0
  244. data/lib/oddb/util/ydim.rb +110 -0
  245. data/lib/oddb/util/yus.rb +46 -0
  246. data/test/business/test_company.rb +29 -0
  247. data/test/business/test_grant_download.rb +29 -0
  248. data/test/drugs/test_active_agent.rb +53 -0
  249. data/test/drugs/test_atc.rb +54 -0
  250. data/test/drugs/test_composition.rb +88 -0
  251. data/test/drugs/test_ddd.rb +22 -0
  252. data/test/drugs/test_dose.rb +189 -0
  253. data/test/drugs/test_galenic_form.rb +41 -0
  254. data/test/drugs/test_package.rb +172 -0
  255. data/test/drugs/test_part.rb +32 -0
  256. data/test/drugs/test_product.rb +31 -0
  257. data/test/drugs/test_sequence.rb +140 -0
  258. data/test/drugs/test_substance.rb +51 -0
  259. data/test/drugs/test_substance_group.rb +27 -0
  260. data/test/export/test_rss.rb +86 -0
  261. data/test/export/test_server.rb +163 -0
  262. data/test/export/test_xls.rb +146 -0
  263. data/test/export/test_yaml.rb +120 -0
  264. data/test/import/data/csv/products.csv +11 -0
  265. data/test/import/data/html/dimdi_index.html +400 -0
  266. data/test/import/data/html/gkv/Befreiungsliste_Arzneimittel_Versicherte.gkvnet +508 -0
  267. data/test/import/data/html/pharma24/1337397.html +754 -0
  268. data/test/import/data/html/pharma24/842756.html +570 -0
  269. data/test/import/data/html/pharma24/ac-page-10.html +2999 -0
  270. data/test/import/data/html/pharma24/ac-page-11.html +2999 -0
  271. data/test/import/data/html/pharma24/ac-page-12.html +2999 -0
  272. data/test/import/data/html/pharma24/ac-page-13.html +2999 -0
  273. data/test/import/data/html/pharma24/ac-page-14.html +2999 -0
  274. data/test/import/data/html/pharma24/ac-page-15.html +3011 -0
  275. data/test/import/data/html/pharma24/ac-page-16.html +3050 -0
  276. data/test/import/data/html/pharma24/ac-page-17.html +3285 -0
  277. data/test/import/data/html/pharma24/ac-page-18.html +3109 -0
  278. data/test/import/data/html/pharma24/ac-page-19.html +3126 -0
  279. data/test/import/data/html/pharma24/ac-page-2.html +3005 -0
  280. data/test/import/data/html/pharma24/ac-page-20.html +3007 -0
  281. data/test/import/data/html/pharma24/ac-page-21.html +2999 -0
  282. data/test/import/data/html/pharma24/ac-page-22.html +2999 -0
  283. data/test/import/data/html/pharma24/ac-page-23.html +3055 -0
  284. data/test/import/data/html/pharma24/ac-page-24.html +2999 -0
  285. data/test/import/data/html/pharma24/ac-page-25.html +3004 -0
  286. data/test/import/data/html/pharma24/ac-page-26.html +2999 -0
  287. data/test/import/data/html/pharma24/ac-page-27.html +3167 -0
  288. data/test/import/data/html/pharma24/ac-page-28.html +3236 -0
  289. data/test/import/data/html/pharma24/ac-page-29.html +3110 -0
  290. data/test/import/data/html/pharma24/ac-page-3.html +2999 -0
  291. data/test/import/data/html/pharma24/ac-page-30.html +2999 -0
  292. data/test/import/data/html/pharma24/ac-page-31.html +2999 -0
  293. data/test/import/data/html/pharma24/ac-page-32.html +2999 -0
  294. data/test/import/data/html/pharma24/ac-page-33.html +3001 -0
  295. data/test/import/data/html/pharma24/ac-page-34.html +2999 -0
  296. data/test/import/data/html/pharma24/ac-page-35.html +2999 -0
  297. data/test/import/data/html/pharma24/ac-page-36.html +2999 -0
  298. data/test/import/data/html/pharma24/ac-page-37.html +2999 -0
  299. data/test/import/data/html/pharma24/ac-page-38.html +3003 -0
  300. data/test/import/data/html/pharma24/ac-page-39.html +2999 -0
  301. data/test/import/data/html/pharma24/ac-page-4.html +2999 -0
  302. data/test/import/data/html/pharma24/ac-page-40.html +2999 -0
  303. data/test/import/data/html/pharma24/ac-page-41.html +2999 -0
  304. data/test/import/data/html/pharma24/ac-page-42.html +2999 -0
  305. data/test/import/data/html/pharma24/ac-page-43.html +2999 -0
  306. data/test/import/data/html/pharma24/ac-page-44.html +2999 -0
  307. data/test/import/data/html/pharma24/ac-page-45.html +2999 -0
  308. data/test/import/data/html/pharma24/ac-page-46.html +2999 -0
  309. data/test/import/data/html/pharma24/ac-page-47.html +2999 -0
  310. data/test/import/data/html/pharma24/ac-page-48.html +2999 -0
  311. data/test/import/data/html/pharma24/ac-page-49.html +2999 -0
  312. data/test/import/data/html/pharma24/ac-page-5.html +3168 -0
  313. data/test/import/data/html/pharma24/ac-page-50.html +2999 -0
  314. data/test/import/data/html/pharma24/ac-page-51.html +2999 -0
  315. data/test/import/data/html/pharma24/ac-page-52.html +3003 -0
  316. data/test/import/data/html/pharma24/ac-page-53.html +2999 -0
  317. data/test/import/data/html/pharma24/ac-page-54.html +3095 -0
  318. data/test/import/data/html/pharma24/ac-page-55.html +3041 -0
  319. data/test/import/data/html/pharma24/ac-page-56.html +2999 -0
  320. data/test/import/data/html/pharma24/ac-page-57.html +3001 -0
  321. data/test/import/data/html/pharma24/ac-page-58.html +3001 -0
  322. data/test/import/data/html/pharma24/ac-page-59.html +2999 -0
  323. data/test/import/data/html/pharma24/ac-page-6.html +3072 -0
  324. data/test/import/data/html/pharma24/ac-page-60.html +3001 -0
  325. data/test/import/data/html/pharma24/ac-page-61.html +3005 -0
  326. data/test/import/data/html/pharma24/ac-page-62.html +2999 -0
  327. data/test/import/data/html/pharma24/ac-page-63.html +3007 -0
  328. data/test/import/data/html/pharma24/ac-page-64.html +3007 -0
  329. data/test/import/data/html/pharma24/ac-page-65.html +2999 -0
  330. data/test/import/data/html/pharma24/ac-page-66.html +3011 -0
  331. data/test/import/data/html/pharma24/ac-page-67.html +3026 -0
  332. data/test/import/data/html/pharma24/ac-page-68.html +2999 -0
  333. data/test/import/data/html/pharma24/ac-page-69.html +3010 -0
  334. data/test/import/data/html/pharma24/ac-page-7.html +2999 -0
  335. data/test/import/data/html/pharma24/ac-page-70.html +3192 -0
  336. data/test/import/data/html/pharma24/ac-page-71.html +3133 -0
  337. data/test/import/data/html/pharma24/ac-page-72.html +2999 -0
  338. data/test/import/data/html/pharma24/ac-page-73.html +3227 -0
  339. data/test/import/data/html/pharma24/ac-page-74.html +3241 -0
  340. data/test/import/data/html/pharma24/ac-page-75.html +3227 -0
  341. data/test/import/data/html/pharma24/ac-page-76.html +3244 -0
  342. data/test/import/data/html/pharma24/ac-page-77.html +1164 -0
  343. data/test/import/data/html/pharma24/ac-page-8.html +2999 -0
  344. data/test/import/data/html/pharma24/ac-page-9.html +2999 -0
  345. data/test/import/data/html/pharma24/ac.html +2999 -0
  346. data/test/import/data/html/pharmnet/display.html +662 -0
  347. data/test/import/data/html/pharmnet/display1.html +625 -0
  348. data/test/import/data/html/pharmnet/display2.html +625 -0
  349. data/test/import/data/html/pharmnet/display3.html +625 -0
  350. data/test/import/data/html/pharmnet/display_tramal.html +634 -0
  351. data/test/import/data/html/pharmnet/empty_result.html +395 -0
  352. data/test/import/data/html/pharmnet/gate.html +246 -0
  353. data/test/import/data/html/pharmnet/index.html +258 -0
  354. data/test/import/data/html/pharmnet/paged_result_1.html +401 -0
  355. data/test/import/data/html/pharmnet/paged_result_2.html +401 -0
  356. data/test/import/data/html/pharmnet/result.html +401 -0
  357. data/test/import/data/html/pharmnet/search.html +865 -0
  358. data/test/import/data/html/pharmnet/search_filtered.html +182 -0
  359. data/test/import/data/html/whocc/A.html +56 -0
  360. data/test/import/data/html/whocc/A03.html +48 -0
  361. data/test/import/data/html/whocc/A03AB.html +48 -0
  362. data/test/import/data/html/whocc/A06AA.html +47 -0
  363. data/test/import/data/html/whocc/C03.html +47 -0
  364. data/test/import/data/html/whocc/login.html +77 -0
  365. data/test/import/data/mail/csv.mail +81 -0
  366. data/test/import/data/rtf/pharmnet/aarane.pi.rtf +648 -0
  367. data/test/import/data/rtf/pharmnet/ace_hemmer_ratio.pi.rtf +324 -0
  368. data/test/import/data/rtf/pharmnet/ace_hemmer_ratio.rtf +4816 -0
  369. data/test/import/data/rtf/pharmnet/acemetacin.pi.rtf +388 -0
  370. data/test/import/data/rtf/pharmnet/acemit.pi.rtf +240 -0
  371. data/test/import/data/rtf/pharmnet/acerbon.pi.rtf +1257 -0
  372. data/test/import/data/rtf/pharmnet/acetylcystein.pi.rtf +323 -0
  373. data/test/import/data/rtf/pharmnet/aciclo.pi.rtf +287 -0
  374. data/test/import/data/rtf/pharmnet/aciclovir.pi.rtf +236 -0
  375. data/test/import/data/rtf/pharmnet/actrapid.pi.rtf +322 -0
  376. data/test/import/data/rtf/pharmnet/amlodipin.pi.rtf +452 -0
  377. data/test/import/data/rtf/pharmnet/amlodipin.rtf +473 -0
  378. data/test/import/data/rtf/pharmnet/aspirin.pi.rtf +313 -0
  379. data/test/import/data/rtf/pharmnet/aspirin.rtf +781 -0
  380. data/test/import/data/rtf/pharmnet/baymycard.pi.rtf +447 -0
  381. data/test/import/data/rtf/pharmnet/omeprazol.pi.rtf +510 -0
  382. data/test/import/data/rtf/pharmnet/omeprazol.rtf +9216 -0
  383. data/test/import/data/rtf/pharmnet/paroxetin.pi.rtf +678 -0
  384. data/test/import/data/rtf/pharmnet/selegilin.pi.rtf +312 -0
  385. data/test/import/data/rtf/pharmnet/selegilin.rtf +683 -0
  386. data/test/import/data/rtf/pharmnet/valium.pi.rtf +387 -0
  387. data/test/import/data/txt/gkv/gkv_p1.txt +17 -0
  388. data/test/import/data/xls/darform_010706.xls +0 -0
  389. data/test/import/data/xls/fb010706.xls +0 -0
  390. data/test/import/data/xls/liste_zuzahlungsbefreite_arzneimittel_suchfunktion.xls +0 -0
  391. data/test/import/data/xls/wirkkurz_010406.xls +0 -0
  392. data/test/import/data/xml/ATC_2006.xml +47 -0
  393. data/test/import/data/xml/ATC_2006_ddd.xml +35 -0
  394. data/test/import/test_dimdi.rb +323 -0
  395. data/test/import/test_excel.rb +31 -0
  396. data/test/import/test_gkv.rb +260 -0
  397. data/test/import/test_pharma24.rb +112 -0
  398. data/test/import/test_pharmnet.rb +980 -0
  399. data/test/import/test_rtf.rb +37 -0
  400. data/test/import/test_whocc.rb +314 -0
  401. data/test/remote/drugs/test_active_agent.rb +36 -0
  402. data/test/selenium/selenium-server.jar +0 -0
  403. data/test/selenium/test_atc_browser.rb +121 -0
  404. data/test/selenium/test_atc_guidelines.rb +95 -0
  405. data/test/selenium/test_collect.rb +137 -0
  406. data/test/selenium/test_compare.rb +294 -0
  407. data/test/selenium/test_fachinfo.rb +128 -0
  408. data/test/selenium/test_feedback.rb +192 -0
  409. data/test/selenium/test_init.rb +64 -0
  410. data/test/selenium/test_limit.rb +304 -0
  411. data/test/selenium/test_login.rb +67 -0
  412. data/test/selenium/test_package.rb +516 -0
  413. data/test/selenium/test_patinfo.rb +128 -0
  414. data/test/selenium/test_product.rb +80 -0
  415. data/test/selenium/test_products.rb +141 -0
  416. data/test/selenium/test_search.rb +933 -0
  417. data/test/selenium/test_sequence.rb +513 -0
  418. data/test/selenium/unit.rb +190 -0
  419. data/test/stub/http_server.rb +144 -0
  420. data/test/stub/model.rb +173 -0
  421. data/test/suite.rb +15 -0
  422. data/test/test_model.rb +83 -0
  423. data/test/util/test_code.rb +74 -0
  424. data/test/util/test_ipn.rb +117 -0
  425. data/test/util/test_mail.rb +85 -0
  426. data/test/util/test_multilingual.rb +97 -0
  427. data/test/util/test_server.rb +94 -0
  428. data/test/util/test_updater.rb +130 -0
  429. data/test/util/test_ydim.rb +115 -0
  430. data/test/util/test_yus.rb +79 -0
  431. metadata +568 -0
@@ -0,0 +1,150 @@
1
+ #!/usr/bin/env ruby
2
+ # Util::Server -- de.oddb.org -- 01.09.2006 -- hwyss@ywesee.com
3
+
4
+ require 'oddb/html/util/known_user'
5
+ require 'oddb/html/util/session'
6
+ require 'oddb/html/util/validator'
7
+ require 'oddb/util/exporter'
8
+ require 'oddb/util/ipn'
9
+ require 'oddb/util/updater'
10
+ require 'oddb/export/rss'
11
+ require 'paypal'
12
+ require 'sbsm/drbserver'
13
+
14
+ module ODDB
15
+ module Util
16
+ class Server < SBSM::DRbServer
17
+ ENABLE_ADMIN = true
18
+ SESSION = Html::Util::Session
19
+ VALIDATOR = Html::Util::Validator
20
+ def initialize(*args)
21
+ super
22
+ @rss_mutex = Mutex.new
23
+ run_exporter if(ODDB.config.run_exporter)
24
+ run_updater if(ODDB.config.run_updater)
25
+ end
26
+ def _admin(src, result, priority=0)
27
+ raise "admin interface disabled" unless(self::class::ENABLE_ADMIN)
28
+ t = Thread.new {
29
+ Thread.current.abort_on_exception = false
30
+ begin
31
+ response = instance_eval(src)
32
+ str = response.to_s
33
+ result << if(str.length > 200)
34
+ response.class
35
+ else
36
+ str
37
+ end.to_s
38
+ rescue StandardError => error
39
+ result << error.message
40
+ require 'pp'
41
+ ODDB.logger.error('admin') { error.class }
42
+ ODDB.logger.error('admin') { error.message }
43
+ ODDB.logger.error('admin') { error.backtrace.pretty_inspect }
44
+ error
45
+ end
46
+ }
47
+ t[:source] = src
48
+ t.priority = priority
49
+ @admin_threads.add(t)
50
+ t
51
+ end
52
+ def grant_download(*arg)
53
+ # This method is for bin/admin sub-command
54
+ usage = "Usage:\n" +
55
+ " Set grant: grant_download 'email address', 'file', Time.local(20yy,mm,dd)\n" +
56
+ " Show grant: grant_download 'email address'\n"
57
+ email = arg[0]
58
+ file = arg[1]
59
+ expiry_time = arg[2]
60
+ if arg.length == 3 # register
61
+ unless user = ODDB::Business::GrantDownload.find_by_email(email)
62
+ user = ODDB::Business::GrantDownload.new(email)
63
+ end
64
+ user.grant_download(file, expiry_time)
65
+ user.save
66
+ ODDB.config.http_server + '/de/temp/grant_download/email/' + email + '/file/' + file
67
+ elsif arg.length == 1 # search
68
+ if user = ODDB::Business::GrantDownload.find_by_email(email)
69
+ grant_list = user.grant_list.sort_by{|filename, expirytime| expirytime}.reverse
70
+ str = grant_list[0..3].map{|x| x[1].strftime("%Y%m%d") + ', ' + x[0]}.join("\n")
71
+ "grant list(total:" + grant_list.length.to_s + "): odba_id: " + user.uid.to_s + "\n" + str
72
+ else
73
+ 'No registration for ' + email
74
+ end
75
+ else
76
+ usage
77
+ end
78
+ end
79
+ def create_product name
80
+ if prod = ODDB::Drugs::Product.find_by_name(name)
81
+ "The product already exists. You may edit it at http://de.oddb.org/de/drugs/product/uid/#{prod.uid}"
82
+ else
83
+ prod = ODDB::Drugs::Product.new
84
+ prod.name.de = name
85
+ prod.save
86
+ "Success! You may now edit the product at http://de.oddb.org/de/drugs/product/uid/#{prod.uid}"
87
+ end
88
+ end
89
+ def generate_dictionary(language, locale)
90
+ ODBA.storage.remove_dictionary(language)
91
+ base = File.join(ODDB.config.data_dir,
92
+ "fulltext", "data", "dicts", language)
93
+ ODBA.storage.generate_dictionary(language, locale, base)
94
+ end
95
+ def generate_dictionaries
96
+ generate_dictionary('german', 'de_DE@euro')
97
+ end
98
+ def ipn(notification)
99
+ Util::Ipn.process notification
100
+ nil # don't return the invoice back across drb - it's not defined in yipn
101
+ end
102
+ def login(email, pass)
103
+ session = ODDB.auth.login(email, pass, ODDB.config.auth_domain)
104
+ Html::Util::KnownUser.new(session)
105
+ end
106
+ def logout(session)
107
+ ODDB.auth.logout(session)
108
+ rescue DRb::DRbError, RangeError, NameError
109
+ end
110
+ def peer_cache cache
111
+ ODBA.peer cache
112
+ end
113
+ def run_at(hour, &block)
114
+ Thread.new {
115
+ loop {
116
+ now = Time.now
117
+ run_at = Time.local(now.year, now.month, now.day, hour)
118
+ while(now > run_at)
119
+ run_at += 24*60*60
120
+ end
121
+ sleep(run_at - now)
122
+ block.call
123
+ }
124
+ }
125
+ end
126
+ def run_exporter
127
+ @exporter = run_at(ODDB.config.export_hour) { Exporter.run }
128
+ end
129
+ def run_updater
130
+ @updater = run_at(ODDB.config.update_hour) { Updater.run }
131
+ end
132
+ def unpeer_cache cache
133
+ ODBA.unpeer cache
134
+ end
135
+ def update_feedback_rss_feed
136
+ async {
137
+ begin
138
+ @rss_mutex.synchronize {
139
+ Export::Rss::Feedback.new.export
140
+ }
141
+ rescue StandardError => error
142
+ ODDB.logger.error('rss_feed') { error.class }
143
+ ODDB.logger.error('rss_feed') { error.message }
144
+ ODDB.logger.error('rss_feed') { error.backtrace.pretty_inspect }
145
+ end
146
+ }
147
+ end
148
+ end
149
+ end
150
+ end
@@ -0,0 +1,58 @@
1
+ require "openssl"
2
+ require "net/smtp"
3
+
4
+ Net::SMTP.class_eval do
5
+ private
6
+ def do_start(helodomain, user, secret, authtype)
7
+ raise IOError, 'SMTP session already started' if @started
8
+ check_auth_args user, secret, authtype if user or secret
9
+
10
+ sock = timeout(@open_timeout) { TCPSocket.open(@address, @port) }
11
+ @socket = Net::InternetMessageIO.new(sock)
12
+ @socket.read_timeout = 60 #@read_timeout
13
+ @socket.debug_output = STDERR #@debug_output
14
+
15
+ check_response(critical { recv_response() })
16
+ do_helo(helodomain)
17
+
18
+ raise 'openssl library not installed' unless defined?(OpenSSL)
19
+ starttls
20
+ ssl = OpenSSL::SSL::SSLSocket.new(sock)
21
+ ssl.sync_close = true
22
+ ssl.connect
23
+ @socket = Net::InternetMessageIO.new(ssl)
24
+ @socket.read_timeout = 60 #@read_timeout
25
+ @socket.debug_output = STDERR #@debug_output
26
+ do_helo(helodomain)
27
+
28
+ authenticate user, secret, authtype if user
29
+ @started = true
30
+ ensure
31
+ unless @started
32
+ # authentication failed, cancel connection.
33
+ @socket.close if not @started and @socket and not @socket.closed?
34
+ @socket = nil
35
+ end
36
+ end
37
+
38
+ def do_helo(helodomain)
39
+ begin
40
+ if @esmtp
41
+ ehlo helodomain
42
+ else
43
+ helo helodomain
44
+ end
45
+ rescue Net::ProtocolError
46
+ if @esmtp
47
+ @esmtp = false
48
+ @error_occured = false
49
+ retry
50
+ end
51
+ raise
52
+ end
53
+ end
54
+
55
+ def starttls
56
+ getok('STARTTLS')
57
+ end
58
+ end
@@ -0,0 +1,161 @@
1
+ #!/usr/bin/env ruby
2
+ # Util::Updater -- de.oddb.org -- 02.02.2007 -- hwyss@ywesee.com
3
+
4
+ require 'date'
5
+ require 'mechanize'
6
+ require 'oddb/import/dimdi'
7
+ require 'oddb/import/gkv'
8
+ require 'oddb/import/pharma24'
9
+ require 'oddb/import/pharmnet'
10
+ require 'oddb/import/whocc'
11
+ require 'oddb/util/mail'
12
+
13
+ module ODDB
14
+ module Util
15
+ module Updater
16
+ DIMDI_INDEX = "http://www.dimdi.de/static/de/amg/fbag/index.htm"
17
+ def Updater.import_dimdi
18
+ if(date = Import::Dimdi.current_date(DIMDI_INDEX))
19
+ import_dimdi_substances(date)
20
+ import_dimdi_galenic_forms(date)
21
+ import_dimdi_products(date)
22
+ end
23
+ end
24
+ def Updater.import_dimdi_galenic_forms(date)
25
+ file = date.strftime("darreichungsformen-%Y%m.xls")
26
+ Import::Dimdi.download(file) { |io|
27
+ reported_import(Import::Dimdi::GalenicForm.new(date), io,
28
+ :filetype => 'XLS')
29
+ }
30
+ end
31
+ def Updater.import_dimdi_products(date)
32
+ file = date.strftime("festbetraege-%Y%m.xls")
33
+ Import::Dimdi.download(file) { |io|
34
+ reported_import(Import::Dimdi::Product.new(date), io,
35
+ :subject => "Update Festbeträge",
36
+ :filetype => 'XLS')
37
+ }
38
+ end
39
+ def Updater.import_dimdi_substances(date)
40
+ file = date.strftime("wirkstoffkuerzel-%Y%m.xls")
41
+ Import::Dimdi.download(file) { |io|
42
+ reported_import(Import::Dimdi::Substance.new(date), io,
43
+ :filetype => 'XLS')
44
+ }
45
+ end
46
+ def Updater.import_fachinfos(term, opts = {})
47
+ importer = Import::PharmNet::Importer.new
48
+ _reported_import(importer, :filetype => 'HTML') {
49
+ importer.import_missing(Mechanize.new, term, opts)
50
+ }
51
+ rescue StandardError => error
52
+ ODDB.logger.error('Updater') { error.message }
53
+ end
54
+ def Updater.import_gkv(opts = {})
55
+ importer = Import::Gkv.new
56
+ if url = opts[:pdf] || importer.latest_url(Mechanize.new, opts)
57
+ importer.download_latest url, opts do |fh|
58
+ reported_import(importer, fh,
59
+ :subject => 'Zubef', :filetype => 'PDF')
60
+ end
61
+ else
62
+ # This is temporary solution.
63
+ # This should be composed in reporting email or logging process.
64
+ host = 'https://www.gkv-spitzenverband.de'
65
+ url = '/Befreiungsliste_Arzneimittel_Versicherte.gkvnet'
66
+ print "WARNING: Updater.import_gkv did nothing. It looks failing in grabbing PDF link.\n"
67
+ print "Check HTML source code at " + host + url + "\n"
68
+ print "Probably you have to modify Gkv#latest_url method."
69
+ print "20100910 masa\n"
70
+ return nil
71
+ end
72
+ end
73
+ def Updater.import_missing(name)
74
+ name.split('|').each do |term|
75
+ Updater.import_fachinfos term, :info_unrestricted => true
76
+ end
77
+ end
78
+ def Updater.import_pharmnet(opts = {})
79
+ opts = { :replace => true, :reload => false,
80
+ :remove => false, :repair => false,
81
+ :reparse => false, :retries => 3,
82
+ :retry_unit => 60 }.update opts
83
+ importer = Import::PharmNet::Importer.new
84
+ _reported_import(importer, {:filetype => 'HTML'}, {:skip_totals => true}) {
85
+ importer._import(Mechanize.new, Drugs::Sequence.all, opts)
86
+ }
87
+ rescue StandardError => error
88
+ ODDB.logger.error('Updater') { error.message }
89
+ end
90
+ def Updater.import_product_infos
91
+ Import::Csv::ProductInfos.download_latest { |io|
92
+ reported_import(Import::Csv::ProductInfos.new, io, :filetype => 'CSV')
93
+ }
94
+ end
95
+ def Updater.import_whocc_guidelines
96
+ reported_import(Import::Whocc::Guidelines.new,
97
+ Mechanize.new, :filetype => 'HTML')
98
+ end
99
+ def Updater.report_fachinfos
100
+ importer = Import::PharmNet::Importer.new
101
+ _reported_import(importer) {
102
+ importer.report
103
+ }
104
+ end
105
+ def Updater.reported_import(importer, io, subject=nil)
106
+ _reported_import(importer, subject) { importer.import io }
107
+ end
108
+ def Updater._reported_import(importer, args={}, error_args={}, &block)
109
+ lines = [
110
+ sprintf("%s: %s %s#import", Time.now.strftime('%c'),
111
+ ODDB.config.server_name, importer.class)
112
+ ]
113
+ lines.concat block.call(importer)
114
+ rescue Exception => err
115
+ lines.push(err.class.to_s, err.message, *err.backtrace)
116
+ if importer.respond_to?(:report)
117
+ report = if importer.method(:report).arity == 0
118
+ importer.report
119
+ else
120
+ importer.report(error_args)
121
+ end rescue [$!.message]
122
+ lines.concat report
123
+ end
124
+ ensure
125
+ ft = args[:filetype]
126
+ fmt = ft ? "%s: %s %s (%s)" : "%s: %s %s"
127
+ subject = sprintf(fmt, Time.now.strftime('%c'), ODDB.config.server_name,
128
+ args[:subject] || importer.class, ft)
129
+ Mail.notify_admins(subject, lines)
130
+ end
131
+ def Updater.run(today = Date.today)
132
+ run_logged_job 'import_dimdi'
133
+ run_logged_job 'import_gkv'
134
+ case today.day
135
+ when 1
136
+ run_logged_job 'import_pharmnet'
137
+ run_logged_job 'import_whocc'
138
+ when 15
139
+ run_logged_job 'import_pharma24'
140
+ end
141
+ end
142
+ def Updater.run_logged_job job
143
+ dir = ODDB.config.oddb_dir
144
+ cmd = File.join dir, 'jobs', job
145
+ log = File.join dir, 'log', job
146
+ IO.popen "#{cmd} log_file=#{log}" do |io|
147
+ # wait for importer to exit
148
+ end
149
+ end
150
+ def Updater.update_prices(packages = Drugs::Package.all,
151
+ opts={:all => false})
152
+ importer = Import::Pharma24.new
153
+ _reported_import(importer) {
154
+ importer.import Mechanize.new, packages
155
+ }
156
+ rescue StandardError => error
157
+ ODDB.logger.error('Updater') { error.message }
158
+ end
159
+ end
160
+ end
161
+ end
@@ -0,0 +1,110 @@
1
+ #!/usr/bin/env ruby
2
+ # Util::Ydim -- de.oddb.org -- 30.01.2008 -- hwyss@ywesee.com
3
+
4
+ require 'ydim/config'
5
+ require 'ydim/client'
6
+ require 'oddb/config'
7
+ require 'oddb/util/yus'
8
+ require 'openssl'
9
+
10
+ module ODDB
11
+ module Util
12
+ module Ydim
13
+ DATE_FMT = "%d.%m.%Y"
14
+ SALUTATIONS = {
15
+ 'salutation_m' => 'Herr',
16
+ 'salutation_f' => 'Frau',
17
+ }
18
+ def Ydim.connect(&block)
19
+ config = YDIM::Client::CONFIG
20
+ server = DRbObject.new(nil, config.server_url)
21
+ client = YDIM::Client.new(config)
22
+ key = OpenSSL::PKey::DSA.new(File.read(config.private_key))
23
+ client.login(server, key)
24
+ block.call(client)
25
+ ensure
26
+ client.logout if(client)
27
+ end
28
+ def Ydim.create_debitor(email)
29
+ connect { |client|
30
+ keys = [ :salutation, :name_last, :name_first ]
31
+ info = Util::Yus.get_preferences(email, keys)
32
+ debitor = client.create_debitor
33
+ debitor.salutation = SALUTATIONS[info[:salutation]]
34
+ debitor.contact_firstname = info[:name_first]
35
+ debitor.contact = info[:name_last]
36
+ debitor.debitor_type = 'dt_info'
37
+ debitor.email = email
38
+ debitor.save
39
+ debitor
40
+ }
41
+ end
42
+ def Ydim.debitor_id(email)
43
+ if(id = Util::Yus.get_preference(email, :ydim_id))
44
+ id
45
+ elsif(debitor = identify_debitor(email))
46
+ debitor.unique_id
47
+ else
48
+ create_debitor(email).unique_id
49
+ end
50
+ end
51
+ def Ydim.identify_debitor(email)
52
+ connect { |client|
53
+ client.search_debitors(email).first
54
+ }
55
+ end
56
+ def Ydim.inject(invoice, opts = {:payment_received => false})
57
+ if(id = invoice.ydim_id)
58
+ Ydim.connect { |client| client.invoice(id) }
59
+ elsif(email = invoice.yus_name)
60
+ ydim_inv = inject_from_items(invoice_date(invoice), email, invoice.items,
61
+ invoice.currency || 'EUR')
62
+ ydim_inv.payment_received = opts[:payment_received]
63
+ ydim_inv.save
64
+ invoice.ydim_id = ydim_inv.unique_id
65
+ invoice.save
66
+ ydim_inv
67
+ end
68
+ end
69
+ def Ydim.inject_from_items(date, email, items, currency='EUR')
70
+ connect { |client|
71
+ debitor_id = debitor_id(email)
72
+ Util::Yus.set_preference(email, :ydim_id, debitor_id)
73
+ ydim_inv = client.create_invoice(debitor_id)
74
+ ydim_inv.description = invoice_description(items)
75
+ ydim_inv.date = date
76
+ ydim_inv.currency = currency
77
+ ydim_inv.payment_period = ODDB.config.payment_period
78
+ item_data = sort_items(items).collect { |item|
79
+ if(sprintf('%1.2f', item.quantity) == "0.00")
80
+ ydim_inv.precision = 3
81
+ end
82
+ item.ydim_data
83
+ }
84
+ client.add_items(ydim_inv.unique_id, item_data)
85
+ ydim_inv
86
+ }
87
+ end
88
+ def Ydim.invoice_date(invoice)
89
+ Date.new(invoice.time.year, invoice.time.month, invoice.time.day)
90
+ end
91
+ def Ydim.invoice_description(items)
92
+ types = []
93
+ items.each { |item| types.push(item.type) }
94
+ main = items.first
95
+ if(types.include?(:poweruser))
96
+ exp = main.expiry_time || main.time + (24 * 60 *60)
97
+ sprintf("PowerUser %s %s - %s", ODDB.config.server_name,
98
+ main.time.strftime(DATE_FMT), exp.strftime(DATE_FMT))
99
+ else
100
+ sprintf("%s %s", ODDB.config.server_name, main.time.strftime(DATE_FMT))
101
+ end
102
+ end
103
+ def Ydim.sort_items(items)
104
+ items.sort_by { |item|
105
+ [item.time.to_i / (24 * 60 * 60), item.text, item.type.to_s]
106
+ }
107
+ end
108
+ end
109
+ end
110
+ end