mongowiki 1.0.0.pre → 1.0.0.pre1
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/.travis.yml +6 -0
- data/Gemfile.lock +31 -21
- data/README.md +14 -14
- data/Rakefile +10 -0
- data/TODO.md +16 -0
- data/lib/assets/stylesheets/articles.css +26 -2
- data/lib/assets/stylesheets/diff.css +67 -0
- data/lib/mongowiki.rb +16 -4
- data/lib/mongowiki/app.rb +12 -9
- data/lib/mongowiki/articles.rb +27 -8
- data/lib/mongowiki/helpers/markdown_helper.rb +14 -2
- data/lib/mongowiki/helpers/message_helper.rb +6 -2
- data/lib/mongowiki/models/article.rb +32 -4
- data/lib/mongowiki/search.rb +6 -1
- data/lib/mongowiki/version.rb +3 -1
- data/lib/views/article/diff.erb +13 -0
- data/lib/views/article/form.erb +0 -5
- data/lib/views/article/show.erb +8 -0
- data/lib/views/article/version.erb +5 -0
- data/mongowiki.gemspec +18 -17
- data/test/mock/base.rb +16 -0
- data/test/mock/search.rb +5 -0
- data/test/mongodb.yml +2 -0
- data/test/spec/article_spec.rb +24 -0
- data/test/spec/rack/search_spec.rb +21 -0
- data/test/spec_helper.rb +40 -0
- metadata +101 -25
- data/lib/assets/javascripts/jquery.preventTab.js +0 -13
- data/test/test_helper.rb +0 -7
- data/test/unit/application_test.rb +0 -22
data/.travis.yml
ADDED
data/Gemfile.lock
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
mongowiki (0.
|
4
|
+
mongowiki (1.0.0.pre)
|
5
5
|
activesupport (~> 3.2.0)
|
6
6
|
bson_ext (~> 1.5)
|
7
7
|
coderay (~> 1.0.6)
|
8
|
+
diffy (~> 2.0.7)
|
8
9
|
mongoid (~> 2.4)
|
9
10
|
mongoid_search (~> 0.2.7)
|
10
11
|
rabl (~> 0.6.10)
|
@@ -22,36 +23,41 @@ PATH
|
|
22
23
|
GEM
|
23
24
|
remote: http://rubygems.org/
|
24
25
|
specs:
|
25
|
-
activemodel (3.2.
|
26
|
-
activesupport (= 3.2.
|
26
|
+
activemodel (3.2.6)
|
27
|
+
activesupport (= 3.2.6)
|
27
28
|
builder (~> 3.0.0)
|
28
|
-
activesupport (3.2.
|
29
|
+
activesupport (3.2.6)
|
29
30
|
i18n (~> 0.6)
|
30
31
|
multi_json (~> 1.0)
|
31
|
-
backports (2.
|
32
|
-
bson (1.6.
|
33
|
-
bson_ext (1.6.
|
34
|
-
bson (~> 1.6.
|
32
|
+
backports (2.6.1)
|
33
|
+
bson (1.6.4)
|
34
|
+
bson_ext (1.6.4)
|
35
|
+
bson (~> 1.6.4)
|
35
36
|
builder (3.0.0)
|
36
|
-
coderay (1.0.
|
37
|
+
coderay (1.0.7)
|
38
|
+
database_cleaner (0.6.7)
|
39
|
+
diffy (2.0.7)
|
37
40
|
eventmachine (0.12.10)
|
38
41
|
fast-stemmer (1.0.1)
|
39
42
|
hike (1.2.1)
|
40
43
|
i18n (0.6.0)
|
41
44
|
kgio (2.7.4)
|
42
|
-
minitest (2.
|
45
|
+
minitest (2.12.1)
|
43
46
|
mongo (1.6.2)
|
44
47
|
bson (~> 1.6.2)
|
45
|
-
mongoid (2.4.
|
48
|
+
mongoid (2.4.11)
|
46
49
|
activemodel (~> 3.1)
|
47
|
-
mongo (
|
50
|
+
mongo (<= 1.6.2)
|
48
51
|
tzinfo (~> 0.3.22)
|
52
|
+
mongoid-minitest (0.0.3.1)
|
53
|
+
minitest (~> 2.12.0)
|
54
|
+
mongoid (~> 2.4.7)
|
49
55
|
mongoid_search (0.2.7)
|
50
56
|
bson_ext (>= 1.2)
|
51
57
|
fast-stemmer (~> 1.0.0)
|
52
58
|
mongoid (>= 2.0.0)
|
53
|
-
multi_json (1.3.
|
54
|
-
rabl (0.6.
|
59
|
+
multi_json (1.3.6)
|
60
|
+
rabl (0.6.14)
|
55
61
|
activesupport (>= 2.3.14)
|
56
62
|
multi_json (~> 1.0)
|
57
63
|
rack (1.4.1)
|
@@ -63,9 +69,10 @@ GEM
|
|
63
69
|
rack
|
64
70
|
rack-test (0.6.1)
|
65
71
|
rack (>= 1.0)
|
66
|
-
raindrops (0.
|
72
|
+
raindrops (0.10.0)
|
73
|
+
rake (0.9.2.2)
|
67
74
|
redcarpet (2.1.1)
|
68
|
-
sass (3.1.
|
75
|
+
sass (3.1.20)
|
69
76
|
sinatra (1.3.2)
|
70
77
|
rack (~> 1.3, >= 1.3.6)
|
71
78
|
rack-protection (~> 1.2)
|
@@ -85,19 +92,22 @@ GEM
|
|
85
92
|
sprockets (~> 2.0)
|
86
93
|
tilt (1.3.3)
|
87
94
|
tzinfo (0.3.33)
|
88
|
-
unicorn (4.
|
95
|
+
unicorn (4.3.1)
|
89
96
|
kgio (~> 2.6)
|
90
97
|
rack
|
91
98
|
raindrops (~> 0.7)
|
92
99
|
yajl-ruby (1.1.0)
|
93
|
-
yard (0.
|
100
|
+
yard (0.8.2.1)
|
94
101
|
|
95
102
|
PLATFORMS
|
96
103
|
ruby
|
97
104
|
|
98
105
|
DEPENDENCIES
|
99
|
-
|
106
|
+
database_cleaner
|
107
|
+
minitest
|
108
|
+
mongoid-minitest
|
100
109
|
mongowiki!
|
101
|
-
rack-test
|
110
|
+
rack-test
|
111
|
+
rake
|
102
112
|
unicorn
|
103
|
-
yard
|
113
|
+
yard
|
data/README.md
CHANGED
@@ -1,12 +1,19 @@
|
|
1
|
-
mongowiki
|
2
|
-
=========
|
1
|
+
# mongowiki
|
3
2
|
|
4
|
-
mongowiki is an sinatra-based
|
3
|
+
mongowiki is an sinatra-based wiki application, which persists your articles into an mongodb
|
5
4
|
|
6
|
-
|
7
|
-
|
5
|
+
## Travis CI
|
6
|
+
|
7
|
+
[](http://travis-ci.org/gr4y/mongowiki)
|
8
|
+
|
9
|
+
## Installation
|
10
|
+
### stable release
|
8
11
|
|
9
12
|
$ gem install mongowiki
|
13
|
+
|
14
|
+
### prerelease
|
15
|
+
|
16
|
+
$ gem install mongowiki --pre
|
10
17
|
|
11
18
|
create a *config.ru* file somewhere on your filesystem, which is in my case */var/apps/mongowiki*
|
12
19
|
|
@@ -14,20 +21,13 @@ create a *config.ru* file somewhere on your filesystem, which is in my case */va
|
|
14
21
|
|
15
22
|
require 'mongowiki'
|
16
23
|
run MongoWiki.run!
|
17
|
-
|
18
|
-
depending on how your mongodb server is configured, you need to set the corresponding environment variables.
|
19
|
-
|
20
|
-
Environment variables
|
21
|
-
--------------------
|
22
24
|
|
23
|
-
|
25
|
+
#### Environment variables
|
24
26
|
|
25
27
|
**MONGO_URL**
|
26
28
|
URI to the MongoDB instance. For example: mongodb://username:passwort@server:27017/database
|
27
29
|
|
28
|
-
Contribution
|
29
|
-
------------
|
30
|
-
|
30
|
+
## Contribution
|
31
31
|
### Patches & Pull Requests
|
32
32
|
|
33
33
|
You want to add a feature or you want to patch mongowiki?
|
data/Rakefile
CHANGED
@@ -8,13 +8,23 @@ YARD::Rake::YardocTask.new do |t|
|
|
8
8
|
end
|
9
9
|
|
10
10
|
namespace :test do
|
11
|
+
|
12
|
+
desc "specs"
|
13
|
+
Rake::TestTask.new(:spec) do |task|
|
14
|
+
task.libs << "test"
|
15
|
+
task.test_files = FileList["test/spec/**/*_spec.rb"]
|
16
|
+
end
|
17
|
+
|
18
|
+
desc "unit tests"
|
11
19
|
Rake::TestTask.new(:unit) do |task|
|
12
20
|
task.libs << "test"
|
13
21
|
task.test_files = FileList["test/unit/**/*_test.rb"]
|
14
22
|
end
|
23
|
+
|
15
24
|
end
|
16
25
|
|
17
26
|
task :test do
|
27
|
+
Rake::Task["test:spec"].invoke
|
18
28
|
Rake::Task["test:unit"].invoke
|
19
29
|
end
|
20
30
|
|
data/TODO.md
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# TODOs
|
2
|
+
|
3
|
+
- Tests
|
4
|
+
- Refactoring
|
5
|
+
|
6
|
+
## Features
|
7
|
+
|
8
|
+
- <s>article versioning</s> and locking
|
9
|
+
- implement an export and import mechanism for articles into markdown
|
10
|
+
- add an markdown editor, maybe [pagedown](http://pagedown.googlecode.com/)?
|
11
|
+
|
12
|
+
## Enhancements
|
13
|
+
|
14
|
+
- replace sprockets cause it's just plain annoying to deal with!
|
15
|
+
- migrate from erb to an much more readable template engine. ([slim](http://slim-lang.com) looks very promising)
|
16
|
+
- migrate from sinatra.rb to [happy.rb](https://github.com/hmans/happy)
|
@@ -3,7 +3,9 @@
|
|
3
3
|
}
|
4
4
|
|
5
5
|
.article .text,
|
6
|
-
ul.articles
|
6
|
+
ul.articles,
|
7
|
+
ul.versions,
|
8
|
+
.diff {
|
7
9
|
padding: 15px;
|
8
10
|
margin: 5px 0;
|
9
11
|
font-family: "Helvetica Neue", Helvetica, serif;
|
@@ -50,4 +52,26 @@ ul.articles li.article {
|
|
50
52
|
|
51
53
|
ul.articles li.article a {
|
52
54
|
color: #000;
|
53
|
-
}
|
55
|
+
}
|
56
|
+
|
57
|
+
ul.versions li.version a {
|
58
|
+
text-decoration: none;
|
59
|
+
color: #000;
|
60
|
+
}
|
61
|
+
|
62
|
+
ul.versions li.version.current {
|
63
|
+
color: #0080FF;
|
64
|
+
}
|
65
|
+
|
66
|
+
.compare .current-link::before {
|
67
|
+
content: '<=';
|
68
|
+
color: #666;
|
69
|
+
}
|
70
|
+
|
71
|
+
.compare .current-link {
|
72
|
+
margin-top: 10px;
|
73
|
+
display: inline-block;
|
74
|
+
color: black;
|
75
|
+
text-decoration: none;
|
76
|
+
}
|
77
|
+
|
@@ -0,0 +1,67 @@
|
|
1
|
+
.diff {
|
2
|
+
overflow: auto;
|
3
|
+
}
|
4
|
+
|
5
|
+
.diff ul {
|
6
|
+
background: #fff;
|
7
|
+
overflow: auto;
|
8
|
+
font-size: 14px;
|
9
|
+
list-style: none;
|
10
|
+
display: table;
|
11
|
+
width: 100%;
|
12
|
+
}
|
13
|
+
|
14
|
+
.diff del, .diff ins {
|
15
|
+
display: block;
|
16
|
+
text-decoration: none;
|
17
|
+
}
|
18
|
+
|
19
|
+
.diff del .symbol, .diff ins .symbol {
|
20
|
+
color: #666;
|
21
|
+
display: inline-block;
|
22
|
+
margin-right: 10px;
|
23
|
+
}
|
24
|
+
|
25
|
+
.diff li {
|
26
|
+
position: relative;
|
27
|
+
padding: 5px;
|
28
|
+
display: table-row;
|
29
|
+
height: 1em;
|
30
|
+
}
|
31
|
+
|
32
|
+
.diff li.ins {
|
33
|
+
background: #dfd;
|
34
|
+
color: #080;
|
35
|
+
}
|
36
|
+
|
37
|
+
.diff li.del {
|
38
|
+
background: #fee;
|
39
|
+
color: #b00;
|
40
|
+
}
|
41
|
+
|
42
|
+
.diff li:hover {
|
43
|
+
background:#ffc
|
44
|
+
}
|
45
|
+
|
46
|
+
.diff del, .diff ins, .diff span {
|
47
|
+
white-space: pre-wrap;
|
48
|
+
font-family: monospace;
|
49
|
+
}
|
50
|
+
|
51
|
+
.diff del strong {
|
52
|
+
font-weight:normal;
|
53
|
+
background:#fcc;
|
54
|
+
}
|
55
|
+
|
56
|
+
.diff ins strong {
|
57
|
+
font-weight:normal;
|
58
|
+
background:#9f9;
|
59
|
+
}
|
60
|
+
|
61
|
+
.diff li.diff-comment {
|
62
|
+
display: none;
|
63
|
+
}
|
64
|
+
|
65
|
+
.diff li.diff-block-info {
|
66
|
+
background: none repeat scroll 0 0 gray;
|
67
|
+
}
|
data/lib/mongowiki.rb
CHANGED
@@ -11,6 +11,7 @@ require 'sprockets'
|
|
11
11
|
require 'sprockets-helpers'
|
12
12
|
require 'redcarpet'
|
13
13
|
require 'coderay'
|
14
|
+
require 'diffy'
|
14
15
|
|
15
16
|
require 'mongowiki/models/article'
|
16
17
|
require 'mongowiki/helpers'
|
@@ -18,17 +19,27 @@ require 'mongowiki/articles'
|
|
18
19
|
require 'mongowiki/search'
|
19
20
|
require 'mongowiki/app'
|
20
21
|
|
22
|
+
Mongoid.logger.level = 3
|
23
|
+
|
21
24
|
module MongoWiki
|
22
|
-
|
23
|
-
class << self
|
24
25
|
|
26
|
+
#
|
27
|
+
# the application
|
28
|
+
#
|
29
|
+
# usage:
|
30
|
+
#
|
31
|
+
# MongoWiki.run!
|
32
|
+
class << self
|
33
|
+
|
25
34
|
attr_reader :mongo_uri
|
26
35
|
|
36
|
+
# set mongo_uri
|
27
37
|
def mongo_uri=(uri)
|
28
38
|
Mongoid::Config.from_hash("uri" => uri)
|
29
39
|
@@mongo_uri = uri
|
30
40
|
end
|
31
|
-
|
41
|
+
|
42
|
+
# init application
|
32
43
|
def init!
|
33
44
|
if mongo_uri = ENV['MONGO_URL']
|
34
45
|
self.mongo_uri = mongo_uri
|
@@ -36,7 +47,8 @@ module MongoWiki
|
|
36
47
|
raise "environment variable MONGO_URL is not set!"
|
37
48
|
end
|
38
49
|
end
|
39
|
-
|
50
|
+
|
51
|
+
# run application
|
40
52
|
def run!
|
41
53
|
init!
|
42
54
|
MongoWiki::App.run!
|
data/lib/mongowiki/app.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
module MongoWiki
|
2
|
+
|
3
|
+
# :nodoc:
|
2
4
|
class App < Sinatra::Base
|
3
5
|
|
4
6
|
# set paths
|
@@ -8,8 +10,7 @@ module MongoWiki
|
|
8
10
|
|
9
11
|
# sinatra
|
10
12
|
set :show_exceptions, true
|
11
|
-
|
12
|
-
|
13
|
+
|
13
14
|
# sprockets
|
14
15
|
set :sprockets, Sprockets::Environment.new(root)
|
15
16
|
set :assets_prefix, '/'
|
@@ -22,10 +23,6 @@ module MongoWiki
|
|
22
23
|
sprockets.append_path File.join(assets_path, "stylesheets")
|
23
24
|
sprockets.append_path File.join(assets_path, "javascripts")
|
24
25
|
sprockets.append_path File.join(assets_path, "images")
|
25
|
-
if logging
|
26
|
-
sprockets.logger = Logger.new($stdout)
|
27
|
-
Mongoid.logger = Logger.new($stdout)
|
28
|
-
end
|
29
26
|
|
30
27
|
# Configure Sprockets::Helpers (if necessary)
|
31
28
|
Sprockets::Helpers.configure do |config|
|
@@ -37,21 +34,27 @@ module MongoWiki
|
|
37
34
|
Rabl.register!
|
38
35
|
|
39
36
|
end
|
40
|
-
|
37
|
+
|
41
38
|
helpers do
|
42
39
|
include Sprockets::Helpers
|
43
40
|
include MongoWiki::Helpers::MessageHelper
|
44
41
|
include MongoWiki::Helpers::MarkdownHelper
|
45
42
|
end
|
46
|
-
|
43
|
+
|
47
44
|
include Rack::Utils
|
48
45
|
include MongoWiki::Articles
|
49
46
|
include MongoWiki::Search
|
50
|
-
|
47
|
+
|
51
48
|
not_found do
|
52
49
|
erb :"404"
|
53
50
|
end
|
54
51
|
|
52
|
+
#
|
53
|
+
# indexing keywords of Article
|
54
|
+
# and creating an Rack::Cascade with sprockets and all includes
|
55
|
+
#
|
56
|
+
# MongoWiki::App.run!
|
57
|
+
#
|
55
58
|
def self.run!
|
56
59
|
Article.index_keywords!
|
57
60
|
Rack::Cascade.new([sprockets, self])
|
data/lib/mongowiki/articles.rb
CHANGED
@@ -1,9 +1,12 @@
|
|
1
|
+
# :nodoc:
|
1
2
|
module MongoWiki
|
3
|
+
|
4
|
+
# ActiveSupport::Concern which includes all the actions for articles
|
2
5
|
module Articles
|
3
6
|
extend ActiveSupport::Concern
|
4
|
-
|
7
|
+
|
5
8
|
included do
|
6
|
-
|
9
|
+
|
7
10
|
get '/' do
|
8
11
|
redirect url("/list")
|
9
12
|
end
|
@@ -17,7 +20,7 @@ module MongoWiki
|
|
17
20
|
erb :error
|
18
21
|
end
|
19
22
|
end
|
20
|
-
|
23
|
+
|
21
24
|
get '/show/:id' do
|
22
25
|
begin
|
23
26
|
@article = Article.find(params[:id])
|
@@ -27,12 +30,28 @@ module MongoWiki
|
|
27
30
|
erb :error
|
28
31
|
end
|
29
32
|
end
|
30
|
-
|
33
|
+
|
34
|
+
get '/show/:id/diff/:aVersion' do
|
35
|
+
begin
|
36
|
+
|
37
|
+
aVersion = params[:aVersion].to_i
|
38
|
+
@article = Article.find(params[:id])
|
39
|
+
|
40
|
+
@title_diff = @article.diff(aVersion, :title)
|
41
|
+
@text_diff = @article.diff(aVersion, :text)
|
42
|
+
erb :'article/diff'
|
43
|
+
|
44
|
+
rescue Mongoid::Errors::DocumentNotFound => e
|
45
|
+
@error = e
|
46
|
+
erb :error
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
31
50
|
get '/new' do
|
32
51
|
@article = Article.new
|
33
52
|
erb :'article/new'
|
34
53
|
end
|
35
|
-
|
54
|
+
|
36
55
|
post '/create' do
|
37
56
|
article = params[:article]
|
38
57
|
@article = Article.create(params[:article])
|
@@ -41,12 +60,12 @@ module MongoWiki
|
|
41
60
|
end
|
42
61
|
redirect url("/show/#{@article._id}")
|
43
62
|
end
|
44
|
-
|
63
|
+
|
45
64
|
get '/edit/:id' do
|
46
65
|
@article = Article.find(params[:id])
|
47
66
|
erb :'article/edit'
|
48
67
|
end
|
49
|
-
|
68
|
+
|
50
69
|
post '/update/:id' do
|
51
70
|
@article = Article.find(params[:id])
|
52
71
|
@article.update_attributes(params[:article])
|
@@ -54,7 +73,7 @@ module MongoWiki
|
|
54
73
|
redirect url("/show/#{@article._id}")
|
55
74
|
end
|
56
75
|
end
|
57
|
-
|
76
|
+
|
58
77
|
get '/destroy/:id' do
|
59
78
|
@article = Article.find(params[:id])
|
60
79
|
if @article.delete
|
@@ -1,18 +1,30 @@
|
|
1
|
-
|
1
|
+
# :nodoc:
|
2
2
|
module MongoWiki
|
3
3
|
|
4
|
+
# custom redcarpet markdown renderer
|
4
5
|
class MarkdownRenderer < Redcarpet::Render::HTML
|
6
|
+
|
7
|
+
# higlight the block of code
|
5
8
|
def block_code(code, language)
|
6
9
|
CodeRay.highlight(code, language)
|
7
10
|
end
|
8
|
-
end
|
9
11
|
|
12
|
+
end
|
13
|
+
|
14
|
+
# :nodoc:
|
10
15
|
module Helpers
|
16
|
+
|
17
|
+
# markdown helper
|
11
18
|
module MarkdownHelper
|
19
|
+
|
20
|
+
# render markdown
|
12
21
|
def markdown(text)
|
13
22
|
markdown = Redcarpet::Markdown.new(MongoWiki::MarkdownRenderer, :fenced_code_blocks => true)
|
14
23
|
markdown.render(text)
|
15
24
|
end
|
25
|
+
|
16
26
|
end
|
27
|
+
|
17
28
|
end
|
29
|
+
|
18
30
|
end
|
@@ -1,16 +1,20 @@
|
|
1
1
|
module MongoWiki
|
2
2
|
|
3
|
+
# :nodoc:
|
3
4
|
module Helpers
|
4
5
|
|
6
|
+
# helper for messages, like flash in rails
|
5
7
|
module MessageHelper
|
6
|
-
|
8
|
+
|
9
|
+
# add an message to the session
|
7
10
|
def message(type, message)
|
8
11
|
if session[:messages].nil?
|
9
12
|
session[:messages] = []
|
10
13
|
end
|
11
14
|
session[:messages] << { :type => type, :text => message }
|
12
15
|
end
|
13
|
-
|
16
|
+
|
17
|
+
# returns an array of all messages
|
14
18
|
def messages
|
15
19
|
if session[:messages].nil?
|
16
20
|
session[:messages] = []
|
@@ -1,15 +1,43 @@
|
|
1
|
+
# mongoid document
|
1
2
|
class Article
|
2
3
|
|
3
4
|
include Mongoid::Document
|
4
|
-
include Mongoid::
|
5
|
+
include Mongoid::Timestamps
|
6
|
+
include Mongoid::Versioning
|
7
|
+
include Mongoid::Search
|
5
8
|
|
9
|
+
# document
|
6
10
|
field :title, :type => String
|
7
11
|
field :text
|
8
|
-
|
12
|
+
|
13
|
+
# search
|
9
14
|
search_in :title, :text
|
10
|
-
|
15
|
+
|
16
|
+
# validations
|
11
17
|
validates_presence_of :title
|
12
18
|
validates_uniqueness_of :title
|
13
19
|
validates_presence_of :text
|
14
|
-
|
20
|
+
|
21
|
+
# returns an Diffy::Diff object of the given field
|
22
|
+
def diff(aVersion, field)
|
23
|
+
version = get_version(aVersion)
|
24
|
+
if !version.nil?
|
25
|
+
Diffy::Diff.new(version[field], self[field], :include_plus_and_minus_in_html => true)
|
26
|
+
else
|
27
|
+
nil
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
def get_version(aVersion)
|
33
|
+
version = nil
|
34
|
+
versions.each do |v|
|
35
|
+
if v.version.eql?(aVersion)
|
36
|
+
version = v
|
37
|
+
break
|
38
|
+
end
|
39
|
+
end
|
40
|
+
version
|
41
|
+
end
|
42
|
+
|
15
43
|
end
|
data/lib/mongowiki/search.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
module MongoWiki
|
2
|
+
|
3
|
+
# ActiveSupport::Concern which does all the search functionality
|
2
4
|
module Search
|
3
5
|
extend ActiveSupport::Concern
|
4
6
|
|
@@ -18,7 +20,8 @@ module MongoWiki
|
|
18
20
|
render :rabl, :'search/articles', :format => params[:format]
|
19
21
|
end
|
20
22
|
end
|
21
|
-
|
23
|
+
|
24
|
+
# search article
|
22
25
|
def search!
|
23
26
|
query = params[:query]
|
24
27
|
@articles = Article.search(query)
|
@@ -26,5 +29,7 @@ module MongoWiki
|
|
26
29
|
end
|
27
30
|
|
28
31
|
end
|
32
|
+
|
29
33
|
end
|
34
|
+
|
30
35
|
end
|
data/lib/mongowiki/version.rb
CHANGED
@@ -0,0 +1,13 @@
|
|
1
|
+
<h2 class="title">diff between latest version and version <%= params[:aVersion] %></h2>
|
2
|
+
|
3
|
+
<section class="compare">
|
4
|
+
|
5
|
+
<h4>article title</h4>
|
6
|
+
<%= @title_diff.to_s(:html) %>
|
7
|
+
|
8
|
+
<h4>article text</h4>
|
9
|
+
<%= @text_diff.to_s(:html) %>
|
10
|
+
|
11
|
+
<a href="/show/<%= @article._id %>" class="button red">back</a>
|
12
|
+
|
13
|
+
</section>
|
data/lib/views/article/form.erb
CHANGED
@@ -9,11 +9,6 @@
|
|
9
9
|
<p>
|
10
10
|
<label for="article[text]">Text: </label>
|
11
11
|
<textarea name="article[text]"><%= @article.text %></textarea>
|
12
|
-
<script type="text/javascript">
|
13
|
-
$(function() {
|
14
|
-
$("textarea").preventTab();
|
15
|
-
});
|
16
|
-
</script>
|
17
12
|
</p>
|
18
13
|
<p>
|
19
14
|
<label for="save"></label>
|
data/lib/views/article/show.erb
CHANGED
@@ -5,6 +5,14 @@
|
|
5
5
|
<div class="text">
|
6
6
|
<%= markdown(@article.text) %>
|
7
7
|
</div>
|
8
|
+
|
9
|
+
<h2>versions</h2>
|
10
|
+
<ul class="versions">
|
11
|
+
<% @article.versions.each do |version| %>
|
12
|
+
<%= erb :'article/version', :locals => { :version => version } %>
|
13
|
+
<% end %>
|
14
|
+
</ul>
|
15
|
+
|
8
16
|
<div class="actions">
|
9
17
|
<a href="<%= url("/edit/#{@article._id}") %>" class="button">edit article</a>
|
10
18
|
<a href="<%= url("/destroy/#{@article._id}") %>" class="button red">destroy article</a>
|
data/mongowiki.gemspec
CHANGED
@@ -7,31 +7,32 @@ Gem::Specification.new do |s|
|
|
7
7
|
s.version = MongoWiki::VERSION
|
8
8
|
s.authors = ["Sascha Wessel"]
|
9
9
|
s.email = ["swessel@gr4yweb.de"]
|
10
|
-
s.homepage = "http://
|
11
|
-
s.summary = %q{mongowiki is an sinatra-based
|
12
|
-
s.description = %q{mongowiki is
|
13
|
-
|
14
|
-
s.rubyforge_project = "mongowiki"
|
15
|
-
|
10
|
+
s.homepage = "http://github.com/gr4y/mongowiki"
|
11
|
+
s.summary = %q{mongowiki is an sinatra-based wiki application, which persists your articles into an mongodb}
|
12
|
+
s.description = %q{mongowiki is an sinatra-based wiki application, which persists your articles into an mongodb}
|
13
|
+
|
16
14
|
s.files = `git ls-files`.split("\n")
|
17
15
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
16
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
17
|
s.require_paths = ["lib"]
|
20
18
|
|
21
19
|
# development dependencies
|
22
|
-
s.add_development_dependency "
|
23
|
-
s.add_development_dependency "
|
24
|
-
s.add_development_dependency "
|
20
|
+
s.add_development_dependency "rake"
|
21
|
+
s.add_development_dependency "rack-test"
|
22
|
+
s.add_development_dependency "minitest"
|
23
|
+
s.add_development_dependency "mongoid-minitest"
|
24
|
+
s.add_development_dependency "yard"
|
25
25
|
s.add_development_dependency "unicorn"
|
26
|
+
s.add_development_dependency "database_cleaner"
|
26
27
|
|
27
28
|
# base dependencies
|
28
|
-
s.add_runtime_dependency
|
29
|
-
s.add_runtime_dependency
|
30
|
-
s.add_runtime_dependency
|
31
|
-
s.add_runtime_dependency
|
32
|
-
s.add_runtime_dependency
|
33
|
-
s.add_runtime_dependency
|
34
|
-
s.add_runtime_dependency
|
29
|
+
s.add_runtime_dependency "rack", "~> 1.4.1"
|
30
|
+
s.add_runtime_dependency "rack-contrib", "~> 1.1.0"
|
31
|
+
s.add_runtime_dependency "rack-cache", "~> 1.1.0"
|
32
|
+
s.add_runtime_dependency "sinatra", "~> 1.3.2"
|
33
|
+
s.add_runtime_dependency "sinatra-contrib", "~> 1.3.1"
|
34
|
+
s.add_runtime_dependency "activesupport", "~> 3.2.0"
|
35
|
+
s.add_runtime_dependency "yajl-ruby", "~> 1.1.0"
|
35
36
|
|
36
37
|
# database
|
37
38
|
s.add_runtime_dependency "mongoid", "~> 2.4"
|
@@ -45,5 +46,5 @@ Gem::Specification.new do |s|
|
|
45
46
|
s.add_runtime_dependency "sprockets-helpers", "~> 0.3.0"
|
46
47
|
s.add_runtime_dependency "sass", "~> 3.1.17"
|
47
48
|
s.add_runtime_dependency "rabl", "~> 0.6.10"
|
48
|
-
|
49
|
+
s.add_runtime_dependency "diffy", "~> 2.0.7"
|
49
50
|
end
|
data/test/mock/base.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
class MockBase < Sinatra::Base
|
2
|
+
|
3
|
+
# has to be set, so the views could be loaded
|
4
|
+
set :root, File.expand_path('../../lib', File.dirname(__FILE__))
|
5
|
+
|
6
|
+
# make sinatra to call the error handler
|
7
|
+
set :raise_errors, Proc.new { true }
|
8
|
+
|
9
|
+
# disable exceptions
|
10
|
+
set :show_exceptions, false
|
11
|
+
|
12
|
+
error do
|
13
|
+
"error: #{request.env['sinatra.error'].to_s}"
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
data/test/mock/search.rb
ADDED
data/test/mongodb.yml
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Article do
|
4
|
+
subject { Article }
|
5
|
+
|
6
|
+
# Mongoid::Matchers::Document
|
7
|
+
it { must be_document }
|
8
|
+
it { must be_timestamped }
|
9
|
+
it { must be_stored_in(:articles) }
|
10
|
+
it { must have_field(:title).of_type(String) }
|
11
|
+
it { must have_field(:text) }
|
12
|
+
|
13
|
+
# Mongoid::Matchers::Validations
|
14
|
+
it { must validate_presence_of(:title) }
|
15
|
+
it { must validate_uniqueness_of(:title) }
|
16
|
+
it { must validate_presence_of(:text) }
|
17
|
+
|
18
|
+
# check if there's a _keywords field, cause of Mongoid::Search
|
19
|
+
it { must have_field(:_keywords) }
|
20
|
+
|
21
|
+
# check if versions are embedded
|
22
|
+
it { must embed_many(:versions) }
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'mock/search'
|
3
|
+
|
4
|
+
def app
|
5
|
+
MockSearch
|
6
|
+
end
|
7
|
+
|
8
|
+
describe "MongoWiki::Search" do
|
9
|
+
|
10
|
+
before :each do
|
11
|
+
Mongoid::Factory.build(Article, { :title => 'Once upon time',
|
12
|
+
:text => [*('A'..'Z')].sample(100).join })
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should return a json string' do
|
16
|
+
get '/search.json', :query => 'time'
|
17
|
+
refute_nil last_response.body
|
18
|
+
refute_equal 'nil', last_response.body
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
data/test/spec_helper.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'rack/test'
|
3
|
+
require 'database_cleaner'
|
4
|
+
require 'mongoid-minitest'
|
5
|
+
require 'mongowiki'
|
6
|
+
require 'yaml'
|
7
|
+
|
8
|
+
ENV['MONGO_URL']='mongodb://localhost/mongowiki_test'
|
9
|
+
|
10
|
+
def mongo_url
|
11
|
+
url = ENV['MONGO_URL']
|
12
|
+
if !url
|
13
|
+
if !::File.exists?('test/mongodb.yml')
|
14
|
+
raise 'MONGO_URL environment variable not set and test/mongodb.yml not found'
|
15
|
+
end
|
16
|
+
yaml = YAML::load_file('test/mongodb.yml')
|
17
|
+
url = yaml['url']
|
18
|
+
end
|
19
|
+
url
|
20
|
+
end
|
21
|
+
|
22
|
+
# set mongo_url
|
23
|
+
Mongoid::Config.from_hash("uri" => mongo_url)
|
24
|
+
|
25
|
+
# setup DatabaseCleaner
|
26
|
+
DatabaseCleaner.strategy = :truncation
|
27
|
+
|
28
|
+
class MiniTest::Spec
|
29
|
+
include Mongoid::Matchers
|
30
|
+
include Rack::Test::Methods
|
31
|
+
|
32
|
+
before :each do
|
33
|
+
DatabaseCleaner.start
|
34
|
+
end
|
35
|
+
|
36
|
+
after :each do
|
37
|
+
DatabaseCleaner.clean
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongowiki
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.
|
4
|
+
version: 1.0.0.pre1
|
5
5
|
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,56 +9,88 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-07-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rake
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
14
30
|
- !ruby/object:Gem::Dependency
|
15
31
|
name: rack-test
|
16
32
|
requirement: !ruby/object:Gem::Requirement
|
17
33
|
none: false
|
18
34
|
requirements:
|
19
|
-
- -
|
35
|
+
- - ! '>='
|
20
36
|
- !ruby/object:Gem::Version
|
21
|
-
version: 0
|
37
|
+
version: '0'
|
22
38
|
type: :development
|
23
39
|
prerelease: false
|
24
40
|
version_requirements: !ruby/object:Gem::Requirement
|
25
41
|
none: false
|
26
42
|
requirements:
|
27
|
-
- -
|
43
|
+
- - ! '>='
|
28
44
|
- !ruby/object:Gem::Version
|
29
|
-
version: 0
|
45
|
+
version: '0'
|
30
46
|
- !ruby/object:Gem::Dependency
|
31
47
|
name: minitest
|
32
48
|
requirement: !ruby/object:Gem::Requirement
|
33
49
|
none: false
|
34
50
|
requirements:
|
35
|
-
- -
|
51
|
+
- - ! '>='
|
36
52
|
- !ruby/object:Gem::Version
|
37
|
-
version:
|
53
|
+
version: '0'
|
38
54
|
type: :development
|
39
55
|
prerelease: false
|
40
56
|
version_requirements: !ruby/object:Gem::Requirement
|
41
57
|
none: false
|
42
58
|
requirements:
|
43
|
-
- -
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: mongoid-minitest
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
44
76
|
- !ruby/object:Gem::Version
|
45
|
-
version:
|
77
|
+
version: '0'
|
46
78
|
- !ruby/object:Gem::Dependency
|
47
79
|
name: yard
|
48
80
|
requirement: !ruby/object:Gem::Requirement
|
49
81
|
none: false
|
50
82
|
requirements:
|
51
|
-
- -
|
83
|
+
- - ! '>='
|
52
84
|
- !ruby/object:Gem::Version
|
53
|
-
version: 0
|
85
|
+
version: '0'
|
54
86
|
type: :development
|
55
87
|
prerelease: false
|
56
88
|
version_requirements: !ruby/object:Gem::Requirement
|
57
89
|
none: false
|
58
90
|
requirements:
|
59
|
-
- -
|
91
|
+
- - ! '>='
|
60
92
|
- !ruby/object:Gem::Version
|
61
|
-
version: 0
|
93
|
+
version: '0'
|
62
94
|
- !ruby/object:Gem::Dependency
|
63
95
|
name: unicorn
|
64
96
|
requirement: !ruby/object:Gem::Requirement
|
@@ -75,6 +107,22 @@ dependencies:
|
|
75
107
|
- - ! '>='
|
76
108
|
- !ruby/object:Gem::Version
|
77
109
|
version: '0'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: database_cleaner
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
78
126
|
- !ruby/object:Gem::Dependency
|
79
127
|
name: rack
|
80
128
|
requirement: !ruby/object:Gem::Requirement
|
@@ -331,8 +379,24 @@ dependencies:
|
|
331
379
|
- - ~>
|
332
380
|
- !ruby/object:Gem::Version
|
333
381
|
version: 0.6.10
|
334
|
-
|
335
|
-
|
382
|
+
- !ruby/object:Gem::Dependency
|
383
|
+
name: diffy
|
384
|
+
requirement: !ruby/object:Gem::Requirement
|
385
|
+
none: false
|
386
|
+
requirements:
|
387
|
+
- - ~>
|
388
|
+
- !ruby/object:Gem::Version
|
389
|
+
version: 2.0.7
|
390
|
+
type: :runtime
|
391
|
+
prerelease: false
|
392
|
+
version_requirements: !ruby/object:Gem::Requirement
|
393
|
+
none: false
|
394
|
+
requirements:
|
395
|
+
- - ~>
|
396
|
+
- !ruby/object:Gem::Version
|
397
|
+
version: 2.0.7
|
398
|
+
description: mongowiki is an sinatra-based wiki application, which persists your articles
|
399
|
+
into an mongodb
|
336
400
|
email:
|
337
401
|
- swessel@gr4yweb.de
|
338
402
|
executables: []
|
@@ -340,17 +404,19 @@ extensions: []
|
|
340
404
|
extra_rdoc_files: []
|
341
405
|
files:
|
342
406
|
- .gitignore
|
407
|
+
- .travis.yml
|
343
408
|
- Gemfile
|
344
409
|
- Gemfile.lock
|
345
410
|
- README.md
|
346
411
|
- Rakefile
|
412
|
+
- TODO.md
|
347
413
|
- lib/assets/javascripts/application.js
|
348
414
|
- lib/assets/javascripts/jquery.autoSearch.js
|
349
|
-
- lib/assets/javascripts/jquery.preventTab.js
|
350
415
|
- lib/assets/stylesheets/application.css
|
351
416
|
- lib/assets/stylesheets/articles.css
|
352
417
|
- lib/assets/stylesheets/buttons.css
|
353
418
|
- lib/assets/stylesheets/coderay.css
|
419
|
+
- lib/assets/stylesheets/diff.css
|
354
420
|
- lib/assets/stylesheets/error.css
|
355
421
|
- lib/assets/stylesheets/forms.css
|
356
422
|
- lib/assets/stylesheets/reset.css
|
@@ -365,19 +431,25 @@ files:
|
|
365
431
|
- lib/mongowiki/search.rb
|
366
432
|
- lib/mongowiki/version.rb
|
367
433
|
- lib/views/404.erb
|
434
|
+
- lib/views/article/diff.erb
|
368
435
|
- lib/views/article/edit.erb
|
369
436
|
- lib/views/article/form.erb
|
370
437
|
- lib/views/article/list.erb
|
371
438
|
- lib/views/article/new.erb
|
372
439
|
- lib/views/article/show.erb
|
440
|
+
- lib/views/article/version.erb
|
373
441
|
- lib/views/error.erb
|
374
442
|
- lib/views/layout.erb
|
375
443
|
- lib/views/search/articles.erb
|
376
444
|
- lib/views/search/articles.rabl
|
377
445
|
- mongowiki.gemspec
|
378
|
-
- test/
|
379
|
-
- test/
|
380
|
-
|
446
|
+
- test/mock/base.rb
|
447
|
+
- test/mock/search.rb
|
448
|
+
- test/mongodb.yml
|
449
|
+
- test/spec/article_spec.rb
|
450
|
+
- test/spec/rack/search_spec.rb
|
451
|
+
- test/spec_helper.rb
|
452
|
+
homepage: http://github.com/gr4y/mongowiki
|
381
453
|
licenses: []
|
382
454
|
post_install_message:
|
383
455
|
rdoc_options: []
|
@@ -396,13 +468,17 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
396
468
|
- !ruby/object:Gem::Version
|
397
469
|
version: 1.3.1
|
398
470
|
requirements: []
|
399
|
-
rubyforge_project:
|
471
|
+
rubyforge_project:
|
400
472
|
rubygems_version: 1.8.24
|
401
473
|
signing_key:
|
402
474
|
specification_version: 3
|
403
|
-
summary: mongowiki is an sinatra-based
|
404
|
-
mongodb
|
475
|
+
summary: mongowiki is an sinatra-based wiki application, which persists your articles
|
476
|
+
into an mongodb
|
405
477
|
test_files:
|
406
|
-
- test/
|
407
|
-
- test/
|
478
|
+
- test/mock/base.rb
|
479
|
+
- test/mock/search.rb
|
480
|
+
- test/mongodb.yml
|
481
|
+
- test/spec/article_spec.rb
|
482
|
+
- test/spec/rack/search_spec.rb
|
483
|
+
- test/spec_helper.rb
|
408
484
|
has_rdoc:
|
@@ -1,13 +0,0 @@
|
|
1
|
-
(function($){
|
2
|
-
$.fn.preventTab = function() {
|
3
|
-
$(this).keydown(function(e) {
|
4
|
-
// when the user presses the tab key
|
5
|
-
if(e.keyCode == 9) {
|
6
|
-
// preventing default behaviour
|
7
|
-
e.preventDefault();
|
8
|
-
// append tab to field value
|
9
|
-
this.value += '\t'
|
10
|
-
}
|
11
|
-
});
|
12
|
-
}
|
13
|
-
})(jQuery);
|
data/test/test_helper.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class ApplicationTest < MiniTest::Unit::TestCase
|
4
|
-
include Rack::Test::Methods
|
5
|
-
|
6
|
-
def app
|
7
|
-
MongoWiki::run!
|
8
|
-
end
|
9
|
-
|
10
|
-
def testStylesheet
|
11
|
-
get '/application.css'
|
12
|
-
assert last_response.ok?
|
13
|
-
last_response.headers['Content-Type'].must_equal "text/css"
|
14
|
-
end
|
15
|
-
|
16
|
-
def testJavascript
|
17
|
-
get '/application.js'
|
18
|
-
assert last_response.ok?
|
19
|
-
last_response.headers['Content-Type'].must_equal "application/javascript"
|
20
|
-
end
|
21
|
-
|
22
|
-
end
|