clwiki 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (134) hide show
  1. data/LICENSE +31 -0
  2. data/Rakefile +53 -0
  3. data/app/assets/javascripts/cl_wiki/application.js +29 -0
  4. data/app/assets/stylesheets/cl_wiki/application.css +103 -0
  5. data/app/controllers/cl_wiki/application_controller.rb +4 -0
  6. data/app/controllers/cl_wiki/page_controller.rb +106 -0
  7. data/app/helpers/cl_wiki/application_helper.rb +4 -0
  8. data/app/views/cl_wiki/page/edit.html.erb +8 -0
  9. data/app/views/cl_wiki/page/find.html.erb +27 -0
  10. data/app/views/cl_wiki/page/recent.html.erb +4 -0
  11. data/app/views/cl_wiki/page/recent.rss.builder +18 -0
  12. data/app/views/cl_wiki/page/show.html.erb +1 -0
  13. data/app/views/layouts/cl_wiki/application.html.erb +14 -0
  14. data/config/clwiki.yml +73 -0
  15. data/config/initializers/clwiki.rb +9 -0
  16. data/config/routes.rb +15 -0
  17. data/lib/cl_wiki.rb +12 -0
  18. data/lib/cl_wiki/configuration.rb +171 -0
  19. data/lib/cl_wiki/engine.rb +5 -0
  20. data/lib/cl_wiki/file.rb +171 -0
  21. data/lib/cl_wiki/find_in_file.rb +33 -0
  22. data/lib/cl_wiki/format/format.blockquote.rb +15 -0
  23. data/lib/cl_wiki/format/format.graphviz.digraph.rb +16 -0
  24. data/lib/cl_wiki/format/format.opml.rb +105 -0
  25. data/lib/cl_wiki/format/format.pre.blockquote.rb +15 -0
  26. data/lib/cl_wiki/format/format.simpletable.rb +25 -0
  27. data/lib/cl_wiki/index.rb +455 -0
  28. data/lib/cl_wiki/page.rb +516 -0
  29. data/lib/cl_wiki/tools/cron.reminders.rb +241 -0
  30. data/lib/cl_wiki/tools/movepages.rb +27 -0
  31. data/lib/cl_wiki/tools/pagestomove.txt +56 -0
  32. data/lib/cl_wiki/tools/rublog/clWiki.rb +62 -0
  33. data/lib/cl_wiki/tools/rublog/readme.txt +2 -0
  34. data/lib/cl_wiki/tools/singlepage.rb +58 -0
  35. data/lib/cl_wiki/tools/test/singlepagetest.rb +9 -0
  36. data/lib/cl_wiki/tools/thunderbird.rb +23 -0
  37. data/lib/cl_wiki/version.rb +3 -0
  38. data/test/dummy/README.rdoc +259 -0
  39. data/test/dummy/Rakefile +6 -0
  40. data/test/dummy/app/assets/javascripts/application.js +16 -0
  41. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  42. data/test/dummy/app/controllers/application_controller.rb +5 -0
  43. data/test/dummy/app/helpers/application_helper.rb +2 -0
  44. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  45. data/test/dummy/config.ru +4 -0
  46. data/test/dummy/config/application.rb +37 -0
  47. data/test/dummy/config/boot.rb +9 -0
  48. data/test/dummy/config/database.yml +25 -0
  49. data/test/dummy/config/environment.rb +5 -0
  50. data/test/dummy/config/environments/development.rb +34 -0
  51. data/test/dummy/config/environments/production.rb +81 -0
  52. data/test/dummy/config/environments/test.rb +36 -0
  53. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  54. data/test/dummy/config/initializers/inflections.rb +16 -0
  55. data/test/dummy/config/initializers/locale.rb +7 -0
  56. data/test/dummy/config/initializers/mime_types.rb +5 -0
  57. data/test/dummy/config/initializers/secret_token.rb +12 -0
  58. data/test/dummy/config/initializers/session_store.rb +3 -0
  59. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  60. data/test/dummy/config/locales/en.yml +23 -0
  61. data/test/dummy/config/routes.rb +5 -0
  62. data/test/dummy/db/development.sqlite3 +0 -0
  63. data/test/dummy/log/development.log +1963 -0
  64. data/test/dummy/log/test.log +1340 -0
  65. data/test/dummy/public/404.html +27 -0
  66. data/test/dummy/public/422.html +26 -0
  67. data/test/dummy/public/500.html +26 -0
  68. data/test/dummy/public/favicon.ico +0 -0
  69. data/test/dummy/script/rails +6 -0
  70. data/test/dummy/tmp/cache/assets/development/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
  71. data/test/dummy/tmp/cache/assets/development/sprockets/17ea26cbf693e610505bdc24be534847 +0 -0
  72. data/test/dummy/tmp/cache/assets/development/sprockets/1883f3d938430da389005555d27c0bad +0 -0
  73. data/test/dummy/tmp/cache/assets/development/sprockets/1b9132b83b822937e80ef987f7da1760 +0 -0
  74. data/test/dummy/tmp/cache/assets/development/sprockets/259fb44b87b29348087957b4937a1953 +0 -0
  75. data/test/dummy/tmp/cache/assets/development/sprockets/37f8e4f0491b6401433af823dfb471d9 +0 -0
  76. data/test/dummy/tmp/cache/assets/development/sprockets/48d7a2c40083020f9e7d97d4d73f26fa +0 -0
  77. data/test/dummy/tmp/cache/assets/development/sprockets/4b0bfb6eb9d6983eb9defa58dd96dae4 +0 -0
  78. data/test/dummy/tmp/cache/assets/development/sprockets/4da11f1195532cd7b80f2dde7cf843d5 +0 -0
  79. data/test/dummy/tmp/cache/assets/development/sprockets/57347ee373d74c87e1515a059c701085 +0 -0
  80. data/test/dummy/tmp/cache/assets/development/sprockets/61b40e54192bf61d97ce2aef71e7d694 +0 -0
  81. data/test/dummy/tmp/cache/assets/development/sprockets/633b01c5a65fcd6457baf30d1cc94148 +0 -0
  82. data/test/dummy/tmp/cache/assets/development/sprockets/6ad8bb345cc43acfca78c043b7bfefae +0 -0
  83. data/test/dummy/tmp/cache/assets/development/sprockets/87a335a43cb68a253dea2b6c0269a4d6 +0 -0
  84. data/test/dummy/tmp/cache/assets/development/sprockets/8a38b2f4390e68175dae4b4b1c144e2e +0 -0
  85. data/test/dummy/tmp/cache/assets/development/sprockets/8ddc1a668acec35c2707ebc47768f59c +0 -0
  86. data/test/dummy/tmp/cache/assets/development/sprockets/8f5ab7b6f73a1e9f16421b299134e39a +0 -0
  87. data/test/dummy/tmp/cache/assets/development/sprockets/9835aec4bc0277b8f02d0e86c977fdba +0 -0
  88. data/test/dummy/tmp/cache/assets/development/sprockets/ae4f771558859f9c120a0f22328e8521 +0 -0
  89. data/test/dummy/tmp/cache/assets/development/sprockets/afed0eaa6fcf7a263498a08a5cc02cf0 +0 -0
  90. data/test/dummy/tmp/cache/assets/development/sprockets/be786e5567855cdc6817603725fd1b8d +0 -0
  91. data/test/dummy/tmp/cache/assets/development/sprockets/bf9b02df32690fb2a936818715d611f3 +0 -0
  92. data/test/dummy/tmp/cache/assets/development/sprockets/c2bf9d91a6a2786263b9912b948f435d +0 -0
  93. data/test/dummy/tmp/cache/assets/development/sprockets/ce4c918439a53cb89d02313ed990d5de +0 -0
  94. data/test/dummy/tmp/cache/assets/development/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
  95. data/test/dummy/tmp/cache/assets/development/sprockets/d9c791f08c547f30854ad746a89b0bb5 +0 -0
  96. data/test/dummy/tmp/cache/assets/development/sprockets/ddc3a7b5173ff5c911a53004b56e4305 +0 -0
  97. data/test/dummy/tmp/cache/assets/development/sprockets/dfed1391742203d15f08cb07173bccba +0 -0
  98. data/test/dummy/tmp/cache/assets/development/sprockets/e282b6bdaa0e070754f8558b9de5e417 +0 -0
  99. data/test/dummy/tmp/cache/assets/development/sprockets/f0e957c30443ade693f73ff470f0f894 +0 -0
  100. data/test/dummy/tmp/cache/assets/development/sprockets/f6b3cbb9c04d5af74d780464c9a34ee5 +0 -0
  101. data/test/dummy/tmp/cache/assets/development/sprockets/fb41fedee86fd2d10ddd938bf5d68eb7 +0 -0
  102. data/test/dummy/tmp/cache/assets/test/sprockets/1883f3d938430da389005555d27c0bad +0 -0
  103. data/test/dummy/tmp/cache/assets/test/sprockets/48d7a2c40083020f9e7d97d4d73f26fa +0 -0
  104. data/test/dummy/tmp/cache/assets/test/sprockets/61b40e54192bf61d97ce2aef71e7d694 +0 -0
  105. data/test/dummy/tmp/cache/assets/test/sprockets/8f5ab7b6f73a1e9f16421b299134e39a +0 -0
  106. data/test/dummy/tmp/cache/assets/test/sprockets/9835aec4bc0277b8f02d0e86c977fdba +0 -0
  107. data/test/dummy/tmp/cache/assets/test/sprockets/ae4f771558859f9c120a0f22328e8521 +0 -0
  108. data/test/dummy/tmp/cache/assets/test/sprockets/be786e5567855cdc6817603725fd1b8d +0 -0
  109. data/test/dummy/tmp/cache/assets/test/sprockets/c2bf9d91a6a2786263b9912b948f435d +0 -0
  110. data/test/dummy/tmp/cache/assets/test/sprockets/ce4c918439a53cb89d02313ed990d5de +0 -0
  111. data/test/dummy/tmp/cache/assets/test/sprockets/e282b6bdaa0e070754f8558b9de5e417 +0 -0
  112. data/test/dummy/tmp/cache/assets/test/sprockets/f0e957c30443ade693f73ff470f0f894 +0 -0
  113. data/test/dummy/tmp/cache/assets/test/sprockets/f6b3cbb9c04d5af74d780464c9a34ee5 +0 -0
  114. data/test/dummy/tmp/testrep/FooBar.txt +1 -0
  115. data/test/dummy/tmp/testrep/FrontPage.txt +1 -0
  116. data/test/dummy/tmp/testrep/QuuxBaz.txt +1 -0
  117. data/test/dummy/wikirep/AboutClWiki.txt +31 -0
  118. data/test/dummy/wikirep/ChrisMorris.txt +4 -0
  119. data/test/dummy/wikirep/DotTest.txt +6 -0
  120. data/test/dummy/wikirep/FooBar.txt +4 -0
  121. data/test/dummy/wikirep/FooBarQuux.txt +4 -0
  122. data/test/dummy/wikirep/FrontPage.txt +14 -0
  123. data/test/dummy/wikirep/HtmlAreaTest.txt +4 -0
  124. data/test/dummy/wikirep/PreTagsTest.txt +27 -0
  125. data/test/dummy/wikirep/TheMan.txt +4 -0
  126. data/test/helpers/wiki_helper_test.rb +4 -0
  127. data/test/lib/clwiki/clwiki_test_helper.rb +3 -0
  128. data/test/lib/clwiki/file_test.rb +93 -0
  129. data/test/lib/clwiki/find_in_file_test.rb +111 -0
  130. data/test/lib/clwiki/index_test.rb +32 -0
  131. data/test/lib/clwiki/page_test.rb +239 -0
  132. data/test/lib/clwiki/test_base.rb +25 -0
  133. data/test/test_helper.rb +15 -0
  134. metadata +312 -0
@@ -0,0 +1,27 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The page you were looking for doesn't exist (404)</title>
5
+ <style>
6
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
+ div.dialog {
8
+ width: 25em;
9
+ padding: 0 4em;
10
+ margin: 4em auto 0 auto;
11
+ border: 1px solid #ccc;
12
+ border-right-color: #999;
13
+ border-bottom-color: #999;
14
+ }
15
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <!-- This file lives in public/404.html -->
21
+ <div class="dialog">
22
+ <h1>The page you were looking for doesn't exist.</h1>
23
+ <p>You may have mistyped the address or the page may have moved.</p>
24
+ </div>
25
+ <p>If you are the application owner check the logs for more information.</p>
26
+ </body>
27
+ </html>
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The change you wanted was rejected (422)</title>
5
+ <style>
6
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
+ div.dialog {
8
+ width: 25em;
9
+ padding: 0 4em;
10
+ margin: 4em auto 0 auto;
11
+ border: 1px solid #ccc;
12
+ border-right-color: #999;
13
+ border-bottom-color: #999;
14
+ }
15
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <!-- This file lives in public/422.html -->
21
+ <div class="dialog">
22
+ <h1>The change you wanted was rejected.</h1>
23
+ <p>Maybe you tried to change something you didn't have access to.</p>
24
+ </div>
25
+ </body>
26
+ </html>
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>We're sorry, but something went wrong (500)</title>
5
+ <style>
6
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
+ div.dialog {
8
+ width: 25em;
9
+ padding: 0 4em;
10
+ margin: 4em auto 0 auto;
11
+ border: 1px solid #ccc;
12
+ border-right-color: #999;
13
+ border-bottom-color: #999;
14
+ }
15
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <!-- This file lives in public/500.html -->
21
+ <div class="dialog">
22
+ <h1>We're sorry, but something went wrong.</h1>
23
+ </div>
24
+ <p>If you are the application owner check the logs for more information.</p>
25
+ </body>
26
+ </html>
File without changes
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3
+
4
+ APP_PATH = File.expand_path('../../config/application', __FILE__)
5
+ require File.expand_path('../../config/boot', __FILE__)
6
+ require 'rails/commands'
@@ -0,0 +1 @@
1
+ Describe FooBar here.
@@ -0,0 +1 @@
1
+ Describe FrontPage here.
@@ -0,0 +1 @@
1
+ Describe QuuxBaz here.
@@ -0,0 +1,31 @@
1
+ mtime: 2013-01-20
2
+
3
+
4
+ If you're used to a more popular wiki, you'll probably be longing for some features that I've managed to do without myself.
5
+
6
+ <b>Markup</b> is basic html. Typical wiki things like asterisked lists, indentation, urls being automagically formatted ain't in here.
7
+
8
+ One quirky bit has made it into clWiki, that is the simpletable tag. Look at the source here to see it in action:
9
+
10
+ <blockquote>
11
+ <simpletable>
12
+ ColA Col B Col C
13
+ x y z
14
+ u v w
15
+ </simpletable>
16
+ </blockquote>
17
+
18
+ A row is a single line of text. A column break is a tab character, two or more spaces or a horizontal bar.
19
+
20
+ As of 1.13.5, some new shorthand markup was added.
21
+ []
22
+ [ and ] indicates the start of a blockquote section, and [ and ] with a slash in the middle will indicate the end. (see source of this page)
23
+ [p]
24
+ Add in a 'p' and that will indicate a blockquote/pre section with content auto-escaped. (see source of this page)
25
+ [/p]
26
+ (Obviously, it'd be nice to have a &lt;raw&gt; tag, or somesuch, to allow me to use [ and ] together.)
27
+ [/]
28
+
29
+ <b>WikiLinks</b> are pretty typical, though there's no special syntax for turning a non-camel-cased word into a link. To stop WikiLinks from being rendered, use a NoWikiLinks tag (closing tag to turn linking back on). <NoWikiLinks>FrontPage</NoWikiLinks> won't render, because the tag is turning it off.
30
+
31
+ The legacy CGI version of clWiki supported full hierarchy, but that's no longer supported.
@@ -0,0 +1,4 @@
1
+ mtime: 2013-01-26 23:21:14 -0600
2
+
3
+
4
+ This is me. My nickname is ChrisMo.
@@ -0,0 +1,6 @@
1
+ mtime: 2013-01-26
2
+
3
+
4
+ digraph g {
5
+ a -> b
6
+ }
@@ -0,0 +1,4 @@
1
+ mtime: 2013-01-26 23:22:06 -0600
2
+
3
+
4
+ Describe FooBar here.
@@ -0,0 +1,4 @@
1
+ mtime: 2013-01-26 23:22:14 -0600
2
+
3
+
4
+ Describe FooBarQuux here.
@@ -0,0 +1,14 @@
1
+ mtime: 2013-01-26 23:22:47 -0600
2
+
3
+
4
+ content aabbcc
5
+
6
+ ChrisMorris
7
+
8
+ DotTest
9
+
10
+ PreTagsTest
11
+
12
+ AboutClWiki
13
+
14
+ partial page hit => FooBa
@@ -0,0 +1,4 @@
1
+ mtime: 2013-01-10
2
+
3
+
4
+ Test text here, baby.
@@ -0,0 +1,27 @@
1
+ mtime: 2013-01-10
2
+
3
+
4
+ [p]
5
+ Version 1.13.1 or .2 introduced a change to ClWikiPage.convert_newline_to_br.
6
+ Previously, \n was converted to just <br>, but this left the resulting html
7
+ rather unreadable if you ever viewed the source.
8
+
9
+ This was changed to \n -> <br>\n, but this affected <pre> sections. Now every
10
+ line had <br> and \n and browsers (Mozilla, at least) would render two line
11
+ feeds instead of one.
12
+
13
+ 1.13.3 changed this back and this text here is some testing.
14
+
15
+ Line One
16
+ Line Two
17
+ Line Three
18
+
19
+ This section is also testing the custom ClWiki tags for a blockquote/pre section.
20
+ [/p]
21
+
22
+ <pre>
23
+ This is a pure pre tag section.
24
+
25
+ Line One
26
+ Line Two
27
+ </pre>
@@ -0,0 +1,4 @@
1
+ mtime: 2013-02-15 01:22:19 -0600
2
+
3
+
4
+ see ChrisMorris
@@ -0,0 +1,4 @@
1
+ require 'test_helper'
2
+
3
+ class WikiHelperTest < ActionView::TestCase
4
+ end
@@ -0,0 +1,3 @@
1
+ $LOAD_PATH << File.dirname(__FILE__) + '/../../../lib/cl_wiki'
2
+
3
+ require File.dirname(__FILE__) + '/test_base'
@@ -0,0 +1,93 @@
1
+ require File.dirname(__FILE__) + '/clwiki_test_helper'
2
+ require 'file'
3
+ require File.dirname(__FILE__) + '/test_base'
4
+
5
+ class TestClWikiFile < TestBase
6
+ # refactor: shouldn't be dealing with page paths at this level, should be at
7
+ # the ClWikiPage level
8
+ def do_test_new_page(fullPageName)
9
+ fullPageName = ClWiki::Util.convertToNativePath(fullPageName)
10
+ fileName = File.expand_path(File.join(@test_wiki_path, fullPageName)) + '.txt'
11
+ File.delete(fileName) if FileTest.exists?(fileName)
12
+ wikiFile = ClWiki::File.new(fullPageName, @test_wiki_path)
13
+ assert(FileTest.exists?(wikiFile.fullPathAndName))
14
+ pagePath, pageName = File.split(fullPageName)
15
+ assert(wikiFile.name == pageName)
16
+ assert_equal(pagePath, wikiFile.pagePath)
17
+ assert(wikiFile.wikiRootPath == @test_wiki_path)
18
+ assert_equal(fileName, wikiFile.fullPathAndName)
19
+ assert_equal(["Describe " + pageName + " here."], wikiFile.content)
20
+ newWikiFile = ClWiki::File.new(fullPageName, @test_wiki_path)
21
+ assert_equal(["Describe " + pageName + " here."], newWikiFile.content)
22
+ end
23
+
24
+ def test_new_root_page
25
+ do_test_new_page('/NewPage')
26
+ end
27
+
28
+ def test_new_sub_page_forward_slash
29
+ do_test_new_page('/NewPage/NewSubPage')
30
+ end
31
+
32
+ def test_new_sub_page_back_slash
33
+ do_test_new_page("\\NewPage\\NewSubPage")
34
+ end
35
+
36
+ def test_update_page
37
+ wikiFile = ClWiki::File.new("/UpdatePage", @test_wiki_path)
38
+ assert_equal(["Describe UpdatePage here."], wikiFile.content)
39
+
40
+ # this test looks ridiculous, but ClWiki::File actually does a write to disk
41
+ # and re-read from the file behind the scenes here.
42
+ # refactor rename?
43
+ wikiFile.content = "This is new content."
44
+ assert_equal(["This is new content."], wikiFile.content)
45
+ end
46
+
47
+ def test_multi_user_edit
48
+ # this can happen if 2 people load a page, then both edit the page - the last one
49
+ # to submit would stomp the first edit ... unless:
50
+ wiki_file_a = ClWiki::File.new("/UpdatePage", @test_wiki_path)
51
+ wiki_file_b = ClWiki::File.new("/UpdatePage", @test_wiki_path)
52
+ assert_equal(["Describe UpdatePage here."], wiki_file_a.content)
53
+ assert_equal(["Describe UpdatePage here."], wiki_file_b.content)
54
+
55
+ sleep 2.5 # to ensure mtime changes. (lesser time sometimes doesn't work)
56
+ wiki_file_a.content = "This is new A content."
57
+ begin
58
+ wiki_file_b.content = "This is new B content."
59
+ assert(false, "Expected exception did not occur.")
60
+ rescue ClWiki::FileModifiedSinceRead
61
+ # don do anythain, issa wha shoo 'appen
62
+ end
63
+
64
+ wiki_file_b.readFile
65
+ assert_equal(["This is new A content."], wiki_file_b.content)
66
+ end
67
+
68
+ def test_multi_user_edit_dst
69
+ # running into a problem where I can't edit a page that was last edited outside
70
+ # of DST when I'm in DST ... it raises ClWiki::FileModifiedSinceRead
71
+ wiki_file = ClWiki::File.new("/UpdateDstPage", @test_wiki_path)
72
+ def wiki_file.ding_mtime
73
+ @metadata['mtime'] = Time.local(2011, 'jan', 1)
74
+ end
75
+ wiki_file.content = 'New content'
76
+
77
+ wiki_file_read = ClWiki::File.new("/UpdateDstPage", @test_wiki_path)
78
+ def wiki_file_read.ding_mtime
79
+ @metadata['mtime'] = Time.local(2011, 'jun', 1)
80
+ end
81
+ wiki_file_read.content = "This is new A content."
82
+ assert_equal(["This is new A content."], wiki_file_read.content)
83
+ end
84
+
85
+ def test_mtime_metadata
86
+ # the mtime of the file can be optionally stored as meta data at the top of the file
87
+ wiki_file = ClWiki::File.new("/PageWithMetaData", @test_wiki_path)
88
+ file_lines = File.readlines(wiki_file.fullPathAndName)
89
+ assert_match /^mtime: .+$/, file_lines[0]
90
+ assert_equal "\n", file_lines[1]
91
+ assert_equal "\n", file_lines[2]
92
+ end
93
+ end
@@ -0,0 +1,111 @@
1
+ require File.dirname(__FILE__) + '/clwiki_test_helper'
2
+
3
+ require 'rubygems'
4
+ gem 'clutil'
5
+ require 'cl/util/test'
6
+ require 'fileutils'
7
+
8
+ require 'find_in_file'
9
+
10
+ class TestFindInFile < TempDirTest
11
+ def set_temp_dir
12
+ @temp_dir = '/tmp/clwiki'
13
+ @test_wiki_path = @temp_dir
14
+ end
15
+
16
+ def setup
17
+ super
18
+ @find_path = @test_wiki_path
19
+ @find_in_file = ClWiki::FindInFile.new(@find_path)
20
+ end
21
+
22
+ def create_test_file(filename, content)
23
+ File.open(filename, 'w') do |f|
24
+ f.puts(content)
25
+ end
26
+ end
27
+
28
+ def test_initialization
29
+ assert_equal(@find_path, @find_in_file.find_path)
30
+ end
31
+
32
+ def test_simple_find_content
33
+ create_test_file(@test_wiki_path + '/TestA', 'this is only a test')
34
+ assert_equal(1, @find_in_file.find('only'))
35
+ assert_equal(1, @find_in_file.files.length)
36
+ assert_equal('TestA', @find_in_file.files[0])
37
+ end
38
+
39
+ def test_simple_find_filename
40
+ create_test_file(@test_wiki_path + '/TestA', 'this is only a test')
41
+ assert_equal(1, @find_in_file.find('tA'))
42
+ assert_equal(1, @find_in_file.files.length)
43
+ assert_equal('TestA', @find_in_file.files[0])
44
+ end
45
+
46
+ def test_simple_find_content_case_insensitive
47
+ create_test_file(@test_wiki_path + '/TestA', 'this is only a test')
48
+ assert_equal(1, @find_in_file.find('oNly'))
49
+ assert_equal(1, @find_in_file.files.length)
50
+ assert_equal('TestA', @find_in_file.files[0])
51
+ end
52
+
53
+ def test_simple_find_filename_case_insensitive
54
+ create_test_file(@test_wiki_path + '/TestA', 'this is only a test')
55
+ assert_equal(1, @find_in_file.find('Ta'))
56
+ assert_equal(1, @find_in_file.files.length)
57
+ assert_equal('TestA', @find_in_file.files[0])
58
+ end
59
+
60
+ def test_match_in_file_name_and_content
61
+ create_test_file(@test_wiki_path + '/TestA', 'this is only a test')
62
+ assert_equal(1, @find_in_file.find('test'))
63
+ assert_equal(1, @find_in_file.files.length)
64
+ assert_equal('TestA', @find_in_file.files[0])
65
+ end
66
+
67
+ def test_subdir_search
68
+ FileUtils.makedirs(@test_wiki_path + '/subdir')
69
+ create_test_file(@test_wiki_path + '/TestA.txt', 'this is only a test')
70
+ assert_equal(1, @find_in_file.find('test'))
71
+ end
72
+
73
+ def test_title_only_search
74
+ create_test_file(@test_wiki_path + '/TestA', 'this is only a test')
75
+ create_test_file(@test_wiki_path + '/blah', 'this is only a test')
76
+ assert_equal(1, @find_in_file.find('test', ClWiki::FindInFile::FILE_NAME_ONLY))
77
+ assert_equal(1, @find_in_file.files.length)
78
+ assert_equal('TestA', @find_in_file.files[0])
79
+ end
80
+
81
+ def xtest_mini_load_test
82
+ create_test_file(@test_wiki_path + '/TestA', 'this is only a test')
83
+ content = ''
84
+ 1000.times do
85
+ content << 'this is a sample file'
86
+ end
87
+ 100.times do |x|
88
+ create_test_file(@test_wiki_path + '/Test' + x.to_s, content)
89
+ end
90
+ start = Time.now
91
+ assert_equal(1, @find_in_file.find('only'))
92
+ stop = Time.now
93
+ puts "find one file in 101"
94
+ puts stop - start
95
+
96
+ start = Time.now
97
+ assert_equal(100, @find_in_file.find('sample'))
98
+ stop = Time.now
99
+ puts "find 100 file in 101"
100
+ print stop - start
101
+ end
102
+
103
+ def test_recursive
104
+ subdir = File.join(@test_wiki_path, '/subdir')
105
+ FileUtils.makedirs(subdir)
106
+ create_test_file(File.join(subdir, '/TestA.txt'), 'this is only a test')
107
+ assert_equal(1, @find_in_file.find('Ta'))
108
+ assert_equal(1, @find_in_file.files.length)
109
+ assert_equal('subdir/TestA.txt', @find_in_file.files[0])
110
+ end
111
+ end