strokedb 0.0.2.1 → 0.0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README +18 -20
- data/bench.html +4001 -0
- data/bin/strokedb +14 -0
- data/examples/movies.rb +105 -0
- data/examples/movies2.rb +97 -0
- data/examples/strokewiki/README +28 -0
- data/examples/strokewiki/view/edit.xhtml +27 -0
- data/examples/strokewiki/view/new.xhtml +26 -0
- data/examples/strokewiki/view/pages.xhtml +27 -0
- data/examples/strokewiki/view/show.xhtml +40 -0
- data/examples/strokewiki/view/versions.xhtml +25 -0
- data/examples/strokewiki/wiki.rb +106 -0
- data/examples/todo.rb +92 -0
- data/lib/strokedb.rb +85 -0
- data/lib/{config → strokedb}/config.rb +14 -9
- data/lib/strokedb/console.rb +87 -0
- data/lib/strokedb/core_ext.rb +10 -0
- data/lib/{util/ext → strokedb/core_ext}/blank.rb +1 -1
- data/lib/{util/ext → strokedb/core_ext}/enumerable.rb +0 -0
- data/lib/{util/ext → strokedb/core_ext}/fixnum.rb +0 -0
- data/lib/strokedb/core_ext/float.rb +4 -0
- data/lib/{util/ext → strokedb/core_ext}/hash.rb +0 -0
- data/lib/strokedb/core_ext/infinity.rb +33 -0
- data/lib/strokedb/core_ext/kernel.rb +41 -0
- data/lib/strokedb/core_ext/object.rb +16 -0
- data/lib/{util/ext → strokedb/core_ext}/string.rb +28 -1
- data/lib/strokedb/core_ext/symbol.rb +13 -0
- data/lib/strokedb/data_structures.rb +5 -0
- data/lib/strokedb/data_structures/chunked_skiplist.rb +123 -0
- data/lib/{data_structures → strokedb/data_structures}/inverted_list.rb +0 -0
- data/lib/{data_structures → strokedb/data_structures}/point_query.rb +0 -0
- data/lib/strokedb/data_structures/simple_skiplist.rb +350 -0
- data/lib/{data_structures → strokedb/data_structures}/skiplist.rb +1 -1
- data/lib/{document → strokedb}/document.rb +180 -71
- data/lib/{document → strokedb/document}/callback.rb +0 -0
- data/lib/{document → strokedb/document}/delete.rb +2 -2
- data/lib/strokedb/document/dsl.rb +4 -0
- data/lib/{document → strokedb/document/dsl}/associations.rb +0 -0
- data/lib/{document → strokedb/document/dsl}/coercions.rb +0 -0
- data/lib/strokedb/document/dsl/meta_dsl.rb +7 -0
- data/lib/{document → strokedb/document/dsl}/validations.rb +26 -21
- data/lib/{document → strokedb/document/dsl}/virtualize.rb +0 -0
- data/lib/{document → strokedb/document}/meta.rb +92 -29
- data/lib/{document → strokedb/document}/slot.rb +17 -5
- data/lib/{document → strokedb/document}/util.rb +0 -0
- data/lib/{document → strokedb/document}/versions.rb +2 -2
- data/lib/strokedb/index.rb +2 -0
- data/lib/strokedb/nsurl.rb +24 -0
- data/lib/strokedb/store.rb +149 -0
- data/lib/strokedb/stores.rb +6 -0
- data/lib/{stores → strokedb/stores}/chainable_storage.rb +20 -14
- data/lib/strokedb/stores/file_storage.rb +118 -0
- data/lib/{stores/inverted_list_index → strokedb/stores}/inverted_list_file_storage.rb +50 -0
- data/lib/strokedb/stores/memory_storage.rb +80 -0
- data/lib/{stores → strokedb/stores}/remote_store.rb +10 -4
- data/lib/strokedb/sync.rb +4 -0
- data/lib/{sync → strokedb/sync}/chain_sync.rb +0 -0
- data/lib/{sync → strokedb/sync}/diff.rb +12 -1
- data/lib/{sync/stroke_diff → strokedb/sync/diff}/array.rb +1 -1
- data/lib/{sync/stroke_diff → strokedb/sync/diff}/default.rb +0 -0
- data/lib/{sync/stroke_diff → strokedb/sync/diff}/hash.rb +1 -1
- data/lib/{sync/stroke_diff → strokedb/sync/diff}/string.rb +1 -1
- data/lib/{sync → strokedb/sync}/lamport_timestamp.rb +0 -0
- data/lib/{sync → strokedb/sync}/store_sync.rb +15 -7
- data/lib/strokedb/transaction.rb +78 -0
- data/lib/{util → strokedb}/util.rb +14 -7
- data/lib/strokedb/util/attach_dsl.rb +29 -0
- data/lib/{util → strokedb/util}/blankslate.rb +0 -0
- data/lib/strokedb/util/class_optimization.rb +93 -0
- data/lib/{util → strokedb/util}/inflect.rb +0 -0
- data/lib/strokedb/util/java_util.rb +13 -0
- data/lib/{util → strokedb/util}/lazy_array.rb +0 -0
- data/lib/{util → strokedb/util}/lazy_mapping_array.rb +4 -0
- data/lib/{util → strokedb/util}/lazy_mapping_hash.rb +0 -0
- data/lib/{util → strokedb/util}/serialization.rb +21 -0
- data/lib/strokedb/util/uuid.rb +159 -0
- data/lib/{util → strokedb/util}/xml.rb +0 -0
- data/lib/{view → strokedb}/view.rb +2 -2
- data/lib/strokedb/volumes.rb +5 -0
- data/lib/strokedb/volumes/archive_volume.rb +165 -0
- data/lib/strokedb/volumes/block_volume.rb +169 -0
- data/lib/strokedb/volumes/distributed_pointer.rb +43 -0
- data/lib/strokedb/volumes/fixed_length_skiplist_volume.rb +109 -0
- data/lib/strokedb/volumes/map_volume.rb +268 -0
- data/meta/MANIFEST +175 -0
- data/script/console +2 -70
- data/spec/integration/remote_store_spec.rb +70 -0
- data/spec/integration/search_spec.rb +76 -0
- data/spec/integration/spec_helper.rb +1 -0
- data/spec/lib/spec_helper.rb +1 -0
- data/spec/lib/strokedb/config_spec.rb +250 -0
- data/spec/lib/strokedb/core_ext/blank_spec.rb +20 -0
- data/spec/lib/strokedb/core_ext/extract_spec.rb +42 -0
- data/spec/lib/strokedb/core_ext/float_spec.rb +62 -0
- data/spec/lib/strokedb/core_ext/infinity_spec.rb +40 -0
- data/spec/lib/strokedb/core_ext/spec_helper.rb +1 -0
- data/spec/lib/strokedb/core_ext/string_spec.rb +25 -0
- data/spec/lib/strokedb/core_ext/symbol_spec.rb +8 -0
- data/spec/lib/strokedb/data_structures/chunked_skiplist_spec.rb +144 -0
- data/spec/lib/strokedb/data_structures/inverted_list_spec.rb +172 -0
- data/spec/lib/strokedb/data_structures/simple_skiplist_spec.rb +200 -0
- data/spec/lib/strokedb/data_structures/skiplist_spec.rb +253 -0
- data/spec/lib/strokedb/data_structures/spec_helper.rb +1 -0
- data/spec/lib/strokedb/document/associations_spec.rb +319 -0
- data/spec/lib/strokedb/document/callbacks_spec.rb +134 -0
- data/spec/lib/strokedb/document/coercions_spec.rb +110 -0
- data/spec/lib/strokedb/document/document_spec.rb +1063 -0
- data/spec/lib/strokedb/document/meta_meta_spec.rb +30 -0
- data/spec/lib/strokedb/document/meta_spec.rb +435 -0
- data/spec/lib/strokedb/document/metaslot_spec.rb +43 -0
- data/spec/lib/strokedb/document/slot_spec.rb +130 -0
- data/spec/lib/strokedb/document/spec_helper.rb +1 -0
- data/spec/lib/strokedb/document/validations_spec.rb +1081 -0
- data/spec/lib/strokedb/document/virtualize_spec.rb +80 -0
- data/spec/lib/strokedb/nsurl_spec.rb +73 -0
- data/spec/lib/strokedb/spec_helper.rb +1 -0
- data/spec/lib/strokedb/stores/chained_storages_spec.rb +116 -0
- data/spec/lib/strokedb/stores/spec_helper.rb +1 -0
- data/spec/lib/strokedb/stores/store_spec.rb +201 -0
- data/spec/lib/strokedb/stores/transaction_spec.rb +107 -0
- data/spec/lib/strokedb/sync/chain_sync_spec.rb +43 -0
- data/spec/lib/strokedb/sync/diff_spec.rb +111 -0
- data/spec/lib/strokedb/sync/lamport_timestamp_spec.rb +174 -0
- data/spec/lib/strokedb/sync/slot_diff_spec.rb +164 -0
- data/spec/lib/strokedb/sync/spec_helper.rb +1 -0
- data/spec/lib/strokedb/sync/store_sync_spec.rb +181 -0
- data/spec/lib/strokedb/sync/stroke_diff/array_spec.rb +97 -0
- data/spec/lib/strokedb/sync/stroke_diff/complex_spec.rb +58 -0
- data/spec/lib/strokedb/sync/stroke_diff/hash_spec.rb +144 -0
- data/spec/lib/strokedb/sync/stroke_diff/scalar_spec.rb +23 -0
- data/spec/lib/strokedb/sync/stroke_diff/spec_helper.rb +25 -0
- data/spec/lib/strokedb/sync/stroke_diff/string_spec.rb +61 -0
- data/spec/lib/strokedb/util/attach_dsl_spec.rb +45 -0
- data/spec/lib/strokedb/util/inflect_spec.rb +14 -0
- data/spec/lib/strokedb/util/lazy_array_spec.rb +157 -0
- data/spec/lib/strokedb/util/lazy_mapping_array_spec.rb +174 -0
- data/spec/lib/strokedb/util/lazy_mapping_hash_spec.rb +92 -0
- data/spec/lib/strokedb/util/spec_helper.rb +1 -0
- data/spec/lib/strokedb/util/uuid_spec.rb +46 -0
- data/spec/lib/strokedb/view_spec.rb +228 -0
- data/spec/lib/strokedb/volumes/archive_volume_spec.rb +105 -0
- data/spec/lib/strokedb/volumes/block_volume_spec.rb +100 -0
- data/spec/lib/strokedb/volumes/distributed_pointer_spec.rb +14 -0
- data/spec/lib/strokedb/volumes/fixed_length_skiplist_volume_spec.rb +177 -0
- data/spec/lib/strokedb/volumes/map_volume_spec.rb +172 -0
- data/spec/lib/strokedb/volumes/spec_helper.rb +1 -0
- data/spec/regression/docref_spec.rb +94 -0
- data/spec/regression/meta_spec.rb +23 -0
- data/spec/regression/spec_helper.rb +1 -0
- data/spec/regression/sync_spec.rb +36 -0
- data/spec/spec.opts +7 -0
- data/spec/spec_helper.rb +37 -0
- data/spec/temp/storages/TIMESTAMP +1 -0
- data/spec/temp/storages/UUID +1 -0
- data/spec/temp/storages/database-sync/TIMESTAMP +1 -0
- data/spec/temp/storages/database-sync/UUID +1 -0
- data/spec/temp/storages/database-sync/config +1 -0
- data/spec/temp/storages/database-sync/file/LAST +1 -0
- data/spec/temp/storages/database-sync/file/bd/f6/bdf675e5-8a7b-494e-97f2-f74a14ccd95d.av +0 -0
- data/spec/temp/storages/database-sync/file/uindex.wal +0 -0
- data/spec/temp/storages/database-sync/inverted_list_file/INVERTED_INDEX +1 -0
- data/spec/temp/storages/inverted_list_storage/INVERTED_INDEX +0 -0
- data/strokedb.gemspec +120 -0
- data/task/benchmark.task +9 -0
- data/task/ditz.task +30 -0
- data/task/echoe.rb +17 -0
- data/task/rcov.task +50 -0
- data/task/rdoc.task +10 -0
- data/task/rspec.task +0 -0
- data/vendor/java_inline.rb +106 -0
- data/vendor/rbmodexcl/mrimodexcl.rb +82 -0
- data/vendor/rbmodexcl/rbmodexcl.rb +5 -0
- data/vendor/rbmodexcl/rbxmodexcl.rb +48 -0
- data/vendor/rbmodexcl/spec/unextend_spec.rb +50 -0
- data/vendor/rbmodexcl/spec/uninclude_spec.rb +26 -0
- metadata +271 -79
- data/CONTRIBUTORS +0 -7
- data/CREDITS +0 -13
- data/bin/sdbc +0 -2
- data/lib/init.rb +0 -57
- data/lib/stores/inverted_list_index/inverted_list_index.rb +0 -49
- data/lib/stores/skiplist_store/chunk.rb +0 -119
- data/lib/stores/skiplist_store/chunk_storage.rb +0 -21
- data/lib/stores/skiplist_store/file_chunk_storage.rb +0 -44
- data/lib/stores/skiplist_store/memory_chunk_storage.rb +0 -37
- data/lib/stores/skiplist_store/skiplist_store.rb +0 -217
- data/lib/stores/store.rb +0 -5
- data/lib/sync/stroke_diff/stroke_diff.rb +0 -9
- data/lib/util/ext/object.rb +0 -8
- data/lib/util/java_util.rb +0 -9
- data/lib/util/trigger_partition.rb +0 -136
- data/strokedb.rb +0 -75
data/bin/strokedb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# begin require 'strokedb/core_ext/kernel'
|
3
|
+
# rescue LoadError => e; raise e, "You need to install StrokeDB as a gem before you can use this" end
|
4
|
+
|
5
|
+
development_lib = File.join(File.dirname(__FILE__), '..', 'lib')
|
6
|
+
if File.exists? development_lib + '/strokedb.rb'
|
7
|
+
$LOAD_PATH.unshift(development_lib).uniq!
|
8
|
+
end
|
9
|
+
|
10
|
+
require 'strokedb'
|
11
|
+
require 'strokedb/console'
|
12
|
+
|
13
|
+
include StrokeDB::Console
|
14
|
+
IRB.start
|
data/examples/movies.rb
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../lib/strokedb'
|
2
|
+
$KCODE = 'u'
|
3
|
+
|
4
|
+
|
5
|
+
# cleanup the database
|
6
|
+
FileUtils.rm_rf '.movies.strokedb'
|
7
|
+
# setup database
|
8
|
+
StrokeDB::Config.build :default => true, :base_path => '.movies.strokedb'
|
9
|
+
include StrokeDB
|
10
|
+
|
11
|
+
Movie = Meta.new(:credits => %w[ Автор Актер Режиссер Исполнитель Год ]) do
|
12
|
+
has_many :comments
|
13
|
+
on_new_document do |doc|
|
14
|
+
doc[:credits] ||= []
|
15
|
+
end
|
16
|
+
|
17
|
+
# :edited_by slot keeps track on who edited this particular version
|
18
|
+
before_save do |doc|
|
19
|
+
doc[:edited_by] ||= doc[:owner]
|
20
|
+
end
|
21
|
+
|
22
|
+
# returns ordered credits in a form of:
|
23
|
+
# movie.credits == [ ["Artist", "Mylène Farmer"], ["Director", "Laurent Boutonnat"] ]
|
24
|
+
def credits
|
25
|
+
meta.credits.map do |s|
|
26
|
+
self[s] ? [s, self[s]] : nil
|
27
|
+
end.compact
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
Comment = Meta.new
|
32
|
+
|
33
|
+
User = Meta.new do
|
34
|
+
on_new_document do |u|
|
35
|
+
u[:playlists] ||= []
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
Playlist = Meta.new do
|
40
|
+
on_new_document do |pl|
|
41
|
+
pl[:items] ||= []
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
oleg = User.create!(:name => "Олег Андреев")
|
46
|
+
yrashk = User.create!(:name => "Юрій Рашковський")
|
47
|
+
|
48
|
+
melancholie = Movie.create!(:owner => oleg,
|
49
|
+
:title => "Je t'aime mélancolie")
|
50
|
+
|
51
|
+
desenchantee = Movie.create!(:owner => oleg,
|
52
|
+
:title => "Désenchantée")
|
53
|
+
|
54
|
+
sanscontrefacon = Movie.create!(:owner => yrashk,
|
55
|
+
:title => "Sans Contrefaçon")
|
56
|
+
|
57
|
+
# Oleg creates a favorites playlist
|
58
|
+
my_favorites = Playlist.new(:owner => oleg,
|
59
|
+
:title => "Favorite MF music videos")
|
60
|
+
|
61
|
+
my_favorites.items += [ melancholie, desenchantee ]
|
62
|
+
my_favorites.save!
|
63
|
+
|
64
|
+
# Yurii adds credits to movies
|
65
|
+
melancholie.edited_by = yrashk
|
66
|
+
desenchantee.edited_by = yrashk
|
67
|
+
sanscontrefacon.edited_by = yrashk
|
68
|
+
|
69
|
+
melancholie["Исполнитель"] = "Mylène Farmer"
|
70
|
+
desenchantee["Исполнитель"] = "Mylène Farmer"
|
71
|
+
sanscontrefacon["Исполнитель"] = "Mylène Farmer"
|
72
|
+
melancholie["Год"] = 1991
|
73
|
+
desenchantee["Год"] = 1991
|
74
|
+
sanscontrefacon["Год"] = 1987
|
75
|
+
melancholie.save!
|
76
|
+
desenchantee.save!
|
77
|
+
sanscontrefacon.save!
|
78
|
+
|
79
|
+
# Oleg adds a comment to "Sans Contrefaçon"
|
80
|
+
|
81
|
+
Comment.create!(:text => "Обалдеть!!!111", :owner => oleg, :movie => sanscontrefacon)
|
82
|
+
|
83
|
+
p sanscontrefacon.comments.map{|c|c.text}
|
84
|
+
# => ["Обалдеть!!!111"]
|
85
|
+
|
86
|
+
# Find all Movies
|
87
|
+
p Movie.find.map { |d|
|
88
|
+
"#{d.uuid[0,4]}: #{d.title}"
|
89
|
+
}
|
90
|
+
# => ["fd59: Je t'aime mélancolie", "66d0: Sans Contrefaçon", "9c4c: Désenchantée"]
|
91
|
+
|
92
|
+
# Find all Oleg's documents
|
93
|
+
p Document.find(:owner => oleg).map { |d|
|
94
|
+
"#{d.meta.name}:#{d.uuid[0,4]}"
|
95
|
+
}
|
96
|
+
# => ["Movie:fd59", "Movie:9c4c", "Playlist:8acc", "Comment:8306"]
|
97
|
+
|
98
|
+
p sanscontrefacon.credits
|
99
|
+
# => [["Исполнитель", "Mylène Farmer"], ["Год", 1987]]
|
100
|
+
|
101
|
+
# Find all 1991 year movies
|
102
|
+
p Movie.find("Год" => 1991).map { |d| d.title }
|
103
|
+
# => ["Désenchantée", "Je t'aime mélancolie"]
|
104
|
+
|
105
|
+
|
data/examples/movies2.rb
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../lib/strokedb'
|
2
|
+
$KCODE = 'u'
|
3
|
+
|
4
|
+
|
5
|
+
# cleanup the database
|
6
|
+
FileUtils.rm_rf '.movies.strokedb'
|
7
|
+
# setup database
|
8
|
+
StrokeDB::Config.build :default => true, :base_path => '.movies.strokedb'
|
9
|
+
include StrokeDB
|
10
|
+
|
11
|
+
Movie = Meta.new(:credits => %w[ Автор Актер Режиссер Исполнитель Год ]) do
|
12
|
+
has_many :comments
|
13
|
+
on_new_document do |doc|
|
14
|
+
doc[:credits] ||= []
|
15
|
+
end
|
16
|
+
|
17
|
+
# :edited_by slot keeps track on who edited this particular version
|
18
|
+
before_save do |doc|
|
19
|
+
doc[:edited_by] ||= doc[:owner]
|
20
|
+
end
|
21
|
+
|
22
|
+
# returns ordered credits in a form of:
|
23
|
+
# movie.credits == [ ["Artist", "Mylène Farmer"], ["Director", "Laurent Boutonnat"] ]
|
24
|
+
def credits
|
25
|
+
meta.credits.map do |s|
|
26
|
+
self[s] ? [s, self[s]] : nil
|
27
|
+
end.compact
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
Comment = Meta.new
|
32
|
+
|
33
|
+
User = Meta.new do
|
34
|
+
on_new_document do |u|
|
35
|
+
u[:playlists] ||= []
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
Playlist = Meta.new do
|
40
|
+
on_new_document do |pl|
|
41
|
+
pl[:items] ||= []
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
oleg = User.create!(:name => "Олег Андреев")
|
46
|
+
yrashk = User.create!(:name => "Юрій Рашковський")
|
47
|
+
|
48
|
+
melancholie = Movie.create!(:owner => oleg,
|
49
|
+
:title => "Je t'aime mélancolie")
|
50
|
+
|
51
|
+
desenchantee = Movie.create!(:owner => oleg,
|
52
|
+
:title => "Désenchantée")
|
53
|
+
|
54
|
+
sanscontrefacon = Movie.create!(:owner => yrashk,
|
55
|
+
:title => "Sans Contrefaçon")
|
56
|
+
|
57
|
+
# Oleg creates a favorites playlist
|
58
|
+
my_favorites = Playlist.new(:owner => oleg,
|
59
|
+
:title => "Favorite MF music videos")
|
60
|
+
|
61
|
+
my_favorites.items += [ melancholie, desenchantee ]
|
62
|
+
my_favorites.save!
|
63
|
+
|
64
|
+
# Yurii adds credits to movies
|
65
|
+
|
66
|
+
common = { :edited_by => yrashk, "Исполнитель" => "Mylène Farmer" }
|
67
|
+
|
68
|
+
melancholie.update_slots!(common.merge("Год" => 1991))
|
69
|
+
desenchantee.update_slots!(common.merge("Год" => 1991))
|
70
|
+
sanscontrefacon.update_slots!(common.merge("Год" => 1987))
|
71
|
+
|
72
|
+
# Oleg adds a comment to "Sans Contrefaçon"
|
73
|
+
sanscontrefacon.comments.create!(:text => "Обалдеть!!!111", :owner => oleg)
|
74
|
+
|
75
|
+
p sanscontrefacon.comments.map{|c|c.text}
|
76
|
+
# => ["Обалдеть!!!111"]
|
77
|
+
|
78
|
+
# Find all Movies
|
79
|
+
p Movie.find.map { |d|
|
80
|
+
"#{d.uuid[0,4]}: #{d.title}"
|
81
|
+
}
|
82
|
+
# => ["fd59: Je t'aime mélancolie", "66d0: Sans Contrefaçon", "9c4c: Désenchantée"]
|
83
|
+
|
84
|
+
# Find all Oleg's documents
|
85
|
+
p Document.find(:owner => oleg).map { |d|
|
86
|
+
"#{d.meta.name}:#{d.uuid[0,4]}"
|
87
|
+
}
|
88
|
+
# => ["Movie:fd59", "Movie:9c4c", "Playlist:8acc", "Comment:8306"]
|
89
|
+
|
90
|
+
p sanscontrefacon.credits
|
91
|
+
# => [["Исполнитель", "Mylène Farmer"], ["Год", 1987]]
|
92
|
+
|
93
|
+
# Find all 1991 year movies
|
94
|
+
p Movie.find("Год" => 1991).map { |d| d.title }
|
95
|
+
# => ["Désenchantée", "Je t'aime mélancolie"]
|
96
|
+
|
97
|
+
|
@@ -0,0 +1,28 @@
|
|
1
|
+
------------------------------------------------------------------------------
|
2
|
+
WARNING
|
3
|
+
|
4
|
+
If you have problems running this example, make sure you start with a fresh
|
5
|
+
database first.
|
6
|
+
Delete .wiki.strokedb folder in current directory
|
7
|
+
------------------------------------------------------------------------------
|
8
|
+
|
9
|
+
StrokeWiki is a Ramaze [1] app, you should have Ramaze installed in order to
|
10
|
+
run this program. The simplest way to get Ramaze is to use the rubygems [2]
|
11
|
+
package manager:
|
12
|
+
|
13
|
+
$ gem install ramaze
|
14
|
+
|
15
|
+
You also need RedCloth [3]. You can install it with rubygems:
|
16
|
+
|
17
|
+
$ gem install RedCloth
|
18
|
+
|
19
|
+
You can run StrokeWiki with:
|
20
|
+
|
21
|
+
$ ruby wiki.rb
|
22
|
+
|
23
|
+
Then open your browser and try: http://localhost:7000
|
24
|
+
|
25
|
+
|
26
|
+
[1] http://ramaze.net/
|
27
|
+
[2] http://www.rubygems.org/
|
28
|
+
[3] http://whytheluckystiff.net/ruby/redcloth/
|
@@ -0,0 +1,27 @@
|
|
1
|
+
<html>
|
2
|
+
<head>
|
3
|
+
<title>strokewiki</title>
|
4
|
+
</head>
|
5
|
+
<body>
|
6
|
+
|
7
|
+
<h1>StrokeWiki</h1>
|
8
|
+
<a href="/">Home</a> |
|
9
|
+
<a href="/pages">Pages</a>
|
10
|
+
<hr/>
|
11
|
+
|
12
|
+
<h2>Edit: #{@page.name}</h2>
|
13
|
+
<p>You can use Textile, and [[links]] to other pages.</p>
|
14
|
+
<form method="POST" action="/update/#{@page.name}">
|
15
|
+
<textarea name="body" rows="20" cols="80">
|
16
|
+
#{@page.body}
|
17
|
+
</textarea>
|
18
|
+
<br />
|
19
|
+
<input type="submit" />
|
20
|
+
</form>
|
21
|
+
<a href="/">Cancel</a>
|
22
|
+
|
23
|
+
<hr/>
|
24
|
+
<a href="/">Home</a> |
|
25
|
+
<a href="/pages">Pages</a>
|
26
|
+
</body>
|
27
|
+
</html>
|
@@ -0,0 +1,26 @@
|
|
1
|
+
<html>
|
2
|
+
<head>
|
3
|
+
<title>strokewiki</title>
|
4
|
+
</head>
|
5
|
+
<body>
|
6
|
+
|
7
|
+
<h1>StrokeWiki</h1>
|
8
|
+
<a href="/">Home</a> |
|
9
|
+
<a href="/pages">Pages</a>
|
10
|
+
<hr/>
|
11
|
+
|
12
|
+
<h2>Create: #{@page.name}</h2>
|
13
|
+
<form method="POST" action="/create/#{@page.name}">
|
14
|
+
<textarea name="body" rows="20" cols="80">
|
15
|
+
#{@page.body}
|
16
|
+
</textarea>
|
17
|
+
<br />
|
18
|
+
<input type="submit" />
|
19
|
+
</form>
|
20
|
+
<a href="/">Cancel</a>
|
21
|
+
|
22
|
+
<hr/>
|
23
|
+
<a href="/">Home</a> |
|
24
|
+
<a href="/pages">Pages</a>
|
25
|
+
</body>
|
26
|
+
</html>
|
@@ -0,0 +1,27 @@
|
|
1
|
+
<html>
|
2
|
+
<head>
|
3
|
+
<title>strokewiki</title>
|
4
|
+
</head>
|
5
|
+
<body>
|
6
|
+
|
7
|
+
<h1>StrokeWiki</h1>
|
8
|
+
<a href="/">Home</a> |
|
9
|
+
<a href="/pages">Pages</a>
|
10
|
+
<hr/>
|
11
|
+
|
12
|
+
<h2>List pages</h2>
|
13
|
+
<ul>
|
14
|
+
<?r @pages.each do |page| ?>
|
15
|
+
<li><a href="/show/#{page.name}">#{page.name}</a> - <a href="/edit/#{page.name}">edit</a> | <a href="/delete/#{page.name}">delete</a></li>
|
16
|
+
<?r end ?>
|
17
|
+
</ul>
|
18
|
+
<h2>Create page</h2>
|
19
|
+
<form method="post" action="/new">
|
20
|
+
Enter title: <input type="text" name="name">
|
21
|
+
<input type="submit">
|
22
|
+
</form>
|
23
|
+
<hr/>
|
24
|
+
<a href="/">Home</a> |
|
25
|
+
<a href="/pages">Pages</a>
|
26
|
+
</body>
|
27
|
+
</html>
|
@@ -0,0 +1,40 @@
|
|
1
|
+
<html>
|
2
|
+
<head>
|
3
|
+
<title>strokewiki</title>
|
4
|
+
</head>
|
5
|
+
<body>
|
6
|
+
|
7
|
+
<h1>StrokeWiki</h1>
|
8
|
+
<a href="/">Home</a> |
|
9
|
+
<a href="/pages">Pages</a> |
|
10
|
+
<a href="/edit/#{@page.name}">Edit</a> |
|
11
|
+
<a href="/versions/#{@page.name}">Versions</a>
|
12
|
+
<?r unless @page.versions.empty? ?>
|
13
|
+
<a href="/show/#{@page.name}/#{@page.versions.previous.version}">Previous</a>
|
14
|
+
<?r end ?>
|
15
|
+
<?r unless @page.versions.current == @page.versions.head ?>
|
16
|
+
<a href="/show/#{@page.name}">Current</a>
|
17
|
+
<a href="javascript:alert('This function is not implemented yet')">Restore</a>
|
18
|
+
<?r end ?>
|
19
|
+
<hr/>
|
20
|
+
|
21
|
+
<h2>#{@page.name}</h2>
|
22
|
+
#{@page.display_body}
|
23
|
+
|
24
|
+
|
25
|
+
<hr/>
|
26
|
+
<a href="/">Home</a> |
|
27
|
+
<a href="/pages">Pages</a> |
|
28
|
+
<a href="/edit/#{@page.name}">Edit</a> |
|
29
|
+
<a href="/versions/#{@page.name}">Versions</a>
|
30
|
+
<?r unless @page.versions.empty? ?>
|
31
|
+
<a href="/show/#{@page.name}/#{@page.versions.previous.version}">Previous</a>
|
32
|
+
<?r end ?>
|
33
|
+
<?r unless @page.versions.current == @page.versions.head ?>
|
34
|
+
<a href="/show/#{@page.name}">Current</a>
|
35
|
+
<a href="javascript:alert('This function is not implemented yet')">Restore</a>
|
36
|
+
<?r end ?>
|
37
|
+
<br/>
|
38
|
+
<p>edited on #{@page.updated_at}</p>
|
39
|
+
</body>
|
40
|
+
</html>
|
@@ -0,0 +1,25 @@
|
|
1
|
+
<html>
|
2
|
+
<head>
|
3
|
+
<title>strokewiki</title>
|
4
|
+
</head>
|
5
|
+
<body>
|
6
|
+
|
7
|
+
<h1>StrokeWiki</h1>
|
8
|
+
<a href="/">Home</a> |
|
9
|
+
<a href="/pages">Pages</a> |
|
10
|
+
<a href="/edit/#{@page.name}">Edit</a>
|
11
|
+
<hr/>
|
12
|
+
|
13
|
+
<h2>Versions of #{@page.name}</h2>
|
14
|
+
|
15
|
+
<ul>
|
16
|
+
<?r @versions.each do |page| ?>
|
17
|
+
<li>#{page.updated_at}: <a href="/show/#{page.name}/#{page.version}">#{page.version}</a></li>
|
18
|
+
<?r end ?>
|
19
|
+
</ul>
|
20
|
+
<hr/>
|
21
|
+
<a href="/">Home</a> |
|
22
|
+
<a href="/pages">Pages</a> |
|
23
|
+
<a href="/edit/#{@page.name}">Edit</a>
|
24
|
+
</body>
|
25
|
+
</html>
|
@@ -0,0 +1,106 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../lib/strokedb'
|
2
|
+
require 'rubygems'
|
3
|
+
require 'ramaze'
|
4
|
+
require 'redcloth'
|
5
|
+
|
6
|
+
# strokewiki will run in port 7000 and uses WEBRick by default
|
7
|
+
# you can change it uncommenting these four lines below.
|
8
|
+
# Ramaze::Global.setup do |g|
|
9
|
+
# g.port = 80
|
10
|
+
# g.adapter = :mongrel
|
11
|
+
# end
|
12
|
+
|
13
|
+
StrokeDB.use_global_default_config!
|
14
|
+
StrokeDB::Config.build :default => true, :base_path => '.wiki.strokedb'
|
15
|
+
# This will be the default homepage name
|
16
|
+
HOME = 'Home'
|
17
|
+
|
18
|
+
|
19
|
+
Page = StrokeDB::Meta.new do
|
20
|
+
|
21
|
+
validates_uniqueness_of :name
|
22
|
+
|
23
|
+
on_new_document do |doc|
|
24
|
+
doc[:body] ||= "I'm a boring page, please edit me!"
|
25
|
+
end
|
26
|
+
|
27
|
+
before_save do |doc|
|
28
|
+
doc[:updated_at] = Time.now.ctime
|
29
|
+
end
|
30
|
+
|
31
|
+
def title
|
32
|
+
name.gsub(/_/, ' ')
|
33
|
+
end
|
34
|
+
|
35
|
+
# A derivation of body, which is actually displayed when showing a page.
|
36
|
+
# It has stuff like [[links]] resolved as HTML links or placeholders if the
|
37
|
+
# linked to page does not already exist
|
38
|
+
def display_body
|
39
|
+
# mostly taken from JunebugWiki, regexps this beautiful should be shared
|
40
|
+
content = self.body.gsub(/\[\[([\w0-9A-Za-z -]+)[|]?([^\]]*)\]\]/) do
|
41
|
+
page = title = $1.strip
|
42
|
+
title = $2 unless $2.empty?
|
43
|
+
page_url = page.gsub(/ /, '_')
|
44
|
+
|
45
|
+
if Page.find(:name => page_url).first
|
46
|
+
%Q{<a href="/show/#{page_url}">#{title}</a>}
|
47
|
+
else
|
48
|
+
%Q{<span>#{title}<a href="/new/#{page_url}">?</a></span>}
|
49
|
+
end
|
50
|
+
end
|
51
|
+
RedCloth.new(content, []).to_html
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
class MainController < Ramaze::Controller
|
57
|
+
def index
|
58
|
+
redirect("/show/#{HOME}")
|
59
|
+
end
|
60
|
+
|
61
|
+
def pages
|
62
|
+
@pages = Page.find.sort { |a,b| a.name.downcase <=> b.name.downcase }
|
63
|
+
end
|
64
|
+
|
65
|
+
def show name,version=nil
|
66
|
+
@page = Page.find(:name => name).first
|
67
|
+
@page = @page.versions[version] if version
|
68
|
+
redirect("/new?name=#{name}") unless @page
|
69
|
+
end
|
70
|
+
|
71
|
+
def versions name
|
72
|
+
@page = Page.find(:name => name).first
|
73
|
+
@versions = @page.versions.all
|
74
|
+
redirect("/new?name=#{name}") unless @page
|
75
|
+
end
|
76
|
+
|
77
|
+
def new
|
78
|
+
@page = Page.new(:name => request['name'])
|
79
|
+
end
|
80
|
+
|
81
|
+
def create name
|
82
|
+
@page = Page.new(:name => name, :body => request['body'])
|
83
|
+
@page.save!
|
84
|
+
redirect("/show/#{@page.name}")
|
85
|
+
end
|
86
|
+
|
87
|
+
def edit name
|
88
|
+
@page = Page.find(:name => name).first
|
89
|
+
end
|
90
|
+
|
91
|
+
def update name
|
92
|
+
@page = Page.find(:name => name).first
|
93
|
+
@page.body = request['body']
|
94
|
+
@page.save!
|
95
|
+
redirect("/show/#{@page.name}")
|
96
|
+
end
|
97
|
+
|
98
|
+
def delete name
|
99
|
+
@page = Page.find(:name => name).first
|
100
|
+
@page.delete!
|
101
|
+
redirect("/")
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
105
|
+
|
106
|
+
Ramaze.start
|