caramelize 0.4.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -7,56 +7,20 @@ module Caramelize
7
7
  class RedmineWiki < Wiki
8
8
  include DatabaseConnector
9
9
 
10
- def initialize options={}
10
+ def initialize(options = {})
11
11
  super(options)
12
12
  @options[:markup] = :textile
13
- @options[:filters] << Caramelize::SwapWikiLinks.new
14
- @options[:filters] << Caramelize::RemoveTableTabLineEndings.new
13
+ @options[:filters] << Caramelize::SwapWikiLinks
14
+ @options[:filters] << Caramelize::RemoveTableTabLineEndings
15
15
  @options[:create_namespace_overview] = true
16
16
  end
17
17
 
18
18
  # after calling this action, I expect the titles and revisions to be filled
19
19
  def read_pages
20
- # get all projects
21
- results_projects = database.query("SELECT id, identifier, name FROM projects;")
22
- results_projects.each do |row_project|
23
- #collect all namespaces
24
- namespaces << OpenStruct.new(identifier: row_project["identifier"], name: row_project["name"])
25
- end
20
+ add_projects_as_namespaces
26
21
 
27
- # get all wikis
28
- results_wikis = database.query("SELECT id, project_id FROM wikis;")
29
-
30
- # get all lemmas
31
- results_pages = database.query("SELECT id, title, wiki_id FROM wiki_pages;")
32
- results_pages.each do |row_page|
33
- results_contents = database.query("SELECT * FROM wiki_content_versions WHERE page_id='#{row_page["id"]}' ORDER BY updated_on;")
34
-
35
- # get wiki for page
36
- wiki_row = nil
37
- project_row = nil
38
- results_wikis.each do |wiki|
39
- wiki_row = wiki if wiki["id"] == row_page["wiki_id"]
40
- end
41
-
42
- if wiki_row
43
- # get project from wiki-id
44
- results_projects.each do |project|
45
- project_row = project if project["id"] == wiki_row["project_id"]
46
- end
47
- end
48
-
49
- project_identifier = project_row ? project_row["identifier"] + '/' : ""
50
-
51
- title = project_identifier + row_page["title"]
52
- titles << title
53
-
54
- @latest_revisions = {}
55
- results_contents.each do |row_content|
56
- page = Page.new(build_properties(title, row_content))
57
- revisions << page
58
- @latest_revisions[title] = page
59
- end
22
+ pages.each do |row_page|
23
+ build_page(row_page)
60
24
  end
61
25
  titles.uniq!
62
26
  @latest_revisions.each { |rev| rev[1].set_latest }
@@ -68,7 +32,7 @@ module Caramelize
68
32
  end
69
33
 
70
34
  def read_authors
71
- results = database.query("SELECT id, login, mail FROM users;")
35
+ results = database.query('SELECT id, login, mail FROM users;')
72
36
  results.each do |row|
73
37
  authors[row["id"]] = OpenStruct.new(id: row["id"],
74
38
  name: row["login"],
@@ -79,15 +43,59 @@ module Caramelize
79
43
 
80
44
  private
81
45
 
46
+ def build_page(row_page)
47
+ results_contents = database.query("SELECT * FROM wiki_content_versions WHERE page_id='#{row_page["id"]}' ORDER BY updated_on;")
48
+
49
+ wiki = wikis.select{ |row| row['id'] == row_page['wiki_id'] }.first
50
+
51
+ project_identifier = ''
52
+
53
+ if wiki
54
+ project = projects.select{ |row| row['id'] == wiki['project_id'] }.first
55
+ project_identifier = project['identifier'] + '/'
56
+ end
57
+
58
+ title = project_identifier + row_page['title']
59
+ titles << title
60
+
61
+ @latest_revisions = {}
62
+ results_contents.each do |row_content|
63
+ page = Page.new(build_properties(title, row_content))
64
+ revisions << page
65
+ @latest_revisions[title] = page
66
+ end
67
+ end
68
+
69
+ def add_projects_as_namespaces
70
+ projects.each do |row_project|
71
+ namespace = OpenStruct.new(identifier: row_project['identifier'],
72
+ name: row_project['name'])
73
+ namespaces << namespace
74
+ end
75
+ end
76
+
77
+ def pages
78
+ @pages ||= database.query('SELECT id, title, wiki_id FROM wiki_pages;')
79
+ end
80
+
81
+ def projects
82
+ @projects ||= database.query('SELECT id, identifier, name FROM projects;')
83
+ end
84
+
85
+ def wikis
86
+ @wikis ||= database.query('SELECT id, project_id FROM wikis;')
87
+ end
88
+
82
89
  def build_properties(title, row_content)
83
90
  author = authors[row_content["author_id"]] ? authors[row_content["author_id"]] : nil
84
- { id: row_content["id"],
91
+ {
92
+ id: row_content['id'],
85
93
  title: title,
86
- body: row_content["data"],
94
+ body: row_content['data'],
87
95
  markup: :textile,
88
96
  latest: false,
89
- time: row_content["updated_on"],
90
- message: row_content["comments"],
97
+ time: row_content['updated_on'],
98
+ message: row_content['comments'],
91
99
  author: author,
92
100
  author_name: author.name
93
101
  }
@@ -7,18 +7,16 @@ module Caramelize
7
7
  class WikkaWiki < Wiki
8
8
  include DatabaseConnector
9
9
 
10
- def initialize options={}
10
+ def initialize(options = {})
11
11
  super(options)
12
12
  @options[:markup] = :wikka
13
- @options[:filters] << Caramelize::Wikka2Markdown.new
13
+ @options[:filters] << Caramelize::Wikka2Markdown
14
14
  end
15
15
 
16
16
  # after calling this action, titles and @revisions are expected to be filled
17
17
  def read_pages
18
- sql = "SELECT id, tag, body, time, latest, user, note FROM wikka_pages ORDER BY time;"
19
- results = database.query(sql)
20
- results.each do |row|
21
- titles << row["tag"]
18
+ pages.each do |row|
19
+ titles << row['tag']
22
20
  page = Page.new(build_properties(row))
23
21
  revisions << page
24
22
  end
@@ -29,19 +27,25 @@ module Caramelize
29
27
  end
30
28
 
31
29
  def read_authors
32
- sql = "SELECT name, email FROM wikka_users;"
30
+ sql = 'SELECT name, email FROM wikka_users;'
33
31
  results = database.query(sql)
34
32
  results.each do |row|
35
- authors[row["name"]] = OpenStruct.new(name: row["name"],
36
- email: row["email"] )
33
+ authors[row['name']] = OpenStruct.new(name: row['name'],
34
+ email: row['email'] )
37
35
  end
38
36
  end
39
37
 
40
38
  private
41
39
 
40
+ def pages
41
+ sql = 'SELECT id, tag, body, time, latest, user, note FROM wikka_pages ORDER BY time;'
42
+ @pages ||= database.query(sql)
43
+ end
44
+
42
45
  def build_properties(row)
43
- author = authors[row["user"]]
44
- { id: row["id"],
46
+ author = authors[row['user']]
47
+ {
48
+ id: row["id"],
45
49
  title: row["tag"],
46
50
  body: row["body"],
47
51
  markup: :wikka,
@@ -1,4 +1,3 @@
1
- require 'caramelize/ext'
2
1
  module Caramelize
3
2
  module OutputWiki
4
3
  class Gollum
@@ -27,6 +26,11 @@ module Caramelize
27
26
  end
28
27
  end
29
28
 
29
+ def rename_page(page_title, rename)
30
+ gollum_page = gollum.page(page_title)
31
+ gollum.rename_page(gollum_page, rename, { message: 'Rename home page' })
32
+ end
33
+
30
34
  # Commit all revisions of the given history into this gollum-wiki-repository.
31
35
  def commit_history(revisions, options = {}, &block)
32
36
  revisions.each_with_index do |page, index|
@@ -47,10 +51,9 @@ module Caramelize
47
51
  def build_commit(page)
48
52
  {
49
53
  message: page.commit_message,
50
- name: page.author_name,
51
- email: page.author_email,
52
- authored_date: page.time,
53
- committed_date: page.time
54
+ name: page.author.name,
55
+ email: page.author.email,
56
+ time: page.time
54
57
  }
55
58
  end
56
59
 
@@ -61,12 +64,14 @@ module Caramelize
61
64
  end
62
65
 
63
66
  def gollum
64
- @gollum ||= ::Gollum::Wiki.new(wiki_path)
67
+ @gollum ||= ::Gollum::Wiki.new(wiki_path, {repo_is_bare: true})
65
68
  end
66
69
 
67
70
  def initialize_repository
68
71
  return if File.exists?(wiki_path)
69
- Grit::Repo.init(wiki_path)
72
+ Dir.mkdir(wiki_path)
73
+ #::Gollum::Git::Repo.new(wiki_path, { is_bare: true })
74
+ ::Gollum::Git::Repo.init(wiki_path)
70
75
  end
71
76
  end
72
77
  end
@@ -1,3 +1,3 @@
1
1
  module Caramelize
2
- VERSION = '0.4.0'
2
+ VERSION = '1.0.0'
3
3
  end
@@ -7,8 +7,12 @@ describe Caramelize::FilterProcessor do
7
7
  subject(:processor) { described_class.new(input_wiki) }
8
8
 
9
9
  class ReverseFilter
10
- def run(body)
11
- body.reverse
10
+ def initialize(body)
11
+ @body = body
12
+ end
13
+
14
+ def run
15
+ @body.reverse
12
16
  end
13
17
  end
14
18
 
@@ -20,9 +24,7 @@ describe Caramelize::FilterProcessor do
20
24
  end
21
25
 
22
26
  context 'with reverse filter' do
23
- let(:filters) do
24
- [ReverseFilter.new]
25
- end
27
+ let(:filters) { [ReverseFilter] }
26
28
 
27
29
  it 'returns reversed body' do
28
30
  expect(processor.run(body)).to eql body.reverse
@@ -1,34 +1,48 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Caramelize::RemoveTableTabLineEndings do
4
+ let(:filter) { described_class.new(body) }
5
+ subject { filter.run}
4
6
 
5
- describe :run do
6
- let(:filter) { Caramelize::RemoveTableTabLineEndings.new }
7
+ describe '#run' do
7
8
  context 'table with tabs at unix line-endings' do
8
- it 'should remove tabs at end of line' do
9
- body = "cell1\t|cell2\t|\t\t\n"
10
- expect(filter.run(body)).to eq "cell1\t|cell2\t|\n"
9
+ let(:body) { "cell1\t|cell2\t|\t\t\n" }
10
+
11
+ it 'removes tabs at end of line' do
12
+ is_expected.to eq "cell1\t|cell2\t|\n"
11
13
  end
12
- it 'should remove spaces at end of line' do
13
- body = "cell1\t|cell2\t|\t \n"
14
- expect(filter.run(body)).to eq "cell1\t|cell2\t|\n"
14
+ end
15
+
16
+ context 'with spaces on line ending' do
17
+ let(:body) { "cell1\t|cell2\t|\t \n" }
18
+
19
+ it 'removes spaces at end of line' do
20
+ is_expected.to eq "cell1\t|cell2\t|\n"
15
21
  end
22
+
16
23
  context 'replace in full file' do
24
+ let(:body) { File.open(File.join(['spec', 'fixtures', 'markup', 'table-tab-line-endings-input.textile']), 'r').read }
25
+
17
26
  it 'returns as expected' do
18
- input_text = File.open(File.join(['spec', 'fixtures', 'markup', 'table-tab-line-endings-input.textile']), 'r').read
19
27
  output_text = File.open(File.join(['spec', 'fixtures', 'markup', 'table-tab-line-endings-output.textile']), 'r').read
20
- expect(filter.run(input_text)).to eq output_text
28
+ is_expected.to eq output_text
21
29
  end
22
30
  end
23
31
  end
32
+
24
33
  context 'table with tabs at windows line-endings' do
25
- it 'should remove tabs at end of line' do
26
- body = "cell1\t|cell2\t|\t\t\r\n"
27
- expect(filter.run(body)).to eq "cell1\t|cell2\t|\n"
34
+ let(:body) { "cell1\t|cell2\t|\t\t\r\n" }
35
+
36
+ it 'removes tabs at end of line' do
37
+ is_expected.to eq "cell1\t|cell2\t|\n"
28
38
  end
29
- it 'should remove spaces at end of line' do
30
- body = "cell1\t|cell2\t|\t \r\n"
31
- expect(filter.run(body)).to eq "cell1\t|cell2\t|\n"
39
+ end
40
+
41
+ context 'with spaces and windows line-endings' do
42
+ let(:body) { "cell1\t|cell2\t|\t \r\n" }
43
+
44
+ it 'removes spaces at end of line' do
45
+ is_expected.to eq "cell1\t|cell2\t|\n"
32
46
  end
33
47
  end
34
48
  end
@@ -1,31 +1,47 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Caramelize::SwapWikiLinks do
4
+ describe '#run' do
5
+ let(:filter) { described_class.new(body) }
6
+ subject { filter.run }
4
7
 
5
- describe :run do
6
- let(:filter) { Caramelize::SwapWikiLinks.new }
7
- context 'wiki link' do
8
- it 'should switch title and target' do
9
- body = '[[statistics|Driver & Team Statistics]]'
10
- expect(filter.run(body)).to eq '[[Driver & Team Statistics|statistics]]'
8
+ context 'wiki link with title' do
9
+ let(:body) { '[[statistics|Driver & Team Statistics]]' }
10
+
11
+ it 'swaps title and target' do
12
+ is_expected.to eq '[[Driver & Team Statistics|statistics]]'
11
13
  end
12
- it 'should replace space with dashes' do
13
- body = '[[Release 1 0]]'
14
- expect(filter.run(body)).to eq '[[Release 1 0|Release_1_0]]'
14
+ end
15
+
16
+ context 'wiki title with spaces' do
17
+ let(:body) { '[[Release 1 0]]' }
18
+
19
+ it 'replaces space with dashes' do
20
+ is_expected.to eq '[[Release 1 0|Release_1_0]]'
15
21
  end
16
- it 'should remove dots' do
17
- body = '[[Release 1.0]]'
18
- expect(filter.run(body)).to eq '[[Release 1.0|Release_10]]'
22
+ end
23
+
24
+ context 'wiki title with dashes' do
25
+ let(:body) { '[[Release 1.0]]' }
26
+
27
+ it 'removes dots' do
28
+ is_expected.to eq '[[Release 1.0|Release_10]]'
19
29
  end
20
- it 'should simple link to hyperlink' do
21
- body = '[[Intra wiki link]]'
22
- expect(filter.run(body)).to eq '[[Intra wiki link|Intra_wiki_link]]'
30
+ end
31
+
32
+ context 'wiki link with spaces and without title' do
33
+ let(:body) { '[[Intra wiki link]]' }
34
+
35
+ it 'simples link to hyperlink' do
36
+ is_expected.to eq '[[Intra wiki link|Intra_wiki_link]]'
23
37
  end
38
+
24
39
  context 'replace in full file' do
40
+ let(:body) { File.open(File.join(['spec', 'fixtures', 'markup', 'swap-links-input.textile']), 'r').read }
41
+
25
42
  it 'returns as expected' do
26
- input_text = File.open(File.join(['spec', 'fixtures', 'markup', 'swap-links-input.textile']), 'r').read
27
43
  output_text = File.open(File.join(['spec', 'fixtures', 'markup', 'swap-links-output.textile']), 'r').read
28
- expect(filter.run(input_text)).to eq output_text
44
+ is_expected.to eq output_text
29
45
  end
30
46
  end
31
47
  end
@@ -1,100 +1,198 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Caramelize::Wikka2Markdown do
4
+ let(:filter) { described_class.new(body) }
5
+
6
+ describe '#run' do
7
+ subject { filter.run }
8
+
9
+ xcontext 'keep line breaks' do
10
+ let(:body) { "line1\nline2" }
11
+
12
+ it { is_expected.to eq "line1 \nline2" }
13
+ end
4
14
 
5
- describe :run do
6
- let(:filter) { Caramelize::Wikka2Markdown.new }
7
15
  context 'headline h1' do
8
- it 'converts to markdown' do
9
- body = '======Headline======'
10
- expect(filter.run(body)).to eq '# Headline'
11
- end
16
+ let(:body) { '======Headline======' }
17
+
18
+ it { is_expected.to eq '# Headline' }
12
19
  end
13
20
 
14
21
  context 'headline h2' do
15
- it 'converts to markdown' do
16
- body = '=====Headline====='
17
- expect(filter.run(body)).to eq '## Headline'
18
- end
22
+ let(:body) { '=====Headline=====' }
23
+
24
+ it { is_expected.to eq '## Headline' }
19
25
  end
20
26
 
21
27
  context 'headline h3' do
22
- it 'converts to markdown' do
23
- body = '====Headline===='
24
- expect(filter.run(body)).to eq '### Headline'
25
- end
28
+ let(:body) { '====Headline===='}
29
+
30
+ it { is_expected.to eq '### Headline' }
26
31
  end
27
32
 
28
33
  context 'headline h4' do
29
- it 'converts to markdown' do
30
- body = '===Headline==='
31
- expect(filter.run(body)).to eq '#### Headline'
32
- end
34
+ let(:body) { '===Headline===' }
35
+
36
+ it { is_expected.to eq '#### Headline' }
33
37
  end
34
38
 
35
- context 'headline h1' do
36
- it 'converts to markdown' do
37
- body = '======Headline======'
38
- expect(filter.run(body)).to eq '# Headline'
39
- end
39
+ context 'headline h5' do
40
+ let(:body) { '==Headline==' }
41
+
42
+ it { is_expected.to eq '##### Headline' }
40
43
  end
41
44
 
42
45
  context 'bold' do
43
- it 'converts to markdown' do
44
- body = '**Text is bold**'
45
- expect(filter.run(body)).to eq '**Text is bold**'
46
- end
46
+ let(:body) { '**Text is bold**' }
47
+
48
+ it { is_expected.to eq '**Text is bold**' }
47
49
  end
48
50
 
49
51
  context 'italic' do
50
- it 'converts to markdown' do
51
- body = '//Text is italic//'
52
- expect(filter.run(body)).to eq '_Text is italic_'
53
- end
52
+ let(:body) { '//Text is italic//' }
53
+
54
+ it { is_expected.to eq '*Text is italic*' }
54
55
  end
55
56
 
56
57
  context 'underline' do
57
- it 'converts to markdown' do
58
- body = '__Text is underlined__'
59
- expect(filter.run(body)).to eq '<u>Text is underlined</u>'
60
- end
58
+ let(:body) { '__Text is underlined__' }
59
+
60
+ it { is_expected.to eq '<u>Text is underlined</u>' }
61
61
  end
62
62
 
63
63
  context 'line break' do
64
- it 'converts to markdown' do
65
- body = 'Text is---\nbroken to two lines.'
66
- expect(filter.run(body)).to eq 'Text is \nbroken to two lines.'
67
- end
64
+ let(:body) { 'Text is---\nbroken to two lines.' }
65
+
66
+ it { is_expected.to eq 'Text is \nbroken to two lines.' }
68
67
  end
69
68
 
70
69
  context 'unordered list entry' do
71
70
  context 'tab based' do
72
- it 'converts to markdown' do
73
- body = "\t-unordered list entry"
74
- expect(filter.run(body)).to eq '*unordered list entry'
75
- end
71
+ let(:body) { "\t-unordered list entry" }
72
+
73
+ it { is_expected.to eq '* unordered list entry' }
76
74
  end
77
75
 
78
76
  context 'also tab based' do
79
- it 'converts to markdown' do
80
- body = "~-unordered list entry"
81
- expect(filter.run(body)).to eq '*unordered list entry'
82
- end
77
+ let(:body) { "~-unordered list entry" }
78
+
79
+ it { is_expected.to eq '* unordered list entry' }
83
80
  end
84
81
 
85
82
  context 'space based' do
86
- it 'converts to markdown' do
87
- body = " -unordered list entry"
88
- expect(filter.run(body)).to eq '*unordered list entry'
89
- end
83
+ let(:body) { " -unordered list entry" }
84
+
85
+ it { is_expected.to eq '* unordered list entry' }
86
+ end
87
+
88
+ context 'tab based with space' do
89
+ let(:body) { "\t- unordered list entry" }
90
+
91
+ it { is_expected.to eq '* unordered list entry' }
92
+ end
93
+
94
+ context 'also tab based with space' do
95
+ let(:body) { "~- unordered list entry" }
96
+
97
+ it { is_expected.to eq '* unordered list entry' }
98
+ end
99
+
100
+ context 'space based with space' do
101
+ let(:body) { " - unordered list entry" }
102
+
103
+ it { is_expected.to eq '* unordered list entry' }
104
+ end
105
+ end
106
+
107
+ context 'ordered list entry' do
108
+ context 'without space' do
109
+ let(:body) { "~1)ordered list entry" }
110
+
111
+ it { is_expected.to eq '1. ordered list entry' }
112
+ end
113
+
114
+ context 'with space' do
115
+ let(:body) { "~1) ordered list entry" }
116
+
117
+ it { is_expected.to eq '1. ordered list entry' }
118
+ end
119
+ end
120
+
121
+ context 'wikilink' do
122
+ context 'only url' do
123
+ let(:body) { '[[LemmaLemma]]' }
124
+
125
+ it { is_expected.to eq '[[LemmaLemma]]' }
126
+ end
127
+
128
+ context 'url and pipe title' do
129
+ let(:body) { '[[SandBox|Test your formatting skills]]' }
130
+
131
+ it { is_expected.to eq '[[Test your formatting skills|SandBox]]' }
132
+ end
133
+
134
+ context 'url and title' do
135
+ let(:body) { '[[SandBox Test your formatting skills]]' }
136
+
137
+ it { is_expected.to eq '[[Test your formatting skills|SandBox]]' }
90
138
  end
91
139
  end
92
140
 
93
141
  context 'hyperlink' do
94
- it 'converts to markdown' do
95
- body = '[[Title http://target]]'
96
- expect(filter.run(body)).to eq '[[http://target|Title]]'
142
+ context 'only url' do
143
+ let(:body) { '[[http://target]]' }
144
+
145
+ it { is_expected.to eq '<http://target>' }
146
+ end
147
+
148
+ context 'url with title' do
149
+ let(:body) { '[[http://target Title]]' }
150
+
151
+ it { is_expected.to eq '[Title](http://target)' }
152
+ end
153
+
154
+ context 'url with pipe' do
155
+ let(:body) { '[[http://target|Title]]' }
156
+
157
+ it { is_expected.to eq '[Title](http://target)' }
158
+ end
159
+ end
160
+
161
+ context 'code block' do
162
+ let(:body) do
163
+ <<-EOS
164
+ Text before
165
+
166
+ %%
167
+ std::cin >> input;
168
+ ++stat[input];
169
+ %%
170
+
171
+ Text after
172
+
173
+ %%
174
+ std::cin >> input;
175
+ ++stat[input];
176
+ %%
177
+
178
+ EOS
97
179
  end
180
+ let(:expected_result) do
181
+ <<-EOS
182
+ Text before
183
+
184
+ std::cin >> input;
185
+ ++stat[input];
186
+
187
+ Text after
188
+
189
+ std::cin >> input;
190
+ ++stat[input];
191
+
192
+ EOS
193
+ end
194
+
195
+ it { is_expected.to eq expected_result }
98
196
  end
99
197
  end
100
198
  end