Soks 0.0.7 → 1.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.
- data/LICENSE.txt +2 -0
- data/README.txt +3 -2
- data/TODO.txt +31 -0
- data/bin/soks-create-wiki.rb +0 -1
- data/lib/authenticators.rb +30 -4
- data/lib/helpers/counter-helpers.rb +132 -0
- data/lib/helpers/default-helpers.rb +170 -169
- data/lib/helpers/mail2wiki-helper.rb +18 -22
- data/lib/helpers/maintenance-helpers.rb +149 -0
- data/lib/helpers/rss2wiki-helper.rb +7 -8
- data/lib/soks-model.rb +82 -54
- data/lib/soks-servlet.rb +126 -108
- data/lib/soks-storage.rb +74 -11
- data/lib/soks-utils.rb +77 -3
- data/lib/soks-view.rb +169 -103
- data/lib/soks.rb +5 -23
- data/templates/default/attachment/newpage.js +4 -13
- data/templates/default/attachment/print_stylesheet.css +2 -7
- data/templates/default/caches/readme.txt +1 -0
- data/templates/default/content/Api%20for%20classes%20to%20modify%20the%20wiki.textile +2 -0
- data/templates/default/content/Author.textile +4 -1
- data/templates/default/content/Automatic%20Summaries.textile +16 -53
- data/templates/default/content/Automatic%20linking%20between%20pages.textile +3 -3
- data/templates/default/content/{bug%3A%20competing%20edits.textile → Bug%3A%20Competing%20edits.textile} +9 -0
- data/templates/default/content/Bug%3A%20Does%20not%20make%20use%20of%20if%2Dmodified%2Dsince%20r.textile +2 -0
- data/templates/default/content/Bug%3A%20E%2Dmail%20addresses%20with%20hyphens%20not%20recognised.textile +17 -0
- data/templates/default/content/Bug%3A%20Email%20adresses%20in%20page%20titles%20cause%20incorrec.textile +3 -0
- data/templates/default/content/Bug%3A%20GEM%20limits%20title%20lengths.textile +3 -1
- data/templates/default/content/Bug%3A%20Memory%20leak.textile +13 -0
- data/templates/default/content/Bug%3A%20Pages%20that%20link%20here%20may%20not%20appear%20on%20r.textile +13 -0
- data/templates/default/content/Bug%3A%20Textile%20mishandles%20paragraphs.textile +4 -0
- data/templates/default/content/Bug%3A%20Unanticipated%20Rollbacks.textile +2 -0
- data/templates/default/content/Bug%3A%20notextile%20does%20not%20prevent%20page%20inserts.textile +2 -0
- data/templates/default/content/Home%20Page.textile +3 -1
- data/templates/default/content/How%20to%20administrate%20this%20wiki.textile +23 -13
- data/templates/default/content/How%20to%20change%20the%20way%20this%20wiki%20looks.textile +3 -1
- data/templates/default/content/How%20to%20export%20a%20site%20from%20this%20wiki.textile +22 -0
- data/templates/default/content/How%20to%20get%20the%20latest%20Soks%20from%20cvs.textile +2 -0
- data/templates/default/content/How%20to%20hack%20soks.textile +2 -0
- data/templates/default/content/How%20to%20import%20a%20site%20from%20instiki.textile +2 -0
- data/templates/default/content/{How%20to%20import%20data%20to%20this%20wiki.textile → How%20to%20import%20data.textile} +3 -7
- data/templates/default/content/How%20to%20install%20Soks.textile +2 -0
- data/templates/default/content/How%20to%20password%20protect%20your%20wiki.textile +21 -11
- data/templates/default/content/How%20to%20report%20a%20bug.textile +2 -1
- data/templates/default/content/How%20to%20upgrade%20soks.textile +22 -0
- data/templates/default/content/How%20to%20use%20the%20keyboard%20shortcuts.textile +2 -2
- data/templates/default/content/How%20to%20use%20this%20wiki.textile +3 -1
- data/templates/default/content/List%20of%20changes.textile +84 -118
- data/templates/default/content/News%3A%20Version%201%2D0%2D0%20released.textile +19 -0
- data/templates/default/content/Pages%20to%20include%20in%20the%20distribution.textile +51 -0
- data/templates/default/content/Per%20Wiki%20Templates.textile +2 -0
- data/templates/default/content/Planned%20Features.textile +30 -9
- data/templates/default/content/README.textile +3 -2
- data/templates/default/content/RSS%20feed.textile +1 -1
- data/templates/default/content/Recent%20changes%20to%20this%20site.textile +283 -0
- data/templates/default/content/SOKS%20features.textile +3 -0
- data/templates/default/content/Site%20Index.textile +202 -0
- data/templates/default/content/Soks%20Licence.textile +2 -0
- data/templates/default/content/Tag%3A%20Include%20this%20page%20in%20the%20distribution.textile +6 -0
- data/templates/default/start.rb +67 -123
- data/templates/default/version.txt +1 -1
- data/templates/default/views/Page_edit.rhtml +7 -7
- data/templates/default/views/{Page_search_results.rhtml → Page_find.rhtml} +9 -3
- data/templates/default/views/Page_linksfromrss.rhtml +24 -0
- data/templates/default/views/Page_listrss.rhtml +46 -0
- data/templates/default/views/Page_meta.rhtml +1 -1
- data/templates/default/views/Page_revision.rhtml +39 -0
- data/templates/default/views/Page_revisions.rhtml +13 -5
- data/templates/default/views/Page_rss.rhtml +8 -8
- data/templates/default/views/Page_view.rhtml +3 -3
- data/templates/default/views/UploadPage_edit.rhtml +8 -8
- data/templates/default/views/frame.rhtml +8 -8
- data/templates/default/views/messages.yaml +1 -0
- data/test/html/2006Mar.html +66 -0
- data/test/html/poignant.html +36 -0
- data/test/html/poignant.textile +36 -0
- data/test/mock-objects.rb +69 -0
- data/test/stress_url_calls.rb +33 -0
- data/test/stress_urls.txt +68 -0
- data/test/test_counter-helper.rb +158 -0
- data/test/test_soks-helper-maintenance.rb +106 -0
- data/test/test_soks-helpers.rb +104 -0
- data/test/test_soks-model.rb +144 -0
- data/test/test_soks-servlet.rb +231 -0
- data/test/test_soks-storage.rb +70 -31
- data/test/test_soks-utils.rb +112 -13
- data/test/test_soks-view.rb +141 -3
- metadata +38 -27
- data/templates/default/content/A%20page%20with%20an%20umlaut%20%F6%20in%20its%20title.textile +0 -1
- data/templates/default/content/All%20News.textile +0 -26
- data/templates/default/content/Bil%20Kleb.textile +0 -1
- data/templates/default/content/Bil.textile +0 -1
- data/templates/default/content/Bill%20Wood.textile +0 -3
- data/templates/default/content/Bug%3A%20RSS%20feed%20does%20not%20validate.textile +0 -10
- data/templates/default/content/Bug%3A%20Type%20a%20title%20here.textile +0 -31
- data/templates/default/content/Instructions%20and%20Howtos.textile +0 -21
- data/templates/default/content/Latest%20News.textile +0 -26
- data/templates/default/content/New%20Recent%20Changes%20class.textile +0 -68
- data/templates/default/content/New%20page%20templates%20or%20categories%20code.textile +0 -68
- data/templates/default/content/News%3A%20Version%200%2E0%2E6%20Released.textile +0 -13
- data/templates/default/content/Recent%20Blog%20Entries.textile +0 -5
- data/templates/default/content/Recent%20Changes%20to%20This%20Site.textile +0 -286
- data/templates/default/content/Ruby.textile +0 -9
- data/templates/default/content/Skorgu.textile +0 -3
- data/templates/default/content/ctrl%2Dn.textile +0 -1
- data/templates/default/content/let%20me%20know.textile +0 -1
- data/templates/default/content/sandbox.textile +0 -20
- data/templates/default/content/tamc.textile +0 -1
- data/templates/default/content/tamc2.textile +0 -1
|
@@ -5,17 +5,17 @@ RSS::Maker.make("2.0") do |maker|
|
|
|
5
5
|
|
|
6
6
|
maker.encoding = 'iso-8859-1'
|
|
7
7
|
|
|
8
|
-
maker.channel.title = "#{
|
|
9
|
-
maker.channel.description =
|
|
10
|
-
maker.channel.link =
|
|
8
|
+
maker.channel.title = "#{name} #{page.name}"
|
|
9
|
+
maker.channel.description = description
|
|
10
|
+
maker.channel.link = root_url
|
|
11
11
|
|
|
12
|
-
maker.image.title =
|
|
13
|
-
maker.image.url = "
|
|
12
|
+
maker.image.title = name
|
|
13
|
+
maker.image.url = file "logo.png"
|
|
14
14
|
|
|
15
15
|
maker.textinput.title = "Search"
|
|
16
|
-
maker.textinput.description = "Search #{
|
|
16
|
+
maker.textinput.description = "Search #{name}'s text"
|
|
17
17
|
maker.textinput.name = "regex"
|
|
18
|
-
maker.textinput.link =
|
|
18
|
+
maker.textinput.link = url('searchpage','find')
|
|
19
19
|
|
|
20
20
|
maker.items.do_sort = true
|
|
21
21
|
|
|
@@ -23,7 +23,7 @@ RSS::Maker.make("2.0") do |maker|
|
|
|
23
23
|
page.revisions.reverse_each do |revision|
|
|
24
24
|
break if (count +=1) == 15
|
|
25
25
|
item = maker.items.new_item
|
|
26
|
-
item.link =
|
|
26
|
+
item.link = url(page.name)
|
|
27
27
|
# Get the first change that makes an addition and use as the title
|
|
28
28
|
title = nil
|
|
29
29
|
revision.changes.each do |group|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
<span class='pagename'><a href='<%= url
|
|
1
|
+
<span class='pagename'><a href='<%= url page.name, "meta" %>'><%= pagename %></a> <%= page.deleted? ? "(Deleted)" : '' %></span>
|
|
2
2
|
|
|
3
3
|
<%= renderedview %>
|
|
4
4
|
|
|
5
5
|
<div class='command'>
|
|
6
|
-
<a href='<%= url
|
|
7
|
-
watch for changes using <a href='<%= url
|
|
6
|
+
<a href='<%= url page.name, "edit" %>' accesskey="E" >Edit this page</a> or
|
|
7
|
+
watch for changes using <a href='<%= url page.name, 'rss' %>'>RSS</a>.
|
|
8
8
|
</div>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<span class='pagename'>
|
|
2
|
-
<a href='<%= url
|
|
2
|
+
<a href='<%= url page.name, "meta" %>'><%= page.name %></a>
|
|
3
3
|
<%= page.deleted? ? "(Deleted)" : '' %>
|
|
4
4
|
</span>
|
|
5
5
|
|
|
@@ -10,15 +10,15 @@
|
|
|
10
10
|
<p>You can put add a link to the file from another page in the wiki by typing its title (e.g. "attached claim form"). To make a picture appear as part of another page write [[ insert picture name ]] (e.g. [[insert picture of a beautiful balloon]]).</p>
|
|
11
11
|
</div>
|
|
12
12
|
|
|
13
|
-
<form class='editpage' action='<%= url
|
|
13
|
+
<form class='editpage' action='<%= url page.name, "upload" %>' method='post' enctype='multipart/form-data' >
|
|
14
14
|
<div id='fileedittitle'>
|
|
15
15
|
Title:
|
|
16
16
|
<% if page.is_a? ImagePage %>
|
|
17
17
|
<input type=hidden name='titleprefix' value='Picture of ' />
|
|
18
|
-
Picture of <input name='newtitle' size = '51' value='<%=
|
|
18
|
+
Picture of <input name='newtitle' size = '51' value='<%= page.name[ 10..-1].strip %>'
|
|
19
19
|
<% else %>
|
|
20
20
|
<input type=hidden name='titleprefix' value='Attached ' />
|
|
21
|
-
Attached <input name='newtitle' size = '52' value='<%=
|
|
21
|
+
Attached <input name='newtitle' size = '52' value='<%= page.name[ 9..-1].strip %>'
|
|
22
22
|
<% end %>
|
|
23
23
|
onBlur="validateTitle( this.value );" onClick="this.value=this.value.replace('Type a title here','')" />
|
|
24
24
|
</div>
|
|
@@ -29,10 +29,10 @@
|
|
|
29
29
|
|
|
30
30
|
Hello <a href='<%= url person %>'><%= person %></a> (Quit browser to log out). Would you like to
|
|
31
31
|
<input name='action' value='Save Changes' type='submit' accesskey="S" /></form>,
|
|
32
|
-
<form class='editpage' method='post' action='<%= url
|
|
32
|
+
<form class='editpage' method='post' action='<%= url page.name %>' >
|
|
33
33
|
<input name='action' value='Cancel Changes' type=submit accesskey="C" />
|
|
34
34
|
</form> or
|
|
35
|
-
<form class='editpage' method='post' action='<%= url
|
|
35
|
+
<form class='editpage' method='post' action='<%= url page.name, 'delete' %>' >
|
|
36
36
|
<input name='action' value='Delete this Page' type='submit' accesskey="D" />
|
|
37
37
|
</form>?
|
|
38
38
|
|
|
@@ -55,9 +55,9 @@
|
|
|
55
55
|
%>
|
|
56
56
|
</div>
|
|
57
57
|
<p>
|
|
58
|
-
<form class='editpage' method=post action='<%= url
|
|
58
|
+
<form class='editpage' method=post action='<%= url page.name, "rollback" %>' >
|
|
59
59
|
<input name='revision' value='<%= page.number-1 %>' type='hidden' />
|
|
60
60
|
<input name='action' value='Undo this change' type='submit' accesskey="U" />
|
|
61
|
-
</form> or <a href='<%= url
|
|
61
|
+
</form> or <a href='<%= url page.name, "revisions" %>' accesskey="A" >Show <b>A</b>ll changes</a>.
|
|
62
62
|
</p>
|
|
63
63
|
<% end %>
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
|
|
2
2
|
<html>
|
|
3
3
|
<head>
|
|
4
|
-
<title><%=
|
|
5
|
-
<meta name='description' content='<%=
|
|
6
|
-
<meta name='keywords' content='Soks, <%=
|
|
4
|
+
<title><%= page.name %></title>
|
|
5
|
+
<meta name='description' content='<%= description %>' />
|
|
6
|
+
<meta name='keywords' content='Soks, <%= name %>' />
|
|
7
7
|
<link href='<%= file 'stylesheet.css' %>' rel='stylesheet' type='text/css' media='screen' />
|
|
8
8
|
<link href='<%= file 'print_stylesheet.css' %>' rel='stylesheet' type='text/css' media='print' />
|
|
9
|
-
<link rel='alternate' type='application/rss+xml' title='RSS' href='<%= url
|
|
9
|
+
<link rel='alternate' type='application/rss+xml' title='RSS' href='<%= url page.name, 'rss' %>' />
|
|
10
10
|
<script src='<%= file 'newpage.js' %>' type='text/javascript'></script>
|
|
11
11
|
</head>
|
|
12
|
-
<body onkeypress='hotkey(event);'>
|
|
12
|
+
<body onkeypress='hotkey(event,"<%= root_url %>/edit/");'>
|
|
13
13
|
|
|
14
14
|
<div id='content'>
|
|
15
15
|
<%= content_of_page %>
|
|
@@ -18,15 +18,15 @@
|
|
|
18
18
|
<div id='menu'>
|
|
19
19
|
|
|
20
20
|
<h1><%= @wikiname %></h1>
|
|
21
|
-
<a href='<%= url
|
|
21
|
+
<a href='<%= url 'Home Page' %>' accesskey='H' >
|
|
22
22
|
<img width='149' src='<%= file 'logo.jpg' %>' alt='<%= @wikiname %>' />
|
|
23
23
|
</a>
|
|
24
24
|
|
|
25
25
|
<h2>Search</h2>
|
|
26
|
-
<form method='get' action='<%= url
|
|
26
|
+
<form method='get' action='<%= url page.name, 'find' %>' >
|
|
27
27
|
<input class='search'
|
|
28
28
|
name='regex'
|
|
29
|
-
value='Enter word & press return'
|
|
29
|
+
value='<%= query['regex'] || "Enter word & press return" %>'
|
|
30
30
|
onfocus="this.value=this.value.replace('Enter word & press return','')"
|
|
31
31
|
size='17' />
|
|
32
32
|
</form>
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
<div class='calendar'>
|
|
2
|
+
|
|
3
|
+
<table>
|
|
4
|
+
<tr>
|
|
5
|
+
<th>Su </th>
|
|
6
|
+
<th>Mo </th>
|
|
7
|
+
<th>Tu </th>
|
|
8
|
+
<th>We </th>
|
|
9
|
+
<th>Th </th>
|
|
10
|
+
<th>Fr </th>
|
|
11
|
+
<th>Sa </th>
|
|
12
|
+
</tr>
|
|
13
|
+
<tr>
|
|
14
|
+
<td> . </td>
|
|
15
|
+
<td> . </td>
|
|
16
|
+
<td> . </td>
|
|
17
|
+
<td> <a href='http://testsite.com/view/2006Mar01' class='missing'>1</a> </td>
|
|
18
|
+
<td> <a href='http://testsite.com/view/2006Mar02' class='missing'>2</a> </td>
|
|
19
|
+
<td> <a href='http://testsite.com/view/2006Mar03' class='missing'>3</a> </td>
|
|
20
|
+
<td> <a href='http://testsite.com/view/2006Mar04' class='missing'>4</a> </td>
|
|
21
|
+
</tr>
|
|
22
|
+
<tr>
|
|
23
|
+
<td> <a href='http://testsite.com/view/2006Mar05' class='missing'>5</a> </td>
|
|
24
|
+
<td> <a href='http://testsite.com/view/2006Mar06' class='missing'>6</a> </td>
|
|
25
|
+
<td> <a href='http://testsite.com/view/2006Mar07' class='missing'>7</a> </td>
|
|
26
|
+
<td> <a href='http://testsite.com/view/2006Mar08' class='missing'>8</a> </td>
|
|
27
|
+
<td> <a href='http://testsite.com/view/2006Mar09' class='missing'>9</a> </td>
|
|
28
|
+
<td> <a href='http://testsite.com/view/2006Mar10' class='missing'>10</a> </td>
|
|
29
|
+
<td> <a href='http://testsite.com/view/2006Mar11' class='missing'>11</a> </td>
|
|
30
|
+
</tr>
|
|
31
|
+
<tr>
|
|
32
|
+
<td> <a href='http://testsite.com/view/2006Mar12' class='missing'>12</a> </td>
|
|
33
|
+
<td> <a href='http://testsite.com/view/2006Mar13' class='missing'>13</a> </td>
|
|
34
|
+
<td> <a href='http://testsite.com/view/2006Mar14' class='missing'>14</a> </td>
|
|
35
|
+
<td> <a href='http://testsite.com/view/2006Mar15' class='missing'>15</a> </td>
|
|
36
|
+
<td> <a href='http://testsite.com/view/2006Mar16' class='missing'>16</a> </td>
|
|
37
|
+
<td> <a href='http://testsite.com/view/2006Mar17' class='missing'>17</a> </td>
|
|
38
|
+
<td> <a href='http://testsite.com/view/2006Mar18' class='missing'>18</a> </td>
|
|
39
|
+
</tr>
|
|
40
|
+
<tr>
|
|
41
|
+
<td> <a href='http://testsite.com/view/2006Mar19' class='missing'>19</a> </td>
|
|
42
|
+
<td> <a href='http://testsite.com/view/2006Mar20' class='missing'>20</a> </td>
|
|
43
|
+
<td> <a href='http://testsite.com/view/2006Mar21' class='missing'>21</a> </td>
|
|
44
|
+
<td> <a href='http://testsite.com/view/2006Mar22' class='missing'>22</a> </td>
|
|
45
|
+
<td> <a href='http://testsite.com/view/2006Mar23' class='missing'>23</a> </td>
|
|
46
|
+
<td> <a href='http://testsite.com/view/2006Mar24' class='missing'>24</a> </td>
|
|
47
|
+
<td> <a href='http://testsite.com/view/2006Mar25' class='missing'>25</a> </td>
|
|
48
|
+
</tr>
|
|
49
|
+
<tr>
|
|
50
|
+
<td> <a href='http://testsite.com/view/2006Mar26' class='missing'>26</a> </td>
|
|
51
|
+
<td> <a href='http://testsite.com/view/2006Mar27' class='missing'>27</a> </td>
|
|
52
|
+
<td> <a href='http://testsite.com/view/2006Mar28' class='missing'>28</a> </td>
|
|
53
|
+
<td> <a href='http://testsite.com/view/2006Mar29' class='missing'>29</a> </td>
|
|
54
|
+
<td> <a href='http://testsite.com/view/2006Mar30' class='missing'>30</a> </td>
|
|
55
|
+
<td> <a href='http://testsite.com/view/2006Mar31' class='missing'>31</a> </td>
|
|
56
|
+
<td> . </td>
|
|
57
|
+
</tr>
|
|
58
|
+
</table>
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
<p><a href='http://testsite.com/view/2006Feb' class='automatic'>2006 Feb</a> <a href='http://testsite.com/view/2006Apr' class='automatic'>2006 Apr</a></p>
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
</div>
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
<h3>False</h3>
|
|
2
|
+
|
|
3
|
+
<p style="float:left"><img src="i/blix-neg.gif" title="Shape of a cat." alt="Shape of a cat." /></p>
|
|
4
|
+
|
|
5
|
+
<p><em>The cat Trady Blix. Frozen in emptiness. Immaculate whiskers rigid. Placid eyes of lake. Tail of warm icicle. Sponsored by a Very Powerful Pause Button.</em></p>
|
|
6
|
+
|
|
7
|
+
<p>The darkness surrounding Blix can be called <strong>negative space</strong>. Hang on to that phrase. Let it suggest that the emptiness has a negative connotation. In a similar way, <code>nil</code> has a slightly sour note that it whistles.</p>
|
|
8
|
+
|
|
9
|
+
<p>Generally speaking, everything in Ruby has a positive charge to it. This spark flows through strings, numbers, regexps, all of it. Only two keywords wear a shady cloak: <code>nil</code> and <code>false</code> draggin us down.</p>
|
|
10
|
+
|
|
11
|
+
<p>You can test that charge with an <code>if</code> keyword. It looks very much like the <code>do</code> blocks we saw in the last chapter, in that both end with an <code>end</code>.</p>
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
<pre>
|
|
15
|
+
if plastic_cup
|
|
16
|
+
print "Plastic cup is on the up 'n' up!"
|
|
17
|
+
end
|
|
18
|
+
</pre>
|
|
19
|
+
<p>If <code>plastic_cup</code> contains either <code>nil</code> or <code>false</code>, you won’t see anything print to the screen. They’re not on the <code>if</code> guest list. So <code>if</code> isn’t going to run any of the code it’s protecting.</p>
|
|
20
|
+
|
|
21
|
+
<p>But <code>nil</code> and <code>false</code> need not walk away in shame. They may be of questionable character, but <code>unless</code> runs a smaller establishment that caters to the bedraggled. The <code>unless</code> keyword has a policy of only allowing those with a negative charge in. Who are: <code>nil</code> and <code>false</code>.</p>
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
<pre>
|
|
25
|
+
unless plastic_cup
|
|
26
|
+
print "Plastic cup is on the down low."
|
|
27
|
+
end
|
|
28
|
+
</pre>
|
|
29
|
+
<p>You can also use <code>if</code> and <code>unless</code> at the end of a single line of code, if that’s all that is being protected.</p>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<pre>
|
|
33
|
+
print "Yeah, plastic cup is up again!" if plastic_cup
|
|
34
|
+
print "Hardly. It's down." unless plastic_cup
|
|
35
|
+
</pre>
|
|
36
|
+
<p>Now that you’ve met <code>false</code>, I’m sure you can see what’s on next.</p>
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
h3. False
|
|
2
|
+
|
|
3
|
+
!<i/blix-neg.gif(Shape of a cat.)!
|
|
4
|
+
|
|
5
|
+
_The cat Trady Blix. Frozen in emptiness. Immaculate whiskers rigid. Placid eyes of lake. Tail of warm icicle. Sponsored by a Very Powerful Pause Button._
|
|
6
|
+
|
|
7
|
+
The darkness surrounding Blix can be called *negative space*. Hang on to that phrase. Let it suggest that the emptiness has a negative connotation. In a similar way, @nil@ has a slightly sour note that it whistles.
|
|
8
|
+
|
|
9
|
+
Generally speaking, everything in Ruby has a positive charge to it. This spark flows through strings, numbers, regexps, all of it. Only two keywords wear a shady cloak: @nil@ and @false@ draggin us down.
|
|
10
|
+
|
|
11
|
+
You can test that charge with an @if@ keyword. It looks very much like the @do@ blocks we saw in the last chapter, in that both end with an @end@.
|
|
12
|
+
|
|
13
|
+
<pre>
|
|
14
|
+
if plastic_cup
|
|
15
|
+
print "Plastic cup is on the up 'n' up!"
|
|
16
|
+
end
|
|
17
|
+
</pre>
|
|
18
|
+
|
|
19
|
+
If @plastic_cup@ contains either @nil@ or @false@, you won't see anything print to the screen. They're not on the @if@ guest list. So @if@ isn't going to run any of the code it's protecting.
|
|
20
|
+
|
|
21
|
+
But @nil@ and @false@ need not walk away in shame. They may be of questionable character, but @unless@ runs a smaller establishment that caters to the bedraggled. The @unless@ keyword has a policy of only allowing those with a negative charge in. Who are: @nil@ and @false@.
|
|
22
|
+
|
|
23
|
+
<pre>
|
|
24
|
+
unless plastic_cup
|
|
25
|
+
print "Plastic cup is on the down low."
|
|
26
|
+
end
|
|
27
|
+
</pre>
|
|
28
|
+
|
|
29
|
+
You can also use @if@ and @unless@ at the end of a single line of code, if that's all that is being protected.
|
|
30
|
+
|
|
31
|
+
<pre>
|
|
32
|
+
print "Yeah, plastic cup is up again!" if plastic_cup
|
|
33
|
+
print "Hardly. It's down." unless plastic_cup
|
|
34
|
+
</pre>
|
|
35
|
+
|
|
36
|
+
Now that you've met @false@, I'm sure you can see what's on next.
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
$:.unshift( "contrib" )
|
|
2
|
+
|
|
3
|
+
require 'yaml'
|
|
4
|
+
$MESSAGES = YAML.load( IO.readlines("templates/default/views/messages.yaml").join )
|
|
5
|
+
|
|
6
|
+
require 'logger'
|
|
7
|
+
$LOG = Logger.new(STDOUT)
|
|
8
|
+
$LOG.level = Logger::WARN
|
|
9
|
+
|
|
10
|
+
begin
|
|
11
|
+
require 'rubygems'
|
|
12
|
+
require_gem 'ruby-breakpoint'
|
|
13
|
+
rescue LoadError
|
|
14
|
+
$LOG.info "Breakpoint library not found. Shouldn't matter"
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
require 'fileutils'
|
|
18
|
+
require 'soks'
|
|
19
|
+
|
|
20
|
+
class MockWikiStore
|
|
21
|
+
include WikiFlatFileStore
|
|
22
|
+
|
|
23
|
+
def initialize( folder )
|
|
24
|
+
@folder = folder
|
|
25
|
+
@pages = {}
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def mutate( pagename )
|
|
29
|
+
p yield( @pages[pagename.downcase] ||= Page.new( pagename ) )
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
module TearDownableWiki
|
|
34
|
+
include FileUtils
|
|
35
|
+
|
|
36
|
+
def setup
|
|
37
|
+
@wiki = Wiki.new( folder )
|
|
38
|
+
@view = View.new( @wiki, 'http://testsite.com','testcontent/views' )
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def teardown
|
|
42
|
+
rmtree( folder )
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
private
|
|
46
|
+
|
|
47
|
+
def create_file( name, content )
|
|
48
|
+
File.open( File.join( folder, name ), 'w') { |f| f.puts content }
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def files
|
|
52
|
+
Dir.entries( folder ).delete_if { |name| name =~ /^(\.+|attachment|views)$/ }.sort
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def folder
|
|
56
|
+
@folder ||= make_folder
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def make_folder
|
|
60
|
+
mkdir( 'testcontent' )
|
|
61
|
+
mkdir('testcontent/attachment')
|
|
62
|
+
File.symlink(File.join(Dir.getwd,'templates/default/views'),'testcontent/views')
|
|
63
|
+
'testcontent'
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def wait_for_queue_to_empty
|
|
67
|
+
sleep(0.1) until @wiki.event_queue.empty?
|
|
68
|
+
end
|
|
69
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
require 'open-uri'
|
|
2
|
+
urls = IO.readlines(ARGV[0])
|
|
3
|
+
end_time = Time.now + (ARGV[1] || 60).to_i
|
|
4
|
+
threads = (ARGV[2] || 10).to_i
|
|
5
|
+
sleep_time = 0.1
|
|
6
|
+
|
|
7
|
+
def time
|
|
8
|
+
start = Time.now
|
|
9
|
+
yield
|
|
10
|
+
Time.now - start
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
threads.times do |i|
|
|
14
|
+
Thread.new(i) do |i|
|
|
15
|
+
total_elapsed = 0.0
|
|
16
|
+
count = 0
|
|
17
|
+
while Time.now < end_time
|
|
18
|
+
url = urls[rand(urls.size)]
|
|
19
|
+
elapsed = time do
|
|
20
|
+
open( url ) do |f|
|
|
21
|
+
f.each_line {|line| } # ignore contents
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
total_elapsed += elapsed
|
|
25
|
+
count += 1
|
|
26
|
+
p "#{i}: #{elapsed}"
|
|
27
|
+
sleep sleep_time
|
|
28
|
+
end
|
|
29
|
+
p "#{i}: Average #{1.0/(total_elapsed/count)} req/s"
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
sleep( (end_time - Time.now)+5 )
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
http://localhost:8000/view/2005%20Aug
|
|
2
|
+
http://localhost:8000/view/2005%20Dec
|
|
3
|
+
http://localhost:8000/view/2005%20Jul
|
|
4
|
+
http://localhost:8000/view/2005%20Jun
|
|
5
|
+
http://localhost:8000/view/2005%20May
|
|
6
|
+
http://localhost:8000/view/2005%20Nov
|
|
7
|
+
http://localhost:8000/view/2005%20Oct
|
|
8
|
+
http://localhost:8000/view/2005%20Sep
|
|
9
|
+
http://localhost:8000/view/2006%20Apr
|
|
10
|
+
http://localhost:8000/view/2006%20Feb
|
|
11
|
+
http://localhost:8000/view/2006%20Jan
|
|
12
|
+
http://localhost:8000/view/2006%20Mar
|
|
13
|
+
http://localhost:8000/view/2006%20May
|
|
14
|
+
http://localhost:8000/view/Picture%20of%20a%20pair%20of%20soks
|
|
15
|
+
http://localhost:8000/view/All%20News
|
|
16
|
+
http://localhost:8000/view/Api%20for%20classes%20to%20modify%20the%20wiki
|
|
17
|
+
http://localhost:8000/view/Author
|
|
18
|
+
http://localhost:8000/view/Automatic%20linking%20between%20pages
|
|
19
|
+
http://localhost:8000/view/Automatic%20Summaries
|
|
20
|
+
http://localhost:8000/view/Bil
|
|
21
|
+
http://localhost:8000/view/Bil%20Kleb
|
|
22
|
+
http://localhost:8000/view/Bill%20Wood
|
|
23
|
+
http://localhost:8000/view/bug:%20competing%20edits
|
|
24
|
+
http://localhost:8000/view/Bug:%20Does%20not%20make%20use%20of%20if-modified-since%20r
|
|
25
|
+
http://localhost:8000/view/Bug:%20GEM%20limits%20title%20lengths
|
|
26
|
+
http://localhost:8000/view/Bug:%20notextile%20does%20not%20prevent%20page%20inserts
|
|
27
|
+
http://localhost:8000/view/Bug:%20RSS%20feed%20does%20not%20validate
|
|
28
|
+
http://localhost:8000/view/Bug:%20Textile%20mishandles%20paragraphs
|
|
29
|
+
http://localhost:8000/view/Bug:%20Type%20a%20title%20here
|
|
30
|
+
http://localhost:8000/view/Bug:%20Unanticipated%20Rollbacks
|
|
31
|
+
http://localhost:8000/view/ctrl-n
|
|
32
|
+
http://localhost:8000/view/Home%20Page
|
|
33
|
+
http://localhost:8000/view/How%20to%20administrate%20this%20wiki
|
|
34
|
+
http://localhost:8000/view/How%20to%20change%20the%20way%20this%20wiki%20looks
|
|
35
|
+
http://localhost:8000/view/How%20to%20export%20a%20site%20from%20this%20wiki
|
|
36
|
+
http://localhost:8000/view/How%20to%20get%20the%20latest%20Soks%20from%20cvs
|
|
37
|
+
http://localhost:8000/view/How%20to%20hack%20soks
|
|
38
|
+
http://localhost:8000/view/How%20to%20import%20a%20site%20from%20instiki
|
|
39
|
+
http://localhost:8000/view/How%20to%20import%20data%20to%20this%20wiki
|
|
40
|
+
http://localhost:8000/view/How%20to%20install%20Soks
|
|
41
|
+
http://localhost:8000/view/How%20to%20password%20protect%20your%20wiki
|
|
42
|
+
http://localhost:8000/view/How%20to%20report%20a%20bug
|
|
43
|
+
http://localhost:8000/view/How%20to%20use%20the%20keyboard%20shortcuts
|
|
44
|
+
http://localhost:8000/view/How%20to%20use%20this%20wiki
|
|
45
|
+
http://localhost:8000/view/Instructions%20and%20Howtos
|
|
46
|
+
http://localhost:8000/view/Known%20bugs
|
|
47
|
+
http://localhost:8000/view/Latest%20News
|
|
48
|
+
http://localhost:8000/view/let%20me%20know
|
|
49
|
+
http://localhost:8000/view/List%20of%20changes
|
|
50
|
+
http://localhost:8000/view/New%20page%20templates%20or%20categories%20code
|
|
51
|
+
http://localhost:8000/view/New%20Recent%20Changes%20class
|
|
52
|
+
http://localhost:8000/view/News:%20Version%200.0.6%20Released
|
|
53
|
+
http://localhost:8000/view/Per%20Wiki%20Templates
|
|
54
|
+
http://localhost:8000/view/Planned%20Features
|
|
55
|
+
http://localhost:8000/view/Popular%20Pages
|
|
56
|
+
http://localhost:8000/view/Prolific%20Viewers
|
|
57
|
+
http://localhost:8000/view/README
|
|
58
|
+
http://localhost:8000/view/Recent%20Blog%20Entries
|
|
59
|
+
http://localhost:8000/view/Recent%20changes%20to%20this%20site
|
|
60
|
+
http://localhost:8000/view/RSS%20feed
|
|
61
|
+
http://localhost:8000/view/Ruby
|
|
62
|
+
http://localhost:8000/view/sandbox
|
|
63
|
+
http://localhost:8000/view/Sidebar%20Page
|
|
64
|
+
http://localhost:8000/view/Skorgu
|
|
65
|
+
http://localhost:8000/view/SOKS%20features
|
|
66
|
+
http://localhost:8000/view/Soks%20Licence
|
|
67
|
+
http://localhost:8000/view/tamc
|
|
68
|
+
http://localhost:8000/view/tamc2
|