Skip to content

Commit bdae5bb

Browse files
committed
add atwiki-dump tool
1 parent 85986b8 commit bdae5bb

5 files changed

Lines changed: 82 additions & 0 deletions

File tree

atwiki/test/tools/__init__.py

Whitespace-only changes.

atwiki/test/tools/test_dump.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# -*- coding: utf-8 -*-
2+
3+
from __future__ import absolute_import, division, print_function, unicode_literals
4+
5+
from unittest import TestCase
6+
7+
from atwiki.tools.dump import AtWikiDump
8+
9+
from .. import TEST_BASE_URI
10+
11+
class AtWikiDumpTest(TestCase):
12+
def test_simple(self):
13+
self.assertRaises(FileNotFoundError, AtWikiDump.start, ['-o', '/tmp/non/existing/directory', TEST_BASE_URI])

atwiki/tools/__init__.py

Whitespace-only changes.

atwiki/tools/dump.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
# -*- coding: utf-8 -*-
2+
3+
from __future__ import absolute_import, division, print_function, unicode_literals
4+
5+
import sys
6+
import time
7+
import optparse
8+
import json
9+
10+
from ..core import AtWikiAPI
11+
from ..uri import AtWikiURI
12+
13+
class AtWikiDump(object):
14+
"""
15+
``atwiki-dump`` is a simple tool to dump every Wiki source.
16+
17+
Restrictions:
18+
- Contents other than Wiki source, page number and page name will not be dumped.
19+
This means that followings are not included in the dump:
20+
- WYSIWYG mode (i.e., syntax of the source)
21+
- history backup
22+
- tags
23+
- ACLs
24+
- No consistency between pages.
25+
"""
26+
27+
@classmethod
28+
def start(cls, args):
29+
USAGE = 'atwiki-dump [--output-dir OUTPUT_DIR] WIKI_URI'
30+
31+
parser = optparse.OptionParser(description='@wiki Dump Tool', usage=USAGE)
32+
parser.add_option('--output-dir', '-o', type='string', default='.',
33+
help='directory to output Wiki source')
34+
35+
(parsed, target) = parser.parse_args(args)
36+
if len(target) != 1:
37+
parser.error('A single WIKI_URI must be specified')
38+
39+
output_dir = parsed.output_dir
40+
target_site = target[0]
41+
42+
api = AtWikiAPI(AtWikiURI(target_site))
43+
page_meta = {'version': 1, 'meta': {}}
44+
45+
for page in api.get_list():
46+
page_id = page['id']
47+
page_name = page['name']
48+
page_meta['meta'][page_id] = {'name': page_name}
49+
path = '{0}/{1}.wiki'.format(output_dir, page_id)
50+
51+
print('dumping: page {0} ({1}) to {2}'.format(page_id, page_name, path))
52+
page_src = api.get_source(page_id)
53+
with open(path, 'w') as f:
54+
f.write(page_src)
55+
time.sleep(1)
56+
57+
path = '{0}/meta.json'.format(output_dir)
58+
print('dumping: meta data to {0}'.format(path))
59+
with open(path, 'w') as f:
60+
json.dump(page_meta, f)
61+
print('done!')
62+
63+
return 0
64+
65+
def main():
66+
sys.exit(AtWikiDump.start(sys.argv[1:]))

setup.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ def _read(filename):
3232
'Programming Language :: Python :: 3.5',
3333
],
3434
packages=find_packages(exclude=['atwiki.test']),
35+
entry_points={
36+
'console_scripts': ['atwiki-dump=atwiki.tools.dump:main'],
37+
},
3538
install_requires=[
3639
'BeautifulSoup4',
3740
],

0 commit comments

Comments
 (0)