Merge pull request #6 from rpappalax/dev-rpapa

Dev rpapa
This commit is contained in:
Peter deHaan 2016-02-22 16:45:05 -08:00
Родитель fb1ae194ca d4002b37a2
Коммит 1f92b5e6f0
20 изменённых файлов: 285 добавлений и 169 удалений

3
.gitignore поставляемый
Просмотреть файл

@ -1,3 +1,6 @@
_temp
venv
*.pyc
*.egg-info/
*.egg
.tox/

Просмотреть файл

@ -25,7 +25,7 @@ test:
tox
clean:
rm -rf venv *egg* dist ./docs/_build .tox
rm -rf venv *egg* dist ./docs/_build .tox _temp
find . -name '*.pyc' -delete
find . -name '__pycache__' -type d -exec rm -fr {} \;

Просмотреть файл

@ -1,4 +1,37 @@
# ff-tool
Python CLI tool for downloading desktop Firefox version, managing profiles and test prefs
ff-tool is a Python CLI tool for downloading desktop Firefox versions,
as well as managing profiles and test prefs. It is largely a glorified
convenience wrapper we've written around these amazing tools/libraries:
* [mozdownload](https://github.com/mozilla/mozdownload)
* [mozprofile](https://github.com/mozilla/mozprofile)
:bangbang: _NOTE: This tool is work in progress... DO NOT USE_ :bangbang:
# Installation
## Pre-requisites
* ff-tool requires you have python and virtualenv installed.
## Build
```
$ make build
$ source ./venv/bin/activate
```
## Cleanup
```
$ deactivate
$ make clean
```
# Run
## Example(s)
```
$ ff -h
$ ff download -h
$ ff download -c nightly
```
# Work in progress... DO NOT USE

19
configs/channels.ini Normal file
Просмотреть файл

@ -0,0 +1,19 @@
[gr]
version=latest
type=release
branch=
[beta]
version=latest-beta
type=candidate
branch=
[aurora]
version=
type=daily
branch=mozilla-aurora
[nightly]
version=
type=daily
branch=mozilla-central

34
configs/cygwin.ini Normal file
Просмотреть файл

@ -0,0 +1,34 @@
# https://archive.mozilla.org/pub/firefox/releases/latest/README.txt
[DEFAULT]
# install paths
PATH_PROGRAM_FILES = /cygdrive/c/Program Files
PATH_FIREFOX_BIN = firefox.exe
# env vars
PATH_FIREFOX_BIN_ENV = %(PATH_FIREFOX_APP)s/%(PATH_FIREFOX_BIN)s
PATH_FIREFOX_PROFILES_ENV = %(APPDATA)s\Mozilla\Firefox\Profiles
PATH_SIKULIX_BIN_ENV = /cygdrive/c/sikulix
[nightly]
# download configs
DOWNLOAD_FILENAME = FirefoxNightly.exe
# install configs
PATH_FIREFOX_APP = %(PATH_PROGRAM_FILES)s/Nightly
[aurora]
# download configs
DOWNLOAD_FILENAME = FirefoxDevEdition.exe
# install configs
PATH_FIREFOX_APP = %(PATH_PROGRAM_FILES)s/Firefox Developer Edition
[beta]
# download configs
DOWNLOAD_FILENAME = FirefoxBeta.exe
# install configs
PATH_FIREFOX_APP = %(PATH_PROGRAM_FILES)s/Mozilla Firefox Beta
[gr]
# download configs
DOWNLOAD_FILENAME = FirefoxRelease.exe
# install configs
PATH_FIREFOX_APP = %(PATH_PROGRAM_FILES)s/Mozilla Firefox

33
configs/darwin.ini Normal file
Просмотреть файл

@ -0,0 +1,33 @@
# https://archive.mozilla.org/pub/firefox/releases/latest/README.txt
[DEFAULT]
# install paths
PATH_FIREFOX_BIN = Contents/MacOS/firefox
# env vars
PATH_FIREFOX_BIN_ENV = %(PATH_FIREFOX_APP)s/%(PATH_FIREFOX_BIN)s
PATH_FIREFOX_PROFILES_ENV = $HOME/Library/Application Support/Firefox/
PATH_SIKULIX_BIN_ENV = /Applications/Sikuli/runsikulix
[nightly]
# download configs
DOWNLOAD_FILENAME = FirefoxNightly.dmg
# install configs
PATH_FIREFOX_APP = /Applications/Firefox Nightly.app
[aurora]
# download configs
DOWNLOAD_FILENAME = FirefoxDevEdition.dmg
# install configs
PATH_FIREFOX_APP = /Applications/Firefox Developer Edition.app
[beta]
# download configs
DOWNLOAD_FILENAME = FirefoxBeta.dmg
# install configs
PATH_FIREFOX_APP = /Applications/FirefoxBeta.app
[gr]
# download configs
DOWNLOAD_FILENAME = FirefoxRelease.dmg
# install configs
PATH_FIREFOX_APP = /Applications/Firefox.app

33
configs/linux-gnu.ini Normal file
Просмотреть файл

@ -0,0 +1,33 @@
# https://archive.mozilla.org/pub/firefox/releases/latest/README.txt
[DEFAULT]
# install paths
PATH_FIREFOX_BIN = firefox
# env vars
PATH_FIREFOX_BIN_ENV = %(PATH_FIREFOX_APP)s/%(PATH_FIREFOX_BIN)s
PATH_FIREFOX_PROFILES_ENV = $HOME/.mozilla
PATH_SIKULIX_BIN_ENV = $HOME/Sikuli/runsikulix
[nightly]
# download configs
DOWNLOAD_FILENAME = firefox-nightly.tar.bz2
# install configs
PATH_FIREFOX_APP = $HOME/bin/firefox-nightly
[aurora]
# download configs
DOWNLOAD_FILENAME = firefox-dev-edition.tar.bz2
# install configs
PATH_FIREFOX_APP = $HOME/bin/firefox-developer-edition
[beta]
# download configs
DOWNLOAD_FILENAME = firefox-beta.tar.bz2
# install configs
PATH_FIREFOX_APP = $HOME/bin/firefox-beta
[gr]
# download configs
DOWNLOAD_FILENAME = firefox-release.tar.bz2
# install configs
PATH_FIREFOX_APP = $HOME/bin/firefox-release

90
fftool/cmd.py Normal file
Просмотреть файл

@ -0,0 +1,90 @@
"""module providing ff-tool command menus"""
from firefox_download import download
class CMDDownload():
def __init__(self, subparsers, CHANNELS, DEFAULT_CHANNEL):
download = subparsers.add_parser(
'download',
help='<download> command help')
download.add_argument(
'-c',
'--channel',
choices=CHANNELS,
default=DEFAULT_CHANNEL,
type=str,
help='Download a specific Firefox channel via mozdownload.'
)
download.set_defaults(func=self.cmd)
def cmd(self, args):
print('Downloading Firefox... [channel: {0}]'.format(args.channel))
download(args.channel)
class CMDProfile():
def __init__(self, subparsers):
profile = subparsers.add_parser(
'profile', help='<profile> command help')
profile.add_argument(
'-c',
'--create',
type=str,
help='Create a new Firefox profile with the specified name.'
)
profile.add_argument(
'-d',
'--delete',
type=str,
help='Delete the specified Firefox profile.'
)
profile.set_defaults(func=self.cmd)
def cmd(self, args):
if args.create:
print('Creating Firefox profile... [name: {0}]'.format(args.create)) # NOQA
if args.delete:
print('Deleting Firefox profile... [name: {0}]'.format(args.delete)) # NOQA
class CMDInstall():
def __init__(self, subparsers, CHANNELS, DEFAULT_CHANNEL):
install = subparsers.add_parser(
'install', help='<install> command help')
install.add_argument(
'-c',
'--channel',
choices=CHANNELS,
default=DEFAULT_CHANNEL,
type=str,
help='Install a specific Firefox channel.'
)
install.set_defaults(func=self.cmd)
def cmd(self, args):
print('Installing Firefox... [channel: {0}]'.format(args.channel))
class CMDUninstall():
def __init__(self, subparsers, CHANNELS, DEFAULT_CHANNEL):
uninstall = subparsers.add_parser(
'uninstall', help='<uninstall> command help')
uninstall.add_argument(
'-c',
'--channel',
choices=CHANNELS,
default=DEFAULT_CHANNEL,
type=str,
help='Uninstall a specific Firefox channel.'
)
uninstall.set_defaults(func=self.cmd)
def cmd(self, args):
print('Uninstalling Firefox... [channel: {0}]'.format(args.channel))

Просмотреть файл

@ -1,24 +0,0 @@
"""
ff-tool <download> specific arguments...
"""
from firefox_download import download
class cmd_download():
def cmd(self, args):
print('Downloading Firefox... [channel: {0}]'.format(args.channel))
download(args.channel)
def __init__(self, subparsers, CHANNELS, DEFAULT_CHANNEL):
download = subparsers.add_parser('download', help='<download> command help')
download.add_argument(
'-c',
'--channel',
choices=CHANNELS,
default=DEFAULT_CHANNEL,
type=str,
help='Download a specific Firefox channel via mozdownload.'
)
download.set_defaults(func=self.cmd)

Просмотреть файл

@ -1,20 +0,0 @@
"""
ff-tool <install> specific arguments...
"""
class cmd_install():
def cmd(self, args):
print('Installing Firefox... [channel: {0}]'.format(args.channel))
def __init__(self, subparsers, CHANNELS, DEFAULT_CHANNEL):
install = subparsers.add_parser('install', help='<install> command help')
install.add_argument(
'-c',
'--channel',
choices=CHANNELS,
default=DEFAULT_CHANNEL,
type=str,
help='Install a specific Firefox channel.'
)
install.set_defaults(func=self.cmd)

Просмотреть файл

@ -1,28 +0,0 @@
"""
ff-tool <profile> specific arguments...
"""
class cmd_profile():
def cmd(self, args):
if args.create:
print('Creating Firefox profile... [name: {0}]'.format(args.create))
if args.delete:
print('Deleting Firefox profile... [name: {0}]'.format(args.delete))
def __init__(self, subparsers):
profile = subparsers.add_parser('profile', help='<profile> command help')
profile.add_argument(
'-c',
'--create',
type=str,
help='Create a new Firefox profile with the specified name.'
)
profile.add_argument(
'-d',
'--delete',
type=str,
help='Delete the specified Firefox profile.'
)
profile.set_defaults(func=self.cmd)

Просмотреть файл

@ -1,20 +0,0 @@
"""
ff-tool <uninstall> specific arguments...
"""
class cmd_uninstall():
def cmd(self, args):
print('Uninstalling Firefox... [channel: {0}]'.format(args.channel))
def __init__(self, subparsers, CHANNELS, DEFAULT_CHANNEL):
uninstall = subparsers.add_parser('uninstall', help='<uninstall> command help')
uninstall.add_argument(
'-c',
'--channel',
choices=CHANNELS,
default=DEFAULT_CHANNEL,
type=str,
help='Uninstall a specific Firefox channel.'
)
uninstall.set_defaults(func=self.cmd)

Просмотреть файл

@ -41,15 +41,16 @@ class FirefoxInstall(object):
if IniHandler.is_linux():
# TODO: Move to /opt/* and chmod file?
# `tar -jxf firefox-beta.tar.gz -C ./beta --strip-components=1`?
local('tar -jxf {0} && mv firefox {1}'.format(installer, install_dir))
# `tar -jxf firefox-beta.tar.gz -C ./beta --strip-components=1`? # NOQA
local('tar -jxf {0} && mv firefox {1}'.format(installer, install_dir)) # NOQA
elif IniHandler.is_windows():
local('{0} -ms'.format(installer))
if channel == 'beta':
# Since Beta and General Release channels install to the same directory,
# install Beta first then rename the directory.
# Since Beta and General Release channels install
# to the same directory, install Beta first then
# rename the directory.
gr_install_dir = self.config.get('gr', 'PATH_FIREFOX_APP')
local('mv "{0}" "{1}"'.format(gr_install_dir, install_dir))
@ -60,7 +61,10 @@ class FirefoxInstall(object):
else:
print(('[{0}] was cached, skipping install.'.format(channel)))
local('"{0}" --version # {1}'.format(self.config.get(channel, 'PATH_FIREFOX_BIN_ENV'), channel))
cmd = self.config.get(channel, 'PATH_FIREFOX_BIN_ENV')
# local('"{0}" --version # {1}'.format(self.config.get(channel,
# 'PATH_FIREFOX_BIN_ENV'), channel))
local('"{0}" --version # {1}'.format(cmd, channel))
def main():

Просмотреть файл

@ -30,7 +30,7 @@ config = configparser.ConfigParser()
def _parse_args():
"""Parses out args for CLI"""
parser = configargparse.ArgumentParser(
description='CLI tool for creating Firefox profiles via mozprofile CLI')
description='CLI tool for creating Firefox profiles')
parser.add_argument('-a', '--application',
required=True,
help='Application to test. Example: "loop-server"')

Просмотреть файл

@ -23,7 +23,7 @@ class FirefoxProfileHandler(object):
def switch_prefs(self, profile_name, user_prefs, channel='nightly'):
channel_firefox_bin = self.config.get(channel, 'PATH_FIREFOX_BIN_ENV')
print(('{0} -CreateProfile {1}'.format(channel_firefox_bin, profile_name)))
print(('{0} -CreateProfile {1}'.format(channel_firefox_bin, profile_name))) # NOQA
print('copy prefs.js to <new profile name> dir')
def delete_all_profiles(self):

Просмотреть файл

@ -1,45 +0,0 @@
"""firefox test tool helper script"""
import configargparse
def _parse_args():
"""Parses out args for CLI"""
parser = configargparse.ArgumentParser(
description='cross-platform CLI tool for installing firefox and managing profiles')
parser.add_argument('-i', '--install',
help='install firefox version (release, beta, aurora, nightly',
default='nightly',
type=str)
parser.add_argument('-u', '--uninstall',
help='install firefox version (release, beta, aurora, nightly, ALL',
type=str)
parser.add_argument('-p', '--create-profile',
help='create new profile (indicate name)',
type=str)
parser.add_argument('-d', '--delete-profile',
help='delete profile (indicate name)',
type=str)
parser.add_argument('-s', '--set-profile-path',
help='-s <path to profile>',
default='<put OS-specific default path here??>',
type=str)
args = parser.parse_args()
return args, parser
def main():
"""Main entrypoint for CLI"""
args, parser = _parse_args()
print('INSTALL: {0}'.format(args.install))
print('UNINSTALL: {0}'.format(args.uninstall))
print('CREATE PROFILE: {0}'.format(args.create_profile))
print('DELETE PROFILE: {0}'.format(args.delete_profile))
print('SET PROFILE PATH: {0}'.format(args.set_profile_path))
if __name__ == '__main__':
main()

Просмотреть файл

@ -44,7 +44,7 @@ class FirefoxUninstall(object):
# If we're on Windows/Cygwin, use the uninstaller.
if self.config.is_windows():
local("\"{0}/uninstall/helper.exe\" -ms".format(path_firefox_app))
local("\"{0}/uninstall/helper.exe\" -ms".format(path_firefox_app)) # NOQA
# Otherwise just rimraf the Firefox folder.
else:

Просмотреть файл

@ -2,10 +2,7 @@
import argparse
from cmd_download import cmd_download
from cmd_install import cmd_install
from cmd_profile import cmd_profile
from cmd_uninstall import cmd_uninstall
from cmd import CMDDownload, CMDInstall, CMDUninstall, CMDProfile
CHANNELS = ['gr', 'release', 'stable',
'beta',
@ -30,6 +27,7 @@ def get_channel(channel):
return channel
def main():
parser = argparse.ArgumentParser(prog='ff')
subparsers = parser.add_subparsers(help='commands', dest='command')
@ -38,13 +36,17 @@ Global arguments...
"""
# parser.add_argument('--foo', action='store_true', help='foo help')
download = cmd_download(subparsers, CHANNELS, DEFAULT_CHANNEL)
install = cmd_install(subparsers, CHANNELS, DEFAULT_CHANNEL)
profile = cmd_profile(subparsers)
uninstall = cmd_uninstall(subparsers, CHANNELS, DEFAULT_CHANNEL)
CMDDownload(subparsers, CHANNELS, DEFAULT_CHANNEL)
CMDInstall(subparsers, CHANNELS, DEFAULT_CHANNEL)
CMDProfile(subparsers)
CMDUninstall(subparsers, CHANNELS, DEFAULT_CHANNEL)
options = parser.parse_args()
if "channel" in options:
options.channel = get_channel(options.channel)
options.func(options)
if __name__ == '__main__':
main()

Просмотреть файл

@ -1,4 +1,6 @@
Fabric3
configargparse
configparser
mozdownload
mozdownload==1.20.2
tox==2.3.1
flake8==2.5.4

Просмотреть файл

@ -34,7 +34,7 @@ setup(name='ff-tool',
zip_safe=False,
entry_points='''
[console_scripts]
fftool = fftool.main:menu
ff = fftool.main:main
''',
**extra_options
)