caramelize 0.4.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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