From 4ec8df3a840ad31747ef38d64c1dccd8d16ee451 Mon Sep 17 00:00:00 2001 From: IceArmy Date: Sat, 26 Nov 2011 17:13:13 -0800 Subject: [PATCH] Refactor arguments system Arguments stuff now contained in its own file Use a defaults dict to change default in only one place --- python/pyphantomjs/arguments.py | 146 ++++++++++++++++++++++++++++++ python/pyphantomjs/config.py | 28 +++--- python/pyphantomjs/pyphantomjs.py | 3 +- python/pyphantomjs/utils.py | 107 ---------------------- 4 files changed, 162 insertions(+), 122 deletions(-) create mode 100644 python/pyphantomjs/arguments.py diff --git a/python/pyphantomjs/arguments.py b/python/pyphantomjs/arguments.py new file mode 100644 index 00000000..46034d7f --- /dev/null +++ b/python/pyphantomjs/arguments.py @@ -0,0 +1,146 @@ +''' + This file is part of the PyPhantomJS project. + + Copyright (C) 2011 James Roe + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +''' + +import argparse + +from PyQt4.QtNetwork import QNetworkProxy + +from __init__ import __version__ +from plugincontroller import do_action + + +license = ''' + PyPhantomJS Version %s + + Copyright (C) 2011 James Roe + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +''' % __version__ + + +defaults = { + 'cookiesFile': None, + 'debug': None, + 'diskCache': False, + 'ignoreSslErrors': False, + 'loadImages': True, + 'loadPlugins': False, + 'localToRemoteUrlAccessEnabled': False, + 'maxDiskCacheSize': -1, + 'outputEncoding': 'System', + 'proxy': None, + 'proxyType': QNetworkProxy.HttpProxy, + 'scriptEncoding': 'utf-8', + 'verbose': False +} + + +def argParser(): + class YesOrNoAction(argparse.Action): + '''Converts yes or no arguments to True/False respectively''' + def __call__(self, parser, namespace, value, option_string=None): + answer = True if value == 'yes' else False + setattr(namespace, self.dest, answer) + + yesOrNo = lambda d: 'yes' if d else 'no' + + parser = argparse.ArgumentParser( + description='Minimalistic headless WebKit-based JavaScript-driven tool', + usage='%(prog)s [options] script.[js|coffee] [script argument [script argument ...]]', + formatter_class=argparse.RawTextHelpFormatter + ) + + parser.add_argument('script', metavar='script.[js|coffee]', nargs='?', + help='The script to execute, and any args to pass to it' + ) + parser.add_argument('-v', '--version', + action='version', version=license, + help="show this program's version and license" + ) + + program = parser.add_argument_group('program options') + script = parser.add_argument_group('script options') + debug = parser.add_argument_group('debug options') + + program.add_argument('--config', metavar='/path/to/config', + help='Specifies path to a JSON-formatted config file' + ) + program.add_argument('--disk-cache', default=defaults['diskCache'], action=YesOrNoAction, + choices=['yes', 'no'], + help='Enable disk cache (default: %s)' % yesOrNo(defaults['diskCache']) + ) + program.add_argument('--ignore-ssl-errors', default=defaults['ignoreSslErrors'], action=YesOrNoAction, + choices=['yes', 'no'], + help='Ignore SSL errors (default: %s)' % yesOrNo(defaults['ignoreSslErrors']) + ) + program.add_argument('--max-disk-cache-size', default=defaults['maxDiskCacheSize'], metavar='size', type=int, + help='Limits the size of disk cache (in KB)' + ) + program.add_argument('--output-encoding', default=defaults['outputEncoding'], metavar='encoding', + help='Sets the encoding used for terminal output (default: %(default)s)' + ) + program.add_argument('--proxy', metavar='address:port', + help='Set the network proxy' + ) + program.add_argument('--proxy-type', default=defaults['proxyType'], metavar='type', + help='Set the network proxy type (default: http)' + ) + program.add_argument('--script-encoding', default=defaults['scriptEncoding'], metavar='encoding', + help='Sets the encoding used for scripts (default: %(default)s)' + ) + + script.add_argument('--cookies-file', metavar='/path/to/cookies.txt', + help='Sets the file name to store the persistent cookies' + ) + script.add_argument('--load-images', default=defaults['loadImages'], action=YesOrNoAction, + choices=['yes', 'no'], + help='Load all inlined images (default: %s)' % yesOrNo(defaults['loadImages']) + ) + script.add_argument('--load-plugins', default=defaults['loadPlugins'], action=YesOrNoAction, + choices=['yes', 'no'], + help='Load all plugins (i.e. Flash, Silverlight, ...) (default: %s)' % yesOrNo(defaults['loadPlugins']) + ) + script.add_argument('--local-to-remote-url-access', default=defaults['localToRemoteUrlAccessEnabled'], action=YesOrNoAction, + choices=['yes', 'no'], + help='Local content can access remote URL (default: %s)' % yesOrNo(defaults['localToRemoteUrlAccessEnabled']) + ) + + debug.add_argument('--debug', choices=['exception', 'program'], metavar='option', + help=('Debug the program with pdb\n' + ' exception : Start debugger when program hits exception\n' + ' program : Start the program with the debugger enabled') + ) + debug.add_argument('--verbose', action='store_true', + help='Show verbose debug messages' + ) + + do_action('ArgParser') + + return parser diff --git a/python/pyphantomjs/config.py b/python/pyphantomjs/config.py index b0fc83b9..0a6bd6dc 100644 --- a/python/pyphantomjs/config.py +++ b/python/pyphantomjs/config.py @@ -21,9 +21,9 @@ import codecs import sys from PyQt4.QtCore import QObject, qWarning -from PyQt4.QtNetwork import QNetworkProxy from PyQt4.QtWebKit import QWebPage +from arguments import defaults from plugincontroller import do_action from utils import QPyFile @@ -36,19 +36,19 @@ class Config(QObject): json = f.read() self.settings = { - 'cookiesFile': { 'mapping': 'cookies_file', 'default': None }, - 'debug': { 'mapping': 'debug', 'default': None }, - 'diskCache': { 'mapping': 'disk_cache', 'default': False }, - 'ignoreSslErrors': { 'mapping': 'ignore_ssl_errors', 'default': False }, - 'loadImages': { 'mapping': 'load_images', 'default': True }, - 'loadPlugins': { 'mapping': 'load_plugins', 'default': False }, - 'localToRemoteUrlAccessEnabled': { 'mapping': 'local_to_remote_url_access', 'default': False }, - 'maxDiskCacheSize': { 'mapping': 'max_disk_cache_size', 'default': -1 }, - 'outputEncoding': { 'mapping': 'output_encoding', 'default': 'System' }, - 'proxy': { 'mapping': 'proxy', 'default': None }, - 'proxyType': { 'mapping': 'proxy_type', 'default': QNetworkProxy.HttpProxy }, - 'scriptEncoding': { 'mapping': 'script_encoding', 'default': 'utf-8' }, - 'verbose': { 'mapping': 'verbose', 'default': False } + 'cookiesFile': { 'mapping': 'cookies_file', 'default': defaults['cookiesFile'] }, + 'debug': { 'mapping': 'debug', 'default': defaults['debug'] }, + 'diskCache': { 'mapping': 'disk_cache', 'default': defaults['diskCache'] }, + 'ignoreSslErrors': { 'mapping': 'ignore_ssl_errors', 'default': defaults['ignoreSslErrors'] }, + 'loadImages': { 'mapping': 'load_images', 'default': defaults['loadImages'] }, + 'loadPlugins': { 'mapping': 'load_plugins', 'default': defaults['loadPlugins'] }, + 'localToRemoteUrlAccessEnabled': { 'mapping': 'local_to_remote_url_access', 'default': defaults['localToRemoteUrlAccessEnabled'] }, + 'maxDiskCacheSize': { 'mapping': 'max_disk_cache_size', 'default': defaults['maxDiskCacheSize'] }, + 'outputEncoding': { 'mapping': 'output_encoding', 'default': defaults['outputEncoding'] }, + 'proxy': { 'mapping': 'proxy', 'default': defaults['proxy'] }, + 'proxyType': { 'mapping': 'proxy_type', 'default': defaults['proxyType'] }, + 'scriptEncoding': { 'mapping': 'script_encoding', 'default': defaults['scriptEncoding'] }, + 'verbose': { 'mapping': 'verbose', 'default': defaults['verbose'] } } do_action('ConfigInit', self.settings) diff --git a/python/pyphantomjs/pyphantomjs.py b/python/pyphantomjs/pyphantomjs.py index 9c297573..c287ae37 100644 --- a/python/pyphantomjs/pyphantomjs.py +++ b/python/pyphantomjs/pyphantomjs.py @@ -39,9 +39,10 @@ if __name__ == '__main__': import resources from __init__ import __version__ +from arguments import argParser from config import Config from phantom import Phantom -from utils import argParser, MessageHandler +from utils import MessageHandler # make keyboard interrupt quit program import signal diff --git a/python/pyphantomjs/utils.py b/python/pyphantomjs/utils.py index f46c047c..078bedab 100644 --- a/python/pyphantomjs/utils.py +++ b/python/pyphantomjs/utils.py @@ -17,7 +17,6 @@ along with this program. If not, see . ''' -import argparse import codecs import os import sys @@ -25,112 +24,6 @@ import sys from PyQt4.QtCore import (QByteArray, QDateTime, qDebug, QFile, Qt, QtCriticalMsg, QtDebugMsg, QtFatalMsg, QtWarningMsg) -from PyQt4.QtNetwork import QNetworkProxy - -from __init__ import __version__ -from plugincontroller import do_action - - -license = ''' - PyPhantomJS Version %s - - Copyright (C) 2011 James Roe - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -''' % __version__ - - -def argParser(): - class YesOrNoAction(argparse.Action): - '''Converts yes or no arguments to True/False respectively''' - def __call__(self, parser, namespace, value, option_string=None): - answer = False if value == 'no' else True - setattr(namespace, self.dest, answer) - - parser = argparse.ArgumentParser( - description='Minimalistic headless WebKit-based JavaScript-driven tool', - usage='%(prog)s [options] script.[js|coffee] [script argument [script argument ...]]', - formatter_class=argparse.RawTextHelpFormatter - ) - - parser.add_argument('script', metavar='script.[js|coffee]', nargs='?', - help='The script to execute, and any args to pass to it' - ) - parser.add_argument('-v', '--version', - action='version', version=license, - help="show this program's version and license" - ) - - program = parser.add_argument_group('program options') - script = parser.add_argument_group('script options') - debug = parser.add_argument_group('debug options') - - program.add_argument('--config', metavar='/path/to/config', - help='Specifies path to a JSON-formatted config file' - ) - program.add_argument('--disk-cache', default=False, action=YesOrNoAction, - choices=['yes', 'no'], - help='Enable disk cache (default: no)' - ) - program.add_argument('--ignore-ssl-errors', default=False, action=YesOrNoAction, - choices=['yes', 'no'], - help='Ignore SSL errors (default: no)' - ) - program.add_argument('--max-disk-cache-size', default=-1, metavar='size', type=int, - help='Limits the size of disk cache (in KB)' - ) - program.add_argument('--output-encoding', default='System', metavar='encoding', - help='Sets the encoding used for terminal output (default: %(default)s)' - ) - program.add_argument('--proxy', metavar='address:port', - help='Set the network proxy' - ) - program.add_argument('--proxy-type', default=QNetworkProxy.HttpProxy, metavar='type', - help='Set the network proxy type (default: http)' - ) - program.add_argument('--script-encoding', default='utf-8', metavar='encoding', - help='Sets the encoding used for scripts (default: %(default)s)' - ) - - script.add_argument('--cookies-file', metavar='/path/to/cookies.txt', - help='Sets the file name to store the persistent cookies' - ) - script.add_argument('--load-images', default=True, action=YesOrNoAction, - choices=['yes', 'no'], - help='Load all inlined images (default: yes)' - ) - script.add_argument('--load-plugins', default=False, action=YesOrNoAction, - choices=['yes', 'no'], - help='Load all plugins (i.e. Flash, Silverlight, ...) (default: no)' - ) - script.add_argument('--local-to-remote-url-access', default=False, action=YesOrNoAction, - choices=['yes', 'no'], - help='Local content can access remote URL (default: no)' - ) - - debug.add_argument('--debug', choices=['exception', 'program'], metavar='option', - help=('Debug the program with pdb\n' - ' exception : Start debugger when program hits exception\n' - ' program : Start the program with the debugger enabled') - ) - debug.add_argument('--verbose', action='store_true', - help='Show verbose debug messages' - ) - - do_action('ArgParser') - - return parser CSConverter = None