caramelize 0.3.0 → 0.4.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.
- checksums.yaml +5 -5
- data/README.md +19 -24
- data/bin/caramelize +48 -2
- data/caramelize.gemspec +2 -1
- data/lib/caramelize.rb +12 -0
- data/lib/caramelize/caramel.rb +33 -29
- data/lib/caramelize/content_transferer.rb +78 -111
- data/lib/caramelize/filter_processor.rb +31 -0
- data/lib/caramelize/input_wiki/redmine_wiki.rb +97 -0
- data/lib/caramelize/{wiki → input_wiki}/trac_converter.rb +0 -0
- data/lib/caramelize/input_wiki/wiki.rb +61 -0
- data/lib/caramelize/input_wiki/wikkawiki.rb +57 -0
- data/lib/caramelize/output_wiki/gollum.rb +73 -0
- data/lib/caramelize/page.rb +10 -4
- data/lib/caramelize/services/page_builder.rb +20 -0
- data/lib/caramelize/version.rb +1 -1
- data/spec/lib/caramelize/content_transferer_spec.rb +9 -0
- data/spec/lib/caramelize/filter_processor_spec.rb +32 -0
- data/spec/lib/caramelize/filters/wikka_to_markdown_spec.rb +25 -13
- data/spec/lib/caramelize/{wiki → input_wiki}/wiki_spec.rb +30 -4
- data/spec/lib/caramelize/output_wiki/gollum_spec.rb +113 -0
- data/spec/lib/caramelize/page_spec.rb +49 -0
- data/spec/lib/caramelize/services/page_builder.rb +29 -0
- data/spec/spec_helper.rb +1 -1
- metadata +38 -17
- data/lib/caramelize/cli.rb +0 -89
- data/lib/caramelize/cli/create_command.rb +0 -36
- data/lib/caramelize/cli/run_command.rb +0 -33
- data/lib/caramelize/gollum_output.rb +0 -79
- data/lib/caramelize/wiki/redmine_wiki.rb +0 -88
- data/lib/caramelize/wiki/wiki.rb +0 -63
- data/lib/caramelize/wiki/wikkawiki.rb +0 -48
- data/spec/lib/caramelize/gollum_output_spec.rb +0 -64
@@ -1,36 +0,0 @@
|
|
1
|
-
require 'caramelize/cli'
|
2
|
-
require 'fileutils'
|
3
|
-
|
4
|
-
module Caramelize::CLI
|
5
|
-
|
6
|
-
# The CLI command for creating a caramelize config file.
|
7
|
-
class CreateCommand < CmdParse::Command
|
8
|
-
|
9
|
-
# The website config-file. Default: the current working directory.
|
10
|
-
attr_reader :config_file
|
11
|
-
|
12
|
-
def initialize #:nodoc:
|
13
|
-
super('create', false)
|
14
|
-
self.description = "If the verbosity level is set to verbose, the created files are listed."
|
15
|
-
self.short_desc = 'Create a default config file for caramelize'
|
16
|
-
self.options = CmdParse::OptionParserWrapper.new do |opts|
|
17
|
-
opts.separator "Arguments:"
|
18
|
-
opts.on("--config <file>", "-f", String, "The config file (default: caramel.rb)") {|p| @config_file = p}
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def usage # :nodoc:
|
23
|
-
"Usage: #{commandparser.program_name} [global options] create [options]"
|
24
|
-
end
|
25
|
-
|
26
|
-
# Create a caramelize config file.
|
27
|
-
def execute(args)
|
28
|
-
# create dummy config file
|
29
|
-
target_file = @config_file.nil? ? "caramel.rb" : @config_file
|
30
|
-
FileUtils.cp(File.dirname(__FILE__) +"/../caramel.rb", target_file)
|
31
|
-
if commandparser.verbosity == :normal
|
32
|
-
puts "Created new configuration file: #{target_file}"
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
@@ -1,33 +0,0 @@
|
|
1
|
-
#Encoding: UTF-8
|
2
|
-
require 'caramelize/cli'
|
3
|
-
|
4
|
-
module Caramelize::CLI
|
5
|
-
|
6
|
-
# The CLI command for rendering a webgen website.
|
7
|
-
class RunCommand < CmdParse::Command
|
8
|
-
|
9
|
-
# The website config-file. Default: the current working directory.
|
10
|
-
attr_reader :config_file
|
11
|
-
|
12
|
-
def initialize # :nodoc:
|
13
|
-
super('run', false)
|
14
|
-
self.short_desc = 'Run the wiki content transfer based on the given config file'
|
15
|
-
self.options = CmdParse::OptionParserWrapper.new do |opts|
|
16
|
-
opts.separator "Arguments:"
|
17
|
-
#opts.separator opts.summary_indent + "DIR: the directory in which the website should be created"
|
18
|
-
opts.on("--config <file>", "-f", String, "The config file (default: caramel.rb)") {|p| @config_file = p}
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def usage # :nodoc:
|
23
|
-
"Usage: #{commandparser.program_name} [global options] run [options]"
|
24
|
-
end
|
25
|
-
|
26
|
-
# Transfer Wiki contents
|
27
|
-
def execute(args)
|
28
|
-
commandparser.transfer_content @config_file
|
29
|
-
end
|
30
|
-
|
31
|
-
end
|
32
|
-
|
33
|
-
end
|
@@ -1,79 +0,0 @@
|
|
1
|
-
require 'caramelize/ext'
|
2
|
-
module Caramelize
|
3
|
-
class GollumOutput
|
4
|
-
|
5
|
-
def supported_markup
|
6
|
-
[:markdown, :textile]
|
7
|
-
end
|
8
|
-
|
9
|
-
# Initialize a new gollum-wiki-repository at the given path.
|
10
|
-
def initialize(new_wiki_path)
|
11
|
-
# TODO use sanitized name as wiki-repository-title
|
12
|
-
@wiki_path = new_wiki_path
|
13
|
-
initialize_repository
|
14
|
-
end
|
15
|
-
|
16
|
-
def wiki_path
|
17
|
-
@wiki_path
|
18
|
-
end
|
19
|
-
|
20
|
-
# Commit the given page into the gollum-wiki-repository.
|
21
|
-
# Make sure the target markup is correct before calling this method.
|
22
|
-
def commit_revision(page, markup)
|
23
|
-
gollum_page = gollum.page(page.title)
|
24
|
-
if gollum_page
|
25
|
-
gollum.update_page(gollum_page, gollum_page.name, gollum_page.format, page.body, build_commit(page))
|
26
|
-
else
|
27
|
-
gollum.write_page(page.title, markup, page.body, build_commit(page))
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
# Commit all revisions of the given history into this gollum-wiki-repository.
|
32
|
-
def commit_history(revisions, options = {}, &block)
|
33
|
-
options[:markup] = :markdown if !options[:markup] # target markup
|
34
|
-
revisions.each_with_index do |page, index|
|
35
|
-
# call debug output from outside
|
36
|
-
block.call(page, index) if block_given?
|
37
|
-
commit_revision(page, options[:markup])
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def create_namespace_overview(namespaces)
|
42
|
-
body = "## Overview of namespaces\n\n"
|
43
|
-
namespaces.each do |namespace|
|
44
|
-
# TODO change wiki as configurable default home
|
45
|
-
# TODO support other markup syntaxes
|
46
|
-
body << "* [[#{namespace[:name]}|#{namespace[:identifier]}/Wiki]] \n"
|
47
|
-
end
|
48
|
-
page = Page.new(title: "Home",
|
49
|
-
body: body,
|
50
|
-
message: 'Create Namespace Overview',
|
51
|
-
latest: true)
|
52
|
-
commit_revision(page, :markdown)
|
53
|
-
page
|
54
|
-
end
|
55
|
-
|
56
|
-
|
57
|
-
private
|
58
|
-
|
59
|
-
def gollum
|
60
|
-
@gollum ||= Gollum::Wiki.new(wiki_path)
|
61
|
-
end
|
62
|
-
|
63
|
-
def initialize_repository
|
64
|
-
# TODO ask if we should replace existing paths
|
65
|
-
Grit::Repo.init(wiki_path) unless File.exists?(wiki_path)
|
66
|
-
end
|
67
|
-
|
68
|
-
def build_commit(page)
|
69
|
-
message = page.message.empty? ? "Edit in page #{page.title}" : page.message
|
70
|
-
|
71
|
-
{ message: message,
|
72
|
-
name: page.author_name,
|
73
|
-
email: page.author_email,
|
74
|
-
authored_date: page.time,
|
75
|
-
committed_date: page.time }
|
76
|
-
end
|
77
|
-
|
78
|
-
end
|
79
|
-
end
|
@@ -1,88 +0,0 @@
|
|
1
|
-
require 'caramelize/wiki/wiki'
|
2
|
-
require 'caramelize/filters/swap_wiki_links'
|
3
|
-
require 'caramelize/filters/remove_table_tab_line_endings'
|
4
|
-
module Caramelize
|
5
|
-
|
6
|
-
class RedmineWiki < Wiki
|
7
|
-
include DatabaseConnector
|
8
|
-
|
9
|
-
def initialize options={}
|
10
|
-
super(options)
|
11
|
-
@options[:markup] = :textile
|
12
|
-
@options[:filters] << Caramelize::SwapWikiLinks.new
|
13
|
-
@options[:filters] << Caramelize::RemoveTableTabLineEndings.new
|
14
|
-
@options[:create_namespace_overview] = true
|
15
|
-
end
|
16
|
-
|
17
|
-
# after calling this action, I expect the titles and revisions to be filled
|
18
|
-
def read_pages
|
19
|
-
# get all projects
|
20
|
-
results_projects = database.query("SELECT id, identifier, name FROM projects;")
|
21
|
-
results_projects.each do |row_project|
|
22
|
-
#collect all namespaces
|
23
|
-
namespaces << OpenStruct.new(identifier: row_project["identifier"], name: row_project["name"])
|
24
|
-
end
|
25
|
-
|
26
|
-
# get all wikis
|
27
|
-
results_wikis = database.query("SELECT id, project_id FROM wikis;")
|
28
|
-
|
29
|
-
# get all lemmas
|
30
|
-
results_pages = database.query("SELECT id, title, wiki_id FROM wiki_pages;")
|
31
|
-
results_pages.each do |row_page|
|
32
|
-
results_contents = database.query("SELECT * FROM wiki_content_versions WHERE page_id='#{row_page["id"]}' ORDER BY updated_on;")
|
33
|
-
|
34
|
-
# get wiki for page
|
35
|
-
wiki_row = nil
|
36
|
-
project_row = nil
|
37
|
-
results_wikis.each do |wiki|
|
38
|
-
wiki_row = wiki if wiki["id"] == row_page["wiki_id"]
|
39
|
-
end
|
40
|
-
|
41
|
-
if wiki_row
|
42
|
-
# get project from wiki-id
|
43
|
-
results_projects.each do |project|
|
44
|
-
project_row = project if project["id"] == wiki_row["project_id"]
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
project_identifier = project_row ? project_row["identifier"] + '/' : ""
|
49
|
-
|
50
|
-
title = project_identifier + row_page["title"]
|
51
|
-
titles << title
|
52
|
-
|
53
|
-
@latest_revisions = {}
|
54
|
-
results_contents.each do |row_content|
|
55
|
-
author = authors[row_content["author_id"]] ? @authors[row_content["author_id"]] : nil
|
56
|
-
page = Page.new({:id => row_content["id"],
|
57
|
-
:title => title,
|
58
|
-
:body => row_content["data"],
|
59
|
-
:markup => :textile,
|
60
|
-
:latest => false,
|
61
|
-
:time => row_content["updated_on"],
|
62
|
-
:message => row_content["comments"],
|
63
|
-
:author => author,
|
64
|
-
:author_name => author.name})
|
65
|
-
revisions << page
|
66
|
-
@latest_revisions[title] = page
|
67
|
-
end
|
68
|
-
end
|
69
|
-
titles.uniq!
|
70
|
-
@latest_revisions.each { |rev| rev[1].set_latest }
|
71
|
-
revisions.sort! { |a,b| a.time <=> b.time }
|
72
|
-
|
73
|
-
# TODO find latest revision for each limit
|
74
|
-
|
75
|
-
revisions
|
76
|
-
end
|
77
|
-
|
78
|
-
def read_authors
|
79
|
-
results = database.query("SELECT id, login, mail FROM users;")
|
80
|
-
results.each do |row|
|
81
|
-
authors[row["id"]] = OpenStruct.new(id: row["id"],
|
82
|
-
name: row["login"],
|
83
|
-
email: row["mail"])
|
84
|
-
end
|
85
|
-
authors
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
data/lib/caramelize/wiki/wiki.rb
DELETED
@@ -1,63 +0,0 @@
|
|
1
|
-
module Caramelize
|
2
|
-
class Wiki
|
3
|
-
include DatabaseConnector
|
4
|
-
|
5
|
-
attr_accessor :revisions, :wiki_title, :titles, :description, :namespaces, :options
|
6
|
-
|
7
|
-
def initialize options={}
|
8
|
-
@options = options
|
9
|
-
@options[:filters] = []
|
10
|
-
@namespaces = []
|
11
|
-
end
|
12
|
-
|
13
|
-
def revisions_by_title(title)
|
14
|
-
# new array only containing pages by this name sorted by time asc
|
15
|
-
# TODO this is probably bad for renamed pages if supported
|
16
|
-
return revisions.select { |revision| revision.title == title }.sort { |x,y| x.time <=> y.time }
|
17
|
-
[]
|
18
|
-
end
|
19
|
-
|
20
|
-
# return an empty array in case this action was not overridden
|
21
|
-
def read_authors
|
22
|
-
return []
|
23
|
-
end
|
24
|
-
|
25
|
-
def namespaces
|
26
|
-
@namespaces ||= {}
|
27
|
-
end
|
28
|
-
|
29
|
-
def authors
|
30
|
-
@authors ||= {}
|
31
|
-
end
|
32
|
-
|
33
|
-
def revisions
|
34
|
-
@revisions ||= []
|
35
|
-
end
|
36
|
-
|
37
|
-
def titles
|
38
|
-
@titles ||= []
|
39
|
-
end
|
40
|
-
|
41
|
-
def convert_markup?(to_markup)
|
42
|
-
markup != to_markup
|
43
|
-
end
|
44
|
-
|
45
|
-
def filters
|
46
|
-
@options[:filters]
|
47
|
-
end
|
48
|
-
|
49
|
-
def latest_revisions
|
50
|
-
@latest_revisions = []
|
51
|
-
titles.each do |title|
|
52
|
-
# pick first revision by descending date
|
53
|
-
@latest_revisions << revisions_by_title(title).last
|
54
|
-
end
|
55
|
-
@latest_revisions
|
56
|
-
end
|
57
|
-
|
58
|
-
def markup
|
59
|
-
@options[:markup]
|
60
|
-
end
|
61
|
-
|
62
|
-
end
|
63
|
-
end
|
@@ -1,48 +0,0 @@
|
|
1
|
-
module Caramelize
|
2
|
-
require 'caramelize/wiki/wiki'
|
3
|
-
require 'caramelize/database_connector'
|
4
|
-
require 'caramelize/filters/wikka_to_markdown'
|
5
|
-
|
6
|
-
class WikkaWiki < Wiki
|
7
|
-
include DatabaseConnector
|
8
|
-
|
9
|
-
def initialize options={}
|
10
|
-
super(options)
|
11
|
-
@options[:markup] = :wikka
|
12
|
-
@options[:filters] << Caramelize::Wikka2Markdown.new
|
13
|
-
end
|
14
|
-
|
15
|
-
# after calling this action, I expect the titles and @revisions to be filled
|
16
|
-
def read_pages
|
17
|
-
sql = "SELECT id, tag, body, time, latest, user, note FROM wikka_pages ORDER BY time;"
|
18
|
-
results = database.query(sql)
|
19
|
-
results.each do |row|
|
20
|
-
titles << row["tag"]
|
21
|
-
author = authors[row["user"]]
|
22
|
-
page = Page.new({:id => row["id"],
|
23
|
-
:title => row["tag"],
|
24
|
-
:body => row["body"],
|
25
|
-
:markup => :wikka,
|
26
|
-
:latest => row["latest"] == "Y",
|
27
|
-
:time => row["time"],
|
28
|
-
:message => row["note"],
|
29
|
-
:author => author,
|
30
|
-
:author_name => row["user"]})
|
31
|
-
revisions << page
|
32
|
-
end
|
33
|
-
titles.uniq!
|
34
|
-
#revisions.sort! { |a,b| a.time <=> b.time }
|
35
|
-
|
36
|
-
revisions
|
37
|
-
end
|
38
|
-
|
39
|
-
def read_authors
|
40
|
-
sql = "SELECT name, email FROM wikka_users;"
|
41
|
-
results = database.query(sql)
|
42
|
-
results.each do |row|
|
43
|
-
authors[row["name"]] = OpenStruct.new(name: row["name"],
|
44
|
-
email: row["email"] )
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
@@ -1,64 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Caramelize::GollumOutput do
|
4
|
-
|
5
|
-
let(:gollum_output) { Caramelize::GollumOutput.new('wiki.git') }
|
6
|
-
before do
|
7
|
-
allow(gollum_output).to receive(:initialize_repository).and_return true
|
8
|
-
end
|
9
|
-
|
10
|
-
describe :commit_history do
|
11
|
-
end
|
12
|
-
|
13
|
-
describe :create_namespace_overview do
|
14
|
-
|
15
|
-
context '3 pages in namespaces' do
|
16
|
-
it 'commits page' do
|
17
|
-
namespaces= [
|
18
|
-
OpenStruct.new(identifier: 'velociraptors', name: 'Velociraptor'),
|
19
|
-
OpenStruct.new(identifier: 'allosaurus', name: 'Allosaurus')
|
20
|
-
]
|
21
|
-
body = "## Overview of namespaces\n\n* [[Velociraptor|velociraptors/Wiki]] \n* [[Allosaurus|allosaurus/Wiki]] \n"
|
22
|
-
expected_page = Caramelize::Page.new(title: 'Home',
|
23
|
-
body: body,
|
24
|
-
message: 'Create Namespace Overview',
|
25
|
-
latest: true
|
26
|
-
)
|
27
|
-
allow(gollum_output).to receive(:commit_revision).with(expected_page, :markdown)
|
28
|
-
gollum_output.create_namespace_overview(namespaces)
|
29
|
-
expect(gollum_output).to have_receive(:commit_revision).with(expected_body, :markdown)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
describe :build_commit do
|
35
|
-
let(:page) do
|
36
|
-
Caramelize::Page.new( title: 'Feathered Dinosaurs',
|
37
|
-
message: 'Dinosaurs really had feathers, do not forget!',
|
38
|
-
time: Time.parse('2015-02-12'),
|
39
|
-
body: 'Dinosaurs are awesome and have feathers!',
|
40
|
-
author: OpenStruct.new(name: 'Jeff Goldblum', email: 'jeff.g@example.com') )
|
41
|
-
end
|
42
|
-
|
43
|
-
it 'builds commit hash' do
|
44
|
-
expected_hash = { message: 'Dinosaurs really had feathers, do not forget!',
|
45
|
-
authored_date: Time.parse('2015-02-12'),
|
46
|
-
committed_date: Time.parse('2015-02-12'),
|
47
|
-
name: 'Jeff Goldblum',
|
48
|
-
email: 'jeff.g@example.com' }
|
49
|
-
expect(gollum_output.send(:build_commit, page)).to eq expected_hash
|
50
|
-
end
|
51
|
-
context 'page has message' do
|
52
|
-
it 'uses page.title' do
|
53
|
-
expect(gollum_output.send(:build_commit, page)[:message]).to eq 'Dinosaurs really had feathers, do not forget!'
|
54
|
-
end
|
55
|
-
end
|
56
|
-
context 'page has no message' do
|
57
|
-
it 'should create message "Edit in page Feathered Dinosaurs"' do
|
58
|
-
page.message = ''
|
59
|
-
expect(gollum_output.send(:build_commit, page)[:message]).to eq 'Edit in page Feathered Dinosaurs'
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
end
|