diff --git a/setup.py b/setup.py index a1b4499980..0adb7d5c8a 100644 --- a/setup.py +++ b/setup.py @@ -20,39 +20,8 @@ VERSION = re.search(r'__version__\s+=\s+[\'"]([^\'"]+)[\'"]', src).group(1) APPNAME = re.search(r'__appname__\s+=\s+[\'"]([^\'"]+)[\'"]', src).group(1) print 'Setup', APPNAME, 'version:', VERSION -entry_points = { - 'console_scripts': [ \ - 'prs500 = libprs500.devices.prs500.cli.main:main', - 'lrf-meta = libprs500.ebooks.lrf.meta:main', - 'rtf-meta = libprs500.ebooks.metadata.rtf:main', - 'pdf-meta = libprs500.ebooks.metadata.pdf:main', - 'lit-meta = libprs500.ebooks.metadata.lit:main', - 'opf-meta = libprs500.ebooks.metadata.opf:main', - 'epub-meta = libprs500.ebooks.metadata.epub:main', - 'txt2lrf = libprs500.ebooks.lrf.txt.convert_from:main', - 'html2lrf = libprs500.ebooks.lrf.html.convert_from:main', - 'markdown-libprs500 = libprs500.ebooks.markdown.markdown:main', - 'lit2lrf = libprs500.ebooks.lrf.lit.convert_from:main', - 'epub2lrf = libprs500.ebooks.lrf.epub.convert_from:main', - 'rtf2lrf = libprs500.ebooks.lrf.rtf.convert_from:main', - 'web2disk = libprs500.web.fetch.simple:main', - 'web2lrf = libprs500.ebooks.lrf.web.convert_from:main', - 'pdf2lrf = libprs500.ebooks.lrf.pdf.convert_from:main', - 'mobi2lrf = libprs500.ebooks.lrf.mobi.convert_from:main', - 'any2lrf = libprs500.ebooks.lrf.any.convert_from:main', - 'lrf2lrs = libprs500.ebooks.lrf.parser:main', - 'lrs2lrf = libprs500.ebooks.lrf.lrs.convert_from:main', - 'pdfreflow = libprs500.ebooks.lrf.pdf.reflow:main', - 'isbndb = libprs500.ebooks.metadata.isbndb:main', - 'librarything = libprs500.ebooks.metadata.library_thing:main', - 'mobi2oeb = libprs500.ebooks.mobi.reader:main', - 'lrf2html = libprs500.ebooks.lrf.html.convert_to:main', - ], - 'gui_scripts' : [ - APPNAME+' = libprs500.gui2.main:main', - 'lrfviewer = libprs500.gui2.lrf_renderer.main:main', - ], - } +epsrc = re.compile(r'entry_points = (\{.*?\})', re.DOTALL).search(open('src/libprs500/linux.py', 'rb').read()).group(1) +entry_points = eval(epsrc, {'__appname__': APPNAME}) if 'win32' in sys.platform.lower() or 'win64' in sys.platform.lower(): entry_points['console_scripts'].append('parallel = libprs500.parallel:main') diff --git a/src/libprs500/devices/prs500/cli/main.py b/src/libprs500/devices/prs500/cli/main.py index 28d8ca584c..7c165ec980 100755 --- a/src/libprs500/devices/prs500/cli/main.py +++ b/src/libprs500/devices/prs500/cli/main.py @@ -23,7 +23,7 @@ from optparse import OptionParser from libprs500 import __version__, iswindows from libprs500.devices.errors import PathError -from libprs500.devices.prs500.cli.terminfo import TerminalController +from libprs500.terminfo import TerminalController from libprs500.devices.errors import ArgumentError, DeviceError, DeviceLocked from libprs500.devices import devices from libprs500.devices.scanner import DeviceScanner diff --git a/src/libprs500/ebooks/lrf/html/convert_to.py b/src/libprs500/ebooks/lrf/html/convert_to.py index 0ef070f722..0e42a4d5b7 100644 --- a/src/libprs500/ebooks/lrf/html/convert_to.py +++ b/src/libprs500/ebooks/lrf/html/convert_to.py @@ -14,7 +14,7 @@ ## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import sys, logging, os -from libprs500 import __appname__, __author__, __version__, setup_cli_handlers +from libprs500 import setup_cli_handlers, OptionParser from libprs500.ebooks import ConversionError from libprs500.ebooks.lrf.meta import get_metadata from libprs500.ebooks.lrf.parser import LRFDocument @@ -91,9 +91,7 @@ class LRFConverter(object): self.create_block_styles() def option_parser(): - from optparse import OptionParser - parser = OptionParser(usage='%prog book.lrf', epilog='Created by '+__author__, - version=__appname__ + ' ' + __version__) + parser = OptionParser(usage='%prog book.lrf') parser.add_option('--output-dir', '-o', default=None, help='Output directory in which to store created HTML files. If it does not exist, it is created. By default the current directory is used.', dest='out') parser.add_option('--verbose', default=False, action='store_true', dest='verbose') return parser diff --git a/src/libprs500/ebooks/lrf/lrs/convert_from.py b/src/libprs500/ebooks/lrf/lrs/convert_from.py index a3abb18670..d16241cb0b 100644 --- a/src/libprs500/ebooks/lrf/lrs/convert_from.py +++ b/src/libprs500/ebooks/lrf/lrs/convert_from.py @@ -18,7 +18,7 @@ Compile a LRS file into a LRF file. import sys, os, logging -from libprs500 import __author__, __appname__, __version__, setup_cli_handlers +from libprs500 import OptionParser, setup_cli_handlers from libprs500.ebooks.BeautifulSoup import BeautifulStoneSoup, NavigableString, \ CData, Tag from libprs500.ebooks.lrf.pylrs.pylrs import Book, PageStyle, TextStyle, \ @@ -263,10 +263,7 @@ class LrsParser(object): def option_parser(): - from optparse import OptionParser - parser = OptionParser(usage='%prog [options] file.lrs', - version=__appname__+ ' ' + __version__, - epilog='Created by '+__author__) + parser = OptionParser(usage='%prog [options] file.lrs\nCompile an LRS file into an LRF file.') parser.add_option('-o', '--output', default=None, help='Path to output file') parser.add_option('--verbose', default=False, action='store_true', help='Verbose processing') diff --git a/src/libprs500/ebooks/lrf/parser.py b/src/libprs500/ebooks/lrf/parser.py index 68a383d72a..960965bac9 100644 --- a/src/libprs500/ebooks/lrf/parser.py +++ b/src/libprs500/ebooks/lrf/parser.py @@ -16,7 +16,7 @@ import sys, array, os, re, codecs, logging -from libprs500 import __author__, __appname__, __version__, setup_cli_handlers +from libprs500 import OptionParser, setup_cli_handlers from libprs500.ebooks.lrf.meta import LRFMetaFile from libprs500.ebooks.lrf.objects import get_object, PageTree, StyleObject, \ Font, Text, TOCObject, BookAttr, ruby_tags @@ -141,9 +141,7 @@ class LRFDocument(LRFMetaFile): return '\n' + bookinfo + pages + styles + objects + '' def option_parser(): - from optparse import OptionParser - parser = OptionParser(usage='%prog book.lrf', epilog='Created by '+__author__, - version=__appname__ + ' ' + __version__) + parser = OptionParser(usage='%prog book.lrf\nConvert an LRF file into an LRS (XML UTF-8 encoded) file') parser.add_option('--output', '-o', default=None, help='Output LRS file', dest='out') parser.add_option('--verbose', default=False, action='store_true', dest='verbose') return parser diff --git a/src/libprs500/ebooks/metadata/__init__.py b/src/libprs500/ebooks/metadata/__init__.py index 1605ccb2f6..c264f903e8 100644 --- a/src/libprs500/ebooks/metadata/__init__.py +++ b/src/libprs500/ebooks/metadata/__init__.py @@ -19,13 +19,13 @@ the L{libprs500.lrf.meta} module. __docformat__ = "epytext" __author__ = "Kovid Goyal " -from optparse import OptionParser + from libprs500 import __version__ as VERSION +from libprs500 import OptionParser def get_parser(extension): ''' Return an option parser with the basic metadata options already setup''' - parser = OptionParser(version='libprs500 version: '+VERSION, - usage='''%prog [options] myfile.'''+extension) + parser = OptionParser(usage='%prog [options] myfile.'+extension+'\n\nRead and write metadata from an ebook file.') parser.add_option("-t", "--title", action="store", type="string", \ dest="title", help="Set the book title", default=None) parser.add_option("-a", "--authors", action="store", type="string", \ diff --git a/src/libprs500/ebooks/metadata/isbndb.py b/src/libprs500/ebooks/metadata/isbndb.py index 83d9b60673..a17954f3e8 100644 --- a/src/libprs500/ebooks/metadata/isbndb.py +++ b/src/libprs500/ebooks/metadata/isbndb.py @@ -18,9 +18,8 @@ Interface to isbndb.com. My key HLLXQX2A. import sys, logging, re, socket from urllib import urlopen, quote -from optparse import OptionParser -from libprs500 import __appname__, __version__, __author__, setup_cli_handlers +from libprs500 import setup_cli_handlers, OptionParser from libprs500.ebooks.metadata import MetaInformation from libprs500.ebooks.BeautifulSoup import BeautifulStoneSoup @@ -98,8 +97,7 @@ def build_combined(base_url, opts): def option_parser(): - parser = OptionParser(epilog='Created by '+__author__, version=__appname__+' '+__version__, - usage=\ + parser = OptionParser(usage=\ ''' %prog [options] key diff --git a/src/libprs500/ebooks/metadata/library_thing.py b/src/libprs500/ebooks/metadata/library_thing.py index 49363650b3..dd5f1c2eb1 100644 --- a/src/libprs500/ebooks/metadata/library_thing.py +++ b/src/libprs500/ebooks/metadata/library_thing.py @@ -17,9 +17,8 @@ Fetch cover from LibraryThing.com based on ISBN number. ''' import sys, socket, os -from optparse import OptionParser -from libprs500 import browser as _browser, __author__, __appname__, __version__ +from libprs500 import browser as _browser, OptionParser from libprs500.ebooks.BeautifulSoup import BeautifulSoup browser = None @@ -68,9 +67,7 @@ def cover_from_isbn(isbn, timeout=5.): socket.setdefaulttimeout(_timeout) def option_parser(): - parser = OptionParser(epilog='Created by '+__author__, - version=__appname__+' '+__version__, - usage=\ + parser = OptionParser(usage=\ ''' %prog [options] ISBN diff --git a/src/libprs500/linux.py b/src/libprs500/linux.py index 24b772d9b6..751f149960 100644 --- a/src/libprs500/linux.py +++ b/src/libprs500/linux.py @@ -14,7 +14,7 @@ ## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.Warning import shutil ''' Post installation script for linux ''' -import sys, os +import sys, os, re from subprocess import check_call from libprs500 import __version__, __appname__ @@ -27,6 +27,41 @@ DESTDIR = '' if os.environ.has_key('DESTDIR'): DESTDIR = os.environ['DESTDIR'] +entry_points = { + 'console_scripts': [ \ + 'prs500 = libprs500.devices.prs500.cli.main:main', + 'lrf-meta = libprs500.ebooks.lrf.meta:main', + 'rtf-meta = libprs500.ebooks.metadata.rtf:main', + 'pdf-meta = libprs500.ebooks.metadata.pdf:main', + 'lit-meta = libprs500.ebooks.metadata.lit:main', + 'opf-meta = libprs500.ebooks.metadata.opf:main', + 'epub-meta = libprs500.ebooks.metadata.epub:main', + 'txt2lrf = libprs500.ebooks.lrf.txt.convert_from:main', + 'html2lrf = libprs500.ebooks.lrf.html.convert_from:main', + 'markdown-libprs500 = libprs500.ebooks.markdown.markdown:main', + 'lit2lrf = libprs500.ebooks.lrf.lit.convert_from:main', + 'epub2lrf = libprs500.ebooks.lrf.epub.convert_from:main', + 'rtf2lrf = libprs500.ebooks.lrf.rtf.convert_from:main', + 'web2disk = libprs500.web.fetch.simple:main', + 'web2lrf = libprs500.ebooks.lrf.web.convert_from:main', + 'pdf2lrf = libprs500.ebooks.lrf.pdf.convert_from:main', + 'mobi2lrf = libprs500.ebooks.lrf.mobi.convert_from:main', + 'any2lrf = libprs500.ebooks.lrf.any.convert_from:main', + 'lrf2lrs = libprs500.ebooks.lrf.parser:main', + 'lrs2lrf = libprs500.ebooks.lrf.lrs.convert_from:main', + 'pdfreflow = libprs500.ebooks.lrf.pdf.reflow:main', + 'isbndb = libprs500.ebooks.metadata.isbndb:main', + 'librarything = libprs500.ebooks.metadata.library_thing:main', + 'mobi2oeb = libprs500.ebooks.mobi.reader:main', + 'lrf2html = libprs500.ebooks.lrf.html.convert_to:main', + ], + 'gui_scripts' : [ + __appname__+' = libprs500.gui2.main:main', + 'lrfviewer = libprs500.gui2.lrf_renderer.main:main', + ], + } + + def options(option_parser): parser = option_parser() options = parser.option_list @@ -79,14 +114,14 @@ complete -o filenames -F _'''%(opts,exts) + name + ' ' + name +"\n\n" use_destdir = False -def open_file(path): +def open_file(path, mode='wb'): if use_destdir: if os.path.isabs(path): path = path[1:] path = os.path.join(DESTDIR, path) - if not os.path.exists(os.path.dirname(path)): - os.makedirs(os.path.dirname(path)) - return open(path, 'wb') + if not os.path.exists(os.path.dirname(path)): + os.makedirs(os.path.dirname(path)) + return open(path, mode) def setup_completion(fatal_errors): try: @@ -269,6 +304,32 @@ def option_parser(): dest='fatal_errors', help='If set die on errors.') return parser +def install_man_pages(fatal_errors): + from bz2 import compress + import subprocess + print 'Installing MAN pages...' + manpath = '/usr/share/man/man1' + f = open_file('/tmp/man_extra', 'wb') + f.write('[see also]\nhttp://%s.kovidgoyal.net\n'%__appname__) + f.close() + for src in entry_points['console_scripts']: + prog = src[:src.index('=')].strip() + if prog in ('prs500', 'pdf-meta', 'epub-meta', 'lit-meta', 'markdown-libprs500'): + continue + help2man = ('help2man', prog, '--name', 'part of %s'%__appname__, + '--section', '1', '--no-info', '--include', + f.name, '--manual', __appname__) + manfile = os.path.join(manpath, prog+'.1'+__appname__+'.bz2') + p = subprocess.Popen(help2man, stdout=subprocess.PIPE) + raw = re.compile(r'^\.IP\s*^([A-Z :]+)$', re.MULTILINE).sub(r'.SS\n\1', p.stdout.read()) + if not raw.strip(): + print 'Unable to create MAN page for', prog + continue + open_file(manfile).write(compress(raw)) + + + + def post_install(): parser = option_parser() opts = parser.parse_args()[0] @@ -283,6 +344,7 @@ def post_install(): setup_udev_rules(opts.group_file, not opts.dont_reload, opts.fatal_errors) setup_completion(opts.fatal_errors) setup_desktop_integration(opts.fatal_errors) + install_man_pages(opts.fatal_errors) try: from PyQt4 import Qt diff --git a/src/libprs500/devices/prs500/cli/terminfo.py b/src/libprs500/terminfo.py similarity index 100% rename from src/libprs500/devices/prs500/cli/terminfo.py rename to src/libprs500/terminfo.py diff --git a/src/libprs500/web/fetch/simple.py b/src/libprs500/web/fetch/simple.py index cd7bd98f0b..64191ce561 100644 --- a/src/libprs500/web/fetch/simple.py +++ b/src/libprs500/web/fetch/simple.py @@ -18,10 +18,8 @@ Fetch a webpage and its links recursively. import sys, socket, os, urlparse, codecs, logging, re, time, copy, urllib2 from urllib import url2pathname from httplib import responses -from optparse import OptionParser -from libprs500 import __version__, __appname__, __author__, setup_cli_handlers, \ - browser, sanitize_file_name +from libprs500 import setup_cli_handlers, browser, sanitize_file_name, OptionParser from libprs500.ebooks.BeautifulSoup import BeautifulSoup from libprs500.ebooks.chardet import xml_to_unicode @@ -296,8 +294,7 @@ class RecursiveFetcher(object): socket.setdefaulttimeout(self.default_timeout) def option_parser(usage='%prog URL\n\nWhere URL is for example http://google.com'): - parser = OptionParser(usage=usage, version=__appname__+' '+__version__, - epilog='Created by ' + __author__) + parser = OptionParser(usage=usage) parser.add_option('-d', '--base-dir', help='Base directory into which URL is saved. Default is %default', default='.', type='string', dest='dir') parser.add_option('-t', '--timeout', help='Timeout in seconds to wait for a response from the server. Default: %default s',