From f0e046ac83ffef85ada6cf0c9766c7aff476d878 Mon Sep 17 00:00:00 2001 From: gimick Date: Sat, 5 Mar 2011 18:17:46 +0000 Subject: [PATCH 01/41] exe: python 2.7 upgrade + cdecimal import --- .../MySqlPython1.2.3WalkthroughPython27.txt | 125 +++++ packaging/windows/py27-links.txt | 30 +- .../windows/py2exeWalkthroughPython27.txt | 241 ++++++++++ packaging/windows/py2exe_setup.py | 450 +++++++++--------- packaging/windows/pypoker138walkthrough.txt | 57 ++- 5 files changed, 648 insertions(+), 255 deletions(-) create mode 100644 packaging/windows/MySqlPython1.2.3WalkthroughPython27.txt create mode 100644 packaging/windows/py2exeWalkthroughPython27.txt diff --git a/packaging/windows/MySqlPython1.2.3WalkthroughPython27.txt b/packaging/windows/MySqlPython1.2.3WalkthroughPython27.txt new file mode 100644 index 00000000..224bf9f9 --- /dev/null +++ b/packaging/windows/MySqlPython1.2.3WalkthroughPython27.txt @@ -0,0 +1,125 @@ +Create MySqlPython version 1.2.3 windows installer for Python26 + +This walkthrough is derived from excellent installation instructions released under GNU Free Documentation License 1.2. The original work is here ... http://www.bcspcsonline.com/wiki/index.php?title=MySQL-5.1.34_Python-2.6_Module_Build_Instructions The Wiki author appears to be "Irondesk" + +This version by Gimick on 29th June 2010 +Content is available under GNU Free Documentation License 1.2 + +Premamble +--------- + + +The FPDB exe needs to build against the MySql-Python project. Unfortunately, for python 2.6 there is no official installer for windows, and none is ever likely to be provided. + +Community builds are available, but to reduce third-party dependencies, we will build our own here. + +Step 0 Get a fresh XP installation +---------------------------------- + +0.1/ Using XPhome 32bit + + +Step 1, VisualStudio 2008 express install +----------------------------------------- + +1.1/ Get the ISO CD from here ... http://www.microsoft.com/express/Downloads/#2008-All + +1.2/ Run and install Visual C++ only, don't bother with the additional packages offered + +This package will run 30 days before registration is needed + + +Step 2, setup Mysql Server +-------------------------- + +2.1/ Install MySQL server runtime ... http://downloads.mysql.com/archives/mysql-5.1/mysql-5.1.34-win32.msi + +Choose Typical, choose configure, choose Standard Configuration, choose all defaults, supply admin username/password. + + +Step 3, more installs +---------------------- + +3.1/ install the following in sequence (accept all default options) there should be no errors ! + +Python 2.7 ... http://python.org/ftp/python/2.7/python-2.7.msi +7zip 914 ... http://sourceforge.net/projects/sevenzip/files/7-Zip/9.14/7z914.exe/download + + +Step 4, grab Mysql server Source +-------------------------------- + +4.1/ Download ... http://downloads.mysql.com/archives/mysql-5.1/mysql-noinstall-5.1.34-win32.zip +4.2/ Unpacking Desktop\mysqlsource (use 7zip) +4.3/ Copy the following source directories to the MySql installation: + +dos> xcopy Desktop\mysqlsource\mysql-5.1.34-win32\data\* "c:\Program Files\MySQL\MySQL Server 5.1\data" /I/E/F/H +dos> xcopy Desktop\mysqlsource\mysql-5.1.34-win32\Embedded\* "c:\Program Files\MySQL\MySQL Server 5.1\Embedded" /I/E/F/H +dos> xcopy Desktop\mysqlsource\mysql-5.1.34-win32\include\* "c:\Program Files\MySQL\MySQL Server 5.1\include" /I/E/F/H +dos> xcopy Desktop\mysqlsource\mysql-5.1.34-win32\lib\* "c:\Program Files\MySQL\MySQL Server 5.1\lib" /I/E/F/H +dos> xcopy Desktop\mysqlsource\mysql-5.1.34-win32\mysql-test\* "c:\Program Files\MySQL\MySQL Server 5.1\mysql-test" /I/E/F/H +dos> xcopy Desktop\mysqlsource\mysql-5.1.34-win32\sql-bench\* "c:\Program Files\MySQL\MySQL Server 5.1\sql-bench" /I/E/F/H + +4.4/ You can delete Destop\mysqlsource, is no longer needed. + + +Step 5, grab Mysql-python source +-------------------------------- + +5.1/ get download +MySql for python ... http://sourceforge.net/projects/mysql-python/files/mysql-python/1.2.3/MySQL-python-1.2.3.tar.gz/download + +5.2/ extract MySQL-python-1.2.3 directory to the Desktop using 7zip +(note: use 7zip, open the gz, then open the tar, then extract the directory found inside there) + +Desktop\MySQL-python-1.2.3 should now exist + + +Step 6, get python build tools +------------------------------ + +6.1/ get Easy Setup installer +Easy setup installer ... http://peak.telecommunity.com/dist/ez_setup.py + +6.2/ Check the DEFAULT VERSION specified in Easy Setup and get the corresponding setuptools (version c11 in this case) +Setuptools version 11 ... http://pypi.python.org/packages/2.7/s/setuptools/setuptools-0.6c11-py2.7.egg + +6.3/ Put both of these files into Desktop\MySQL-python-1.2.3, overwriting any existing files + + +Step 7, install the build tool +------------------------------ + +dos> cd Desktop\MySQL-python-1.2.3 +dos> c:\Python27\python.exe ez_setup.py setuptools-0.6c11-py2.7.egg + + +Step 8, Tweak the configuration +------------------------------- + +dos> cd Desktop\MySQL-python-1.2.3 + +8.1/ dos> write site.cfg + +Change registry_key = SOFTWARE\MySQL AB\MySQL Server 5.0 + to registry_key = SOFTWARE\MySQL AB\MySQL Server 5.1 + + +Step 9, build +------------- + +dos> cd Desktop\MySQL-python-1.2.3 + +9.1/ dos> c:\python27\python.exe setup.py build + +* Note: You will probably get a bunch of warnings and maybe a manifest error status 31, these are ok as long as there are no errors in compiling or linking. +* Note: This will generate the "MySQL-python-1.2.3/build" folder + +9.2/ dos> c:\python27\python.exe setup.py bdist_wininst + + +Step 10, done +------------- + +10.1/ the \dist directory will contain MySQL-python-1.2.3.win32-py2.7.exe !!!!! +10.2/ upload this file to sourceforge diff --git a/packaging/windows/py27-links.txt b/packaging/windows/py27-links.txt index cb1e413c..00f3cd81 100644 --- a/packaging/windows/py27-links.txt +++ b/packaging/windows/py27-links.txt @@ -1,16 +1,24 @@ -This is a list of download links of Windows packages for Python 2.7 of our dependencies. +This is a list of download links of Windows32 packages for Python 2.7 of our dependencies. -These are as of 26Feb2011: -matplotlib 1.0.1 ... http://sourceforge.net/projects/matplotlib/files/matplotlib/matplotlib-1.0.1/ -pygtk 2.22 ... http://ftp.gnome.org/pub/GNOME/binaries/win32/pygtk/2.22/ -pycairo 1.8.10 ... http://ftp.gnome.org/pub/GNOME/binaries/win32/pycairo/1.8/ -pyGobject X ... http://ftp.gnome.org/pub/GNOME/binaries/win32/pygobject/2.26/ +These are as of 27Feb2011: - -The below are from Aug2010, and should probably be updated to newer versions: +Required: Python 2.7 ... http://python.org/ftp/python/2.7/python-2.7.msi -pywin 214 ... https://sourceforge.net/projects/pywin32/files/pywin32/Build%20214/pywin32-214.win32-py2.7.exe/download -py2exe 0.6.9 ... https://sourceforge.net/projects/py2exe/files/py2exe/0.6.9/py2exe-0.6.9.win32-py2.7.exe/download -psycopg2 ... http://www.stickpeople.com/projects/python/win-psycopg/psycopg2-2.2.2.win32-py2.7-pg8.4.4-release.exe +gtk+ allinone... http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.22/gtk+-bundle_2.22.1-20101227_win32.zip +matplotlib 1.0.1 ... http://sourceforge.net/projects/matplotlib/files/matplotlib/matplotlib-1.0.1/matplotlib-1.0.1.win32-py2.7.exe/download +pygtk 2.22 ... http://ftp.gnome.org/pub/GNOME/binaries/win32/pygtk/2.22/pygtk-2.22.0-1.win32-py2.7.exe +pycairo 1.8.10 ... http://ftp.gnome.org/pub/GNOME/binaries/win32/pycairo/1.8/pycairo-1.8.10.win32-py2.7.exe +pyGobject X ... http://ftp.gnome.org/pub/GNOME/binaries/win32/pygobject/2.26/pygobject-2.26.0-1.win32-py2.7.exe +pywin 216 ... http://sourceforge.net/projects/pywin32/files/pywin32/Build216/pywin32-216.win32-py2.7.exe/download +numpy 1.5.1 ... http://sourceforge.net/projects/numpy/files/NumPy/1.5.1/numpy-1.5.1-win32-superpack-python2.7.exe/download +pypokereval 138 ... http://sourceforge.net/projects/fpdb/files/fpdb/pokereval-138.win32-py2.7.exe/download + +optional: +cdecimal 2.2 ... http://www.bytereef.org/software/mpdecimal/releases/cdecimal-2.2.win32-py2.7.msi +mysql-python 1.2.3 ... http://sourceforge.net/projects/fpdb/files/fpdb/MySQL-python-1.2.3.win32-py2.7.exe/download +psycopg2 ... http://www.stickpeople.com/projects/python/win-psycopg/psycopg2-2.3.1.win32-py2.7-pg9.0.1-release.exe + +Developers only: +py2exe 0.6.9 ... http://sourceforge.net/projects/py2exe/files/py2exe/0.6.9/py2exe-0.6.9.win32-py2.7.exe/download diff --git a/packaging/windows/py2exeWalkthroughPython27.txt b/packaging/windows/py2exeWalkthroughPython27.txt new file mode 100644 index 00000000..c1fe722c --- /dev/null +++ b/packaging/windows/py2exeWalkthroughPython27.txt @@ -0,0 +1,241 @@ +PY2EXE walkthrough for Python 2.7 & FPDB 0.2x +created on 27th Feb 2011 by Gimick + +This walkthrough is derived from comments in the py2exe script made by Ray and SqlCoder +Additional information, formatting, updating to Python 2.6 and Python 2.7 and sequencing added by Gimick +Content is available under the the GNU Affero General Public License version 3 + + + +Step 0 Get a fresh XP installation +---------------------------------- + +0.1/ Using XPhome or Pro 32bit + +0.2/ Ensure the CPU supports SSE2 instruction set or better. + + +Step 1, dependency install +-------------------------- + +1.1/ install the following in sequence (accept all default options) there should be no errors ! + +Python 2.7 ... http://python.org/ftp/python/2.7/python-2.7.msi +matplotlib 1.0.1 ... http://sourceforge.net/projects/matplotlib/files/matplotlib/matplotlib-1.0.1/matplotlib-1.0.1.win32-py2.7.exe/download +pygtk 2.22 ... http://ftp.gnome.org/pub/GNOME/binaries/win32/pygtk/2.22/pygtk-2.22.0-1.win32-py2.7.exe +pycairo 1.8.10 ... http://ftp.gnome.org/pub/GNOME/binaries/win32/pycairo/1.8/pycairo-1.8.10.win32-py2.7.exe +pyGobject X 2.26 ... http://ftp.gnome.org/pub/GNOME/binaries/win32/pygobject/2.26/pygobject-2.26.0-1.win32-py2.7.exe +pywin 216 ... http://sourceforge.net/projects/pywin32/files/pywin32/Build216/pywin32-216.win32-py2.7.exe/download + +pypokereval 138 ... http://sourceforge.net/projects/fpdb/files/fpdb/pokereval-138.win32-py2.7.exe/download +cdecimal 2.2 ... http://www.bytereef.org/software/mpdecimal/releases/cdecimal-2.2.win32-py2.7.msi +psycopg2 ... http://www.stickpeople.com/projects/python/win-psycopg/psycopg2-2.2.1.win32-py2.6-pg8.4.3-release.exe + +(Note: stickpeople is the offical repository, not a community build) + +py2exe 0.6.9 ... http://sourceforge.net/projects/py2exe/files/py2exe/0.6.9/py2exe-0.6.9.win32-py2.7.exe/download + +1.2/ MySQL + +Install the following file: +mysql-python 1.2.3 ... http://sourceforge.net/projects/fpdb/files/fpdb/MySQL-python-1.2.3.win32-py2.7.exe/download + +1.3/ pytz fixup to work in an executable package + +pytz needs runtime access to timezone definition files. pytz is hard-coded to search in the directory from which the pytz .py modules are being run. +In a py2exe package, this directory is actually a library.zip container file, so windows cannot find the timezone definitions, and will crash the app. + +We need to make a one-line change to pytz to search in the current working directory (which is not a container), and not the application directory. +The py2exe script copies the timezone datafiles into the package folder pyfpdb/zoneinfo. + +Thanks to Jeff Peck gmail.com> on the py2exe mailing list for documenting this problem and solution. + +1.3.1/ Navigate to C:\Python27\Lib\site-packages\pytz +1.3.2/ Edit __init__.py +1.3.3/ At line 55 replace the following line(s): + + filename = os.path.join(os.path.dirname(__file__), + 'zoneinfo', *name_parts) + +with this line: + + filename = os.path.join(os.getcwd(), 'zoneinfo', *name_parts) + +1.3.4/ Save and exit + + +1.4/ Patch py2exe to stop popup runtime error message + +see http://www.py2exe.org/index.cgi/StderrLog for technical info. + +1.4.1/ + +dos> write C:\Python27\Lib\site-packages\py2exe\boot_common.py + +replace: + atexit.register(alert, 0, + "See the logfile '%s' for details" % fname, + "Errors occurred") +with: + #atexit.register(alert, 0, + # "See the logfile '%s' for details" % fname, + # "Errors occurred") + +1.4.2/ save and exit + + + +Step 2 Setup GTK +----------------- + +There are quite a few GTK packages needed, and rather than install them individually, I used the official AllinOne from the GTK project. + +2,1/ Create a new folder c:\GTK + +2.2/ Extract the following zip file into c:\GTK + +gtk+ allinone 2.22.1 ... http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.22/gtk+-bundle_2.22.1-20101227_win32.zip + +2.3/ If everything has worked, you should have c:\GTK\bin \etc \lib \src and so on created. + +2.4/ The /share/doc and /share/gtk-doc folders are huge, so can be emptied now (leave the /doc and /gtk-doc folders + in place, but delete the content) + + +Step 3 Set GTK into the PATH variable +------------------------------------- + +The path for GTK isn't set by default, so need to let the o/s know where the GTK stuff is. + +3.1/ Rightclick on mycomputer to show system properties +3.2/ select advanced/environment Variables +3.3/ in "system variables" NOT "user variables" do the following +3.3.1/ create a new item as name: GTK_BASEPATH value: c:\GTK +3.3.2/ edit the item "path", press home to get to the first character and insert the following text, (no quotes, including semicolon) %GTK_BASEPATH%\bin; + +3.4/ to check, open command prompt and do: + +dos>path ... system should respond with ... PATH=c:\GTK\bin;C:\WIN........ + +3.5/ Give it a spin to test (hopefully an application will start, if not, something has gone wrong) + +dos> gtk-demo + + +Step 4 Get the fpdb GIT tree +---------------------------- + +4.1/ Best to take a copy to work with; following steps will assume that the fpdb folder is on the Desktop +4.2/ Edit the script in packaging/windows/py2exe_setup.py to set the fpdbver variable for this release + + +5.3/ Install correct Numpy for this build +----------------------------------------- + +Numpy needs special handling, as by default it will install an optimised version for the SSE level of your CPU (SSE3, SSE2 or noSSE). This means that the completed package will not run on an older CPU. + +For this reason, do not just run the installer downloaded. We will force a nosse version, to minimise problems on +older client PC's + +5.3.1/ download the package to the Desktop + +numpy 1.5.1 ... http://sourceforge.net/projects/numpy/files/NumPy/1.5.1/numpy-1.5.1-win32-superpack-python2.7.exe/download + +5.3.3/ If you are wanting to build a package which works on all CPU's, install noSSE as follows: + +dos> cd Desktop +dos> numpy-1.5.1-win32-superpack-python2.7.exe /arch nosse + +5.3.4/ At the end of the installation, click on "show details" to confirm the installation. + +"Target CPU handles SSE2" +"Target CPU handles SSE3" +"nosse install (arch value: nosse)" +"Install NO SSE" +Extract: numpy-1.5.1-nosse.exe... 100% +Execute: "C:\DOCUME~1\user\LOCALS~1\Temp\numpy-1.5.1-nosse.exe" +Completed + +Step 6 Run py2exe to generate fpdb.exe +-------------------------------------- + +6.1/ Run the script to create the fpdb.exe bundle + +dos> cd Desktop\fpdb\packaging\windows +dos> c:\python27\python.exe py2exe_setup.py py2exe + +wait a while, watch lots of copying and whatever. + +6.2/ You should next get prompted for the GTK folder. +c:\GTK + +6.3/ If there are no errors reported, it has probably worked, we will test soon. + +Build notes: + +There is a warning about dll's not included "umath.pyd - c:\Python27\lib\site-packages\numpy\core\umath.pyd" + - reason for this is not understood at present. (Umath is apparently included in the built package). + + +Step 7 not currently used +------------------------- + +Has been deleted + + +Step 8 Drag out the completed bundle +------------------------------------ + +py2exe creates a new folder for the created software bundle, drag this out to the desktop for ease of working. + +8.1/ Drag Desktop\fpdb\packaging\windows\fpdb-n.nn.nnn to Desktop\ + + +Step 9 Initial run +------------------ + +9.1/ Open the Desktop\fpdb-n.nn.nnn folder +9.2/ In explorer...tools...folder options...View uncheck "Hide extensions for known file types" +9.3/ Double click run_fpdb.bat +9.4/ check the contents of pyfpdb\fpdb.exe.log, deal with any errors thrown + +9.5/ hopefully, fpdb will run +9.6/ Try out a few options, deal with any errors reported + +Observe that the msvcp90.dll was provided by the python runtime package, so we don't have to install the separate package from Microsoft. End-users will, however need the dependency. + + +Step 11 pruning +--------------- + +11.1/ The generated folder is 100+MB and can be pruned by removing the following directories: + +pyfpdb/lib/glib-2.0 +pyfpdb/lib/pkgconfig +pyfpdb/share/aclocal +pyfpdb/share/doc +pyfpdb/share/glib-2.0 +pyfpdb/share/gtk-2.0 +pyfpdb/share/gtk-doc +pyfpdb/share/locale +pyfpdb/share/man + + +Step 12 rename folder +--------------------- + +If needed, rename the folder to something meaningful to the community. If you have built for NoSSE, append anyCPU to the directory name. + + +Step 13 Compress to executable archive +-------------------------------------- + +13.1/ Download and install 7zip 914 ... http://sourceforge.net/projects/sevenzip/files/7-Zip/9.14/7z914.exe/download +13.2/ Rightclick on fpdb executable folder, select 7zip Add to archive... select SFX archive option switch +13.3/ Test the created exe file + +Step 14 If you need to build again for a different SSE level +------------------------------------------------------------ + +Go back to step 5 and run again. + diff --git a/packaging/windows/py2exe_setup.py b/packaging/windows/py2exe_setup.py index 84b75886..25a54c79 100644 --- a/packaging/windows/py2exe_setup.py +++ b/packaging/windows/py2exe_setup.py @@ -1,225 +1,225 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -"""setup.py - -Py2exe script for fpdb. -""" -# Copyright 2009-2010, Ray E. Barker -# -# 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 2 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, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -######################################################################## - -#TODO: -# get rid of all the uneeded libraries (e.g., pyQT) -# think about an installer - -# done: change GuiAutoImport so that it knows to start HUD_main.exe, when appropriate -# include the lib needed to handle png files in mucked - -#HOW TO USE this script: -# -#- cd to the folder where this script is stored, usually ...packaging/windows -#- Run the script with python "py2exe_setup.py py2exe" -#- You will frequently get messages about missing .dll files.just assume other -# person will have them? we have copyright issues including some dll's -#- If it works, you'll have a new dir fpdb-YYYYMMDD-exe which should -# contain 2 dirs; gfx and pyfpdb and run_fpdb.bat -#- [ This bit is now automated: -# Last, you must copy the etc/, lib/ and share/ folders from your -# gtk/bin/ (just /gtk/?) folder to the pyfpdb folder. (the whole folders, -# not just the contents) ] -#- You can (should) then prune the etc/, lib/ and share/ folders to -# remove components we don't need. (see output at end of program run) - -# See walkthrough in packaging directory for versions used - -# steffeN: Doesnt seem necessary to gettext-ify this, but feel free to if you disagree -# Gimick: restructure to allow script to run from packaging/windows directory, and not to write to source pyfpdb - - -import os -import sys - -# get out now if parameter not passed -try: - sys.argv[1] <> "" -except: - print "A parameter is required, quitting now" - quit() - -from distutils.core import setup -import py2exe -import glob -import matplotlib -import shutil -#from datetime import date - -def isSystemDLL(pathname): - #dwmapi appears to be vista-specific file, not XP - if os.path.basename(pathname).lower() in ("dwmapi.dll"): - return 0 - return origIsSystemDLL(pathname) - -def test_and_remove(top): - if os.path.exists(top): - if os.path.isdir(top): - remove_tree(top) - else: - print "Unexpected file '"+top+"' found. Exiting." - exit() - -def remove_tree(top): - # Delete everything reachable from the directory named in 'top', - # assuming there are no symbolic links. - # CAUTION: This is dangerous! For example, if top == '/', it - # could delete all your disk files. - # sc: Nicked this from somewhere, added the if statement to try - # make it a bit safer - if top in ('build','dist',distdir) and os.path.basename(os.getcwd()) == 'windows': - #print "removing directory '"+top+"' ..." - for root, dirs, files in os.walk(top, topdown=False): - for name in files: - os.remove(os.path.join(root, name)) - for name in dirs: - os.rmdir(os.path.join(root, name)) - os.rmdir(top) - -def copy_tree(source,destination): - source = source.replace('\\', '\\\\') - destination = destination.replace('\\', '\\\\') - print "*** Copying " + source + " to " + destination + " ***" - shutil.copytree( source, destination ) - -def copy_file(source,destination): - source = source.replace('\\', '\\\\') - destination = destination.replace('\\', '\\\\') - print "*** Copying " + source + " to " + destination + " ***" - shutil.copy( source, destination ) - - -fpdbver = '0.21.rc1' - -distdir = r'fpdb-' + fpdbver -rootdir = r'../../' #cwd is normally /packaging/windows -pydir = rootdir+'pyfpdb/' -gfxdir = rootdir+'gfx/' -sys.path.append( pydir ) # allows fpdb modules to be found by options/includes below - - -print "\n" + r"Output will be created in "+distdir - -print "*** Cleaning working folders ***" -test_and_remove('dist') -test_and_remove('build') -test_and_remove(distdir) - -print "*** Building now in dist folder ***" - -origIsSystemDLL = py2exe.build_exe.isSystemDLL -py2exe.build_exe.isSystemDLL = isSystemDLL - -setup( - name = 'fpdb', - description = 'Free Poker DataBase', - version = fpdbver, - - windows = [ {'script': pydir+'fpdb.pyw', "icon_resources": [(1, gfxdir+"fpdb_large_icon.ico")]}, - {'script': pydir+'HUD_main.pyw', }, - {'script': pydir+'Configuration.py', } - ], - - console = [ {'script': pydir+'Stove.py', } - ], - - options = {'py2exe': { - 'packages' : ['encodings', 'matplotlib'], - 'includes' : ['gio', 'cairo', 'pango', 'pangocairo', 'atk', 'gobject' - ,'matplotlib.numerix.random_array' - ,'AbsoluteToFpdb', 'BetfairToFpdb' - ,'CarbonToFpdb', 'EverleafToFpdb' - ,'FulltiltToFpdb', 'iPokerToFpdb' - ,'OnGameToFpdb', 'PartyPokerToFpdb' - ,'PkrToFpdb', 'PokerStarsToFpdb' - ,'Win2dayToFpdb', 'WinamaxToFpdb' - ], - 'excludes' : ['_tkagg', '_agg2', 'cocoaagg', 'fltkagg'], - 'dll_excludes': ['libglade-2.0-0.dll', 'libgdk-win32-2.0-0.dll', 'libgobject-2.0-0.dll' - , 'msvcr90.dll', 'MSVCP90.dll', 'MSVCR90.dll','msvcr90.dll'], # these are vis c / c++ runtimes, and must not be redistributed - } - }, - - # files in 2nd value in tuple are moved to dir named in 1st value - # this code will not walk a tree - # Note: cwd for 1st value is packaging/windows/dist (this is confusing BTW) - # Note: only include files here which are to be put into the package pyfpdb folder or subfolders - - data_files = [('', glob.glob(rootdir+'*.txt')) - ,('', [pydir+'HUD_config.xml.example',pydir+'Cards01.png', pydir+'logging.conf']) - ] + matplotlib.get_py2exe_datafiles() -) - -# ,(distdir, [rootdir+'run_fpdb.bat']) -# ,(distdir+r'\gfx', glob.glob(gfxdir+'*.*')) -# ] + -print "*** py2exe build phase complete ***" - -# copy zone info and fpdb translation folders -copy_tree (r'c:\python26\Lib\site-packages\pytz\zoneinfo', os.path.join(r'dist', 'zoneinfo')) -copy_tree (pydir+r'locale', os.path.join(r'dist', 'locale')) - -# create distribution folder and populate with gfx + bat -copy_tree (gfxdir, os.path.join(distdir, 'gfx')) -copy_file (rootdir+'run_fpdb.bat', distdir) - -print "*** Renaming dist folder as distribution pyfpdb folder ***" -dest = os.path.join(distdir, 'pyfpdb') -os.rename( 'dist', dest ) - -print "*** copying GTK runtime ***" -gtk_dir = "" -while not os.path.exists(gtk_dir): - print "Enter directory name for GTK (e.g. c:/gtk) : ", # the comma means no newline - gtk_dir = sys.stdin.readline().rstrip() - -print "*** copying GTK runtime ***" -dest = os.path.join(distdir, 'pyfpdb') -copy_file(os.path.join(gtk_dir, 'bin', 'libgdk-win32-2.0-0.dll'), dest ) -copy_file(os.path.join(gtk_dir, 'bin', 'libgobject-2.0-0.dll'), dest) -copy_tree(os.path.join(gtk_dir, 'etc'), os.path.join(dest, 'etc')) -copy_tree(os.path.join(gtk_dir, 'lib'), os.path.join(dest, 'lib')) -copy_tree(os.path.join(gtk_dir, 'share'), os.path.join(dest, 'share')) - -print "*** All done! ***" -test_and_remove('build') -print distdir+" is in the pyfpdb dir" -print """ -The following dirs can probably removed to make the final package smaller: - -pyfpdb/lib/glib-2.0 -pyfpdb/lib/gtk-2.0/include -pyfpdb/lib/pkgconfig -pyfpdb/share/aclocal -pyfpdb/share/doc -pyfpdb/share/glib-2.0 -pyfpdb/share/gtk-2.0 -pyfpdb/share/gtk-doc -pyfpdb/share/locale -pyfpdb/share/man -pyfpdb/share/themes/Default - -Use 7-zip to zip up the distribution and create a self extracting archive and that's it! -""" +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +"""setup.py + +Py2exe script for fpdb. +""" +# Copyright 2009-2010, Ray E. Barker +# +# 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 2 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, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +######################################################################## + +#TODO: +# get rid of all the uneeded libraries (e.g., pyQT) +# think about an installer + +# done: change GuiAutoImport so that it knows to start HUD_main.exe, when appropriate +# include the lib needed to handle png files in mucked + +#HOW TO USE this script: +# +#- cd to the folder where this script is stored, usually ...packaging/windows +#- Run the script with python "py2exe_setup.py py2exe" +#- You will frequently get messages about missing .dll files.just assume other +# person will have them? we have copyright issues including some dll's +#- If it works, you'll have a new dir fpdb-YYYYMMDD-exe which should +# contain 2 dirs; gfx and pyfpdb and run_fpdb.bat +#- [ This bit is now automated: +# Last, you must copy the etc/, lib/ and share/ folders from your +# gtk/bin/ (just /gtk/?) folder to the pyfpdb folder. (the whole folders, +# not just the contents) ] +#- You can (should) then prune the etc/, lib/ and share/ folders to +# remove components we don't need. (see output at end of program run) + +# See walkthrough in packaging directory for versions used + +# steffeN: Doesnt seem necessary to gettext-ify this, but feel free to if you disagree +# Gimick: restructure to allow script to run from packaging/windows directory, and not to write to source pyfpdb + + +import os +import sys + +# get out now if parameter not passed +try: + sys.argv[1] <> "" +except: + print "A parameter is required, quitting now" + quit() + +from distutils.core import setup +import py2exe +import glob +import matplotlib +import shutil +import cdecimal + +def isSystemDLL(pathname): + #dwmapi appears to be vista-specific file, not XP + if os.path.basename(pathname).lower() in ("dwmapi.dll"): + return 0 + return origIsSystemDLL(pathname) + +def test_and_remove(top): + if os.path.exists(top): + if os.path.isdir(top): + remove_tree(top) + else: + print "Unexpected file '"+top+"' found. Exiting." + exit() + +def remove_tree(top): + # Delete everything reachable from the directory named in 'top', + # assuming there are no symbolic links. + # CAUTION: This is dangerous! For example, if top == '/', it + # could delete all your disk files. + # sc: Nicked this from somewhere, added the if statement to try + # make it a bit safer + if top in ('build','dist',distdir) and os.path.basename(os.getcwd()) == 'windows': + #print "removing directory '"+top+"' ..." + for root, dirs, files in os.walk(top, topdown=False): + for name in files: + os.remove(os.path.join(root, name)) + for name in dirs: + os.rmdir(os.path.join(root, name)) + os.rmdir(top) + +def copy_tree(source,destination): + source = source.replace('\\', '\\\\') + destination = destination.replace('\\', '\\\\') + print "*** Copying " + source + " to " + destination + " ***" + shutil.copytree( source, destination ) + +def copy_file(source,destination): + source = source.replace('\\', '\\\\') + destination = destination.replace('\\', '\\\\') + print "*** Copying " + source + " to " + destination + " ***" + shutil.copy( source, destination ) + + +fpdbver = '0.21' + +distdir = r'fpdb-' + fpdbver +rootdir = r'../../' #cwd is normally /packaging/windows +pydir = rootdir+'pyfpdb/' +gfxdir = rootdir+'gfx/' +sys.path.append( pydir ) # allows fpdb modules to be found by options/includes below + + +print "\n" + r"Output will be created in "+distdir + +print "*** Cleaning working folders ***" +test_and_remove('dist') +test_and_remove('build') +test_and_remove(distdir) + +print "*** Building now in dist folder ***" + +origIsSystemDLL = py2exe.build_exe.isSystemDLL +py2exe.build_exe.isSystemDLL = isSystemDLL + +setup( + name = 'fpdb', + description = 'Free Poker DataBase', + version = fpdbver, + + windows = [ {'script': pydir+'fpdb.pyw', "icon_resources": [(1, gfxdir+"fpdb_large_icon.ico")]}, + {'script': pydir+'HUD_main.pyw', }, + {'script': pydir+'Configuration.py', } + ], + + console = [ {'script': pydir+'Stove.py', } + ], + + options = {'py2exe': { + 'packages' : ['encodings', 'matplotlib'], + 'includes' : ['gio', 'cairo', 'pango', 'pangocairo', 'atk', 'gobject' + ,'matplotlib.numerix.random_array' + ,'AbsoluteToFpdb', 'BetfairToFpdb' + ,'CarbonToFpdb', 'EverleafToFpdb' + ,'FulltiltToFpdb', 'iPokerToFpdb' + ,'OnGameToFpdb', 'PartyPokerToFpdb' + ,'PkrToFpdb', 'PokerStarsToFpdb' + ,'Win2dayToFpdb', 'WinamaxToFpdb' + ], + 'excludes' : ['_tkagg', '_agg2', 'cocoaagg', 'fltkagg'], + 'dll_excludes': ['libglade-2.0-0.dll', 'libgdk-win32-2.0-0.dll', 'libgobject-2.0-0.dll' + , 'msvcr90.dll', 'MSVCP90.dll', 'MSVCR90.dll','msvcr90.dll'], # these are vis c / c++ runtimes, and must not be redistributed + } + }, + + # files in 2nd value in tuple are moved to dir named in 1st value + # this code will not walk a tree + # Note: cwd for 1st value is packaging/windows/dist (this is confusing BTW) + # Note: only include files here which are to be put into the package pyfpdb folder or subfolders + + data_files = [('', glob.glob(rootdir+'*.txt')) + ,('', [pydir+'HUD_config.xml.example',pydir+'Cards01.png', pydir+'logging.conf']) + ] + matplotlib.get_py2exe_datafiles() +) + +# ,(distdir, [rootdir+'run_fpdb.bat']) +# ,(distdir+r'\gfx', glob.glob(gfxdir+'*.*')) +# ] + +print "*** py2exe build phase complete ***" + +# copy zone info and fpdb translation folders +copy_tree (r'c:\python27\Lib\site-packages\pytz\zoneinfo', os.path.join(r'dist', 'zoneinfo')) +copy_tree (pydir+r'locale', os.path.join(r'dist', 'locale')) + +# create distribution folder and populate with gfx + bat +copy_tree (gfxdir, os.path.join(distdir, 'gfx')) +copy_file (rootdir+'run_fpdb.bat', distdir) + +print "*** Renaming dist folder as distribution pyfpdb folder ***" +dest = os.path.join(distdir, 'pyfpdb') +os.rename( 'dist', dest ) + +print "*** copying GTK runtime ***" +gtk_dir = "" +while not os.path.exists(gtk_dir): + print "Enter directory name for GTK (e.g. c:/gtk) : ", # the comma means no newline + gtk_dir = sys.stdin.readline().rstrip() + +print "*** copying GTK runtime ***" +dest = os.path.join(distdir, 'pyfpdb') +copy_file(os.path.join(gtk_dir, 'bin', 'libgdk-win32-2.0-0.dll'), dest ) +copy_file(os.path.join(gtk_dir, 'bin', 'libgobject-2.0-0.dll'), dest) +copy_tree(os.path.join(gtk_dir, 'etc'), os.path.join(dest, 'etc')) +copy_tree(os.path.join(gtk_dir, 'lib'), os.path.join(dest, 'lib')) +copy_tree(os.path.join(gtk_dir, 'share'), os.path.join(dest, 'share')) + +print "*** All done! ***" +test_and_remove('build') +print distdir+" is in the pyfpdb dir" +print """ +The following dirs can probably removed to make the final package smaller: + +pyfpdb/lib/glib-2.0 +pyfpdb/lib/gtk-2.0/include +pyfpdb/lib/pkgconfig +pyfpdb/share/aclocal +pyfpdb/share/doc +pyfpdb/share/glib-2.0 +pyfpdb/share/gtk-2.0 +pyfpdb/share/gtk-doc +pyfpdb/share/locale +pyfpdb/share/man +pyfpdb/share/themes/Default + +Use 7-zip to zip up the distribution and create a self extracting archive and that's it! +""" diff --git a/packaging/windows/pypoker138walkthrough.txt b/packaging/windows/pypoker138walkthrough.txt index 1c7ee0f4..f4e5f3af 100644 --- a/packaging/windows/pypoker138walkthrough.txt +++ b/packaging/windows/pypoker138walkthrough.txt @@ -2,6 +2,7 @@ pypokereval build for windows stepbystep guide ---------------------------------------------- Created by Gimick on 3rd December 2010 +Updated for py27 by Gimick 27th Feb 2011 This walkthrough is derived with the assistance of EricBlade and the build notes supplied by Loic Dachary http://dachary.org/ @@ -12,7 +13,7 @@ Content is available under the the GNU Affero General Public License version 3 0. Build environ ---------------- -We are building against the 2008 runtime because Python 2.6 +We are building against the 2008 runtime because Python 2.7 has the same dependency (msvcr90.dll version 9.0.21022.8) Using winXPhome 32 bit @@ -31,7 +32,7 @@ This package will run 30 days before registration is needed 2.1/ Install python runtime from here ... -Python 2.6.5 ... http://www.python.org/ftp/python/2.6.5/python-2.6.5.msi +Python 2.7 ... http://python.org/ftp/python/2.7/python-2.7.msi 3. Source install ----------------- @@ -62,11 +63,29 @@ change this: to be this: -#define VERSION_NAME(W) W##2_6 -#define PYTHON_VERSION "2_6" +#define VERSION_NAME(W) W##2_7 +#define PYTHON_VERSION "2_7" + +- - - - - - + +Move this block of code: + +#ifdef _DEBUG // for Windows python23_d.lib is not in distribution... ugly but works + #undef _DEBUG + #include + #define _DEBUG +#else + #include +#endif + +To be after this line: + +#include "enumdefs.h" 4.2/ save and exit +- - - - - + 4.3/ dos> write c:/pypoker-eval/pokereval.py Comment-out this line: @@ -75,7 +94,7 @@ _pokereval = __import__('_pokereval_' + sys.version[0] + '_' + sys.version[2]) Insert this one in its' place: -import _pokereval_2_6 as _pokereval +import _pokereval_2_7 as _pokereval 4.4/ save and exit @@ -112,7 +131,7 @@ import _pokereval_2_6 as _pokereval 6.2.5 In the pythonpoker-eval properties dialog, -change references to "python24" to "python26" in the following: +change references to "python24" to "python27" in the following: = C/C++/Additional Include Directories/ = linker/general/Additional library directories @@ -121,7 +140,6 @@ change references to "python24" to "python26" in the following: Change the following = linker/generate debug info - set to No - = linker/debugging/Generate debug info - set to No 6.2.6 Apply all changes to the properties dialog and close @@ -154,38 +172,39 @@ Change the following 8.4 Exit from visual studio -9. packaging ------------- +9. Wrap-up +---------- 9.1 Navigate to c:/pypoker-eval/release 9.2 the output file is pypokereval.dll -9.3 rename this file to _pokereval_2_6.pyd +9.3 rename this file to _pokereval_2_7.pyd 9.4 create a zip file containing : -_pokereval_2_6.pyd from releases +_pokereval_2_7.pyd from releases test.py from pypoker-eval-138.0 pokereval.py from pypoker-eval-138.0 poker-eval.vcproj from c:\poker-eval pypoker-eval.vcproj from c:\pypoker-eval pypokereval.c from c:\pypoker-eval -Remember to include the version (138), python 265 and win32 in the package filename +Remember to include the version (138), python 27 and win32 in the package filename -10. Installation and Testing ----------------------------- +10. Testing +----------- -Python 2.6.5 must be installed +Python 2.7 must be installed -10.1 Extract this package to directory +10.1 Extract the zip file created in 9.4 into a new directory 10.2 Change directory to the directory in 10.1 -10.3 execute dos> c:\Python26\python.exe test.py +10.3 execute dos> c:\Python27\python.exe test.py 10.4 hand-output should scroll down the screen 10.5 start the python interpreter 10.6 >>> import pokereval 10.7 No errors should be seen +11. Packaging +------------- - - +Please follow pypokereval-win32-packaging-walkthrough.txt in the same directory as this walkthrough. From 10f098dc18122284b9f052fe30eeb4635d12a938 Mon Sep 17 00:00:00 2001 From: Eric Blade Date: Sun, 6 Mar 2011 06:08:08 -0500 Subject: [PATCH 02/41] reformatting, pep8 stuff --- pyfpdb/WinTables.py | 10 +- pyfpdb/fpdb.pyw | 320 +++++++++++++++++++++++--------------------- 2 files changed, 175 insertions(+), 155 deletions(-) diff --git a/pyfpdb/WinTables.py b/pyfpdb/WinTables.py index 5b3b4a54..9b5ceb5a 100644 --- a/pyfpdb/WinTables.py +++ b/pyfpdb/WinTables.py @@ -56,15 +56,17 @@ class Table(Table_Window): """Finds poker client window with the given table name.""" titles = {} win32gui.EnumWindows(win_enum_handler, titles) - for hwnd in titles: + for hwnd in titles: if titles[hwnd] == "": continue if re.search(self.search_string, titles[hwnd], re.I): if self.check_bad_words(titles[hwnd]): continue - if not win32gui.IsWindowVisible(hwnd): # if window not visible, probably not a table + # if window not visible, probably not a table + if not win32gui.IsWindowVisible(hwnd): continue - if win32gui.GetParent(hwnd) != 0: # if window is a child of another window, probably not a table + # if window is a child of another window, probably not a table + if win32gui.GetParent(hwnd) != 0: continue HasNoOwner = win32gui.GetWindow(hwnd, win32con.GW_OWNER) == 0 WindowStyle = win32gui.GetWindowLong(hwnd, win32con.GWL_EXSTYLE) @@ -72,7 +74,7 @@ class Table(Table_Window): continue if not HasNoOwner and WindowStyle & win32con.WS_EX_APPWINDOW == 0: continue - + self.window = hwnd break diff --git a/pyfpdb/fpdb.pyw b/pyfpdb/fpdb.pyw index b5501e35..ec8ffb94 100755 --- a/pyfpdb/fpdb.pyw +++ b/pyfpdb/fpdb.pyw @@ -28,7 +28,7 @@ if os.name == 'nt' and sys.version[0:3] not in ('2.5', '2.6', '2.7') and '-r' no #print "old path =", os.environ['PATH'] dirs = re.split(os.pathsep, os.environ['PATH']) # remove any trailing / or \ chars from dirs: - dirs = [re.sub('[\\/]$','',p) for p in dirs] + dirs = [re.sub('[\\/]$', '', p) for p in dirs] # remove any dirs containing 'python' apart from those ending in 'python25', 'python26' or 'python': dirs = [p for p in dirs if not re.search('python', p, re.I) or re.search('python25$', p, re.I) or re.search('python26$', p, re.I) or re.search('python27$', p, re.I)] tmppath = ";".join(dirs) @@ -37,10 +37,10 @@ if os.name == 'nt' and sys.version[0:3] not in ('2.5', '2.6', '2.7') and '-r' no os.environ['PATH'] = tmppath print "Python " + sys.version[0:3] + _(' - press return to continue\n') sys.stdin.readline() - if os.name=='nt': - os.execvpe('pythonw.exe', ('pythonw.exe', 'fpdb.pyw', '-r'), os.environ) # first arg is ignored (name of program being run) + if os.name == 'nt': + os.execvpe('pythonw.exe', ('pythonw.exe', 'fpdb.pyw', '-r'), os.environ) else: - os.execvpe('python', ('python', 'fpdb.pyw', '-r'), os.environ) # first arg is ignored (name of program being run) + os.execvpe('python', ('python', 'fpdb.pyw', '-r'), os.environ) else: print _("\npython 2.5-2.7 not found, please install python 2.5, 2.6 or 2.7 for fpdb\n") raw_input(_("Press ENTER to continue.")) @@ -67,7 +67,8 @@ import string cl_options = string.join(sys.argv[1:]) (options, argv) = Options.fpdb_options() -import logging, logging.config +import logging +import logging.config log = logging.getLogger("fpdb") try: @@ -141,9 +142,9 @@ class fpdb: def add_tab(self, new_page, new_tab_name): """adds a tab, namely creates the button and displays it and appends all the relevant arrays""" - for name in self.nb_tab_names: #todo: check this is valid + for name in self.nb_tab_names: # todo: check this is valid if name == new_tab_name: - return # if tab already exists, just go to it + return # if tab already exists, just go to it used_before = False for i, name in enumerate(self.tab_names): @@ -205,9 +206,9 @@ class fpdb: image = gtk.Image() image.set_from_stock(gtk.STOCK_CLOSE, gtk.ICON_SIZE_SMALL_TOOLBAR) gtk.Button.set_relief(button, gtk.RELIEF_NONE) - settings = gtk.Widget.get_settings(button); - (w,h) = gtk.icon_size_lookup_for_settings(settings, gtk.ICON_SIZE_SMALL_TOOLBAR); - gtk.Widget.set_size_request(button, w + 4, h + 4); + settings = gtk.Widget.get_settings(button) + (w, h) = gtk.icon_size_lookup_for_settings(settings, gtk.ICON_SIZE_SMALL_TOOLBAR) + gtk.Widget.set_size_request(button, w + 4, h + 4) image.show() iconBox.pack_start(image, True, False, 0) button.add(iconBox) @@ -245,7 +246,7 @@ class fpdb: dia.set_comments(_("You are free to change, and distribute original or changed versions of fpdb within the rules set out by the license")) dia.set_license(_("Please see fpdb's start screen for license information")) dia.set_website("http://fpdb.sourceforge.net/") - + dia.set_authors(['Steffen', 'Eratosthenes', 'Carl Gherardi', 'Eric Blade', '_mt', 'sqlcoder', 'Bostik', _('and others')]) dia.set_program_name("Free Poker Database (FPDB)") @@ -253,27 +254,27 @@ class fpdb: db_version = "" #if self.db is not None: # db_version = self.db.get_version() - nums = [ (_('Operating System'), os.name) - , ('Python', sys.version[0:3]) - , ('GTK+', '.'.join([str(x) for x in gtk.gtk_version])) - , ('PyGTK', '.'.join([str(x) for x in gtk.pygtk_version])) - , ('matplotlib', matplotlib_version) - , ('numpy', numpy_version) - , ('sqlite', sqlite_version) - , ('fpdb version', VERSION) - , ('database used', self.settings['db-server']) + nums = [(_('Operating System'), os.name), + ('Python', sys.version[0:3]), + ('GTK+', '.'.join([str(x) for x in gtk.gtk_version])), + ('PyGTK', '.'.join([str(x) for x in gtk.pygtk_version])), + ('matplotlib', matplotlib_version), + ('numpy', numpy_version), + ('sqlite', sqlite_version), + ('fpdb version', VERSION), + ('database used', self.settings['db-server']) ] versions = gtk.TextBuffer() w = 20 # width used for module names and version numbers - versions.set_text( '\n'.join( [x[0].rjust(w)+' '+ x[1].ljust(w) for x in nums] ) ) + versions.set_text('\n'.join([x[0].rjust(w) + ' ' + x[1].ljust(w) for x in nums])) view = gtk.TextView(versions) view.set_editable(False) view.set_justification(gtk.JUSTIFY_CENTER) view.modify_font(pango.FontDescription('monospace 10')) view.show() dia.vbox.pack_end(view, True, True, 2) - - l = gtk.Label(_("Your config file is: ")+self.config.file) + + l = gtk.Label(_("Your config file is: ") + self.config.file) l.set_alignment(0.5, 0.5) l.show() dia.vbox.pack_end(l, True, True, 2) @@ -282,7 +283,7 @@ class fpdb: l.set_alignment(0.5, 0.5) l.show() dia.vbox.pack_end(l, True, True, 2) - + dia.run() dia.destroy() log.debug(_("Threads: ")) @@ -332,10 +333,10 @@ class fpdb: # save updated config self.config.save() self.load_profile() - for name in self.config.supported_databases: #db_ip/db_user/db_pass/db_server - log.info('fpdb: name,desc='+name+','+self.config.supported_databases[name].db_desc) + for name in self.config.supported_databases: # db_ip/db_user/db_pass/db_server + log.info('fpdb: name,desc=' + name + ',' + self.config.supported_databases[name].db_desc) else: - log.info(_('guidb response was ')+str(response)) + log.info(_('guidb response was ') + str(response)) self.release_global_lock() @@ -344,72 +345,75 @@ class fpdb: self.warning_box(_("Cannot open Database Maintenance window because other windows have been opened. Re-start fpdb to use this option.")) def dia_database_stats(self, widget, data=None): - self.warning_box(str=_("Number of Hands: ")+str(self.db.getHandCount())+ - _("\nNumber of Tourneys: ")+str(self.db.getTourneyCount())+ - _("\nNumber of TourneyTypes: ")+str(self.db.getTourneyTypeCount()), + self.warning_box(str=_("Number of Hands: ") + str(self.db.getHandCount()) + + _("\nNumber of Tourneys: ") + str(self.db.getTourneyCount()) + + _("\nNumber of TourneyTypes: ") + str(self.db.getTourneyTypeCount()), diatitle=_("Database Statistics")) #end def dia_database_stats def diaHudConfigurator(self, widget, data=None): """Opens dialog to set parameters (game category, row count, column count for HUD stat configurator""" - self.hudConfiguratorRows=None - self.hudConfiguratorColumns=None - self.hudConfiguratorGame=None - + self.hudConfiguratorRows = None + self.hudConfiguratorColumns = None + self.hudConfiguratorGame = None + diaSelections = gtk.Dialog(_("HUD Configurator - choose category"), self.window, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, (gtk.STOCK_OK, gtk.RESPONSE_ACCEPT, gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT)) - - label=gtk.Label(_("Please select the game category for which you want to configure HUD stats:")) + + label = gtk.Label(_("Please select the game category for which you want to configure HUD stats:")) diaSelections.vbox.add(label) label.show() - + comboGame = gtk.combo_box_new_text() comboGame.connect("changed", self.hudConfiguratorComboSelection) diaSelections.vbox.add(comboGame) - games=self.config.get_supported_games() + games = self.config.get_supported_games() for game in games: comboGame.append_text(game) comboGame.set_active(0) comboGame.show() - + comboRows = gtk.combo_box_new_text() comboRows.connect("changed", self.hudConfiguratorComboSelection) diaSelections.vbox.add(comboRows) - for i in range(1,8): - comboRows.append_text(str(i)+" rows") + for i in range(1, 8): + comboRows.append_text(str(i) + " rows") comboRows.set_active(0) comboRows.show() - + comboColumns = gtk.combo_box_new_text() comboColumns.connect("changed", self.hudConfiguratorComboSelection) diaSelections.vbox.add(comboColumns) - for i in range(1,8): - comboColumns.append_text(str(i)+" columns") + for i in range(1, 8): + comboColumns.append_text(str(i) + " columns") comboColumns.set_active(0) comboColumns.show() - - response=diaSelections.run() + + response = diaSelections.run() diaSelections.destroy() - - if response == gtk.RESPONSE_ACCEPT and self.hudConfiguratorRows!=None and self.hudConfiguratorColumns!=None and self.hudConfiguratorGame!=None: + + if (response == gtk.RESPONSE_ACCEPT and + self.hudConfiguratorRows != None and + self.hudConfiguratorColumns != None and + self.hudConfiguratorGame != None): #print "clicked ok and selected:", self.hudConfiguratorGame,"with", str(self.hudConfiguratorRows), "rows and", str(self.hudConfiguratorColumns), "columns" self.diaHudConfiguratorTable() #end def diaHudConfigurator def hudConfiguratorComboSelection(self, widget): #TODO: remove this and handle it directly in diaHudConfigurator - result=widget.get_active_text() + result = widget.get_active_text() if result.endswith(" rows"): - self.hudConfiguratorRows=int(result[0]) + self.hudConfiguratorRows = int(result[0]) elif result.endswith(" columns"): - self.hudConfiguratorColumns=int(result[0]) + self.hudConfiguratorColumns = int(result[0]) else: - self.hudConfiguratorGame=result + self.hudConfiguratorGame = result #end def hudConfiguratorComboSelection - + def diaHudConfiguratorTable(self): """shows dialogue with Table of ComboBoxes to allow choosing of HUD stats""" #TODO: add notices to hud configurator: no duplicates, no empties, display options @@ -419,92 +423,103 @@ class fpdb: gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, (gtk.STOCK_SAVE, gtk.RESPONSE_ACCEPT, gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT)) - - label=gtk.Label(_("Please choose the stats you wish to use in the below table.")) + + label = gtk.Label(_("Please choose the stats you wish to use in the below table.")) diaHudTable.vbox.add(label) label.show() - - label=gtk.Label(_("Note that you may not select any stat more than once or it will crash.")) + + label = gtk.Label(_("Note that you may not select any stat more than once or it will crash.")) diaHudTable.vbox.add(label) label.show() - - label=gtk.Label(_("It is not currently possible to select \"empty\" or anything else to that end.")) + + label = gtk.Label(_("It is not currently possible to select \"empty\" or anything else to that end.")) diaHudTable.vbox.add(label) label.show() - - label=gtk.Label(_("To configure things like colouring you will still have to use the Preferences dialogue or manually edit your HUD_config.xml.")) + + label = gtk.Label(_("To configure things like colouring you will still have to use the Preferences dialogue or manually edit your HUD_config.xml.")) diaHudTable.vbox.add(label) label.show() - - self.hudConfiguratorTableContents=[] - table= gtk.Table(rows=self.hudConfiguratorRows+1, columns=self.hudConfiguratorColumns+1, homogeneous=True) - - statDir=dir(Stats) - statDict={} + + self.hudConfiguratorTableContents = [] + table = gtk.Table(rows=self.hudConfiguratorRows + 1, columns=self.hudConfiguratorColumns + 1, homogeneous=True) + + statDir = dir(Stats) + statDict = {} for attr in statDir: - if attr.startswith('__'): continue + if attr.startswith('__'): + continue if attr in ("Charset", "Configuration", "Database", "GInitiallyUnowned", "gtk", "pygtk", "player", "c", "db_connection", "do_stat", "do_tip", "stat_dict", - "h", "re", "re_Percent", "re_Places", ): continue - statDict[attr]=eval("Stats.%s.__doc__" % (attr)) - - for rowNumber in range(self.hudConfiguratorRows+1): - newRow=[] - for columnNumber in range(self.hudConfiguratorColumns+1): - if rowNumber==0: - if columnNumber==0: + "h", "re", "re_Percent", "re_Places", ): + continue + statDict[attr] = eval("Stats.%s.__doc__" % (attr)) + + for rowNumber in range(self.hudConfiguratorRows + 1): + newRow = [] + for columnNumber in range(self.hudConfiguratorColumns + 1): + if rowNumber == 0: + if columnNumber == 0: pass else: - label=gtk.Label("column "+str(columnNumber)) - table.attach(child=label, left_attach=columnNumber, right_attach=columnNumber+1, top_attach=rowNumber, bottom_attach=rowNumber+1) + label = gtk.Label("column " + str(columnNumber)) + table.attach(child=label, left_attach=columnNumber, + right_attach=columnNumber + 1, + top_attach=rowNumber, + bottom_attach=rowNumber + 1) label.show() - elif columnNumber==0: - label=gtk.Label("row "+str(rowNumber)) - table.attach(child=label, left_attach=columnNumber, right_attach=columnNumber+1, top_attach=rowNumber, bottom_attach=rowNumber+1) + elif columnNumber == 0: + label = gtk.Label("row " + str(rowNumber)) + table.attach(child=label, left_attach=columnNumber, + right_attach=columnNumber + 1, + top_attach=rowNumber, + bottom_attach=rowNumber + 1) label.show() else: comboBox = gtk.combo_box_new_text() - + for stat in statDict.keys(): comboBox.append_text(stat) comboBox.set_active(0) - + newRow.append(comboBox) - table.attach(child=comboBox, left_attach=columnNumber, right_attach=columnNumber+1, top_attach=rowNumber, bottom_attach=rowNumber+1) - + table.attach(child=comboBox, left_attach=columnNumber, + right_attach=columnNumber + 1, + top_attach=rowNumber, + bottom_attach=rowNumber + 1) + comboBox.show() - if rowNumber!=0: + if rowNumber != 0: self.hudConfiguratorTableContents.append(newRow) diaHudTable.vbox.add(table) table.show() - - response=diaHudTable.run() + + response = diaHudTable.run() diaHudTable.destroy() - + if response == gtk.RESPONSE_ACCEPT: self.storeNewHudStatConfig() #end def diaHudConfiguratorTable - + def storeNewHudStatConfig(self): """stores selections made in diaHudConfiguratorTable""" self.obtain_global_lock("diaHudConfiguratorTable") - statTable=[] + statTable = [] for row in self.hudConfiguratorTableContents: - newRow=[] + newRow = [] for column in row: newField = column.get_active_text() newRow.append(newField) statTable.append(newRow) - - self.config.editStats(self.hudConfiguratorGame,statTable) - self.config.save() #TODO: make it not store in horrible formatting + + self.config.editStats(self.hudConfiguratorGame, statTable) + self.config.save() # TODO: make it not store in horrible formatting self.release_global_lock() #end def storeNewHudStatConfig - + def dia_dump_db(self, widget, data=None): filename = "database-dump.sql" result = self.db.dumpDatabase() - + dumpFile = open(filename, 'w') dumpFile.write(result) dumpFile.close() @@ -543,7 +558,7 @@ class fpdb: diastring = _("Please confirm that you want to (re-)create the tables.") \ + (_(" If there already are tables in the database %s on %s they will be deleted and you will have to re-import your histories.\n") % (self.db.database, self.db.host)) \ + _("This may take a while.") - dia_confirm.format_secondary_text(diastring)#todo: make above string with bold for db, host and deleted + dia_confirm.format_secondary_text(diastring) # todo: make above string with bold for db, host and deleted # disable windowclose, do not want the the underlying processing interrupted mid-process dia_confirm.set_deletable(False) @@ -581,7 +596,7 @@ class fpdb: hb1 = gtk.HBox(True, 1) self.h_start_date = gtk.Entry(max=12) - self.h_start_date.set_text( self.db.get_hero_hudcache_start() ) + self.h_start_date.set_text(self.db.get_hero_hudcache_start()) lbl = gtk.Label(_(" Hero's cache starts: ")) btn = gtk.Button() btn.set_image(gtk.image_new_from_stock(gtk.STOCK_INDEX, gtk.ICON_SIZE_BUTTON)) @@ -595,7 +610,7 @@ class fpdb: hb2 = gtk.HBox(True, 1) self.start_date = gtk.Entry(max=12) - self.start_date.set_text( self.db.get_hero_hudcache_start() ) + self.start_date.set_text(self.db.get_hero_hudcache_start()) lbl = gtk.Label(_(" Villains' cache starts: ")) btn = gtk.Button() btn.set_image(gtk.image_new_from_stock(gtk.STOCK_INDEX, gtk.ICON_SIZE_BUTTON)) @@ -615,7 +630,7 @@ class fpdb: while gtk.events_pending(): gtk.main_iteration_do(False) - self.db.rebuild_hudcache( self.h_start_date.get_text(), self.start_date.get_text() ) + self.db.rebuild_hudcache(self.h_start_date.get_text(), self.start_date.get_text()) elif response == gtk.RESPONSE_NO: print _('User cancelled rebuilding hud cache') @@ -625,11 +640,11 @@ class fpdb: def dia_rebuild_indexes(self, widget, data=None): if self.obtain_global_lock("dia_rebuild_indexes"): - self.dia_confirm = gtk.MessageDialog(parent=self.window - ,flags=gtk.DIALOG_DESTROY_WITH_PARENT - ,type=gtk.MESSAGE_WARNING - ,buttons=(gtk.BUTTONS_YES_NO) - ,message_format=_("Confirm rebuilding database indexes")) + self.dia_confirm = gtk.MessageDialog(parent=self.window, + flags=gtk.DIALOG_DESTROY_WITH_PARENT, + type=gtk.MESSAGE_WARNING, + buttons=(gtk.BUTTONS_YES_NO), + message_format=_("Confirm rebuilding database indexes")) diastring = _("Please confirm that you want to rebuild the database indexes.") self.dia_confirm.format_secondary_text(diastring) # disable windowclose, do not want the the underlying processing interrupted mid-process @@ -693,7 +708,6 @@ class fpdb: self.logbuffer.insert(end_iter, text) self.logview.scroll_to_mark(self.logbuffer.get_insert(), 0) - def process_close_messages(self): # check for close messages try: @@ -847,29 +861,28 @@ class fpdb: window.add_accel_group(accel_group) return menubar #end def get_menu - - def load_profile(self, create_db = False): + def load_profile(self, create_db=False): """Loads profile from the provided path name.""" self.config = Configuration.Config(file=options.config, dbname=options.dbname) if self.config.file_error: self.warning_box(_("There is an error in your config file\n") + self.config.file - + _("\n\nError is: ") + str(self.config.file_error) - , diatitle=_("CONFIG FILE ERROR")) + + _("\n\nError is: ") + str(self.config.file_error), + diatitle=_("CONFIG FILE ERROR")) sys.exit() log = Configuration.get_logger("logging.conf", "fpdb", log_dir=self.config.dir_log) print (_("Logfile is %s\n") % os.path.join(self.config.dir_log, self.config.log_file)) if self.config.example_copy: - self.info_box(_("Config file") - , _("has been created at:\n%s.\n") % self.config.file + self.info_box(_("Config file"), + _("has been created at:\n%s.\n") % self.config.file + _("Edit your screen_name and hand history path in the supported_sites section of the Preferences window (Main menu) before trying to import hands.")) self.settings = {} self.settings['global_lock'] = self.lock - if (os.sep=="/"): - self.settings['os']="linuxmac" + if (os.sep == "/"): + self.settings['os'] = "linuxmac" else: - self.settings['os']="windows" + self.settings['os'] = "windows" self.settings.update({'cl_options': cl_options}) self.settings.update(self.config.get_db_parameters()) @@ -879,10 +892,10 @@ class fpdb: if self.db is not None and self.db.is_connected(): self.db.disconnect() - self.sql = SQL.Sql(db_server = self.settings['db-server']) + self.sql = SQL.Sql(db_server=self.settings['db-server']) err_msg = None try: - self.db = Database.Database(self.config, sql = self.sql) + self.db = Database.Database(self.config, sql=self.sql) if self.db.get_backend_name() == 'SQLite': # tell sqlite users where the db file is print (_("Connected to SQLite: %s") % self.db.db_path) @@ -919,7 +932,8 @@ class fpdb: # sys.stderr.write("Failed to connect to %s database with username %s." % (self.settings['db-server'], self.settings['db-user'])) if self.db is not None and self.db.wrongDbVersion: - diaDbVersionWarning = gtk.Dialog(title=_("Strong Warning - Invalid database version"), parent=None, flags=0, buttons=(gtk.STOCK_OK,gtk.RESPONSE_OK)) + diaDbVersionWarning = gtk.Dialog(title=_("Strong Warning - Invalid database version"), + parent=None, flags=0, buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK)) label = gtk.Label(_("An invalid DB version or missing tables have been detected.")) diaDbVersionWarning.vbox.add(label) @@ -944,14 +958,14 @@ class fpdb: if self.db is not None and self.db.is_connected(): self.status_bar.set_text(_("Status: Connected to %s database named %s on host %s") - % (self.db.get_backend_name(),self.db.database, self.db.host)) + % (self.db.get_backend_name(), self.db.database, self.db.host)) # rollback to make sure any locks are cleared: self.db.rollback() self.validate_config() def obtain_global_lock(self, source): - ret = self.lock.acquire(source=source) # will return false if lock is already held + ret = self.lock.acquire(source=source) # will return false if lock is already held if ret: print (_("\nGlobal lock taken by %s") % source) self.lockTakenBy=source @@ -969,14 +983,14 @@ class fpdb: print _("Quitting normally") self.quitting = True # TODO: check if current settings differ from profile, if so offer to save or abort - + if self.db is not None: if self.db.backend == self.db.MYSQL_INNODB: try: import _mysql_exceptions if self.db is not None and self.db.is_connected(): self.db.disconnect() - except _mysql_exceptions.OperationalError: # oh, damn, we're already disconnected + except _mysql_exceptions.OperationalError: # oh, damn, we're already disconnected pass else: if self.db is not None and self.db.is_connected(): @@ -985,12 +999,12 @@ class fpdb: pass self.statusIcon.set_visible(False) - self.window.destroy() # explicitly destroy to allow child windows to close cleanly + self.window.destroy() # explicitly destroy to allow child windows to close cleanly gtk.main_quit() def release_global_lock(self): self.lock.release() - self.lockTakenBy=None + self.lockTakenBy = None print _("Global lock released.\n") def tab_auto_import(self, widget, data=None): @@ -1023,7 +1037,7 @@ class fpdb: tab=new_thread.get_vbox() self.add_and_display_tab(tab, _("eMail Import")) #end def tab_import_imap_summaries - + def tab_ring_player_stats(self, widget, data=None): new_ps_thread = GuiRingPlayerStats.GuiRingPlayerStats(self.config, self.sql, self.window) self.threads.append(new_ps_thread) @@ -1110,7 +1124,7 @@ You can find the full license texts in agpl-3.0.txt, gpl-2.0.txt, gpl-3.0.txt an self.quitting = False self.visible = False self.threads = [] # objects used by tabs - no need for threads, gtk handles it - self.closeq = Queue.Queue(20) # used to signal ending of a thread (only logviewer for now) + self.closeq = Queue.Queue(20) # used to signal ending of a thread (only logviewer for now) # create window, move it to specific location on command line self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) @@ -1119,7 +1133,7 @@ You can find the full license texts in agpl-3.0.txt, gpl-2.0.txt, gpl-3.0.txt an options.xloc = 0 if options.yloc is None: options.yloc = 0 - self.window.move(options.xloc,options.yloc) + self.window.move(options.xloc, options.yloc) # connect to required events self.window.connect("delete_event", self.delete_event) @@ -1129,8 +1143,10 @@ You can find the full license texts in agpl-3.0.txt, gpl-2.0.txt, gpl-3.0.txt an self.window.set_border_width(1) defx, defy = 900, 720 sx, sy = gtk.gdk.screen_width(), gtk.gdk.screen_height() - if sx < defx: defx = sx - if sy < defy: defy = sy + if sx < defx: + defx = sx + if sy < defy: + defy = sy self.window.set_default_size(defx, defy) self.window.set_resizable(True) @@ -1162,13 +1178,13 @@ You can find the full license texts in agpl-3.0.txt, gpl-2.0.txt, gpl-3.0.txt an if options.minimized: self.window.iconify() if options.hidden: - self.window.hide() + self.window.hide() if not options.hidden: self.window.show() self.visible = True # Flip on - self.load_profile(create_db = True) + self.load_profile(create_db=True) # setup error logging if not options.errorsToConsole: @@ -1181,7 +1197,7 @@ You can find the full license texts in agpl-3.0.txt, gpl-2.0.txt, gpl-3.0.txt an # set up tray-icon and menu self.statusIcon = gtk.StatusIcon() # use getcwd() here instead of sys.path[0] so that py2exe works: - cards = os.path.join(os.getcwd(), '..','gfx','fpdb-cards.png') + cards = os.path.join(os.getcwd(), '..', 'gfx', 'fpdb-cards.png') if os.path.exists(cards): self.statusIcon.set_from_file(cards) self.window.set_icon_from_file(cards) @@ -1195,7 +1211,7 @@ You can find the full license texts in agpl-3.0.txt, gpl-2.0.txt, gpl-3.0.txt an self.statusIcon.connect('activate', self.statusicon_activate) self.statusMenu = gtk.Menu() - # set default menu options + # set default menu options self.addImageToTrayMenu(gtk.STOCK_ABOUT, self.dia_about) self.addImageToTrayMenu(gtk.STOCK_QUIT, self.quit) @@ -1255,7 +1271,7 @@ You can find the full license texts in agpl-3.0.txt, gpl-2.0.txt, gpl-3.0.txt an # Tell GTK not to propagate this signal any further return True - def statusicon_menu(self, widget, button, time, data = None): + def statusicon_menu(self, widget, button, time, data=None): # we don't need to pass data here, since we do keep track of most all # our variables .. the example code that i looked at for this # didn't use any long scope variables.. which might be an alright @@ -1266,7 +1282,7 @@ You can find the full license texts in agpl-3.0.txt, gpl-2.0.txt, gpl-3.0.txt an data.popup(None, None, None, 3, time) pass - def statusicon_activate(self, widget, data = None): + def statusicon_activate(self, widget, data=None): # Let's allow the tray icon to toggle window visibility, the way # most other apps work if self.visible: @@ -1275,15 +1291,17 @@ You can find the full license texts in agpl-3.0.txt, gpl-2.0.txt, gpl-3.0.txt an self.window.present() def info_box(self, str1, str2): - diapath = gtk.MessageDialog( parent=self.window, flags=gtk.DIALOG_DESTROY_WITH_PARENT, type=gtk.MESSAGE_INFO - , buttons=(gtk.BUTTONS_OK), message_format=str1 ) + diapath = gtk.MessageDialog(parent=self.window, flags=gtk.DIALOG_DESTROY_WITH_PARENT, type=gtk.MESSAGE_INFO, + buttons=(gtk.BUTTONS_OK), message_format=str1) diapath.format_secondary_text(str2) response = diapath.run() diapath.destroy() return response def warning_box(self, str, diatitle=_("FPDB WARNING")): - diaWarning = gtk.Dialog(title=diatitle, parent=self.window, flags=gtk.DIALOG_DESTROY_WITH_PARENT, buttons=(gtk.STOCK_OK,gtk.RESPONSE_OK)) + diaWarning = gtk.Dialog(title=diatitle, parent=self.window, + flags=gtk.DIALOG_DESTROY_WITH_PARENT, + buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK)) label = gtk.Label(str) diaWarning.vbox.add(label) @@ -1296,10 +1314,10 @@ You can find the full license texts in agpl-3.0.txt, gpl-2.0.txt, gpl-3.0.txt an def validate_config(self): # can this be removed now? if self.config.get_import_parameters().get('saveStarsHH'): - hhbase = self.config.get_import_parameters().get("hhArchiveBase") - hhbase = os.path.expanduser(hhbase) - #hhdir = os.path.join(hhbase,site) - hhdir = hhbase + hhbase = self.config.get_import_parameters().get("hhArchiveBase") + hhbase = os.path.expanduser(hhbase) + #hhdir = os.path.join(hhbase,site) + hhdir = hhbase if not os.path.isdir(hhdir): diapath = gtk.MessageDialog(parent=None, flags=0, type=gtk.MESSAGE_WARNING, buttons=(gtk.BUTTONS_YES_NO), message_format="Setup hh dir") diastring = _("WARNING: Unable to find output hand history directory %s\n\n Press YES to create this directory, or NO to select a new one.") % hhdir @@ -1318,7 +1336,7 @@ You can find the full license texts in agpl-3.0.txt, gpl-2.0.txt, gpl-3.0.txt an for site in self.config.get_supported_sites(True): # get site names from config file try: self.config.get_site_id(site) # and check against list from db - except KeyError , exc: + except KeyError, exc: log.warning("site %s missing from db" % site) dia = gtk.MessageDialog(parent=None, flags=0, type=gtk.MESSAGE_WARNING, buttons=(gtk.BUTTONS_YES_NO), message_format="Unknown Site") diastring = _("WARNING: Unable to find site '%s'\n\nPress YES to add this site to the database.") % site @@ -1329,15 +1347,15 @@ You can find the full license texts in agpl-3.0.txt, gpl-2.0.txt, gpl-3.0.txt an self.add_site(site) def add_site(self, site): - dia = gtk.Dialog( title="Add Site", parent=self.window - , flags=gtk.DIALOG_DESTROY_WITH_PARENT - , buttons=(gtk.STOCK_SAVE, gtk.RESPONSE_ACCEPT - ,gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT) + dia = gtk.Dialog(title="Add Site", parent=self.window, + flags=gtk.DIALOG_DESTROY_WITH_PARENT, + buttons=(gtk.STOCK_SAVE, gtk.RESPONSE_ACCEPT, + gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT) ) h = gtk.HBox() dia.vbox.pack_start(h, padding=5) # sets horizontal padding - label = gtk.Label( _("\nEnter short code for %s\n(up to 3 characters):\n") % site ) + label = gtk.Label(_("\nEnter short code for %s\n(up to 3 characters):\n") % site) h.pack_start(label, padding=20) # sets horizontal padding #label.set_alignment(1.0, 0.5) @@ -1347,8 +1365,8 @@ You can find the full license texts in agpl-3.0.txt, gpl-2.0.txt, gpl-3.0.txt an e_code.set_width_chars(5) h.pack_start(e_code, True, False, padding=5) - label = gtk.Label( "" ) - dia.vbox.add(label) # create space below entry, maybe padding arg above makes this redundant? + label = gtk.Label("") + dia.vbox.add(label) # create space below entry, maybe padding arg above makes this redundant? dia.show_all() response = dia.run() From 8792b427dece82384cd7d0c3dae080b648c64ce7 Mon Sep 17 00:00:00 2001 From: gimick Date: Sun, 6 Mar 2011 23:51:21 +0000 Subject: [PATCH 03/41] fpdb.pyw: force bg_colour for inactive tab labels - workaround themes problem --- pyfpdb/fpdb.pyw | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/pyfpdb/fpdb.pyw b/pyfpdb/fpdb.pyw index b5501e35..c6d318a2 100755 --- a/pyfpdb/fpdb.pyw +++ b/pyfpdb/fpdb.pyw @@ -187,6 +187,22 @@ class fpdb: tabBox.pack_start(tabLabel, False) eventBox.add(tabBox) + # fixme: force background state to fix problem where STATE_ACTIVE + # tab labels are black in some gtk themes, and therefore unreadable + # This behaviour is probably a bug in libwimp.dll or pygtk, but + # need to force background to avoid issues with menu labels being + # unreadable + # + # gtk.STATE_ACTIVE is a displayed, but not selected tab + # gtk.STATE_NORMAL is a displayed, selected, focussed tab + # gtk.STATE_INSENSITIVE is an inactive tab + # Insensitive/base is chosen as the background colour, because + # although not perfect, it seems to be the least instrusive. + baseNormStyle = eventBox.get_style().base[gtk.STATE_INSENSITIVE] + if baseNormStyle: + print baseNormStyle + eventBox.modify_bg(gtk.STATE_ACTIVE, gtk.gdk.color_parse(str(baseNormStyle))) + if nb.get_n_pages() > 0: tabButton = gtk.Button() From 87d1e80a2dabf60fa6ff18921a817f0558890442 Mon Sep 17 00:00:00 2001 From: Steffen Schaumburg Date: Wed, 9 Mar 2011 23:28:45 +0100 Subject: [PATCH 04/41] trivial: add a todo note, l10nify a string --- pyfpdb/HUD_main.pyw | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyfpdb/HUD_main.pyw b/pyfpdb/HUD_main.pyw index 9a4d6e4f..5f98754a 100755 --- a/pyfpdb/HUD_main.pyw +++ b/pyfpdb/HUD_main.pyw @@ -120,14 +120,14 @@ class HUD_main(object): gobject.timeout_add(800, self.check_tables) except: - log.exception("Error initializing main_window") + log.exception(_("Error initializing main_window")) gtk.main_quit() # we're hosed, just terminate def client_moved(self, widget, hud): hud.up_update_table_position() def client_resized(self, widget, hud): -# Don't forget to get rid of this. +#TODO Don't forget to get rid of this. if not is_windows: gigobject.idle_add(idle_resize, hud) From d0f6f53ae1ac3f5a394489365a85f25504adda0f Mon Sep 17 00:00:00 2001 From: Steffen Schaumburg Date: Thu, 10 Mar 2011 06:17:56 +0100 Subject: [PATCH 05/41] update pot/po/mo files --- pyfpdb/locale/de/LC_MESSAGES/fpdb.mo | Bin 23726 -> 23538 bytes pyfpdb/locale/es/LC_MESSAGES/fpdb.mo | Bin 11739 -> 11657 bytes pyfpdb/locale/fpdb-de_DE.po | 39 +++++++++++++------------- pyfpdb/locale/fpdb-en_GB.pot | 30 +++++++++----------- pyfpdb/locale/fpdb-es_ES.po | 33 +++++++++++----------- pyfpdb/locale/fpdb-fr_FR.po | 40 +++++++++++++++------------ pyfpdb/locale/fpdb-hu_HU.po | 40 +++++++++++++++------------ pyfpdb/locale/fpdb-pl_PL.po | 30 +++++++++----------- pyfpdb/locale/fpdb-ru_RU.po | 40 +++++++++++++++------------ pyfpdb/locale/fr/LC_MESSAGES/fpdb.mo | Bin 72829 -> 72502 bytes pyfpdb/locale/hu/LC_MESSAGES/fpdb.mo | Bin 74420 -> 74112 bytes pyfpdb/locale/pl/LC_MESSAGES/fpdb.mo | Bin 21780 -> 21780 bytes pyfpdb/locale/ru/LC_MESSAGES/fpdb.mo | Bin 8884 -> 8531 bytes 13 files changed, 128 insertions(+), 124 deletions(-) diff --git a/pyfpdb/locale/de/LC_MESSAGES/fpdb.mo b/pyfpdb/locale/de/LC_MESSAGES/fpdb.mo index 18fb016cecfbfe374a39d5dbe849f77407ce32f9..b64215b3f8068b623c211fb6df7fc800ecf41760 100644 GIT binary patch delta 4357 zcmYM$3v|zA9LMozcC(F{U2Mj-zgo>@Zkzqh<}$Q}M&VyGE1hU^i4m(9esSEYlgkli zbck{dhre>&Q3=OUi6c|txTKbACpo2Jy+8e)b8?*j>v^8v<@r9}@ALfFwm0Cn-2u*p z=%A&BKj8t!G{=|gtM~t(15w5_q+5;YcpTI4Pwar6#>RMYAU47IsQXr90)B~2@hZk) z9j0Jhv@vasaZDDCehiGj4BUpg@e*pHKTt1DiE+ohs23O7ekm&O3Oinj@$`3~0zZaR zu?7=yP^|m>IBd-PW-bl>no52&;Z_XCZ;@xrMce<~T4xO>O5GP{^;p|jz1E)ALTizA zI3_T^8ApR`nz+`^kSq5|-x7!!g+QJHwb`Z_AL3+?syQK{dE zrMMFx!UT^oZ7>)0{+Cb-DMu}Qrb9!KFGWpQW&3OJ5&9ouTRe`9@E&S~VJ(blg$dXi zd!ZIG4hwNAD&Ev%WSQs&$KGe|PbDAWSxqe@qayx%c9XlQeNjY`QiRHP43$FX6m8&DP&)6YR= z1$AaJ zAqRCV$75&QjM;b@yJ0h;_F^$A6N|6|zK`wk6slD9Nb7&+zYz@`tCpx0bVsH7Dbz~F z+wqyG%q&5zU@fWy8<3M{K1OBmE7Sy+thX?P{@alUu&qPNn%%P#pRK^e6!K^?Q zWArnw5Kt1;vHo!CO zsJ~Wpg#kr+6Sac-s8R$|uwaZwjVB?W2J;9iBYCJ26rt`bMU`Nz?K`M|=b$EDfDyP3 z74UZ5pvd+if6YODI9cX4>c!C%OquZ@RWLnJ4~|AXHyO2(DX4|aMFqYHvv95TEUKiD z>~sZ~g^keZOT$B>*j|{5sq`11O5;cEksnY2MP;}vPez^NEL1HA*#0Q%OluWJaovyF zTVL4mpKwzE^{=DRmH+oQ(wQG1{aW0~Jn&`?bmSyx)uTX$FwSdUsyS=062a}5u~;GaINXgTVE4^YQ$FM9AS>VbQx7wLZw z+SM^gmQ5;ZlMX|+hgpZu;SZ?ycFA*3PXQjL20m0N5}kZE@)T^wKpJX=y-}$yw%13Y zN;3gp!D*-!-nPaRxD#}?=A+&-7=v-NwG1_JIVx~xDvjPWcA?JqpQx0EJnkODCa4U*;byXpKNp`jE7 zJ;6;Fj_f;Aj%{%#mf%IKk6jDhmF1%{H3$Q7IO;zbBQXp|qe?glvv3yb`8}uwe1^Hq zZ)#}dVN8Fw6h7p{m`Z#MPa|bEO$Qi54CZ-M#M*eiP3l$6;S=bZV8&> z0{R}*`?jO@)R(9U@8BDl;Bzyz!bko)F>smzo!hXd-4*pjZLR^h97|Dw-N(-{$Aa%d=ZAK4rHsEI$d*4Xh|7{U18c06>5 z`=VrwWIPQ$=tY&J2sQDGsLYk2N--H*<2H;#=Q|quhTpa}E_NTt#CnWpV-)71QeSBM zKI}rj6ti(P>cwYK83-Keo{o4_DbrBn{ZOSDhTLCbDrk5aSdWVMJbJJemD;cpchjVy z`UTb(t+P<6T!X6dPE5p_694y6Uj_NUiF>EHe?~?|K#(`5qu0MH^K6K}I%mJfzoH~A F;9r@x*Iobs delta 4536 zcmYk;3sl$T9mnwp`GW{37rBWNKOM*hs372l46RfYP0I^unDsXxCH5ySEtjmHMK;u8 zU6z}3W?s^jJFLV8wnZmAE!R#K*1VjdN9Q~Zu_)KNShKx9{+^R@{^$RCp6B=bJ(utE zeSZ8ewgspp$W(1VbqO5L%o3#Q5{c3wU?qguD11csEKc} z?H!m%y&E<0UVH$*z+|k8^PYbkV;JA;rohK^@THZ#gW>pJ`T#ZH2~-aJ8^_}3ScK`!Di_O>iT_jzn`lr-kD?wpi+kzmQ`7{urZNfK ziHgLF);Cb0J#Md`M}_`VtiZ2v6#5-wvhWd9|1Y5y(&C`{Q zF&H<}m?*pfwZaAXBlKe?ZbU8Qk2n_(qCy_cEYzNadM+ImK{wxCD8^YdEJB57D{4YL zs4Y5!O47@if*B-?A~6HCqGhN^R9PEQTiIgk+mK+Gmr)DoMz+p1XDDcZOQ_^ZO!Fd= zhni_I>R6Vd4KJ{C+M_UzNIu5lWSot8*n~Qk?KlztgOf0e*SYcLD7=X-DvcA|raun~JvA+99V2Vxa!qIIY}e+V_< zC$R=MWf6alqzTRT_SnH|sL#UXcsH`W<}XNkm_Bqcij5D$9ONx+CgV?W9){x~+=K69 zJ+2w+MYbO`fe_-a=fcMk|40g{G-yTH7=;s1E0~Geig_4tps0klN4SWnE@PbQ0GyW1avtTxcq6tGznwf;^xC|AURmiTGX4G^0P|v-F zT1XdaA@8ClegX@y&pMI}*OuOjnxOk2g(wP7p@Tc@g@dTjA43w>e1po7wDI13OHmVh z02P5|R1$APZE1(CAF=jXeRX;tH+wg15*ZD7{HGzhWNWPdIw*DS!Vjp56 zYINO~gbLv}R1TD)uGgaWc0E3c&myl7lfz3xTULrmxEAAav)Xn3|3E>>a01oAIn>@> zvW66T^=RvG>u77Pb&9pvy1;t7btP&7^{9wFhHf&2*C;57j-!(3B+kO~wmpy6oF+I4 zHL>X!i}O**wgMIEYSi;^jXA4GSE3$j$byTu`g`|-wn#RvF{0XYx4_pd5 zMrZI%_MjiN6|c2}m{d>OTeXYKU_5=PIZ;XquD%9Tn~sB2LJKZ;uU zZ*hUn{|glOm~Z&f1ZK?kekhcnI;_IcxC>M8Z>SD?QMq#&l{1MY-T?WiV_Jf|N{rvO zKZDApy*LJs;W(ZDkU3rw6`)=`^O5{9epHCIVHG})veDwmQi1WVR#H9@iZz@ zA7L>55A}m1=qB&9_)uFo1Pd77q)<=?3sE6jhMX8vhtseXwH5ugJ#U_uR5eH%nElAy z%q3LBX3qB(v=-IRZ;+F0j^YrEx!Fs02d|v}8z~It!g5ryRii@PjC!-}MrC&=YKyv2 zp+Ab6a6b;kkXyX$ABKuVCWhifRIU`+dM#?At8XFxI(GYL(6RbErr~F}1&5I#+S^x9 z5jujp{~!1WUPeu*X`z>N%@|Al3DkskqPCzNTkub){z?{kId%6U;;#W)XjqGFs8HoE z_Ws+|pw8_s)QWmg$<>R$LR0EZ?AO>ubvv%W@>{(KzJ+@39BM)rQIQT^;+>8-mx69c zMXfL!W3T`fx?+2M9%|q+Yn^Rhj}f$Qvh6!i{Tx8;br(9=jT+}7hU2%W$hqN5y}gLS zOd4imJT~A+++h7Z>Vd;J0N=-GJc>H+AKH39PNuH^v6G+>)o(p20?%R;?nAcHHC^_? zIn>^Kg?b>N%=`I#Jv!7^qh`L@)_0+j^i5RmoVE1<%e;2ST7-(|GSpTFFd3gl6W-Pt z{a0Vciu#)B`x+_=o$0H}0~rm@kNpjIt#s-t?wI8dl+O-S))YD!>Gc_H>*9YgBH?P= z_wQ~SH2%6EUqNARPFqRd@zAl?f7j>tx^eEQ2?QD{u5{)ER^7F-!KtXbry>w&OD*hl W7|>sSwReqp^(H?Lw)NbW5cGc}%oPU! diff --git a/pyfpdb/locale/es/LC_MESSAGES/fpdb.mo b/pyfpdb/locale/es/LC_MESSAGES/fpdb.mo index d86f31d93f0e99ac587f52048c59f07c1576dbc6..80e24a9a4531b2e06065798bca072d2d8eca585e 100644 GIT binary patch delta 2778 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 diff --git a/pyfpdb/locale/fpdb-de_DE.po b/pyfpdb/locale/fpdb-de_DE.po index 248f4103..3e56509c 100644 --- a/pyfpdb/locale/fpdb-de_DE.po +++ b/pyfpdb/locale/fpdb-de_DE.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: Free Poker Database\n" -"POT-Creation-Date: 2011-03-10 05:10+CET\n" +"POT-Creation-Date: 2011-03-10 06:16+CET\n" "PO-Revision-Date: 2011-03-10 01:42+0000\n" "Last-Translator: steffen123 \n" "Language-Team: German (Germany) \n" @@ -37,13 +37,10 @@ msgstr "Konnte Gametype in '%s' nicht erkennen" msgid "determineGameType: Raising FpdbParseError" msgstr "determineGameType: FpdbParseError" -#: AbsoluteToFpdb.py:204 -msgid "readHandInfo: Didn't match: '%s'" -msgstr "readHandInfo: '%s' nicht erkannt" - -#: AbsoluteToFpdb.py:205 -msgid "Absolute: Didn't match re_HandInfo: '%s'" -msgstr "Absolute: re_HandInfo konnte '%s' nicht erkennen" +#: AbsoluteToFpdb.py:204 AbsoluteToFpdb.py:205 +#, fuzzy +msgid "Didn't match re_HandInfo: '%s'" +msgstr "Keine Treffer für re_HandInfo" #: AbsoluteToFpdb.py:207 msgid "readHandInfo: File name didn't match re_*InfoFromFilename" @@ -54,8 +51,9 @@ msgid "File name: %s" msgstr "Dateiname: %s" #: AbsoluteToFpdb.py:209 -msgid "Absolute: Didn't match re_*InfoFromFilename: '%s'" -msgstr "" +#, fuzzy +msgid "Didn't match re_*InfoFromFilename: '%s'" +msgstr "Absolute: re_HandInfo konnte '%s' nicht erkennen" #: AbsoluteToFpdb.py:278 EverleafToFpdb.py:218 FulltiltToFpdb.py:416 #: OnGameToFpdb.py:294 PokerStarsToFpdb.py:357 Win2dayToFpdb.py:203 @@ -600,11 +598,11 @@ msgstr "_Limits anzeigen" msgid "Show Number of _Players" msgstr "_Spielerzahl anzeigen" -#: Filters.py:54 TourneyFilters.py:51 +#: Filters.py:54 TourneyFilters.py:53 msgid "And:" msgstr "Und:" -#: Filters.py:54 TourneyFilters.py:51 +#: Filters.py:54 TourneyFilters.py:53 msgid "Between:" msgstr "Zwischen:" @@ -612,11 +610,11 @@ msgstr "Zwischen:" msgid "Games:" msgstr "Spiele:" -#: Filters.py:55 TourneyFilters.py:50 +#: Filters.py:55 TourneyFilters.py:52 msgid "Hero:" msgstr "Held:" -#: Filters.py:55 TourneyFilters.py:50 +#: Filters.py:55 TourneyFilters.py:52 msgid "Sites:" msgstr "Seien:" @@ -624,7 +622,7 @@ msgstr "Seien:" msgid "Limits:" msgstr "Limits:" -#: Filters.py:56 TourneyFilters.py:50 +#: Filters.py:56 TourneyFilters.py:52 msgid "Number of Players:" msgstr "Spielerzahl:" @@ -636,7 +634,7 @@ msgstr "Gruppieren:" msgid "Show Position Stats" msgstr "Positionen Anzeigen" -#: Filters.py:58 TourneyFilters.py:51 +#: Filters.py:58 TourneyFilters.py:53 msgid "Date:" msgstr "Datum:" @@ -656,7 +654,7 @@ msgstr "Tourney" msgid "New packing box created!" msgstr "" -#: Filters.py:106 TourneyFilters.py:114 +#: Filters.py:106 TourneyFilters.py:116 msgid "Either 0 or more than one site matched (%s) - EEK" msgstr "Entweder 0 oder mehr als eine Seite wurden (%s) erkannt" @@ -3177,11 +3175,11 @@ msgstr "" msgid "tournament tracker starting\n" msgstr "" -#: TourneyFilters.py:52 +#: TourneyFilters.py:54 msgid "Tourney Type" msgstr "" -#: TourneyFilters.py:86 +#: TourneyFilters.py:88 msgid "setting numTourneys:" msgstr "" @@ -4212,6 +4210,9 @@ msgid "" "manually\n" msgstr "" +#~ msgid "readHandInfo: Didn't match: '%s'" +#~ msgstr "readHandInfo: '%s' nicht erkannt" + #~ msgid "determineGameType: Unable to recognise gametype from: '%s'" #~ msgstr "determineGameType: Konnte Gametype in '%s' nicht erkennen" diff --git a/pyfpdb/locale/fpdb-en_GB.pot b/pyfpdb/locale/fpdb-en_GB.pot index 46ca5a26..675428d3 100644 --- a/pyfpdb/locale/fpdb-en_GB.pot +++ b/pyfpdb/locale/fpdb-en_GB.pot @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2011-03-10 05:14+CET\n" +"POT-Creation-Date: 2011-03-10 06:16+CET\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -36,12 +36,8 @@ msgstr "" msgid "determineGameType: Raising FpdbParseError" msgstr "" -#: AbsoluteToFpdb.py:204 -msgid "readHandInfo: Didn't match: '%s'" -msgstr "" - -#: AbsoluteToFpdb.py:205 -msgid "Absolute: Didn't match re_HandInfo: '%s'" +#: AbsoluteToFpdb.py:204 AbsoluteToFpdb.py:205 +msgid "Didn't match re_HandInfo: '%s'" msgstr "" #: AbsoluteToFpdb.py:207 @@ -53,7 +49,7 @@ msgid "File name: %s" msgstr "" #: AbsoluteToFpdb.py:209 -msgid "Absolute: Didn't match re_*InfoFromFilename: '%s'" +msgid "Didn't match re_*InfoFromFilename: '%s'" msgstr "" #: AbsoluteToFpdb.py:278 EverleafToFpdb.py:218 FulltiltToFpdb.py:416 @@ -588,11 +584,11 @@ msgstr "" msgid "Show Number of _Players" msgstr "" -#: Filters.py:54 TourneyFilters.py:51 +#: Filters.py:54 TourneyFilters.py:53 msgid "And:" msgstr "" -#: Filters.py:54 TourneyFilters.py:51 +#: Filters.py:54 TourneyFilters.py:53 msgid "Between:" msgstr "" @@ -600,11 +596,11 @@ msgstr "" msgid "Games:" msgstr "" -#: Filters.py:55 TourneyFilters.py:50 +#: Filters.py:55 TourneyFilters.py:52 msgid "Hero:" msgstr "" -#: Filters.py:55 TourneyFilters.py:50 +#: Filters.py:55 TourneyFilters.py:52 msgid "Sites:" msgstr "" @@ -612,7 +608,7 @@ msgstr "" msgid "Limits:" msgstr "" -#: Filters.py:56 TourneyFilters.py:50 +#: Filters.py:56 TourneyFilters.py:52 msgid "Number of Players:" msgstr "" @@ -624,7 +620,7 @@ msgstr "" msgid "Show Position Stats" msgstr "" -#: Filters.py:58 TourneyFilters.py:51 +#: Filters.py:58 TourneyFilters.py:53 msgid "Date:" msgstr "" @@ -644,7 +640,7 @@ msgstr "" msgid "New packing box created!" msgstr "" -#: Filters.py:106 TourneyFilters.py:114 +#: Filters.py:106 TourneyFilters.py:116 msgid "Either 0 or more than one site matched (%s) - EEK" msgstr "" @@ -3100,11 +3096,11 @@ msgid "" "tournament tracker starting\n" msgstr "" -#: TourneyFilters.py:52 +#: TourneyFilters.py:54 msgid "Tourney Type" msgstr "" -#: TourneyFilters.py:86 +#: TourneyFilters.py:88 msgid "setting numTourneys:" msgstr "" diff --git a/pyfpdb/locale/fpdb-es_ES.po b/pyfpdb/locale/fpdb-es_ES.po index 872ffdb5..5f32cc7d 100644 --- a/pyfpdb/locale/fpdb-es_ES.po +++ b/pyfpdb/locale/fpdb-es_ES.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: fpdb\n" -"POT-Creation-Date: 2011-03-10 05:10+CET\n" +"POT-Creation-Date: 2011-03-10 06:16+CET\n" "PO-Revision-Date: \n" "Last-Translator: Javier Sánchez \n" "Language-Team: \n" @@ -33,12 +33,8 @@ msgstr "Incapaz de reconocer el tipo de juego para: '%s'" msgid "determineGameType: Raising FpdbParseError" msgstr "determineGameType: Lanzando FpdbParseError" -#: AbsoluteToFpdb.py:204 -msgid "readHandInfo: Didn't match: '%s'" -msgstr "readHandInfo: No coinciden: '%s'" - -#: AbsoluteToFpdb.py:205 -msgid "Absolute: Didn't match re_HandInfo: '%s'" +#: AbsoluteToFpdb.py:204 AbsoluteToFpdb.py:205 +msgid "Didn't match re_HandInfo: '%s'" msgstr "" #: AbsoluteToFpdb.py:207 @@ -50,7 +46,7 @@ msgid "File name: %s" msgstr "Nombre de archivo: %s" #: AbsoluteToFpdb.py:209 -msgid "Absolute: Didn't match re_*InfoFromFilename: '%s'" +msgid "Didn't match re_*InfoFromFilename: '%s'" msgstr "" #: AbsoluteToFpdb.py:278 EverleafToFpdb.py:218 FulltiltToFpdb.py:416 @@ -590,11 +586,11 @@ msgstr "Mostrar _límites" msgid "Show Number of _Players" msgstr "Mostrar número de _jugadores" -#: Filters.py:54 TourneyFilters.py:51 +#: Filters.py:54 TourneyFilters.py:53 msgid "And:" msgstr "Y:" -#: Filters.py:54 TourneyFilters.py:51 +#: Filters.py:54 TourneyFilters.py:53 msgid "Between:" msgstr "Entre:" @@ -602,11 +598,11 @@ msgstr "Entre:" msgid "Games:" msgstr "Juegos:" -#: Filters.py:55 TourneyFilters.py:50 +#: Filters.py:55 TourneyFilters.py:52 msgid "Hero:" msgstr "Hero:" -#: Filters.py:55 TourneyFilters.py:50 +#: Filters.py:55 TourneyFilters.py:52 msgid "Sites:" msgstr "Sitios:" @@ -614,7 +610,7 @@ msgstr "Sitios:" msgid "Limits:" msgstr "Límites:" -#: Filters.py:56 TourneyFilters.py:50 +#: Filters.py:56 TourneyFilters.py:52 msgid "Number of Players:" msgstr "Número de jugadores:" @@ -626,7 +622,7 @@ msgstr "" msgid "Show Position Stats" msgstr "Mostrar stadísticas posicionales" -#: Filters.py:58 TourneyFilters.py:51 +#: Filters.py:58 TourneyFilters.py:53 msgid "Date:" msgstr "Fecha:" @@ -646,7 +642,7 @@ msgstr "Torneo" msgid "New packing box created!" msgstr "" -#: Filters.py:106 TourneyFilters.py:114 +#: Filters.py:106 TourneyFilters.py:116 msgid "Either 0 or more than one site matched (%s) - EEK" msgstr "" @@ -3164,11 +3160,11 @@ msgstr "" msgid "tournament tracker starting\n" msgstr "" -#: TourneyFilters.py:52 +#: TourneyFilters.py:54 msgid "Tourney Type" msgstr "" -#: TourneyFilters.py:86 +#: TourneyFilters.py:88 msgid "setting numTourneys:" msgstr "" @@ -4165,6 +4161,9 @@ msgid "" "manually\n" msgstr "" +#~ msgid "readHandInfo: Didn't match: '%s'" +#~ msgstr "readHandInfo: No coinciden: '%s'" + #~ msgid "determineGameType: Unable to recognise gametype from: '%s'" #~ msgstr "determineGameType: Incapaz de reconocer el tipo de juego para: '%s'" diff --git a/pyfpdb/locale/fpdb-fr_FR.po b/pyfpdb/locale/fpdb-fr_FR.po index 401e1e23..18382d75 100644 --- a/pyfpdb/locale/fpdb-fr_FR.po +++ b/pyfpdb/locale/fpdb-fr_FR.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: Free Poker Database\n" -"POT-Creation-Date: 2011-03-10 05:10+CET\n" +"POT-Creation-Date: 2011-03-10 06:16+CET\n" "PO-Revision-Date: 2011-03-09 15:37+0000\n" "Last-Translator: kibbitzer \n" "Language-Team: French (France) <>\n" @@ -37,13 +37,10 @@ msgstr "Impossible de reconnaître le type de jeu de: '%s'" msgid "determineGameType: Raising FpdbParseError" msgstr "determineGameType: Une erreur d'analyse de Fpdb est survenue" -#: AbsoluteToFpdb.py:204 -msgid "readHandInfo: Didn't match: '%s'" -msgstr "ReadHandInfo: Pas de correspondance: '%s'" - -#: AbsoluteToFpdb.py:205 -msgid "Absolute: Didn't match re_HandInfo: '%s'" -msgstr "Absolute: Pas de correspondance avec re_HandInfo: '%s'" +#: AbsoluteToFpdb.py:204 AbsoluteToFpdb.py:205 +#, fuzzy +msgid "Didn't match re_HandInfo: '%s'" +msgstr "Ne correspond pas à  re_HandInfo" #: AbsoluteToFpdb.py:207 msgid "readHandInfo: File name didn't match re_*InfoFromFilename" @@ -55,7 +52,8 @@ msgid "File name: %s" msgstr "Nom de fichier: '%s'" #: AbsoluteToFpdb.py:209 -msgid "Absolute: Didn't match re_*InfoFromFilename: '%s'" +#, fuzzy +msgid "Didn't match re_*InfoFromFilename: '%s'" msgstr "Absolute: Ne correspond pas à re_*IntoFromFileName: '%s'" #: AbsoluteToFpdb.py:278 EverleafToFpdb.py:218 FulltiltToFpdb.py:416 @@ -623,11 +621,11 @@ msgstr "Montre _Limites" msgid "Show Number of _Players" msgstr "Montre le nombre de _Joueurs" -#: Filters.py:54 TourneyFilters.py:51 +#: Filters.py:54 TourneyFilters.py:53 msgid "And:" msgstr "Et:" -#: Filters.py:54 TourneyFilters.py:51 +#: Filters.py:54 TourneyFilters.py:53 msgid "Between:" msgstr "Entre:" @@ -635,11 +633,11 @@ msgstr "Entre:" msgid "Games:" msgstr "Parties:" -#: Filters.py:55 TourneyFilters.py:50 +#: Filters.py:55 TourneyFilters.py:52 msgid "Hero:" msgstr "Héros:" -#: Filters.py:55 TourneyFilters.py:50 +#: Filters.py:55 TourneyFilters.py:52 msgid "Sites:" msgstr "Sites:" @@ -647,7 +645,7 @@ msgstr "Sites:" msgid "Limits:" msgstr "Limites" -#: Filters.py:56 TourneyFilters.py:50 +#: Filters.py:56 TourneyFilters.py:52 msgid "Number of Players:" msgstr "Nombre de Joueurs :" @@ -659,7 +657,7 @@ msgstr "Regroupement:" msgid "Show Position Stats" msgstr "Montre les stats par position" -#: Filters.py:58 TourneyFilters.py:51 +#: Filters.py:58 TourneyFilters.py:53 msgid "Date:" msgstr "Date:" @@ -680,7 +678,7 @@ msgstr "Tournoi" msgid "New packing box created!" msgstr "DEBUG: Nouvelle boîte de stockage créée !" -#: Filters.py:106 TourneyFilters.py:114 +#: Filters.py:106 TourneyFilters.py:116 msgid "Either 0 or more than one site matched (%s) - EEK" msgstr "0 ou plus d'un site correspondant (%s) - EEK" @@ -3347,11 +3345,11 @@ msgstr "nom de table %s non trouvé, ignore.\n" msgid "tournament tracker starting\n" msgstr "démarrage du tracker de tournoi\n" -#: TourneyFilters.py:52 +#: TourneyFilters.py:54 msgid "Tourney Type" msgstr "Type de Tournoi" -#: TourneyFilters.py:86 +#: TourneyFilters.py:88 msgid "setting numTourneys:" msgstr "Paramètre numTourneys:" @@ -4436,6 +4434,12 @@ msgstr "" "pas de répertoire gtk trouvé à cet endroit - installez gtk ou modifiez le " "chemin manuellement\n" +#~ msgid "readHandInfo: Didn't match: '%s'" +#~ msgstr "ReadHandInfo: Pas de correspondance: '%s'" + +#~ msgid "Absolute: Didn't match re_HandInfo: '%s'" +#~ msgstr "Absolute: Pas de correspondance avec re_HandInfo: '%s'" + #~ msgid "determineGameType: Unable to recognise gametype from: '%s'" #~ msgstr "" #~ "determineGameType: Impossible de reconnaître le type de jeu de: '%s'" diff --git a/pyfpdb/locale/fpdb-hu_HU.po b/pyfpdb/locale/fpdb-hu_HU.po index bda22f50..336aa8d9 100644 --- a/pyfpdb/locale/fpdb-hu_HU.po +++ b/pyfpdb/locale/fpdb-hu_HU.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.20.905 plus git\n" -"POT-Creation-Date: 2011-03-10 05:10+CET\n" +"POT-Creation-Date: 2011-03-10 06:16+CET\n" "PO-Revision-Date: 2011-02-27 18:23+0100\n" "Last-Translator: Ferenc Erki \n" "Language-Team: Hungarian \n" @@ -37,13 +37,10 @@ msgstr "Nem sikerült felismerni a játéktípust innen: '%s'" msgid "determineGameType: Raising FpdbParseError" msgstr "determineGameType: FpdbParseError" -#: AbsoluteToFpdb.py:204 -msgid "readHandInfo: Didn't match: '%s'" -msgstr "readHandInfo: Nem illeszkedik: '%s'" - -#: AbsoluteToFpdb.py:205 -msgid "Absolute: Didn't match re_HandInfo: '%s'" -msgstr "Absolute: re_HandInfo nem illeszkedik: '%s'" +#: AbsoluteToFpdb.py:204 AbsoluteToFpdb.py:205 +#, fuzzy +msgid "Didn't match re_HandInfo: '%s'" +msgstr "re_HandInfo nem illeszkedik" #: AbsoluteToFpdb.py:207 msgid "readHandInfo: File name didn't match re_*InfoFromFilename" @@ -54,7 +51,8 @@ msgid "File name: %s" msgstr "Fájlnév: %s" #: AbsoluteToFpdb.py:209 -msgid "Absolute: Didn't match re_*InfoFromFilename: '%s'" +#, fuzzy +msgid "Didn't match re_*InfoFromFilename: '%s'" msgstr "Absolute: nem illeszkedik re_*InfoFromFilename-re: '%s'" #: AbsoluteToFpdb.py:278 EverleafToFpdb.py:218 FulltiltToFpdb.py:416 @@ -623,11 +621,11 @@ msgstr "_Limitek" msgid "Show Number of _Players" msgstr "_Játékosok száma" -#: Filters.py:54 TourneyFilters.py:51 +#: Filters.py:54 TourneyFilters.py:53 msgid "And:" msgstr "Max:" -#: Filters.py:54 TourneyFilters.py:51 +#: Filters.py:54 TourneyFilters.py:53 msgid "Between:" msgstr "Min:" @@ -635,11 +633,11 @@ msgstr "Min:" msgid "Games:" msgstr "Játékok:" -#: Filters.py:55 TourneyFilters.py:50 +#: Filters.py:55 TourneyFilters.py:52 msgid "Hero:" msgstr "Játékos:" -#: Filters.py:55 TourneyFilters.py:50 +#: Filters.py:55 TourneyFilters.py:52 msgid "Sites:" msgstr "Termek:" @@ -647,7 +645,7 @@ msgstr "Termek:" msgid "Limits:" msgstr "Limitek:" -#: Filters.py:56 TourneyFilters.py:50 +#: Filters.py:56 TourneyFilters.py:52 msgid "Number of Players:" msgstr "Játékosok száma:" @@ -659,7 +657,7 @@ msgstr "Csoportosítás:" msgid "Show Position Stats" msgstr "Pozíciók" -#: Filters.py:58 TourneyFilters.py:51 +#: Filters.py:58 TourneyFilters.py:53 msgid "Date:" msgstr "Dátum:" @@ -680,7 +678,7 @@ msgstr "Versenyek" msgid "New packing box created!" msgstr "DEBUG: Új csoportosító doboz létrehozva!" -#: Filters.py:106 TourneyFilters.py:114 +#: Filters.py:106 TourneyFilters.py:116 msgid "Either 0 or more than one site matched (%s) - EEK" msgstr "Vagy egynél több, vagy egy terem sem illeszkedik (%s) - EEK" @@ -3319,11 +3317,11 @@ msgstr "%s nevű asztal nincs meg, kihagyás.\n" msgid "tournament tracker starting\n" msgstr "versenykövető indítása\n" -#: TourneyFilters.py:52 +#: TourneyFilters.py:54 msgid "Tourney Type" msgstr "Verseny típusa" -#: TourneyFilters.py:86 +#: TourneyFilters.py:88 msgid "setting numTourneys:" msgstr "numTourneys beállítása:" @@ -4408,6 +4406,12 @@ msgstr "" "Nem találhatóak a GTK könyvtárak az útvonaladban - telepítsd a GTK-t, vagy " "állítsd be kézzel az útvonalat\n" +#~ msgid "readHandInfo: Didn't match: '%s'" +#~ msgstr "readHandInfo: Nem illeszkedik: '%s'" + +#~ msgid "Absolute: Didn't match re_HandInfo: '%s'" +#~ msgstr "Absolute: re_HandInfo nem illeszkedik: '%s'" + #~ msgid "determineGameType: Unable to recognise gametype from: '%s'" #~ msgstr "" #~ "determineGameType: Nem sikerült felismerni a játéktípust innen: '%s'" diff --git a/pyfpdb/locale/fpdb-pl_PL.po b/pyfpdb/locale/fpdb-pl_PL.po index fcf7fd47..4faf63aa 100644 --- a/pyfpdb/locale/fpdb-pl_PL.po +++ b/pyfpdb/locale/fpdb-pl_PL.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: Free Poker Database\n" -"POT-Creation-Date: 2011-03-10 05:10+CET\n" +"POT-Creation-Date: 2011-03-10 06:16+CET\n" "PO-Revision-Date: 2011-03-09 22:36+0000\n" "Last-Translator: greg20 \n" "Language-Team: Polish (Poland) <>\n" @@ -38,12 +38,8 @@ msgstr "" msgid "determineGameType: Raising FpdbParseError" msgstr "" -#: AbsoluteToFpdb.py:204 -msgid "readHandInfo: Didn't match: '%s'" -msgstr "" - -#: AbsoluteToFpdb.py:205 -msgid "Absolute: Didn't match re_HandInfo: '%s'" +#: AbsoluteToFpdb.py:204 AbsoluteToFpdb.py:205 +msgid "Didn't match re_HandInfo: '%s'" msgstr "" #: AbsoluteToFpdb.py:207 @@ -55,7 +51,7 @@ msgid "File name: %s" msgstr "" #: AbsoluteToFpdb.py:209 -msgid "Absolute: Didn't match re_*InfoFromFilename: '%s'" +msgid "Didn't match re_*InfoFromFilename: '%s'" msgstr "" #: AbsoluteToFpdb.py:278 EverleafToFpdb.py:218 FulltiltToFpdb.py:416 @@ -589,11 +585,11 @@ msgstr "" msgid "Show Number of _Players" msgstr "" -#: Filters.py:54 TourneyFilters.py:51 +#: Filters.py:54 TourneyFilters.py:53 msgid "And:" msgstr "" -#: Filters.py:54 TourneyFilters.py:51 +#: Filters.py:54 TourneyFilters.py:53 msgid "Between:" msgstr "" @@ -601,11 +597,11 @@ msgstr "" msgid "Games:" msgstr "" -#: Filters.py:55 TourneyFilters.py:50 +#: Filters.py:55 TourneyFilters.py:52 msgid "Hero:" msgstr "" -#: Filters.py:55 TourneyFilters.py:50 +#: Filters.py:55 TourneyFilters.py:52 msgid "Sites:" msgstr "" @@ -613,7 +609,7 @@ msgstr "" msgid "Limits:" msgstr "" -#: Filters.py:56 TourneyFilters.py:50 +#: Filters.py:56 TourneyFilters.py:52 msgid "Number of Players:" msgstr "" @@ -625,7 +621,7 @@ msgstr "" msgid "Show Position Stats" msgstr "" -#: Filters.py:58 TourneyFilters.py:51 +#: Filters.py:58 TourneyFilters.py:53 msgid "Date:" msgstr "" @@ -645,7 +641,7 @@ msgstr "" msgid "New packing box created!" msgstr "" -#: Filters.py:106 TourneyFilters.py:114 +#: Filters.py:106 TourneyFilters.py:116 msgid "Either 0 or more than one site matched (%s) - EEK" msgstr "" @@ -3151,11 +3147,11 @@ msgstr "nie znaleziono stołu %s - pomijanie\n" msgid "tournament tracker starting\n" msgstr "tracker turniejowy rozpoczyna\n" -#: TourneyFilters.py:52 +#: TourneyFilters.py:54 msgid "Tourney Type" msgstr "Rodzaj turnieju" -#: TourneyFilters.py:86 +#: TourneyFilters.py:88 msgid "setting numTourneys:" msgstr "ustawianie numTourneys:" diff --git a/pyfpdb/locale/fpdb-ru_RU.po b/pyfpdb/locale/fpdb-ru_RU.po index 92ff8179..652e9486 100644 --- a/pyfpdb/locale/fpdb-ru_RU.po +++ b/pyfpdb/locale/fpdb-ru_RU.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: Free Poker Database\n" -"POT-Creation-Date: 2011-03-10 05:10+CET\n" +"POT-Creation-Date: 2011-03-10 06:16+CET\n" "PO-Revision-Date: 2011-03-04 18:18+0000\n" "Last-Translator: Lexej \n" "Language-Team: Russian (Russia) <>\n" @@ -38,13 +38,10 @@ msgstr "Невозможно определить тип игры: '%s'" msgid "determineGameType: Raising FpdbParseError" msgstr "determineGameType: FpdbParseError" -#: AbsoluteToFpdb.py:204 -msgid "readHandInfo: Didn't match: '%s'" -msgstr "readHandInfo: нет соответствия: '%s'" - -#: AbsoluteToFpdb.py:205 -msgid "Absolute: Didn't match re_HandInfo: '%s'" -msgstr "Absolute: re_HandInfo не соответствует: '%s'" +#: AbsoluteToFpdb.py:204 AbsoluteToFpdb.py:205 +#, fuzzy +msgid "Didn't match re_HandInfo: '%s'" +msgstr "re_HandInfo не соответствует" #: AbsoluteToFpdb.py:207 msgid "readHandInfo: File name didn't match re_*InfoFromFilename" @@ -55,7 +52,8 @@ msgid "File name: %s" msgstr "Имя файла: %s" #: AbsoluteToFpdb.py:209 -msgid "Absolute: Didn't match re_*InfoFromFilename: '%s'" +#, fuzzy +msgid "Didn't match re_*InfoFromFilename: '%s'" msgstr "Absolute: Не соответствует re_*InfoFromFilename: '%s'" #: AbsoluteToFpdb.py:278 EverleafToFpdb.py:218 FulltiltToFpdb.py:416 @@ -596,11 +594,11 @@ msgstr "" msgid "Show Number of _Players" msgstr "" -#: Filters.py:54 TourneyFilters.py:51 +#: Filters.py:54 TourneyFilters.py:53 msgid "And:" msgstr "" -#: Filters.py:54 TourneyFilters.py:51 +#: Filters.py:54 TourneyFilters.py:53 msgid "Between:" msgstr "" @@ -608,11 +606,11 @@ msgstr "" msgid "Games:" msgstr "" -#: Filters.py:55 TourneyFilters.py:50 +#: Filters.py:55 TourneyFilters.py:52 msgid "Hero:" msgstr "Херо:" -#: Filters.py:55 TourneyFilters.py:50 +#: Filters.py:55 TourneyFilters.py:52 msgid "Sites:" msgstr "" @@ -620,7 +618,7 @@ msgstr "" msgid "Limits:" msgstr "" -#: Filters.py:56 TourneyFilters.py:50 +#: Filters.py:56 TourneyFilters.py:52 msgid "Number of Players:" msgstr "" @@ -632,7 +630,7 @@ msgstr "" msgid "Show Position Stats" msgstr "" -#: Filters.py:58 TourneyFilters.py:51 +#: Filters.py:58 TourneyFilters.py:53 msgid "Date:" msgstr "Дата:" @@ -652,7 +650,7 @@ msgstr "Турнир" msgid "New packing box created!" msgstr "" -#: Filters.py:106 TourneyFilters.py:114 +#: Filters.py:106 TourneyFilters.py:116 msgid "Either 0 or more than one site matched (%s) - EEK" msgstr "" @@ -3144,11 +3142,11 @@ msgstr "" msgid "tournament tracker starting\n" msgstr "" -#: TourneyFilters.py:52 +#: TourneyFilters.py:54 msgid "Tourney Type" msgstr "" -#: TourneyFilters.py:86 +#: TourneyFilters.py:88 msgid "setting numTourneys:" msgstr "" @@ -4139,6 +4137,12 @@ msgid "" "manually\n" msgstr "" +#~ msgid "readHandInfo: Didn't match: '%s'" +#~ msgstr "readHandInfo: нет соответствия: '%s'" + +#~ msgid "Absolute: Didn't match re_HandInfo: '%s'" +#~ msgstr "Absolute: re_HandInfo не соответствует: '%s'" + #~ msgid "determineGameType: Unable to recognise gametype from: '%s'" #~ msgstr "determineGameType: Невозможно определить тип игры: '%s'" diff --git a/pyfpdb/locale/fr/LC_MESSAGES/fpdb.mo b/pyfpdb/locale/fr/LC_MESSAGES/fpdb.mo index b1011be9b99ca990c92ba9f58620fe5affa4e543..cbfb22ca85e1a64fbcbcde408894be6281b729a9 100644 GIT binary patch delta 13373 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 delta 13590 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 diff --git a/pyfpdb/locale/hu/LC_MESSAGES/fpdb.mo b/pyfpdb/locale/hu/LC_MESSAGES/fpdb.mo index a67e8605a61be194b4b8fc21a2f8a5298f45506a..e00afdd6d66d76daadcce243f63a5fa60702f6dd 100644 GIT binary patch delta 13610 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 delta 13795 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 Fe*h|Z`zinc diff --git a/pyfpdb/locale/pl/LC_MESSAGES/fpdb.mo b/pyfpdb/locale/pl/LC_MESSAGES/fpdb.mo index 24be114ec1ab214a4f55dd90b25a01a68f32205a..d6e01a9fe3d8d7320ad785f1c93f2575a6c8ed56 100644 GIT binary patch delta 19 bcmbQTigC&+#tk?0SZ delta 19 bcmbQTigC&+#tk?0Sxl`A4L0A=w@?KDP09x) diff --git a/pyfpdb/locale/ru/LC_MESSAGES/fpdb.mo b/pyfpdb/locale/ru/LC_MESSAGES/fpdb.mo index b72b7ee6c533532d31b09463e572e57b59d66683..4b3c09a6e9622f0f73455efcdf290b0dad20d024 100644 GIT binary patch delta 1160 zcmYMzUr1A77{~Evb7>>3sk1rLre;btBZyAaMNrg*MNkl4L}D>Wc4ZNjbraF|*9MKV^LgI)ynmnbo(J7i+ntXUzO?b% z!M~P&msh3#zkZ)t6~zPCfP=Uj(^!sKT!P;)h~5Qe^%%ksZp2nh;37;GJe$|CG(i&& zCa@VNaRq+HGAu7PtHuca8xWULP88~oU?t@tq>GIe>aSv)vWpt$J1#~~iJ2b*nDIGg zH3U4fNtV}xuaV7Iurxnl7`ZIMtpZz7nTq3T?8g8OqcUUg1g=j%|Z@5W6yfE(}%GKamv7ap@2)C4!_+^%{YM=$AGhBr`W z=Lt4r7Pn$ar8yQO=-~xw;3R6rF4o~oRL2~)<3b)LunYI&c~k~wQT_j*+C^D?3m!#n zELA8!MrAgKYw>Fp`M*F=OFpTy3@RhfPz`7BCtpMkNsfJBwu?B2N@bG9YB!47=@@E< z_fQLXhrQ_KA))O>wL8XbJq|krjRX%-JARK^@h@z{2q$d>_u+AzM(wzl#$?eBqt3`F z)L}f0IwQAm7iKVu^QZ;4EYE)x9XLVx&`E-o1mQ?N)p69o2Qh{xuoE-52Xn|}(fa&5 z??X*|2K(?fZo}WGjBaUgM}18m*I)d_pQ;W#^2IvaV(wJnT#=g%7L}z!jo1GIU#NMO delta 1361 zcmZY8OGuPa6u|Lgj_=p#IF_mTIjNHmP_wa`NGm2y%TTZfk;#;XhK-SiQsG!D7bf9g zEqa)wQHm{`LJ)!?DrjZdLWmv^^w@+5wUqv+88B#=`F{7ibH01;Iro0^yB_WKeoQhA z3!f@}>HHd2>D|g_z$9Yj_6laukp#41GHyfzt8g{8Vj=cn2~Ob#{Dd(g zUWp9<+mPg-24)jbh`Csg>#+yp@FuRo3DgOmV+y_x_AjA@`49KKcB`h9h&h|)cfzKCAY9I1(<<@SdEM&3#b+Qi5eG0 zS$^~8Sdi*UH0fQ%RMZMjpvKK0UwOtw6aL_(p%a=oL3^IuAf!DAYr_qLAP%{qa zq6^MOeXaIkKlb7oj93@QxCix+4xyf%anwWl0QKy6-_oe2v4ESt;6W_IQFP)0)}n>|;1O|S9$rG7coMbr@34U|i6pHZbTp!t_O{J`#FQNp zeY~@y{ajaz({TB^6O1CKVbAHb%g&YVwq}pL%Q)@sI?-yJZE4!$_B2;}PId$W{TIU) zqmo?z#02_%jR`MJ4rfWR-) Date: Thu, 10 Mar 2011 17:35:58 +0100 Subject: [PATCH 06/41] dont load configuration in test_python_libs as the import fails --- test_Python_Libs.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/test_Python_Libs.py b/test_Python_Libs.py index 71a613e4..31e14b34 100755 --- a/test_Python_Libs.py +++ b/test_Python_Libs.py @@ -24,9 +24,6 @@ Test if gtk is working. import sys import os -import Configuration - -config_path = Configuration.get_default_config_path() try: import gobject as _gobject @@ -70,7 +67,7 @@ try: (gtk.STOCK_CLOSE, gtk.RESPONSE_OK)) dia.set_default_size(500, 300) - l = gtk.Label("GTK is working!\nConfig location: %s" %config_path) + l = gtk.Label("GTK is working!\n") dia.vbox.add(l) l.show() From 0dfe6b3d78cb6e220b3ecd546ef5abb0b0b3f169 Mon Sep 17 00:00:00 2001 From: gimick Date: Thu, 10 Mar 2011 21:02:14 +0000 Subject: [PATCH 07/41] py2exe: add more build automation, activate MS-Windows GTK theme --- .../windows/py2exeWalkthroughPython27.txt | 472 +++++++++--------- packaging/windows/py2exe_setup.py | 73 ++- 2 files changed, 267 insertions(+), 278 deletions(-) diff --git a/packaging/windows/py2exeWalkthroughPython27.txt b/packaging/windows/py2exeWalkthroughPython27.txt index c1fe722c..af498584 100644 --- a/packaging/windows/py2exeWalkthroughPython27.txt +++ b/packaging/windows/py2exeWalkthroughPython27.txt @@ -1,241 +1,231 @@ -PY2EXE walkthrough for Python 2.7 & FPDB 0.2x -created on 27th Feb 2011 by Gimick - -This walkthrough is derived from comments in the py2exe script made by Ray and SqlCoder -Additional information, formatting, updating to Python 2.6 and Python 2.7 and sequencing added by Gimick -Content is available under the the GNU Affero General Public License version 3 - - - -Step 0 Get a fresh XP installation ----------------------------------- - -0.1/ Using XPhome or Pro 32bit - -0.2/ Ensure the CPU supports SSE2 instruction set or better. - - -Step 1, dependency install --------------------------- - -1.1/ install the following in sequence (accept all default options) there should be no errors ! - -Python 2.7 ... http://python.org/ftp/python/2.7/python-2.7.msi -matplotlib 1.0.1 ... http://sourceforge.net/projects/matplotlib/files/matplotlib/matplotlib-1.0.1/matplotlib-1.0.1.win32-py2.7.exe/download -pygtk 2.22 ... http://ftp.gnome.org/pub/GNOME/binaries/win32/pygtk/2.22/pygtk-2.22.0-1.win32-py2.7.exe -pycairo 1.8.10 ... http://ftp.gnome.org/pub/GNOME/binaries/win32/pycairo/1.8/pycairo-1.8.10.win32-py2.7.exe -pyGobject X 2.26 ... http://ftp.gnome.org/pub/GNOME/binaries/win32/pygobject/2.26/pygobject-2.26.0-1.win32-py2.7.exe -pywin 216 ... http://sourceforge.net/projects/pywin32/files/pywin32/Build216/pywin32-216.win32-py2.7.exe/download - -pypokereval 138 ... http://sourceforge.net/projects/fpdb/files/fpdb/pokereval-138.win32-py2.7.exe/download -cdecimal 2.2 ... http://www.bytereef.org/software/mpdecimal/releases/cdecimal-2.2.win32-py2.7.msi -psycopg2 ... http://www.stickpeople.com/projects/python/win-psycopg/psycopg2-2.2.1.win32-py2.6-pg8.4.3-release.exe - -(Note: stickpeople is the offical repository, not a community build) - -py2exe 0.6.9 ... http://sourceforge.net/projects/py2exe/files/py2exe/0.6.9/py2exe-0.6.9.win32-py2.7.exe/download - -1.2/ MySQL - -Install the following file: -mysql-python 1.2.3 ... http://sourceforge.net/projects/fpdb/files/fpdb/MySQL-python-1.2.3.win32-py2.7.exe/download - -1.3/ pytz fixup to work in an executable package - -pytz needs runtime access to timezone definition files. pytz is hard-coded to search in the directory from which the pytz .py modules are being run. -In a py2exe package, this directory is actually a library.zip container file, so windows cannot find the timezone definitions, and will crash the app. - -We need to make a one-line change to pytz to search in the current working directory (which is not a container), and not the application directory. -The py2exe script copies the timezone datafiles into the package folder pyfpdb/zoneinfo. - -Thanks to Jeff Peck gmail.com> on the py2exe mailing list for documenting this problem and solution. - -1.3.1/ Navigate to C:\Python27\Lib\site-packages\pytz -1.3.2/ Edit __init__.py -1.3.3/ At line 55 replace the following line(s): - - filename = os.path.join(os.path.dirname(__file__), - 'zoneinfo', *name_parts) - -with this line: - - filename = os.path.join(os.getcwd(), 'zoneinfo', *name_parts) - -1.3.4/ Save and exit - - -1.4/ Patch py2exe to stop popup runtime error message - -see http://www.py2exe.org/index.cgi/StderrLog for technical info. - -1.4.1/ - -dos> write C:\Python27\Lib\site-packages\py2exe\boot_common.py - -replace: - atexit.register(alert, 0, - "See the logfile '%s' for details" % fname, - "Errors occurred") -with: - #atexit.register(alert, 0, - # "See the logfile '%s' for details" % fname, - # "Errors occurred") - -1.4.2/ save and exit - - - -Step 2 Setup GTK ------------------ - -There are quite a few GTK packages needed, and rather than install them individually, I used the official AllinOne from the GTK project. - -2,1/ Create a new folder c:\GTK - -2.2/ Extract the following zip file into c:\GTK - -gtk+ allinone 2.22.1 ... http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.22/gtk+-bundle_2.22.1-20101227_win32.zip - -2.3/ If everything has worked, you should have c:\GTK\bin \etc \lib \src and so on created. - -2.4/ The /share/doc and /share/gtk-doc folders are huge, so can be emptied now (leave the /doc and /gtk-doc folders - in place, but delete the content) - - -Step 3 Set GTK into the PATH variable -------------------------------------- - -The path for GTK isn't set by default, so need to let the o/s know where the GTK stuff is. - -3.1/ Rightclick on mycomputer to show system properties -3.2/ select advanced/environment Variables -3.3/ in "system variables" NOT "user variables" do the following -3.3.1/ create a new item as name: GTK_BASEPATH value: c:\GTK -3.3.2/ edit the item "path", press home to get to the first character and insert the following text, (no quotes, including semicolon) %GTK_BASEPATH%\bin; - -3.4/ to check, open command prompt and do: - -dos>path ... system should respond with ... PATH=c:\GTK\bin;C:\WIN........ - -3.5/ Give it a spin to test (hopefully an application will start, if not, something has gone wrong) - -dos> gtk-demo - - -Step 4 Get the fpdb GIT tree ----------------------------- - -4.1/ Best to take a copy to work with; following steps will assume that the fpdb folder is on the Desktop -4.2/ Edit the script in packaging/windows/py2exe_setup.py to set the fpdbver variable for this release - - -5.3/ Install correct Numpy for this build ------------------------------------------ - -Numpy needs special handling, as by default it will install an optimised version for the SSE level of your CPU (SSE3, SSE2 or noSSE). This means that the completed package will not run on an older CPU. - -For this reason, do not just run the installer downloaded. We will force a nosse version, to minimise problems on -older client PC's - -5.3.1/ download the package to the Desktop - -numpy 1.5.1 ... http://sourceforge.net/projects/numpy/files/NumPy/1.5.1/numpy-1.5.1-win32-superpack-python2.7.exe/download - -5.3.3/ If you are wanting to build a package which works on all CPU's, install noSSE as follows: - -dos> cd Desktop -dos> numpy-1.5.1-win32-superpack-python2.7.exe /arch nosse - -5.3.4/ At the end of the installation, click on "show details" to confirm the installation. - -"Target CPU handles SSE2" -"Target CPU handles SSE3" -"nosse install (arch value: nosse)" -"Install NO SSE" -Extract: numpy-1.5.1-nosse.exe... 100% -Execute: "C:\DOCUME~1\user\LOCALS~1\Temp\numpy-1.5.1-nosse.exe" -Completed - -Step 6 Run py2exe to generate fpdb.exe --------------------------------------- - -6.1/ Run the script to create the fpdb.exe bundle - -dos> cd Desktop\fpdb\packaging\windows -dos> c:\python27\python.exe py2exe_setup.py py2exe - -wait a while, watch lots of copying and whatever. - -6.2/ You should next get prompted for the GTK folder. -c:\GTK - -6.3/ If there are no errors reported, it has probably worked, we will test soon. - -Build notes: - -There is a warning about dll's not included "umath.pyd - c:\Python27\lib\site-packages\numpy\core\umath.pyd" - - reason for this is not understood at present. (Umath is apparently included in the built package). - - -Step 7 not currently used -------------------------- - -Has been deleted - - -Step 8 Drag out the completed bundle ------------------------------------- - -py2exe creates a new folder for the created software bundle, drag this out to the desktop for ease of working. - -8.1/ Drag Desktop\fpdb\packaging\windows\fpdb-n.nn.nnn to Desktop\ - - -Step 9 Initial run ------------------- - -9.1/ Open the Desktop\fpdb-n.nn.nnn folder -9.2/ In explorer...tools...folder options...View uncheck "Hide extensions for known file types" -9.3/ Double click run_fpdb.bat -9.4/ check the contents of pyfpdb\fpdb.exe.log, deal with any errors thrown - -9.5/ hopefully, fpdb will run -9.6/ Try out a few options, deal with any errors reported - -Observe that the msvcp90.dll was provided by the python runtime package, so we don't have to install the separate package from Microsoft. End-users will, however need the dependency. - - -Step 11 pruning ---------------- - -11.1/ The generated folder is 100+MB and can be pruned by removing the following directories: - -pyfpdb/lib/glib-2.0 -pyfpdb/lib/pkgconfig -pyfpdb/share/aclocal -pyfpdb/share/doc -pyfpdb/share/glib-2.0 -pyfpdb/share/gtk-2.0 -pyfpdb/share/gtk-doc -pyfpdb/share/locale -pyfpdb/share/man - - -Step 12 rename folder ---------------------- - -If needed, rename the folder to something meaningful to the community. If you have built for NoSSE, append anyCPU to the directory name. - - -Step 13 Compress to executable archive --------------------------------------- - -13.1/ Download and install 7zip 914 ... http://sourceforge.net/projects/sevenzip/files/7-Zip/9.14/7z914.exe/download -13.2/ Rightclick on fpdb executable folder, select 7zip Add to archive... select SFX archive option switch -13.3/ Test the created exe file - -Step 14 If you need to build again for a different SSE level ------------------------------------------------------------- - -Go back to step 5 and run again. - +PY2EXE walkthrough for Python 2.7 & FPDB 0.2x +created on 27th Feb 2011 by Gimick + +This walkthrough is derived from comments in the py2exe script made by Ray and SqlCoder +Additional information, formatting, updating to Python 2.6 and Python 2.7 and sequencing added by Gimick +Content is available under the the GNU Affero General Public License version 3 + + + +Step 0 Get a fresh XP installation +---------------------------------- + +0.1/ Using XPhome or Pro 32bit + +0.2/ Ensure the CPU supports SSE2 instruction set or better. + + +Step 1, dependency install +-------------------------- + +1.1/ install the following in sequence (accept all default options) there should be no errors ! + +Python 2.7 ... http://python.org/ftp/python/2.7/python-2.7.msi +matplotlib 1.0.1 ... http://sourceforge.net/projects/matplotlib/files/matplotlib/matplotlib-1.0.1/matplotlib-1.0.1.win32-py2.7.exe/download +pygtk 2.22 ... http://ftp.gnome.org/pub/GNOME/binaries/win32/pygtk/2.22/pygtk-2.22.0-1.win32-py2.7.exe +pycairo 1.8.10 ... http://ftp.gnome.org/pub/GNOME/binaries/win32/pycairo/1.8/pycairo-1.8.10.win32-py2.7.exe +pyGobject X 2.26 ... http://ftp.gnome.org/pub/GNOME/binaries/win32/pygobject/2.26/pygobject-2.26.0-1.win32-py2.7.exe +pywin 216 ... http://sourceforge.net/projects/pywin32/files/pywin32/Build216/pywin32-216.win32-py2.7.exe/download + +pypokereval 138 ... http://sourceforge.net/projects/fpdb/files/fpdb/pokereval-138.win32-py2.7.exe/download +cdecimal 2.2 ... http://www.bytereef.org/software/mpdecimal/releases/cdecimal-2.2.win32-py2.7.msi +psycopg2 ... http://www.stickpeople.com/projects/python/win-psycopg/psycopg2-2.2.1.win32-py2.6-pg8.4.3-release.exe + +(Note: stickpeople is the offical repository, not a community build) + +py2exe 0.6.9 ... http://sourceforge.net/projects/py2exe/files/py2exe/0.6.9/py2exe-0.6.9.win32-py2.7.exe/download + +1.2/ MySQL + +Install the following file: +mysql-python 1.2.3 ... http://sourceforge.net/projects/fpdb/files/fpdb/MySQL-python-1.2.3.win32-py2.7.exe/download + +1.3/ pytz fixup to work in an executable package + +pytz needs runtime access to timezone definition files. pytz is hard-coded to search in the directory from which the pytz .py modules are being run. +In a py2exe package, this directory is actually a library.zip container file, so windows cannot find the timezone definitions, and will crash the app. + +We need to make a one-line change to pytz to search in the current working directory (which is not a container), and not the application directory. +The py2exe script copies the timezone datafiles into the package folder pyfpdb/zoneinfo. + +Thanks to Jeff Peck gmail.com> on the py2exe mailing list for documenting this problem and solution. + +1.3.1/ Navigate to C:\Python27\Lib\site-packages\pytz +1.3.2/ Edit __init__.py +1.3.3/ At line 55 replace the following line(s): + + filename = os.path.join(os.path.dirname(__file__), + 'zoneinfo', *name_parts) + +with this line: + + filename = os.path.join(os.getcwd(), 'zoneinfo', *name_parts) + +1.3.4/ Save and exit + + +1.4/ Patch py2exe to stop popup runtime error message + +see http://www.py2exe.org/index.cgi/StderrLog for technical info. + +1.4.1/ + +dos> write C:\Python27\Lib\site-packages\py2exe\boot_common.py + +replace: + atexit.register(alert, 0, + "See the logfile '%s' for details" % fname, + "Errors occurred") +with: + #atexit.register(alert, 0, + # "See the logfile '%s' for details" % fname, + # "Errors occurred") + +1.4.2/ save and exit + + + +Step 2 Setup GTK +----------------- + +There are quite a few GTK packages needed, and rather than install them individually, I used the official AllinOne from the GTK project. + +2,1/ Create a new folder c:\GTK + +2.2/ Extract the following zip file into c:\GTK + +gtk+ allinone 2.22.1 ... http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.22/gtk+-bundle_2.22.1-20101227_win32.zip + +2.3/ If everything has worked, you should have c:\GTK\bin \etc \lib \src and so on created. + +2.4/ The /share/doc and /share/gtk-doc folders are huge, so can be emptied now (leave the /doc and /gtk-doc folders + in place, but delete the content) + + +Step 3 Set GTK into the PATH variable +------------------------------------- + +The path for GTK isn't set by default, so need to let the o/s know where the GTK stuff is. + +3.1/ Rightclick on mycomputer to show system properties +3.2/ select advanced/environment Variables +3.3/ in "system variables" NOT "user variables" do the following +3.3.1/ create a new item as name: GTK_BASEPATH value: c:\GTK +3.3.2/ edit the item "path", press home to get to the first character and insert the following text, (no quotes, including semicolon) %GTK_BASEPATH%\bin; + +3.4/ to check, open command prompt and do: + +dos>path ... system should respond with ... PATH=c:\GTK\bin;C:\WIN........ + +3.5/ Give it a spin to test (hopefully an application will start, if not, something has gone wrong) + +dos> gtk-demo + + +Step 4 Get the fpdb GIT tree +---------------------------- + +4.1/ Best to take a copy to work with; following steps will assume that the fpdb folder is on the Desktop +4.2/ Edit the script in packaging/windows/py2exe_setup.py to set the fpdbver variable for this release + + +5.3/ Install correct Numpy for this build +----------------------------------------- + +Numpy needs special handling, as by default it will install an optimised version for the SSE level of your CPU (SSE3, SSE2 or noSSE). This means that the completed package will not run on an older CPU. + +For this reason, do not just run the installer. We will force a nosse version, to minimise problems on +older client PC's + +5.3.1/ download the package to the Desktop + +numpy 1.5.1 ... http://sourceforge.net/projects/numpy/files/NumPy/1.5.1/numpy-1.5.1-win32-superpack-python2.7.exe/download + +5.3.3/ You are normally wanting to build a package which works on all CPU's, so install for noSSE as follows: + +dos> cd Desktop +dos> numpy-1.5.1-win32-superpack-python2.7.exe /arch nosse + +5.3.4/ At the end of the installation, click on "show details" to confirm the installation. + +"Target CPU handles SSE2" +"Target CPU handles SSE3" +"nosse install (arch value: nosse)" +"Install NO SSE" +Extract: numpy-1.5.1-nosse.exe... 100% +Execute: "C:\DOCUME~1\user\LOCALS~1\Temp\numpy-1.5.1-nosse.exe" +Completed + +Step 6 Run py2exe to generate fpdb.exe +-------------------------------------- + +6.0/ Set version number of build folder +dos> cd Desktop\fpdb\packaging\windows +dos> write py2exe_setup.py +change the value of fpdbver and save file + +6.1/ Run the script to create the fpdb.exe bundle + +dos> cd Desktop\fpdb\packaging\windows +dos> c:\python27\python.exe py2exe_setup.py py2exe + +wait a while, watch lots of copying and whatever. + +6.2/ You should next get prompted for the GTK folder. +Enter c:\GTK + +6.3/ If there are no errors reported, it has probably worked, we will test soon. + +Build notes: + +There is a warning about dll's not included "umath.pyd - c:\Python27\lib\site-packages\numpy\core\umath.pyd" + - reason for this is not understood at present. (Umath is apparently included in the built package). + + +Step 7 not currently used +------------------------- + +Has been deleted + + +Step 8 Drag out the completed bundle +------------------------------------ + +py2exe creates a new folder for the created software bundle, drag this out to the desktop for ease of working. + +8.1/ Drag Desktop\fpdb\packaging\windows\fpdb-n.nn.nnn to Desktop\ + + +Step 9 Initial run +------------------ + +9.1/ Open the Desktop\fpdb-n.nn.nnn folder +9.2/ In explorer...tools...folder options...View uncheck "Hide extensions for known file types" +9.3/ Double click run_fpdb.bat +9.4/ check the contents of pyfpdb\fpdb.exe.log, deal with any errors thrown + +9.5/ hopefully, fpdb will run +9.6/ Try out a few options, deal with any errors reported + +Observe that the msvcp90.dll was provided by the python runtime package, so we don't have to install the separate package from Microsoft. End-users will, however need the dependency. + + +Step 11 deleted +--------------- + +Has been deleted + + +Step 12 rename folder +--------------------- + +If needed, rename the folder to something meaningful to the community. + +Step 13 Compress to executable archive +-------------------------------------- + +13.1/ Download and install 7zip 914 ... http://sourceforge.net/projects/sevenzip/files/7-Zip/9.14/7z914.exe/download +13.2/ Rightclick on fpdb executable folder, select 7zip Add to archive... select SFX archive option switch +13.3/ Test the created exe file + + diff --git a/packaging/windows/py2exe_setup.py b/packaging/windows/py2exe_setup.py index 25a54c79..723218ac 100644 --- a/packaging/windows/py2exe_setup.py +++ b/packaging/windows/py2exe_setup.py @@ -24,32 +24,25 @@ Py2exe script for fpdb. ######################################################################## #TODO: -# get rid of all the uneeded libraries (e.g., pyQT) # think about an installer -# done: change GuiAutoImport so that it knows to start HUD_main.exe, when appropriate -# include the lib needed to handle png files in mucked - #HOW TO USE this script: # +#- edit the fpdbver variable in this script (this value will be used to create the distribution folder name) #- cd to the folder where this script is stored, usually ...packaging/windows #- Run the script with python "py2exe_setup.py py2exe" #- You will frequently get messages about missing .dll files.just assume other # person will have them? we have copyright issues including some dll's -#- If it works, you'll have a new dir fpdb-YYYYMMDD-exe which should +#- If it works, you'll have a new dir fpdb-version which should # contain 2 dirs; gfx and pyfpdb and run_fpdb.bat -#- [ This bit is now automated: -# Last, you must copy the etc/, lib/ and share/ folders from your -# gtk/bin/ (just /gtk/?) folder to the pyfpdb folder. (the whole folders, -# not just the contents) ] -#- You can (should) then prune the etc/, lib/ and share/ folders to -# remove components we don't need. (see output at end of program run) # See walkthrough in packaging directory for versions used +# Very useful guide here : http://www.no-ack.org/2010/09/complete-guide-to-py2exe-for-pygtk.html # steffeN: Doesnt seem necessary to gettext-ify this, but feel free to if you disagree # Gimick: restructure to allow script to run from packaging/windows directory, and not to write to source pyfpdb +fpdbver = '0.22' import os import sys @@ -61,6 +54,10 @@ except: print "A parameter is required, quitting now" quit() +if sys.argv[1] <> "py2exe": + print "Parameter 1 is not valid, quitting now" + quit() + from distutils.core import setup import py2exe import glob @@ -75,12 +72,15 @@ def isSystemDLL(pathname): return origIsSystemDLL(pathname) def test_and_remove(top): + #print "Attempting to delete:", top if os.path.exists(top): if os.path.isdir(top): remove_tree(top) else: print "Unexpected file '"+top+"' found. Exiting." exit() + else: + "oops folder not found" def remove_tree(top): # Delete everything reachable from the directory named in 'top', @@ -89,8 +89,8 @@ def remove_tree(top): # could delete all your disk files. # sc: Nicked this from somewhere, added the if statement to try # make it a bit safer - if top in ('build','dist',distdir) and os.path.basename(os.getcwd()) == 'windows': - #print "removing directory '"+top+"' ..." + if (top in ('build','dist') or top.startswith(distdir)) and os.path.basename(os.getcwd()) == 'windows': + print "removing directory '"+top+"' ..." for root, dirs, files in os.walk(top, topdown=False): for name in files: os.remove(os.path.join(root, name)) @@ -111,8 +111,6 @@ def copy_file(source,destination): shutil.copy( source, destination ) -fpdbver = '0.21' - distdir = r'fpdb-' + fpdbver rootdir = r'../../' #cwd is normally /packaging/windows pydir = rootdir+'pyfpdb/' @@ -172,9 +170,6 @@ setup( ] + matplotlib.get_py2exe_datafiles() ) -# ,(distdir, [rootdir+'run_fpdb.bat']) -# ,(distdir+r'\gfx', glob.glob(gfxdir+'*.*')) -# ] + print "*** py2exe build phase complete ***" # copy zone info and fpdb translation folders @@ -185,7 +180,7 @@ copy_tree (pydir+r'locale', os.path.join(r'dist', 'locale')) copy_tree (gfxdir, os.path.join(distdir, 'gfx')) copy_file (rootdir+'run_fpdb.bat', distdir) -print "*** Renaming dist folder as distribution pyfpdb folder ***" +print "*** Renaming dist folder as pyfpdb folder ***" dest = os.path.join(distdir, 'pyfpdb') os.rename( 'dist', dest ) @@ -196,30 +191,34 @@ while not os.path.exists(gtk_dir): gtk_dir = sys.stdin.readline().rstrip() print "*** copying GTK runtime ***" -dest = os.path.join(distdir, 'pyfpdb') +dest = os.path.join(distdir, 'pyfpdb', ) copy_file(os.path.join(gtk_dir, 'bin', 'libgdk-win32-2.0-0.dll'), dest ) copy_file(os.path.join(gtk_dir, 'bin', 'libgobject-2.0-0.dll'), dest) copy_tree(os.path.join(gtk_dir, 'etc'), os.path.join(dest, 'etc')) copy_tree(os.path.join(gtk_dir, 'lib'), os.path.join(dest, 'lib')) copy_tree(os.path.join(gtk_dir, 'share'), os.path.join(dest, 'share')) -print "*** All done! ***" +print "*** Activating MS-Windows GTK theme ***" +gtkrc = open(os.path.join(distdir, 'pyfpdb', 'etc', 'gtk-2.0', 'gtkrc'), 'w') +print >>gtkrc, 'gtk-theme-name = "MS-Windows"' +gtkrc.close() + +print "*** deleting temporary build folder ***" test_and_remove('build') -print distdir+" is in the pyfpdb dir" -print """ -The following dirs can probably removed to make the final package smaller: -pyfpdb/lib/glib-2.0 -pyfpdb/lib/gtk-2.0/include -pyfpdb/lib/pkgconfig -pyfpdb/share/aclocal -pyfpdb/share/doc -pyfpdb/share/glib-2.0 -pyfpdb/share/gtk-2.0 -pyfpdb/share/gtk-doc -pyfpdb/share/locale -pyfpdb/share/man -pyfpdb/share/themes/Default +print "*** deleting folders to shrink package size ***" +test_and_remove(os.path.join(distdir, 'pyfpdb', 'lib', 'glib-2.0')) +test_and_remove(os.path.join(distdir, 'pyfpdb', 'lib', 'gtk-2.0','include')) +test_and_remove(os.path.join(distdir, 'pyfpdb', 'lib', 'pkgconfig')) +test_and_remove(os.path.join(distdir, 'pyfpdb', 'share', 'aclocal')) +test_and_remove(os.path.join(distdir, 'pyfpdb', 'share', 'doc')) +test_and_remove(os.path.join(distdir, 'pyfpdb', 'share', 'glib-2.0')) +test_and_remove(os.path.join(distdir, 'pyfpdb', 'share', 'gtk-2.0')) +test_and_remove(os.path.join(distdir, 'pyfpdb', 'share', 'gtk-doc')) +test_and_remove(os.path.join(distdir, 'pyfpdb', 'share', 'locale')) +test_and_remove(os.path.join(distdir, 'pyfpdb', 'share', 'man')) -Use 7-zip to zip up the distribution and create a self extracting archive and that's it! -""" +print "***++++++++++++++++++++++++++++++++++++++++++++++" +print "All done!" +print "The distribution folder "+distdir+" is in the pyfpdb dir" +print "***++++++++++++++++++++++++++++++++++++++++++++++" From 78c19a7e8864f93721f94fd7b5bac8f31d5ca2bc Mon Sep 17 00:00:00 2001 From: Erki Ferenc Date: Fri, 11 Mar 2011 01:36:41 +0100 Subject: [PATCH 08/41] l10n: updated Hungarian translation --- pyfpdb/locale/fpdb-hu_HU.po | 291 +++++++++++++++--------------------- 1 file changed, 118 insertions(+), 173 deletions(-) diff --git a/pyfpdb/locale/fpdb-hu_HU.po b/pyfpdb/locale/fpdb-hu_HU.po index bda22f50..357b3f18 100644 --- a/pyfpdb/locale/fpdb-hu_HU.po +++ b/pyfpdb/locale/fpdb-hu_HU.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.20.905 plus git\n" "POT-Creation-Date: 2011-03-10 05:10+CET\n" -"PO-Revision-Date: 2011-02-27 18:23+0100\n" +"PO-Revision-Date: 2011-03-11 01:33+0100\n" "Last-Translator: Ferenc Erki \n" "Language-Team: Hungarian \n" "Language: hu\n" @@ -81,9 +81,8 @@ msgstr "Az Absolute terem readStudPlayerCards funkciója csak egy csonk." #: AbsoluteToFpdb.py:351 CarbonToFpdb.py:267 EverestToFpdb.py:234 #: EverestToFpdb.py:235 EverleafToFpdb.py:288 -#, fuzzy msgid "Unimplemented readAction: %s %s" -msgstr "Nem ismert readAction: '%s' '%s'" +msgstr "Nem ismert readAction: %s %s" #: AbsoluteToFpdb.py:401 BetfairToFpdb.py:222 CarbonToFpdb.py:298 #: EverleafToFpdb.py:326 FulltiltToFpdb.py:784 PartyPokerToFpdb.py:577 @@ -136,11 +135,10 @@ msgstr "Nyitó hívás nem található" #: PokerStarsToFpdb.py:439 Win2dayToFpdb.py:341 WinamaxToFpdb.py:406 #: test_Database.py:50 test_Database.py:51 msgid "DEBUG: " -msgstr "" +msgstr "DEBUG: " #: BetfairToFpdb.py:199 OnGameToFpdb.py:337 PokerStarsToFpdb.py:439 #: Win2dayToFpdb.py:341 WinamaxToFpdb.py:406 -#, fuzzy msgid "unimplemented readAction: '%s' '%s'" msgstr "Nem ismert readAction: '%s' '%s'" @@ -181,9 +179,8 @@ msgid "No %s found, cannot fall back. Exiting.\n" msgstr "%s nem található, nem tudom folytatni. Kilépés.\n" #: Configuration.py:166 Configuration.py:167 -#, fuzzy msgid "Default logger initialised for %s" -msgstr "Alapértelmezett naplózó előkészítve ehhez: " +msgstr "Alapértelmezett naplózó előkészítve ehhez: %s" #: Configuration.py:178 Database.py:447 Database.py:448 msgid "Creating directory: '%s'" @@ -262,9 +259,10 @@ msgid "Error parsing %s. See error log file." msgstr "Hiba a(z) %s értelmezése közben. Nézz bele a hibanaplóba." #: Configuration.py:837 -#, fuzzy msgid "Error parsing example configuration file %s. See error log file." -msgstr "Hiba a(z) %s mintafájl értelmezése közben. Nézz bele a hibanaplóba." +msgstr "" +"Hiba a(z) %s minta konfigurációs fájl értelmezése közben. Nézz bele a " +"hibanaplóba." #: Database.py:65 msgid "Not using sqlalchemy connection pool." @@ -374,9 +372,8 @@ msgid "warning: index %s_%s_idx not dropped %s, continuing ..." msgstr "figyelem: a(z) %s_%s_idx index nem lett eldobva: %s, folytatás ..." #: Database.py:1119 -#, fuzzy msgid "prepare import took %s seconds" -msgstr "Vacuum %.1f másodpercig tartott" +msgstr "az import előkészítése %s másodpercig tartott" #: Database.py:1150 Database.py:1158 Database.py:1426 Database.py:1434 msgid "Creating foreign key " @@ -388,23 +385,20 @@ msgid "Create foreign key failed: " msgstr "idegen kulcs létrehozása sikertelen: " #: Database.py:1172 -#, fuzzy msgid "Creating MySQL index %s %s" -msgstr "MySQL index létrehozása: %s %s" +msgstr "MySQL index létrehozása: %s %s" #: Database.py:1181 -#, fuzzy msgid "Creating PostgreSQL index " -msgstr "pg index létrehozása " +msgstr "PostgreSQL index létrehozása " #: Database.py:1186 Database.py:1337 Database.py:1346 Database.py:1354 msgid "Create index failed: " msgstr "Index létrehozása nem sikerült: " #: Database.py:1194 -#, fuzzy msgid "After import took %s seconds" -msgstr "Analyze %.1f másodpercig tartott" +msgstr "Az import utómunka %s másodpercig tartott" #: Database.py:1227 Database.py:1228 msgid "Finished recreating tables" @@ -605,7 +599,7 @@ msgstr "Az Everleaf terem readStudPlayerCards funkciója csak egy csonk." #: EverleafToFpdb.py:297 msgid "readShowdownActions %s %s" -msgstr "" +msgstr "readShowdownActions %s %s" #: Filters.py:53 msgid "All" @@ -676,9 +670,8 @@ msgid "Tourney" msgstr "Versenyek" #: Filters.py:80 -#, fuzzy msgid "New packing box created!" -msgstr "DEBUG: Új csoportosító doboz létrehozva!" +msgstr "Új csoportosító doboz létrehozva!" #: Filters.py:106 TourneyFilters.py:114 msgid "Either 0 or more than one site matched (%s) - EEK" @@ -727,7 +720,7 @@ msgstr "Min. leosztásszám:" #: Filters.py:679 Filters.py:708 Filters.py:734 Filters.py:761 Filters.py:875 #: Filters.py:926 Filters.py:960 Filters.py:1018 Filters.py:1071 msgid "hide" -msgstr "" +msgstr "elrejt" #: Filters.py:724 msgid "INFO: No tourney types returned from database" @@ -775,7 +768,7 @@ msgstr "Törlés" #: Filters.py:1068 msgid "show" -msgstr "" +msgstr "mutat" #: Filters.py:1076 fpdb.pyw:721 msgid "Pick a date" @@ -816,14 +809,12 @@ msgid "Lim_Blinds has no lookup for '%s'" msgstr "Lim_Blinds nem tartalmazza ezt: '%s'" #: FulltiltToFpdb.py:267 -#, fuzzy msgid "readHandInfo: Raising FpdbParseError" -msgstr "parseSummary: FpdbParseError" +msgstr "readHandInfo: FpdbParseError" #: FulltiltToFpdb.py:369 -#, fuzzy msgid "FTP: readPlayerStacks: No players detected (hand #%s)" -msgstr "readPlayerStacks: Kettőnél kevesebb játékost találtam egy leosztásban" +msgstr "FTP: readPlayerStacks: Nem találtam játékosokat (hand #%s)" #: FulltiltToFpdb.py:429 msgid "No bringin found, handid =%s" @@ -904,9 +895,8 @@ msgid " Stop _Auto Import " msgstr " _Auto Import leállítása " #: GuiAutoImport.py:203 -#, fuzzy msgid "Detecting hh directory for site: '%s'" -msgstr "Könyvtár létrehozása: '%s'" +msgstr "Leosztáskönyvtár keresése ehhez a teremhez: '%s'" #: GuiAutoImport.py:242 msgid "" @@ -957,9 +947,8 @@ msgstr "" " * Auto Import megállítása: A HUD már nem fut" #: GuiAutoImport.py:316 -#, fuzzy msgid "%s auto-import:" -msgstr "Auto Import automatikus indítása" +msgstr "%s auto-import:" #: GuiAutoImport.py:325 msgid "Browse..." @@ -1267,7 +1256,7 @@ msgstr "Kiszolgáló" #: GuiDatabase.py:481 msgid "addDB.run: response is %s accept is %s" -msgstr "" +msgstr "addDB.run: a válasz %s, az elfogadás %s" #: GuiDatabase.py:495 msgid "start creating new db" @@ -1322,9 +1311,8 @@ msgid "Do you want to try again?" msgstr "Meg akarod próbálni újból?" #: GuiDatabase.py:582 -#, fuzzy msgid "check_fields: ret is %s cancel is %s" -msgstr "check_fields: OK visszaadása, mint %s, újrapróbálás, mint %s" +msgstr "check_fields: a ret %s, a mégse %s" #: GuiDatabase.py:585 msgid "check_fields: destroy dialog" @@ -1519,19 +1507,19 @@ msgstr "Nem" #: GuiLogView.py:38 msgid "Fpdb Errors" -msgstr "" +msgstr "Fpdb hibák" #: GuiLogView.py:39 msgid "Fpdb Log" -msgstr "" +msgstr "Fpdb napló" #: GuiLogView.py:40 msgid "HUD Errors" -msgstr "" +msgstr "HUD hibák" #: GuiLogView.py:41 msgid "HUD Log" -msgstr "" +msgstr "HUD napló" #: GuiLogView.py:52 msgid "Log Messages" @@ -1539,101 +1527,91 @@ msgstr "Naplóbejegyzések" #: GuiLogView.py:98 msgid "Date/Time" -msgstr "" +msgstr "Dátum/idő" #: GuiLogView.py:99 msgid "Module" -msgstr "" +msgstr "Modul" #: GuiLogView.py:100 msgid "Level" -msgstr "" +msgstr "Szint" #: GuiLogView.py:101 msgid "Text" -msgstr "" +msgstr "Szöveg" #: GuiPositionalStats.py:137 -#, fuzzy msgid "activesite set to %s" -msgstr "DEBUG: aktív terem: %s" +msgstr "aktív terem: %s" #: GuiPositionalStats.py:323 msgid "Positional Stats page displayed in %4.2f seconds" msgstr "Pozíciós statisztikák megjelenítve %4.2f mp alatt" #: GuiPrefs.py:31 -#, fuzzy msgid "Databases" -msgstr "A_datbázis" +msgstr "Adatbázisok" #: GuiPrefs.py:31 msgid "General" -msgstr "" +msgstr "Általános" #: GuiPrefs.py:32 msgid "HUD" -msgstr "" +msgstr "HUD" #: GuiPrefs.py:32 msgid "Import" msgstr "Importálás" #: GuiPrefs.py:33 -#, fuzzy msgid "Games" -msgstr "Játékok:" +msgstr "Játékok" #: GuiPrefs.py:33 -#, fuzzy msgid "Sites" -msgstr "Termek:" +msgstr "Termek" #: GuiPrefs.py:34 -#, fuzzy msgid "Popup Windows" -msgstr "StatWindows debugolása" +msgstr "Felugró ablakok" #: GuiPrefs.py:34 msgid "Window" -msgstr "" +msgstr "Ablak" #: GuiPrefs.py:35 -#, fuzzy msgid "Popup Name" -msgstr "Nincs név" +msgstr "Felugró név" #: GuiPrefs.py:35 -#, fuzzy msgid "Stat" -msgstr "Állapot" +msgstr "Statisztika" #: GuiPrefs.py:36 GuiPrefs.py:42 -#, fuzzy msgid "Stat Name" -msgstr "Adatbázis név" +msgstr "Statisztika neve" #: GuiPrefs.py:37 msgid "Auxiliary Windows" -msgstr "" +msgstr "Kiegészítő ablakok" #: GuiPrefs.py:37 msgid "stud_mucked" -msgstr "" +msgstr "stud_mucked" #: GuiPrefs.py:38 -#, fuzzy msgid "Hand History Converters" -msgstr "Modulnév a Leosztástörténet Konvertáló számára" +msgstr "Leosztás feldolgozók" #: GuiPrefs.py:38 msgid "mucked" -msgstr "" +msgstr "mucked" #: GuiPrefs.py:39 -#, fuzzy msgid "Field Type" -msgstr "Fogadás módja" +msgstr "Mező típusa" #: GuiPrefs.py:39 fpdb.pyw:1033 msgid "Ring Player Stats" @@ -1641,25 +1619,23 @@ msgstr "Készpénzes statisztikák" #: GuiPrefs.py:40 msgid "Column Heading" -msgstr "" +msgstr "Oszlop fejléc" #: GuiPrefs.py:40 msgid "Left/Right Align" -msgstr "" +msgstr "Balra/jobbra igazítás" #: GuiPrefs.py:41 -#, fuzzy msgid "Show in Position Stats" -msgstr "Pozíciók" +msgstr "Mutatás a pozíciós statisztikákban" #: GuiPrefs.py:41 -#, fuzzy msgid "Show in Summaries" -msgstr "_Limitek" +msgstr "Mutatás az összegzésekben" #: GuiPrefs.py:42 msgid "Format" -msgstr "" +msgstr "Formátum" #: GuiPrefs.py:72 msgid "Setting" @@ -1844,9 +1820,8 @@ msgid "Hand Breakdown for all levels listed above" msgstr "Kezdőkezekre bontva a fenti limiteknél" #: GuiRingPlayerStats.py:143 -#, fuzzy msgid "_Filters" -msgstr "Leosztás szűrők:" +msgstr "_Szűrők" #: GuiRingPlayerStats.py:145 GuiTourneyPlayerStats.py:75 msgid "_Refresh Stats" @@ -1954,70 +1929,63 @@ msgstr "Köszönjük" #: GuiStove.py:97 msgid "Draw" -msgstr "" +msgstr "Draw" #: GuiStove.py:104 msgid "Stud" -msgstr "" +msgstr "Stud" #: GuiStove.py:115 msgid "Flop" -msgstr "" +msgstr "Flop" #: GuiStove.py:134 -#, fuzzy msgid "Gametype:" -msgstr "Játékok:" +msgstr "Játéktípus:" #: GuiStove.py:137 -#, fuzzy msgid "Players:" -msgstr "Minden játékos" +msgstr "Játékosok:" #: GuiStove.py:143 -#, fuzzy msgid "Input:" -msgstr "Bemeneti fájl" +msgstr "Bemenet:" #: GuiStove.py:144 msgid "Output:" -msgstr "" +msgstr "Kimenet:" #: GuiStove.py:170 msgid "Board:" -msgstr "" +msgstr "Közös lapok:" #: GuiStove.py:182 -#, fuzzy msgid "Player1:" -msgstr "Minden játékos" +msgstr "Játékos1:" #: GuiStove.py:197 -#, fuzzy msgid "Player2:" -msgstr "Minden játékos" +msgstr "Játékos2:" #: GuiStove.py:211 msgid "Results" -msgstr "" +msgstr "Eredmények" #: GuiStove.py:221 -#, fuzzy msgid "called set_board_flop: '%s' '%s'" -msgstr "DEBUG: nem ismert readAction: '%s' '%s'" +msgstr "set_board_flop hívása: '%s' '%s'" #: GuiStove.py:225 -#, fuzzy msgid "called set_hero_cards_flop" -msgstr "DEBUG: nem ismert readAction: '%s' '%s'" +msgstr "set_hero_cards_flop hívása: '%s' '%s'" #: GuiStove.py:229 msgid "called set_villain_cards_flop" -msgstr "" +msgstr "set_villain_cards_flop hívása" #: GuiStove.py:233 msgid "called update_flop_output_pane" -msgstr "" +msgstr "update_flop_output_pane hívása" #: GuiTourneyGraphViewer.py:178 msgid "Tournaments" @@ -2078,66 +2046,63 @@ msgstr "Importálandó fájlnév megadása szükséges" #: GuiTourneyPlayerStats.py:84 msgid "Cat." -msgstr "" +msgstr "Kat." #: GuiTourneyPlayerStats.py:85 -#, fuzzy msgid "Limit" -msgstr "Limitek:" +msgstr "Limit" #: GuiTourneyPlayerStats.py:86 msgid "Curr." -msgstr "" +msgstr "Pénzn." #: GuiTourneyPlayerStats.py:87 msgid "BuyIn" -msgstr "" +msgstr "Beülő" #: GuiTourneyPlayerStats.py:88 msgid "Fee" -msgstr "" +msgstr "Díj" #: GuiTourneyPlayerStats.py:90 msgid "#" -msgstr "" +msgstr "#" #: GuiTourneyPlayerStats.py:91 msgid "ITM%" -msgstr "" +msgstr "ITM%" #: GuiTourneyPlayerStats.py:92 msgid "1st" -msgstr "" +msgstr "1." #: GuiTourneyPlayerStats.py:93 -#, fuzzy msgid "2nd" -msgstr "Max:" +msgstr "2." #: GuiTourneyPlayerStats.py:94 msgid "3rd" -msgstr "" +msgstr "3." #: GuiTourneyPlayerStats.py:95 msgid "Rank?" -msgstr "" +msgstr "???" #: GuiTourneyPlayerStats.py:96 msgid "Spent" -msgstr "" +msgstr "Fizetett" #: GuiTourneyPlayerStats.py:97 msgid "Won" -msgstr "" +msgstr "Nyert" #: GuiTourneyPlayerStats.py:98 msgid "ROI%" -msgstr "" +msgstr "ROI%" #: GuiTourneyPlayerStats.py:99 -#, fuzzy msgid "$/Tour" -msgstr "Versenyek" +msgstr "$/verseny" #: GuiTourneyViewer.py:40 msgid "Enter the tourney number you want to display:" @@ -2197,7 +2162,7 @@ msgstr "Ezen ablak bezárása a HUD-ot is bezárja." #: HUD_main.pyw:123 msgid "Error initializing main_window" -msgstr "" +msgstr "Hiba a main_window inicializálása közben" #: HUD_main.pyw:138 msgid "hud_main: Game changed." @@ -2216,9 +2181,8 @@ msgid "HUD_main.read_stdin: hand processing starting ..." msgstr "HUD_main.read_stdin: leosztás feldolgozása indul" #: HUD_main.pyw:234 -#, fuzzy msgid "db error: skipping %s" -msgstr "adatbázis hiba: kihagyásra kerül a(z)" +msgstr "adatbázis hiba: kihagyásra kerül %s" #: HUD_main.pyw:253 msgid "hud_dict[%s] was not found\n" @@ -2482,15 +2446,12 @@ msgstr "" "markstreets nem egyezik - A(z) %s leosztás érvénytelenítését feltételezem" #: Hand.py:478 -#, fuzzy msgid "markStreets appeared to fail: First 100 chars: '%s'" -msgstr "" -"FpdbParseError: markStreets hívása meghiúsult: az első 100 karakter: '%s'" +msgstr "markStreets hívása meghiúsult: az első 100 karakter: '%s'" #: Hand.py:482 Hand.py:483 -#, fuzzy msgid "checkPlayerExists: %s fail on hand number %s" -msgstr "checkPlayerExists: '%s hiba a következő leosztásban: %s" +msgstr "checkPlayerExists: %s hiba a következő leosztásban: %s" #: Hand.py:574 msgid "%s %s calls %s" @@ -2544,6 +2505,7 @@ msgstr "" #: Hand.py:1170 msgid "DrawHand.__init__: street 'DEAL' is empty. Hand cancelled? HandID: '%s'" msgstr "" +"DrawHand.__init__: a 'DEAL' utca üres. A leosztás megszakítva? HandID: '%s'" #: Hand.py:1397 msgid "%s %s completes %s" @@ -2571,17 +2533,15 @@ msgstr "join_holecards: a '%s' játékos úgy tűnik, hogy nem kapott lapot" #: Hand.py:1676 Hand.py:1677 msgid "Pot.end(): Major failure while calculating pot: '%s'" -msgstr "" +msgstr "Pot.end(): Nagyobb hiba a kassza számítása közben: '%s'" #: Hand.py:1690 -#, fuzzy msgid "call Pot.end() before printing pot total" -msgstr "DEBUG: Pot.end() hívása a teljes kassza kiírása előtt" +msgstr "Pot.end() hívása a teljes kassza kiírása előtt" #: Hand.py:1692 -#, fuzzy msgid "Error in printing Hand object" -msgstr "FpdbError egy Hand objektum kiírása közben" +msgstr "Hiba egy Hand objektum kiírása közben" #: HandHistoryConverter.py:40 msgid "" @@ -2653,9 +2613,8 @@ msgstr "50 karakternél rövidebb szöveg eltávolítása" #: HandHistoryConverter.py:307 HandHistoryConverter.py:308 #: HandHistoryConverter.py:314 -#, fuzzy msgid "Unsupported game type: %s" -msgstr "Ismeretlen játéktípus: '%s'" +msgstr "Nem támogatott játéktípus: %s" #: HandHistoryConverter.py:487 msgid "HH Sanity Check: output and input files are the same, check config" @@ -2855,12 +2814,10 @@ msgid "(btw, the key was %s and statd is %s" msgstr "(ja, a kulcs %s volt a statd pedig %s)" #: ImapFetcher.py:44 ImapFetcher.py:53 -#, fuzzy msgid "re_SplitTourneys isn't matching" -msgstr "DEBUG: re_SplitTourneys nem egyezik" +msgstr "re_SplitTourneys nem egyezik" #: ImapFetcher.py:67 -#, fuzzy msgid "response to logging in: " msgstr "válasz a bejelentkezésre:" @@ -2877,9 +2834,8 @@ msgid "No Tournament summaries found." msgstr "Nem található verseny összefoglaló." #: ImapFetcher.py:111 -#, fuzzy msgid "Errors: %s" -msgstr "hiba: %s" +msgstr "Hibák: %s" #: ImapFetcher.py:159 msgid "Finished importing %s/%s PS summaries" @@ -2895,9 +2851,8 @@ msgid "limit not found in self.limits(%s). hand: '%s'" msgstr "limit nem található ebben: self.limits(%s). leosztás: '%s'" #: OnGameToFpdb.py:209 OnGameToFpdb.py:210 WinamaxToFpdb.py:217 -#, fuzzy msgid "readHandInfo: DATETIME not matched: '%s'" -msgstr "readHandInfo: Nem illeszkedik: '%s'" +msgstr "readHandInfo: DATETIME nem illeszkedik: '%s'" #: OnGameToFpdb.py:264 PartyPokerToFpdb.py:365 PokerStarsToFpdb.py:312 #: Win2dayToFpdb.py:162 WinamaxToFpdb.py:329 @@ -2984,7 +2939,7 @@ msgstr "Indítás rejtve" #: Options.py:109 msgid "Alias '%s' unknown" -msgstr "" +msgstr "Ismeretlen alias: '%s'" #: Options.py:119 msgid "press enter to end" @@ -3007,9 +2962,8 @@ msgid "Unknown game type '%s'" msgstr "Ismeretlen játéktípus: '%s'" #: PartyPokerToFpdb.py:255 -#, fuzzy msgid "Cannot read HID for current hand: %s" -msgstr "HID nem olvasható az aktuális leosztásból" +msgstr "HID nem olvasható a leosztásból: %s" #: PartyPokerToFpdb.py:260 msgid "Cannot read Handinfo for current hand" @@ -3020,18 +2974,16 @@ msgid "Cannot read GameType for current hand" msgstr "GameType nem olvasható az aktuális leosztásból" #: PartyPokerToFpdb.py:348 -#, fuzzy msgid "Failed to detect currency. HID: %s: '%s'" -msgstr "nem sikerült a pénznem meghatározása" +msgstr "Nem sikerült a pénznem meghatározása. HID: %s: '%s'" #: PartyPokerToFpdb.py:536 msgid "Unimplemented readAction: '%s' '%s'" msgstr "Nem ismert readAction: '%s' '%s'" #: PokerStarsToFpdb.py:265 -#, fuzzy msgid "Failed to detect currency: '%s'" -msgstr "nem sikerült a pénznem meghatározása" +msgstr "Nem sikerült a pénznem meghatározása: '%s'" #: SplitHandHistory.py:76 msgid "File not found" @@ -3039,11 +2991,11 @@ msgstr "Fájl nem található" #: SplitHandHistory.py:86 msgid "%s processed" -msgstr "" +msgstr "%s feldolgozva" #: SplitHandHistory.py:105 msgid "Nope, will not work (fileno=%d)" -msgstr "" +msgstr "Nem, nem fog működni (fileno=%d)" #: SplitHandHistory.py:126 msgid "Unexpected error processing file" @@ -3517,34 +3469,31 @@ msgstr "nem sikerült a pénznem meghatározása" #: WinamaxToFpdb.py:300 msgid "readplayerstacks: re is '%s'" -msgstr "" +msgstr "readplayerstacks: re értéke '%s'" #: WinamaxToFpdb.py:317 msgid "Failed to add streets. handtext=%s" msgstr "Nem sikerült az utcák hozzáadása. handtext=%s" #: WinamaxToFpdb.py:327 -#, fuzzy msgid "readButton: button on pos %d" -msgstr "readButton: nem található" +msgstr "readButton: a gomb ebben a pozícióban: %d" #: WinamaxToFpdb.py:379 -#, fuzzy msgid "No hole cards found for %s" -msgstr "Nincs játékosazonosító" +msgstr "Osztott lapok nem találhatóak a %s leosztásban " #: WinamaxToFpdb.py:385 -#, fuzzy msgid "Hero cards %s: %s" -msgstr "A hiba a következő: %s" +msgstr "Saját lapok %s: %s" #: WinamaxToFpdb.py:412 msgid "add show actions %s" -msgstr "" +msgstr "mutatás akció hozzáadása: %s" #: WinamaxToFpdb.py:469 msgid "Read shown cards: %s" -msgstr "" +msgstr "Mutatott lapok beolvasása: %s" #: XTables.py:70 msgid "Could not retrieve XID from table xwininfo. xwininfo is %s" @@ -3593,13 +3542,12 @@ msgstr "" "eval-t." #: fpdb.pyw:244 -#, fuzzy msgid "" "Copyright 2008-2011, Steffen, Eratosthenes, Carl Gherardi, Eric Blade, _mt, " "sqlcoder, Bostik, and others" msgstr "" "Copyright 2008-2011, Steffen, Eratosthenes, Carl Gherardi, Eric Blade, _mt, " -"sqlcoder, Bostik, and others" +"sqlcoder, Bostik, és mások" #: fpdb.pyw:245 msgid "" @@ -3694,21 +3642,23 @@ msgid "" "Note that this dialogue will overwrite an existing config if one has been " "made already. " msgstr "" +"Megj: ez a funkció felülírja az esetleg már létező konfigurációs fájlt." #: fpdb.pyw:366 msgid "Abort now if you don't want that." -msgstr "" +msgstr "Fejezd be most, ha ezt nem szeretnéd." #: fpdb.pyw:367 -#, fuzzy msgid "" "Please select the game category for which you want to configure HUD stats " "and the number of rows and columns:" -msgstr "Válassz játéktípust, amelyre vonatkozóan be akarod állítani a HUD-ot:" +msgstr "" +"Válassz játéktípust, amelyre vonatkozóan be akarod állítani a HUD-ot, és " +"állítsd be a sorok és oszlopok számát:" #: fpdb.pyw:384 msgid "%d rows" -msgstr "" +msgstr "%d sor" #: fpdb.pyw:419 msgid "HUD Configurator - please choose your stats" @@ -3740,11 +3690,11 @@ msgstr "" #: fpdb.pyw:460 msgid "column %d" -msgstr "" +msgstr "%d. oszlop" #: fpdb.pyw:464 msgid "row %d" -msgstr "" +msgstr "%d sor" #: fpdb.pyw:544 msgid "Confirm deleting and recreating tables" @@ -3772,9 +3722,8 @@ msgid "User cancelled recreating tables" msgstr "A felhasználó megszakította a táblák újra létrehozását" #: fpdb.pyw:578 -#, fuzzy msgid "Confirm recreating HUD cache" -msgstr "Erősítsd meg a táblák törlését és újra létrehozását" +msgstr "Erősítsd meg a HUD cache újra létrehozását" #: fpdb.pyw:579 msgid "Please confirm that you want to re-create the HUD cache." @@ -4371,24 +4320,20 @@ msgstr "" "Parancssorból a GuiBulkImport.py segítségével tudsz leosztásokat importálni" #: iPokerToFpdb.py:261 -#, fuzzy msgid "Unimplemented readAction: %s" -msgstr "Nem ismert readAction: '%s' '%s'" +msgstr "Nem ismert readAction: %s" #: interlocks.py:52 msgid "lock already held by:" msgstr "a zárolást már elvégezte:" #: test_Database.py:50 -#, fuzzy msgid "Testing variance function" -msgstr "DEBUG: Varianciafügvény tesztelése" +msgstr "Variancia függvény tesztelése" #: test_Database.py:51 -#, fuzzy msgid "result: %s expecting: 0.666666 (result-expecting ~= 0.0): %s" -msgstr "" -"DEBUG: eredmény: %s várt érték: 0.666666. (eredmény - várt érték ~= 0.0): %s" +msgstr "eredmény: %s várt érték: 0.666666 (eredmény - várt érték ~= 0.0): %s" #: windows_make_bats.py:30 msgid "" From 292cea1fb98e4d8c9a16a36c2f2ae6582bc8d1ba Mon Sep 17 00:00:00 2001 From: Worros Date: Sun, 6 Mar 2011 09:40:49 +0800 Subject: [PATCH 09/41] Regression: Party freeroll tourney, sample --- .../NLHE-Freeroll-MTT-201008.Sample.hand.txt | Bin 0 -> 1368 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 pyfpdb/regression-test-files/tour/PartyPoker/Flop/NLHE-Freeroll-MTT-201008.Sample.hand.txt diff --git a/pyfpdb/regression-test-files/tour/PartyPoker/Flop/NLHE-Freeroll-MTT-201008.Sample.hand.txt b/pyfpdb/regression-test-files/tour/PartyPoker/Flop/NLHE-Freeroll-MTT-201008.Sample.hand.txt new file mode 100644 index 0000000000000000000000000000000000000000..c6075c9e1cb7883e3a61f14ed600ada4f3913012 GIT binary patch literal 1368 zcmb7^Pfy!G5XF18s(ro$W?HT%$dZ#h%JK}C{GK-xM8LO3$jXf3@Hh<*@C8$5 zTV1hrfUoUsYb?SdKs25t;Uvj$`eQmn97dt<&Dgx*_#B0F;gsnL*R82>ra9NDX)ub$ zX->ZbJXh`&^iN0EoHh8RBwru+-jp+o48p+H9P`#%B?+u7)yQ@^=Nf8(Rm0X?8*-#L zjzYY&6%+jKg$N@gK{tdW=1z*Yq{vA$%A2mtN$Hl9I4RqbVkhNWQtG5)D807`-`m(k zw{d(YvxK}wr5+?ove@A8(D%B>7FN9)a085M%xe7gy=PMrl&WniNM)h9St-hmkg#IO zk4BX+rIM1DmRIDN>sU}$jJwUDnK0bo<|KTjW;;_eO6h=F>>zrFRfO`kt z8R}Zx(@WG(ReXqa(>R`~)dQVDxeEGVF|3&AU&pC Date: Sun, 6 Mar 2011 09:41:43 +0800 Subject: [PATCH 10/41] Party: Fix Party freeroll tourney parsing --- pyfpdb/PartyPokerToFpdb.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyfpdb/PartyPokerToFpdb.py b/pyfpdb/PartyPokerToFpdb.py index 903a344c..69265fbf 100755 --- a/pyfpdb/PartyPokerToFpdb.py +++ b/pyfpdb/PartyPokerToFpdb.py @@ -335,7 +335,7 @@ class PartyPoker(HandHistoryConverter): hand.fee = 0 hand.buyinCurrency = "FREE" hand.isKO = False - if hand.tourNo != None: + elif hand.tourNo != None: hand.buyin = 0 hand.fee = 0 hand.buyinCurrency = "FREE" From 72f6a1ce6aec9e4eeab2e303114111a7254679da Mon Sep 17 00:00:00 2001 From: Worros Date: Thu, 10 Mar 2011 18:01:25 +0800 Subject: [PATCH 11/41] Database: Reformat a some tournament results update code Reformat to make life easier when debugging --- pyfpdb/Database.py | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/pyfpdb/Database.py b/pyfpdb/Database.py index 35841213..4efc832f 100644 --- a/pyfpdb/Database.py +++ b/pyfpdb/Database.py @@ -2359,8 +2359,9 @@ class Database: def createOrUpdateTourney(self, hand, source):#note: this method is used on Hand and TourneySummary objects cursor = self.get_cursor() - cursor.execute (self.sql.query['getTourneyByTourneyNo'].replace('%s', self.sql.query['placeholder']), - (hand.siteId, hand.tourNo)) + q = self.sql.query['getTourneyByTourneyNo'].replace('%s', self.sql.query['placeholder']) + cursor.execute(q, (hand.siteId, hand.tourNo)) + columnNames=[desc[0] for desc in cursor.description] result=cursor.fetchone() @@ -2385,9 +2386,12 @@ class Database: # if (resultDict[ev] < hand.startTime): # hand.startTime=resultDict[ev] if updateDb: - cursor.execute (self.sql.query['updateTourney'].replace('%s', self.sql.query['placeholder']), - (hand.entries, hand.prizepool, hand.startTime, hand.endTime, hand.tourneyName, - hand.matrixIdProcessed, hand.totalRebuyCount, hand.totalAddOnCount, hand.comment, hand.commentTs, tourneyId)) + q = self.sql.query['updateTourney'].replace('%s', self.sql.query['placeholder']) + row = (hand.entries, hand.prizepool, hand.startTime, hand.endTime, hand.tourneyName, + hand.matrixIdProcessed, hand.totalRebuyCount, hand.totalAddOnCount, hand.comment, + hand.commentTs, tourneyId + ) + cursor.execute(q, row) else: if source=="HHC": cursor.execute (self.sql.query['insertTourney'].replace('%s', self.sql.query['placeholder']), @@ -2436,9 +2440,19 @@ class Database: elif getattr(hand, handAttribute)[player]!=None and resultDict[ev]==None:#object has this value but DB doesnt, so update DB updateDb=True if updateDb: - cursor.execute (self.sql.query['updateTourneysPlayer'].replace('%s', self.sql.query['placeholder']), - (hand.ranks[player], hand.winnings[player], hand.winningsCurrency[player], - hand.rebuyCounts[player], hand.addOnCounts[player], hand.koCounts[player], tourneysPlayersIds[player[1]])) + q = self.sql.query['updateTourneysPlayer'].replace('%s', self.sql.query['placeholder']) + inputs = (hand.ranks[player], + hand.winnings[player], + hand.winningsCurrency[player], + hand.rebuyCounts[player], + hand.addOnCounts[player], + hand.koCounts[player], + tourneysPlayersIds[player[1]] + ) + #print q + #pp = pprint.PrettyPrinter(indent=4) + #pp.pprint(inputs) + cursor.execute(q, inputs) else: if source=="HHC": cursor.execute (self.sql.query['insertTourneysPlayer'].replace('%s', self.sql.query['placeholder']), From d7697f432811976365971fa2fc122ff96000a468 Mon Sep 17 00:00:00 2001 From: Worros Date: Thu, 10 Mar 2011 18:03:21 +0800 Subject: [PATCH 12/41] TourneySummary: SQLite complaining about Decimal format. Variables were already passed in as int - allow them to remain so --- pyfpdb/TourneySummary.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pyfpdb/TourneySummary.py b/pyfpdb/TourneySummary.py index b7210a01..94055b92 100644 --- a/pyfpdb/TourneySummary.py +++ b/pyfpdb/TourneySummary.py @@ -245,13 +245,13 @@ class TourneySummary(object): Adds a player to the tourney, and initialises data structures indexed by player. rank (int) indicating the finishing rank (can be -1 if unknown) name (string) player name -winnings (decimal) the money the player ended the tourney with (can be 0, or -1 if unknown) +winnings (int) the money the player ended the tourney with (can be 0, or -1 if unknown) """ log.debug(_("addPlayer: rank:%s - name : '%s' - Winnings (%s)") % (rank, name, winnings)) self.players.append(name) if rank: - self.ranks.update( { name : Decimal(rank) } ) - self.winnings.update( { name : Decimal(winnings) } ) + self.ranks.update( { name : rank } ) + self.winnings.update( { name : winnings } ) self.winningsCurrency.update( { name : winningsCurrency } ) else: self.ranks.update( { name : None } ) From 1fac2ffe135e390b6b33d7fe5ae37e29c1d8c743 Mon Sep 17 00:00:00 2001 From: Steffen Schaumburg Date: Fri, 11 Mar 2011 07:08:50 +0100 Subject: [PATCH 13/41] more string unification, update l10n files --- pyfpdb/Anonymise.py | 2 +- pyfpdb/BetfairToFpdb.py | 4 +- pyfpdb/CarbonToFpdb.py | 2 +- pyfpdb/EverestToFpdb.py | 2 +- pyfpdb/OnGameToFpdb.py | 2 +- pyfpdb/PokerStarsToFpdb.py | 2 +- pyfpdb/locale/de/LC_MESSAGES/fpdb.mo | Bin 23538 -> 24021 bytes pyfpdb/locale/es/LC_MESSAGES/fpdb.mo | Bin 11657 -> 11657 bytes pyfpdb/locale/fpdb-de_DE.po | 78 +++++++++++++-------------- pyfpdb/locale/fpdb-en_GB.pot | 48 ++++++++--------- pyfpdb/locale/fpdb-es_ES.po | 48 ++++++++--------- pyfpdb/locale/fpdb-fr_FR.po | 51 +++++++++--------- pyfpdb/locale/fpdb-hu_HU.po | 51 +++++++++--------- pyfpdb/locale/fpdb-pl_PL.po | 48 ++++++++--------- pyfpdb/locale/fpdb-ru_RU.po | 53 +++++++++--------- pyfpdb/locale/fr/LC_MESSAGES/fpdb.mo | Bin 72502 -> 72429 bytes pyfpdb/locale/hu/LC_MESSAGES/fpdb.mo | Bin 74112 -> 74036 bytes pyfpdb/locale/pl/LC_MESSAGES/fpdb.mo | Bin 21780 -> 21780 bytes pyfpdb/locale/ru/LC_MESSAGES/fpdb.mo | Bin 8531 -> 8441 bytes 19 files changed, 197 insertions(+), 194 deletions(-) diff --git a/pyfpdb/Anonymise.py b/pyfpdb/Anonymise.py index 4b603e75..6b00e3c6 100755 --- a/pyfpdb/Anonymise.py +++ b/pyfpdb/Anonymise.py @@ -52,7 +52,7 @@ else: m = hhc.re_PlayerInfo.finditer(filecontents) outfile = options.filename+".anon" -print _("Output being written to"), outfile +print (_("Output being written to %s") % outfile) savestdout = sys.stdout fsock = open(outfile,"w") diff --git a/pyfpdb/BetfairToFpdb.py b/pyfpdb/BetfairToFpdb.py index 8c9664ab..7357806a 100755 --- a/pyfpdb/BetfairToFpdb.py +++ b/pyfpdb/BetfairToFpdb.py @@ -105,7 +105,7 @@ class Betfair(HandHistoryConverter): def readHandInfo(self, hand): m = self.re_HandInfo.search(hand.handText) if(m == None): - log.error(_("Didn't match re_HandInfo")) + log.error(_("No match in readHandInfo.")) raise FpdbParseError(_("No match in readHandInfo.")) logging.debug("HID %s, Table %s" % (m.group('HID'), m.group('TABLE'))) hand.handid = m.group('HID') @@ -196,7 +196,7 @@ class Betfair(HandHistoryConverter): elif action.group('ATYPE') == 'checks': hand.addCheck( street, action.group('PNAME')) else: - sys.stderr.write(_("DEBUG: ") + _("unimplemented readAction: '%s' '%s'") % (action.group('PNAME'),action.group('ATYPE'))) + sys.stderr.write(_("DEBUG: ") + _("Unimplemented readAction: '%s' '%s'") % (action.group('PNAME'),action.group('ATYPE'))) def readShowdownActions(self, hand): diff --git a/pyfpdb/CarbonToFpdb.py b/pyfpdb/CarbonToFpdb.py index 1ddba430..7bcfa195 100644 --- a/pyfpdb/CarbonToFpdb.py +++ b/pyfpdb/CarbonToFpdb.py @@ -160,7 +160,7 @@ or None if we fail to get the info """ def readHandInfo(self, hand): m = self.re_HandInfo.search(hand.handText) if m is None: - logging.info(_("Didn't match re_HandInfo")) + logging.info(_("No match in readHandInfo.")) logging.info(hand.handText) raise FpdbParseError(_("No match in readHandInfo.")) logging.debug("HID %s-%s, Table %s" % (m.group('HID1'), diff --git a/pyfpdb/EverestToFpdb.py b/pyfpdb/EverestToFpdb.py index d55cc922..22fb1886 100644 --- a/pyfpdb/EverestToFpdb.py +++ b/pyfpdb/EverestToFpdb.py @@ -142,7 +142,7 @@ class Everest(HandHistoryConverter): def readHandInfo(self, hand): m = self.re_HandInfo.search(hand.handText) if m is None: - logging.info(_("Didn't match re_HandInfo")) + logging.info(_("No match in readHandInfo.")) logging.info(hand.handText) raise FpdbParseError(_("No match in readHandInfo.")) hand.handid = m.group('HID') diff --git a/pyfpdb/OnGameToFpdb.py b/pyfpdb/OnGameToFpdb.py index 67b0cd62..fd5efe31 100755 --- a/pyfpdb/OnGameToFpdb.py +++ b/pyfpdb/OnGameToFpdb.py @@ -334,7 +334,7 @@ class OnGame(HandHistoryConverter): elif action.group('ATYPE') == ' stands pat': hand.addStandsPat( street, action.group('PNAME')) else: - print (_("DEBUG: ") + _("unimplemented readAction: '%s' '%s'") % (action.group('PNAME'), action.group('ATYPE'))) + print (_("DEBUG: ") + _("Unimplemented readAction: '%s' '%s'") % (action.group('PNAME'), action.group('ATYPE'))) def readShowdownActions(self, hand): for shows in self.re_ShowdownAction.finditer(hand.handText): diff --git a/pyfpdb/PokerStarsToFpdb.py b/pyfpdb/PokerStarsToFpdb.py index 7b1add77..583fecf0 100644 --- a/pyfpdb/PokerStarsToFpdb.py +++ b/pyfpdb/PokerStarsToFpdb.py @@ -436,7 +436,7 @@ class PokerStars(HandHistoryConverter): elif action.group('ATYPE') == ' stands pat': hand.addStandsPat( street, action.group('PNAME')) else: - print (_("DEBUG: ") + _("unimplemented readAction: '%s' '%s'") % (action.group('PNAME'),action.group('ATYPE'))) + print (_("DEBUG: ") + _("Unimplemented readAction: '%s' '%s'") % (action.group('PNAME'),action.group('ATYPE'))) def readShowdownActions(self, hand): diff --git a/pyfpdb/locale/de/LC_MESSAGES/fpdb.mo b/pyfpdb/locale/de/LC_MESSAGES/fpdb.mo index b64215b3f8068b623c211fb6df7fc800ecf41760..e5a5f755f9be69b1563c11540dcc4e08177213e7 100644 GIT binary patch delta 4986 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 diff --git a/pyfpdb/locale/es/LC_MESSAGES/fpdb.mo b/pyfpdb/locale/es/LC_MESSAGES/fpdb.mo index 80e24a9a4531b2e06065798bca072d2d8eca585e..779464be11c6bff218c16be473ca5bfaaaf4271a 100644 GIT binary patch delta 19 acmeB-?u_1GEyZT2U|?=#u-Q?{Ll^)(eg$6u delta 19 acmeB-?u_1GEyZS_U|?otxY<$4Ll^)(aRpug diff --git a/pyfpdb/locale/fpdb-de_DE.po b/pyfpdb/locale/fpdb-de_DE.po index 3e56509c..66b7bada 100644 --- a/pyfpdb/locale/fpdb-de_DE.po +++ b/pyfpdb/locale/fpdb-de_DE.po @@ -1,20 +1,20 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR ORGANIZATION -# FIRST AUTHOR , YEAR. -# +# Steffen Schaumburg , 2011. msgid "" msgstr "" "Project-Id-Version: Free Poker Database\n" -"POT-Creation-Date: 2011-03-10 06:16+CET\n" -"PO-Revision-Date: 2011-03-10 01:42+0000\n" -"Last-Translator: steffen123 \n" -"Language-Team: German (Germany) \n" -"Language: de_DE\n" +"POT-Creation-Date: 2011-03-11 07:06+CET\n" +"PO-Revision-Date: 2011-03-11 07:05+0200\n" +"Last-Translator: Steffen Schaumburg \n" +"Language-Team: Fpdb\n" +"Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: ENCODING\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Virtaal 0.6.1\n" "Generated-By: pygettext.py 1.5\n" -"Plural-Forms: nplurals=2; plural=(n != 1)\n" #: AbsoluteToFpdb.py:139 AbsoluteToFpdb.py:141 BetfairToFpdb.py:76 #: BetfairToFpdb.py:78 CarbonToFpdb.py:130 CarbonToFpdb.py:132 @@ -44,7 +44,7 @@ msgstr "Keine Treffer für re_HandInfo" #: AbsoluteToFpdb.py:207 msgid "readHandInfo: File name didn't match re_*InfoFromFilename" -msgstr "" +msgstr "readHandInfo: Dateiname wurde von re_*InfoFromFilename nicht erkannt" #: AbsoluteToFpdb.py:208 msgid "File name: %s" @@ -63,11 +63,11 @@ msgstr "Lese Antes" #: AbsoluteToFpdb.py:287 BetfairToFpdb.py:160 FulltiltToFpdb.py:426 msgid "Player bringing in: %s for %s" -msgstr "" +msgstr "Spieler macht Bring In: %s für %s" #: AbsoluteToFpdb.py:290 EverleafToFpdb.py:230 msgid "No bringin found." -msgstr "Kein Bringin gefunden." +msgstr "Kein Bring In gefunden." #: AbsoluteToFpdb.py:297 EverleafToFpdb.py:237 msgid "No small blind" @@ -80,19 +80,19 @@ msgstr "" #: AbsoluteToFpdb.py:351 CarbonToFpdb.py:267 EverestToFpdb.py:234 #: EverestToFpdb.py:235 EverleafToFpdb.py:288 msgid "Unimplemented readAction: %s %s" -msgstr "" +msgstr "Nicht implementierte readAction: %s %s" #: AbsoluteToFpdb.py:401 BetfairToFpdb.py:222 CarbonToFpdb.py:298 #: EverleafToFpdb.py:326 FulltiltToFpdb.py:784 PartyPokerToFpdb.py:577 #: PokerStarsToFpdb.py:467 Win2dayToFpdb.py:368 iPokerToFpdb.py:291 msgid "parse input hand history" -msgstr "" +msgstr "Zu lesende Hand History" #: AbsoluteToFpdb.py:402 BetfairToFpdb.py:223 CarbonToFpdb.py:299 #: EverleafToFpdb.py:327 FulltiltToFpdb.py:785 PartyPokerToFpdb.py:578 #: PokerStarsToFpdb.py:468 Win2dayToFpdb.py:369 iPokerToFpdb.py:292 msgid "output translation to" -msgstr "" +msgstr "Ausgabepfad" #: AbsoluteToFpdb.py:403 BetfairToFpdb.py:224 CarbonToFpdb.py:300 #: EverleafToFpdb.py:328 FulltiltToFpdb.py:786 PartyPokerToFpdb.py:579 @@ -105,18 +105,14 @@ msgid "Could not find file %s" msgstr "Konnte Datei %s nicht finden" #: Anonymise.py:55 -msgid "Output being written to" +msgid "Output being written to %s" msgstr "" -#: BetfairToFpdb.py:108 CarbonToFpdb.py:163 EverestToFpdb.py:145 -#: EverleafToFpdb.py:145 iPokerToFpdb.py:156 iPokerToFpdb.py:158 -msgid "Didn't match re_HandInfo" -msgstr "Keine Treffer für re_HandInfo" - -#: BetfairToFpdb.py:109 CarbonToFpdb.py:165 EverestToFpdb.py:147 +#: BetfairToFpdb.py:108 BetfairToFpdb.py:109 CarbonToFpdb.py:163 +#: CarbonToFpdb.py:165 EverestToFpdb.py:145 EverestToFpdb.py:147 #: PokerStarsToFpdb.py:223 msgid "No match in readHandInfo." -msgstr "" +msgstr "Keine Treffer für re_HandInfo" #: BetfairToFpdb.py:123 msgid "readPlayerStacks: Less than 2 players found in a hand" @@ -135,9 +131,9 @@ msgstr "Kein Bringin gefunden" msgid "DEBUG: " msgstr "" -#: BetfairToFpdb.py:199 OnGameToFpdb.py:337 PokerStarsToFpdb.py:439 -#: Win2dayToFpdb.py:341 WinamaxToFpdb.py:406 -msgid "unimplemented readAction: '%s' '%s'" +#: BetfairToFpdb.py:199 OnGameToFpdb.py:337 PartyPokerToFpdb.py:536 +#: PokerStarsToFpdb.py:439 +msgid "Unimplemented readAction: '%s' '%s'" msgstr "" #: Card.py:431 @@ -534,39 +530,39 @@ msgstr "" msgid "***Error sending finish: " msgstr "" -#: Database.py:2401 +#: Database.py:2405 msgid "invalid source in Database.createOrUpdateTourney" msgstr "" -#: Database.py:2414 +#: Database.py:2418 msgid "invalid source in Database.createOrUpdateTourneysPlayers" msgstr "" -#: Database.py:2540 +#: Database.py:2554 msgid "HandToWrite.init error: " msgstr "" -#: Database.py:2590 +#: Database.py:2604 msgid "HandToWrite.set_all error: " msgstr "" -#: Database.py:2621 +#: Database.py:2635 msgid "nutOmatic is id_player = %d" msgstr "" -#: Database.py:2629 +#: Database.py:2643 msgid "query plan: " msgstr "" -#: Database.py:2638 +#: Database.py:2652 msgid "cards =" msgstr "" -#: Database.py:2641 +#: Database.py:2655 msgid "get_stats took: %4.3f seconds" msgstr "" -#: Database.py:2643 +#: Database.py:2657 msgid "press enter to continue" msgstr "" @@ -574,6 +570,10 @@ msgstr "" msgid "Unable to recognise handinfo from: '%s'" msgstr "" +#: EverleafToFpdb.py:145 iPokerToFpdb.py:156 iPokerToFpdb.py:158 +msgid "Didn't match re_HandInfo" +msgstr "Keine Treffer für re_HandInfo" + #: EverleafToFpdb.py:265 msgid "Everleaf readStudPlayerCards is only a stub." msgstr "" @@ -2887,10 +2887,6 @@ msgstr "" msgid "Failed to detect currency. HID: %s: '%s'" msgstr "Konnte Währung nicht finden" -#: PartyPokerToFpdb.py:536 -msgid "Unimplemented readAction: '%s' '%s'" -msgstr "" - #: PokerStarsToFpdb.py:265 #, fuzzy msgid "Failed to detect currency: '%s'" @@ -3357,6 +3353,10 @@ msgid "" "using version %d.%d.%d. Your milage may vary." msgstr "" +#: Win2dayToFpdb.py:341 WinamaxToFpdb.py:406 +msgid "unimplemented readAction: '%s' '%s'" +msgstr "" + #: WinTables.py:81 msgid "Window %s not found. Skipping." msgstr "" diff --git a/pyfpdb/locale/fpdb-en_GB.pot b/pyfpdb/locale/fpdb-en_GB.pot index 675428d3..ad04d720 100644 --- a/pyfpdb/locale/fpdb-en_GB.pot +++ b/pyfpdb/locale/fpdb-en_GB.pot @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2011-03-10 06:16+CET\n" +"POT-Creation-Date: 2011-03-11 07:06+CET\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -102,15 +102,11 @@ msgid "Could not find file %s" msgstr "" #: Anonymise.py:55 -msgid "Output being written to" +msgid "Output being written to %s" msgstr "" -#: BetfairToFpdb.py:108 CarbonToFpdb.py:163 EverestToFpdb.py:145 -#: EverleafToFpdb.py:145 iPokerToFpdb.py:156 iPokerToFpdb.py:158 -msgid "Didn't match re_HandInfo" -msgstr "" - -#: BetfairToFpdb.py:109 CarbonToFpdb.py:165 EverestToFpdb.py:147 +#: BetfairToFpdb.py:108 BetfairToFpdb.py:109 CarbonToFpdb.py:163 +#: CarbonToFpdb.py:165 EverestToFpdb.py:145 EverestToFpdb.py:147 #: PokerStarsToFpdb.py:223 msgid "No match in readHandInfo." msgstr "" @@ -132,9 +128,9 @@ msgstr "" msgid "DEBUG: " msgstr "" -#: BetfairToFpdb.py:199 OnGameToFpdb.py:337 PokerStarsToFpdb.py:439 -#: Win2dayToFpdb.py:341 WinamaxToFpdb.py:406 -msgid "unimplemented readAction: '%s' '%s'" +#: BetfairToFpdb.py:199 OnGameToFpdb.py:337 PartyPokerToFpdb.py:536 +#: PokerStarsToFpdb.py:439 +msgid "Unimplemented readAction: '%s' '%s'" msgstr "" #: Card.py:431 @@ -520,39 +516,39 @@ msgstr "" msgid "***Error sending finish: " msgstr "" -#: Database.py:2401 +#: Database.py:2405 msgid "invalid source in Database.createOrUpdateTourney" msgstr "" -#: Database.py:2414 +#: Database.py:2418 msgid "invalid source in Database.createOrUpdateTourneysPlayers" msgstr "" -#: Database.py:2540 +#: Database.py:2554 msgid "HandToWrite.init error: " msgstr "" -#: Database.py:2590 +#: Database.py:2604 msgid "HandToWrite.set_all error: " msgstr "" -#: Database.py:2621 +#: Database.py:2635 msgid "nutOmatic is id_player = %d" msgstr "" -#: Database.py:2629 +#: Database.py:2643 msgid "query plan: " msgstr "" -#: Database.py:2638 +#: Database.py:2652 msgid "cards =" msgstr "" -#: Database.py:2641 +#: Database.py:2655 msgid "get_stats took: %4.3f seconds" msgstr "" -#: Database.py:2643 +#: Database.py:2657 msgid "press enter to continue" msgstr "" @@ -560,6 +556,10 @@ msgstr "" msgid "Unable to recognise handinfo from: '%s'" msgstr "" +#: EverleafToFpdb.py:145 iPokerToFpdb.py:156 iPokerToFpdb.py:158 +msgid "Didn't match re_HandInfo" +msgstr "" + #: EverleafToFpdb.py:265 msgid "Everleaf readStudPlayerCards is only a stub." msgstr "" @@ -2808,10 +2808,6 @@ msgstr "" msgid "Failed to detect currency. HID: %s: '%s'" msgstr "" -#: PartyPokerToFpdb.py:536 -msgid "Unimplemented readAction: '%s' '%s'" -msgstr "" - #: PokerStarsToFpdb.py:265 msgid "Failed to detect currency: '%s'" msgstr "" @@ -3276,6 +3272,10 @@ msgstr "" msgid "This module was developed and tested with version 2.8.18 of gtk. You are using version %d.%d.%d. Your milage may vary." msgstr "" +#: Win2dayToFpdb.py:341 WinamaxToFpdb.py:406 +msgid "unimplemented readAction: '%s' '%s'" +msgstr "" + #: WinTables.py:81 msgid "Window %s not found. Skipping." msgstr "" diff --git a/pyfpdb/locale/fpdb-es_ES.po b/pyfpdb/locale/fpdb-es_ES.po index 5f32cc7d..4a749300 100644 --- a/pyfpdb/locale/fpdb-es_ES.po +++ b/pyfpdb/locale/fpdb-es_ES.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: fpdb\n" -"POT-Creation-Date: 2011-03-10 06:16+CET\n" +"POT-Creation-Date: 2011-03-11 07:06+CET\n" "PO-Revision-Date: \n" "Last-Translator: Javier Sánchez \n" "Language-Team: \n" @@ -99,15 +99,11 @@ msgid "Could not find file %s" msgstr "" #: Anonymise.py:55 -msgid "Output being written to" +msgid "Output being written to %s" msgstr "" -#: BetfairToFpdb.py:108 CarbonToFpdb.py:163 EverestToFpdb.py:145 -#: EverleafToFpdb.py:145 iPokerToFpdb.py:156 iPokerToFpdb.py:158 -msgid "Didn't match re_HandInfo" -msgstr "" - -#: BetfairToFpdb.py:109 CarbonToFpdb.py:165 EverestToFpdb.py:147 +#: BetfairToFpdb.py:108 BetfairToFpdb.py:109 CarbonToFpdb.py:163 +#: CarbonToFpdb.py:165 EverestToFpdb.py:145 EverestToFpdb.py:147 #: PokerStarsToFpdb.py:223 msgid "No match in readHandInfo." msgstr "" @@ -129,9 +125,9 @@ msgstr "" msgid "DEBUG: " msgstr "" -#: BetfairToFpdb.py:199 OnGameToFpdb.py:337 PokerStarsToFpdb.py:439 -#: Win2dayToFpdb.py:341 WinamaxToFpdb.py:406 -msgid "unimplemented readAction: '%s' '%s'" +#: BetfairToFpdb.py:199 OnGameToFpdb.py:337 PartyPokerToFpdb.py:536 +#: PokerStarsToFpdb.py:439 +msgid "Unimplemented readAction: '%s' '%s'" msgstr "" #: Card.py:431 @@ -522,39 +518,39 @@ msgstr "" msgid "***Error sending finish: " msgstr "" -#: Database.py:2401 +#: Database.py:2405 msgid "invalid source in Database.createOrUpdateTourney" msgstr "" -#: Database.py:2414 +#: Database.py:2418 msgid "invalid source in Database.createOrUpdateTourneysPlayers" msgstr "" -#: Database.py:2540 +#: Database.py:2554 msgid "HandToWrite.init error: " msgstr "" -#: Database.py:2590 +#: Database.py:2604 msgid "HandToWrite.set_all error: " msgstr "" -#: Database.py:2621 +#: Database.py:2635 msgid "nutOmatic is id_player = %d" msgstr "" -#: Database.py:2629 +#: Database.py:2643 msgid "query plan: " msgstr "" -#: Database.py:2638 +#: Database.py:2652 msgid "cards =" msgstr "" -#: Database.py:2641 +#: Database.py:2655 msgid "get_stats took: %4.3f seconds" msgstr "" -#: Database.py:2643 +#: Database.py:2657 msgid "press enter to continue" msgstr "" @@ -562,6 +558,10 @@ msgstr "" msgid "Unable to recognise handinfo from: '%s'" msgstr "" +#: EverleafToFpdb.py:145 iPokerToFpdb.py:156 iPokerToFpdb.py:158 +msgid "Didn't match re_HandInfo" +msgstr "" + #: EverleafToFpdb.py:265 msgid "Everleaf readStudPlayerCards is only a stub." msgstr "" @@ -2873,10 +2873,6 @@ msgstr "" msgid "Failed to detect currency. HID: %s: '%s'" msgstr "" -#: PartyPokerToFpdb.py:536 -msgid "Unimplemented readAction: '%s' '%s'" -msgstr "" - #: PokerStarsToFpdb.py:265 msgid "Failed to detect currency: '%s'" msgstr "" @@ -3342,6 +3338,10 @@ msgid "" "using version %d.%d.%d. Your milage may vary." msgstr "" +#: Win2dayToFpdb.py:341 WinamaxToFpdb.py:406 +msgid "unimplemented readAction: '%s' '%s'" +msgstr "" + #: WinTables.py:81 msgid "Window %s not found. Skipping." msgstr "" diff --git a/pyfpdb/locale/fpdb-fr_FR.po b/pyfpdb/locale/fpdb-fr_FR.po index 18382d75..b1716bd4 100644 --- a/pyfpdb/locale/fpdb-fr_FR.po +++ b/pyfpdb/locale/fpdb-fr_FR.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: Free Poker Database\n" -"POT-Creation-Date: 2011-03-10 06:16+CET\n" +"POT-Creation-Date: 2011-03-11 07:06+CET\n" "PO-Revision-Date: 2011-03-09 15:37+0000\n" "Last-Translator: kibbitzer \n" "Language-Team: French (France) <>\n" @@ -107,15 +107,12 @@ msgid "Could not find file %s" msgstr "Impossible de trouver le fichier %s" #: Anonymise.py:55 -msgid "Output being written to" +#, fuzzy +msgid "Output being written to %s" msgstr "Enregistrement du résultat dans" -#: BetfairToFpdb.py:108 CarbonToFpdb.py:163 EverestToFpdb.py:145 -#: EverleafToFpdb.py:145 iPokerToFpdb.py:156 iPokerToFpdb.py:158 -msgid "Didn't match re_HandInfo" -msgstr "Ne correspond pas à  re_HandInfo" - -#: BetfairToFpdb.py:109 CarbonToFpdb.py:165 EverestToFpdb.py:147 +#: BetfairToFpdb.py:108 BetfairToFpdb.py:109 CarbonToFpdb.py:163 +#: CarbonToFpdb.py:165 EverestToFpdb.py:145 EverestToFpdb.py:147 #: PokerStarsToFpdb.py:223 msgid "No match in readHandInfo." msgstr "Pas de correspondance dans readHandInfo" @@ -137,10 +134,9 @@ msgstr "Bring-In non trouvé" msgid "DEBUG: " msgstr "" -#: BetfairToFpdb.py:199 OnGameToFpdb.py:337 PokerStarsToFpdb.py:439 -#: Win2dayToFpdb.py:341 WinamaxToFpdb.py:406 -#, fuzzy -msgid "unimplemented readAction: '%s' '%s'" +#: BetfairToFpdb.py:199 OnGameToFpdb.py:337 PartyPokerToFpdb.py:536 +#: PokerStarsToFpdb.py:439 +msgid "Unimplemented readAction: '%s' '%s'" msgstr "readAction non implémenté: '%s' '%s'" #: Card.py:431 @@ -556,39 +552,39 @@ msgstr "" msgid "***Error sending finish: " msgstr "***Erreur lors de l'envoi de fin: " -#: Database.py:2401 +#: Database.py:2405 msgid "invalid source in Database.createOrUpdateTourney" msgstr "source invalide dans Database.createOrUpdateTourney" -#: Database.py:2414 +#: Database.py:2418 msgid "invalid source in Database.createOrUpdateTourneysPlayers" msgstr "source invalide dans Database.createOrUpdateTourneysPlayers" -#: Database.py:2540 +#: Database.py:2554 msgid "HandToWrite.init error: " msgstr "HandToWrite.init erreur: " -#: Database.py:2590 +#: Database.py:2604 msgid "HandToWrite.set_all error: " msgstr "HandToWrite.set_all erreur: " -#: Database.py:2621 +#: Database.py:2635 msgid "nutOmatic is id_player = %d" msgstr "nutOmatic est id_player = %d" -#: Database.py:2629 +#: Database.py:2643 msgid "query plan: " msgstr "plan de requête: " -#: Database.py:2638 +#: Database.py:2652 msgid "cards =" msgstr "cartes =" -#: Database.py:2641 +#: Database.py:2655 msgid "get_stats took: %4.3f seconds" msgstr "get_stats a duré: %4.3f seconds" -#: Database.py:2643 +#: Database.py:2657 msgid "press enter to continue" msgstr "appuyez sur entrée pour continuer" @@ -596,6 +592,10 @@ msgstr "appuyez sur entrée pour continuer" msgid "Unable to recognise handinfo from: '%s'" msgstr "Impossible de reconnaître handinfo de: '¨%s'" +#: EverleafToFpdb.py:145 iPokerToFpdb.py:156 iPokerToFpdb.py:158 +msgid "Didn't match re_HandInfo" +msgstr "Ne correspond pas à  re_HandInfo" + #: EverleafToFpdb.py:265 msgid "Everleaf readStudPlayerCards is only a stub." msgstr "" @@ -3051,10 +3051,6 @@ msgstr "Impossible de lire le GameType pour cette main" msgid "Failed to detect currency. HID: %s: '%s'" msgstr "Impossible de trouver la devise" -#: PartyPokerToFpdb.py:536 -msgid "Unimplemented readAction: '%s' '%s'" -msgstr "readAction non implémenté: '%s' '%s'" - #: PokerStarsToFpdb.py:265 #, fuzzy msgid "Failed to detect currency: '%s'" @@ -3529,6 +3525,11 @@ msgstr "" "Ce module à été développé et testé avec la version 2.8.18 de gtk. Vous " "utilisez la version %d.%d.%d. Votre programme de fidélité peut varier." +#: Win2dayToFpdb.py:341 WinamaxToFpdb.py:406 +#, fuzzy +msgid "unimplemented readAction: '%s' '%s'" +msgstr "readAction non implémenté: '%s' '%s'" + #: WinTables.py:81 #, fuzzy msgid "Window %s not found. Skipping." diff --git a/pyfpdb/locale/fpdb-hu_HU.po b/pyfpdb/locale/fpdb-hu_HU.po index 336aa8d9..77d1204c 100644 --- a/pyfpdb/locale/fpdb-hu_HU.po +++ b/pyfpdb/locale/fpdb-hu_HU.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.20.905 plus git\n" -"POT-Creation-Date: 2011-03-10 06:16+CET\n" +"POT-Creation-Date: 2011-03-11 07:06+CET\n" "PO-Revision-Date: 2011-02-27 18:23+0100\n" "Last-Translator: Ferenc Erki \n" "Language-Team: Hungarian \n" @@ -106,15 +106,12 @@ msgid "Could not find file %s" msgstr "%s fájl nem található" #: Anonymise.py:55 -msgid "Output being written to" +#, fuzzy +msgid "Output being written to %s" msgstr "Az eredmény ide került kiírásra" -#: BetfairToFpdb.py:108 CarbonToFpdb.py:163 EverestToFpdb.py:145 -#: EverleafToFpdb.py:145 iPokerToFpdb.py:156 iPokerToFpdb.py:158 -msgid "Didn't match re_HandInfo" -msgstr "re_HandInfo nem illeszkedik" - -#: BetfairToFpdb.py:109 CarbonToFpdb.py:165 EverestToFpdb.py:147 +#: BetfairToFpdb.py:108 BetfairToFpdb.py:109 CarbonToFpdb.py:163 +#: CarbonToFpdb.py:165 EverestToFpdb.py:145 EverestToFpdb.py:147 #: PokerStarsToFpdb.py:223 msgid "No match in readHandInfo." msgstr "readHandInfo nem illeszkedik." @@ -136,10 +133,9 @@ msgstr "Nyitó hívás nem található" msgid "DEBUG: " msgstr "" -#: BetfairToFpdb.py:199 OnGameToFpdb.py:337 PokerStarsToFpdb.py:439 -#: Win2dayToFpdb.py:341 WinamaxToFpdb.py:406 -#, fuzzy -msgid "unimplemented readAction: '%s' '%s'" +#: BetfairToFpdb.py:199 OnGameToFpdb.py:337 PartyPokerToFpdb.py:536 +#: PokerStarsToFpdb.py:439 +msgid "Unimplemented readAction: '%s' '%s'" msgstr "Nem ismert readAction: '%s' '%s'" #: Card.py:431 @@ -557,39 +553,39 @@ msgstr "" msgid "***Error sending finish: " msgstr "***Hiba a befejezés küldésekor: " -#: Database.py:2401 +#: Database.py:2405 msgid "invalid source in Database.createOrUpdateTourney" msgstr "érvénytelen forrás a Database.createOrUpdateTourney-ban" -#: Database.py:2414 +#: Database.py:2418 msgid "invalid source in Database.createOrUpdateTourneysPlayers" msgstr "érvénytelen forrás a Database.createOrUpdateTourneysPlayers-ben" -#: Database.py:2540 +#: Database.py:2554 msgid "HandToWrite.init error: " msgstr "HandToWrite.init hiba: " -#: Database.py:2590 +#: Database.py:2604 msgid "HandToWrite.set_all error: " msgstr "HandToWrite.set_all hiba: " -#: Database.py:2621 +#: Database.py:2635 msgid "nutOmatic is id_player = %d" msgstr "nutOmatic id_player értéke = %d" -#: Database.py:2629 +#: Database.py:2643 msgid "query plan: " msgstr "lekérdezési terv: " -#: Database.py:2638 +#: Database.py:2652 msgid "cards =" msgstr "kezdőkéz =" -#: Database.py:2641 +#: Database.py:2655 msgid "get_stats took: %4.3f seconds" msgstr "get_stats időigény: %4.3f mp" -#: Database.py:2643 +#: Database.py:2657 msgid "press enter to continue" msgstr "nyomj ENTER-t a folytatáshoz" @@ -597,6 +593,10 @@ msgstr "nyomj ENTER-t a folytatáshoz" msgid "Unable to recognise handinfo from: '%s'" msgstr "Nem sikerült felismerni a leosztásinformációkat innen: '%s'" +#: EverleafToFpdb.py:145 iPokerToFpdb.py:156 iPokerToFpdb.py:158 +msgid "Didn't match re_HandInfo" +msgstr "re_HandInfo nem illeszkedik" + #: EverleafToFpdb.py:265 msgid "Everleaf readStudPlayerCards is only a stub." msgstr "Az Everleaf terem readStudPlayerCards funkciója csak egy csonk." @@ -3022,10 +3022,6 @@ msgstr "GameType nem olvasható az aktuális leosztásból" msgid "Failed to detect currency. HID: %s: '%s'" msgstr "nem sikerült a pénznem meghatározása" -#: PartyPokerToFpdb.py:536 -msgid "Unimplemented readAction: '%s' '%s'" -msgstr "Nem ismert readAction: '%s' '%s'" - #: PokerStarsToFpdb.py:265 #, fuzzy msgid "Failed to detect currency: '%s'" @@ -3501,6 +3497,11 @@ msgstr "" "Ez a modul a gtk 2.8.18 verziójával lett fejlesztve és tesztelve. Te most a " "%d.%d.%d verziót használod. Lehet, hogy máshogy fog működni." +#: Win2dayToFpdb.py:341 WinamaxToFpdb.py:406 +#, fuzzy +msgid "unimplemented readAction: '%s' '%s'" +msgstr "Nem ismert readAction: '%s' '%s'" + #: WinTables.py:81 msgid "Window %s not found. Skipping." msgstr "A(z) %s nevű ablak nincs meg. Kihagyás." diff --git a/pyfpdb/locale/fpdb-pl_PL.po b/pyfpdb/locale/fpdb-pl_PL.po index 4faf63aa..7e2639e1 100644 --- a/pyfpdb/locale/fpdb-pl_PL.po +++ b/pyfpdb/locale/fpdb-pl_PL.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: Free Poker Database\n" -"POT-Creation-Date: 2011-03-10 06:16+CET\n" +"POT-Creation-Date: 2011-03-11 07:06+CET\n" "PO-Revision-Date: 2011-03-09 22:36+0000\n" "Last-Translator: greg20 \n" "Language-Team: Polish (Poland) <>\n" @@ -104,15 +104,11 @@ msgid "Could not find file %s" msgstr "" #: Anonymise.py:55 -msgid "Output being written to" +msgid "Output being written to %s" msgstr "" -#: BetfairToFpdb.py:108 CarbonToFpdb.py:163 EverestToFpdb.py:145 -#: EverleafToFpdb.py:145 iPokerToFpdb.py:156 iPokerToFpdb.py:158 -msgid "Didn't match re_HandInfo" -msgstr "" - -#: BetfairToFpdb.py:109 CarbonToFpdb.py:165 EverestToFpdb.py:147 +#: BetfairToFpdb.py:108 BetfairToFpdb.py:109 CarbonToFpdb.py:163 +#: CarbonToFpdb.py:165 EverestToFpdb.py:145 EverestToFpdb.py:147 #: PokerStarsToFpdb.py:223 msgid "No match in readHandInfo." msgstr "" @@ -134,9 +130,9 @@ msgstr "" msgid "DEBUG: " msgstr "" -#: BetfairToFpdb.py:199 OnGameToFpdb.py:337 PokerStarsToFpdb.py:439 -#: Win2dayToFpdb.py:341 WinamaxToFpdb.py:406 -msgid "unimplemented readAction: '%s' '%s'" +#: BetfairToFpdb.py:199 OnGameToFpdb.py:337 PartyPokerToFpdb.py:536 +#: PokerStarsToFpdb.py:439 +msgid "Unimplemented readAction: '%s' '%s'" msgstr "" #: Card.py:431 @@ -521,39 +517,39 @@ msgstr "" msgid "***Error sending finish: " msgstr "" -#: Database.py:2401 +#: Database.py:2405 msgid "invalid source in Database.createOrUpdateTourney" msgstr "" -#: Database.py:2414 +#: Database.py:2418 msgid "invalid source in Database.createOrUpdateTourneysPlayers" msgstr "" -#: Database.py:2540 +#: Database.py:2554 msgid "HandToWrite.init error: " msgstr "" -#: Database.py:2590 +#: Database.py:2604 msgid "HandToWrite.set_all error: " msgstr "" -#: Database.py:2621 +#: Database.py:2635 msgid "nutOmatic is id_player = %d" msgstr "" -#: Database.py:2629 +#: Database.py:2643 msgid "query plan: " msgstr "" -#: Database.py:2638 +#: Database.py:2652 msgid "cards =" msgstr "" -#: Database.py:2641 +#: Database.py:2655 msgid "get_stats took: %4.3f seconds" msgstr "" -#: Database.py:2643 +#: Database.py:2657 msgid "press enter to continue" msgstr "" @@ -561,6 +557,10 @@ msgstr "" msgid "Unable to recognise handinfo from: '%s'" msgstr "" +#: EverleafToFpdb.py:145 iPokerToFpdb.py:156 iPokerToFpdb.py:158 +msgid "Didn't match re_HandInfo" +msgstr "" + #: EverleafToFpdb.py:265 msgid "Everleaf readStudPlayerCards is only a stub." msgstr "" @@ -2852,10 +2852,6 @@ msgstr "" msgid "Failed to detect currency. HID: %s: '%s'" msgstr "nie wykryto waluty" -#: PartyPokerToFpdb.py:536 -msgid "Unimplemented readAction: '%s' '%s'" -msgstr "" - #: PokerStarsToFpdb.py:265 #, fuzzy msgid "Failed to detect currency: '%s'" @@ -3331,6 +3327,10 @@ msgstr "" "Ten moduł został napisany i przetestowany z GTK w wersji 2.8.18. Używasz " "wersji %d.%d.%d. Twój milage może się różnić." +#: Win2dayToFpdb.py:341 WinamaxToFpdb.py:406 +msgid "unimplemented readAction: '%s' '%s'" +msgstr "" + #: WinTables.py:81 #, fuzzy msgid "Window %s not found. Skipping." diff --git a/pyfpdb/locale/fpdb-ru_RU.po b/pyfpdb/locale/fpdb-ru_RU.po index 652e9486..24312a9f 100644 --- a/pyfpdb/locale/fpdb-ru_RU.po +++ b/pyfpdb/locale/fpdb-ru_RU.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: Free Poker Database\n" -"POT-Creation-Date: 2011-03-10 06:16+CET\n" +"POT-Creation-Date: 2011-03-11 07:06+CET\n" "PO-Revision-Date: 2011-03-04 18:18+0000\n" "Last-Translator: Lexej \n" "Language-Team: Russian (Russia) <>\n" @@ -107,15 +107,12 @@ msgid "Could not find file %s" msgstr "Не удалось найти файл %s" #: Anonymise.py:55 -msgid "Output being written to" +#, fuzzy +msgid "Output being written to %s" msgstr "Вывод будет записан в файл " -#: BetfairToFpdb.py:108 CarbonToFpdb.py:163 EverestToFpdb.py:145 -#: EverleafToFpdb.py:145 iPokerToFpdb.py:156 iPokerToFpdb.py:158 -msgid "Didn't match re_HandInfo" -msgstr "re_HandInfo не соответствует" - -#: BetfairToFpdb.py:109 CarbonToFpdb.py:165 EverestToFpdb.py:147 +#: BetfairToFpdb.py:108 BetfairToFpdb.py:109 CarbonToFpdb.py:163 +#: CarbonToFpdb.py:165 EverestToFpdb.py:145 EverestToFpdb.py:147 #: PokerStarsToFpdb.py:223 msgid "No match in readHandInfo." msgstr "Нет соответствия в readHandInfo." @@ -137,11 +134,10 @@ msgstr "Bring-In не найден" msgid "DEBUG: " msgstr "" -#: BetfairToFpdb.py:199 OnGameToFpdb.py:337 PokerStarsToFpdb.py:439 -#: Win2dayToFpdb.py:341 WinamaxToFpdb.py:406 -#, fuzzy -msgid "unimplemented readAction: '%s' '%s'" -msgstr "DEBUG: не выполнена readAction: '%s' '%s'" +#: BetfairToFpdb.py:199 OnGameToFpdb.py:337 PartyPokerToFpdb.py:536 +#: PokerStarsToFpdb.py:439 +msgid "Unimplemented readAction: '%s' '%s'" +msgstr "" #: Card.py:431 msgid "fpdb card encoding(same as pokersource)" @@ -530,39 +526,39 @@ msgstr "" msgid "***Error sending finish: " msgstr "" -#: Database.py:2401 +#: Database.py:2405 msgid "invalid source in Database.createOrUpdateTourney" msgstr "" -#: Database.py:2414 +#: Database.py:2418 msgid "invalid source in Database.createOrUpdateTourneysPlayers" msgstr "" -#: Database.py:2540 +#: Database.py:2554 msgid "HandToWrite.init error: " msgstr "" -#: Database.py:2590 +#: Database.py:2604 msgid "HandToWrite.set_all error: " msgstr "" -#: Database.py:2621 +#: Database.py:2635 msgid "nutOmatic is id_player = %d" msgstr "" -#: Database.py:2629 +#: Database.py:2643 msgid "query plan: " msgstr "" -#: Database.py:2638 +#: Database.py:2652 msgid "cards =" msgstr "" -#: Database.py:2641 +#: Database.py:2655 msgid "get_stats took: %4.3f seconds" msgstr "" -#: Database.py:2643 +#: Database.py:2657 msgid "press enter to continue" msgstr "" @@ -570,6 +566,10 @@ msgstr "" msgid "Unable to recognise handinfo from: '%s'" msgstr "" +#: EverleafToFpdb.py:145 iPokerToFpdb.py:156 iPokerToFpdb.py:158 +msgid "Didn't match re_HandInfo" +msgstr "re_HandInfo не соответствует" + #: EverleafToFpdb.py:265 msgid "Everleaf readStudPlayerCards is only a stub." msgstr "" @@ -2855,10 +2855,6 @@ msgstr "" msgid "Failed to detect currency. HID: %s: '%s'" msgstr "" -#: PartyPokerToFpdb.py:536 -msgid "Unimplemented readAction: '%s' '%s'" -msgstr "" - #: PokerStarsToFpdb.py:265 msgid "Failed to detect currency: '%s'" msgstr "" @@ -3324,6 +3320,11 @@ msgid "" "using version %d.%d.%d. Your milage may vary." msgstr "" +#: Win2dayToFpdb.py:341 WinamaxToFpdb.py:406 +#, fuzzy +msgid "unimplemented readAction: '%s' '%s'" +msgstr "DEBUG: не выполнена readAction: '%s' '%s'" + #: WinTables.py:81 msgid "Window %s not found. Skipping." msgstr "" diff --git a/pyfpdb/locale/fr/LC_MESSAGES/fpdb.mo b/pyfpdb/locale/fr/LC_MESSAGES/fpdb.mo index cbfb22ca85e1a64fbcbcde408894be6281b729a9..daaa048ac9ab982043f2bb466f1bc1e592880569 100644 GIT binary patch delta 13348 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 delta 13414 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 DY=O?A delta 13653 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%0DVF_rZ88&Ri%RiO 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 delta 1231 zcmYMzTSydP6u|N0x~ZXgH!rR2*u~0(Rx~ZMtSBj^GLW83ND%YIBv=Zo+)5##rnKdp@KoK7v&| z7{FYdz?JwJmtazqNCvv`-+;K3a&@@A5mP94B3-06T;GS~lr7Y8zF|B@M2jrOMD#mN zkt_n9$pp)*z}LuTBsDHHU?y^jn_DvGqh_ic*J3RuVi#&gu45(+qE7fcTpvJfH-oy7 z@3@8eC648l;2zWlov16kijjB|xul<)?(iOJ1}xNxULkvsSzLp2Scj?1uCJsO*I_p@ zrwn5jj-#o;B!PCEN8Ld-FI3<82GrE=#?4rV8}SA*hrGcT5h7El6WpeAq1IzRI!M?7G~p1)Q&+c#26k{V;LU8OQ;!`MeV&AoFf|IB_uA(tn zlm^r@asu@*o?og`BQ3pPP#puOS^y5AZ zB9{~yp?6+`I`Jv2!MnH}|Da}cYmQav?2Ac1(B^Gv^BVOHP0fu)`|&2Px1rha9 Date: Fri, 11 Mar 2011 07:15:17 +0100 Subject: [PATCH 14/41] generate hungarian mo file --- pyfpdb/locale/fpdb-hu_HU.po | 10 +++++----- pyfpdb/locale/hu/LC_MESSAGES/fpdb.mo | Bin 74036 -> 81282 bytes 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pyfpdb/locale/fpdb-hu_HU.po b/pyfpdb/locale/fpdb-hu_HU.po index f37d024a..ea1a6623 100644 --- a/pyfpdb/locale/fpdb-hu_HU.po +++ b/pyfpdb/locale/fpdb-hu_HU.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.20.905 plus git\n" -"POT-Creation-Date: 2011-03-10 05:10+CET\n" +"POT-Creation-Date: 2011-03-11 07:14+CET\n" "PO-Revision-Date: 2011-03-11 01:33+0100\n" "Last-Translator: Ferenc Erki \n" "Language-Team: Hungarian \n" @@ -132,9 +132,10 @@ msgstr "Nyitó hívás nem található" msgid "DEBUG: " msgstr "DEBUG: " -#: BetfairToFpdb.py:199 OnGameToFpdb.py:337 PokerStarsToFpdb.py:439 -#: Win2dayToFpdb.py:341 WinamaxToFpdb.py:406 -msgid "unimplemented readAction: '%s' '%s'" +#: BetfairToFpdb.py:199 OnGameToFpdb.py:337 PartyPokerToFpdb.py:536 +#: PokerStarsToFpdb.py:439 +#, fuzzy +msgid "Unimplemented readAction: '%s' '%s'" msgstr "Nem ismert readAction: '%s' '%s'" #: Card.py:431 @@ -3451,7 +3452,6 @@ msgstr "" "%d.%d.%d verziót használod. Lehet, hogy máshogy fog működni." #: Win2dayToFpdb.py:341 WinamaxToFpdb.py:406 -#, fuzzy msgid "unimplemented readAction: '%s' '%s'" msgstr "Nem ismert readAction: '%s' '%s'" diff --git a/pyfpdb/locale/hu/LC_MESSAGES/fpdb.mo b/pyfpdb/locale/hu/LC_MESSAGES/fpdb.mo index 3af1e722e47dc7aca5efe09bed05866be9f8d624..5d510f82d447ec799abe2694dbb014da5420ba78 100644 GIT binary patch delta 20978 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 bP5k5UfgJ<7T0^Y$&m>#jb}Y`cUbp@a1drI< delta 14495 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 Rs8aB1Lv8YdM%H)M{{f>gRN4Rl From 26fc81c01302428fbf92ba1357f5d9fde09706e3 Mon Sep 17 00:00:00 2001 From: gimick Date: Fri, 11 Mar 2011 09:51:53 +0000 Subject: [PATCH 15/41] Revert "py2exe: add more build automation, activate MS-Windows GTK theme" filetype mangled This reverts commit 0dfe6b3d78cb6e220b3ecd546ef5abb0b0b3f169. --- .../windows/py2exeWalkthroughPython27.txt | 472 +++++++++--------- packaging/windows/py2exe_setup.py | 73 +-- 2 files changed, 278 insertions(+), 267 deletions(-) diff --git a/packaging/windows/py2exeWalkthroughPython27.txt b/packaging/windows/py2exeWalkthroughPython27.txt index af498584..c1fe722c 100644 --- a/packaging/windows/py2exeWalkthroughPython27.txt +++ b/packaging/windows/py2exeWalkthroughPython27.txt @@ -1,231 +1,241 @@ -PY2EXE walkthrough for Python 2.7 & FPDB 0.2x -created on 27th Feb 2011 by Gimick - -This walkthrough is derived from comments in the py2exe script made by Ray and SqlCoder -Additional information, formatting, updating to Python 2.6 and Python 2.7 and sequencing added by Gimick -Content is available under the the GNU Affero General Public License version 3 - - - -Step 0 Get a fresh XP installation ----------------------------------- - -0.1/ Using XPhome or Pro 32bit - -0.2/ Ensure the CPU supports SSE2 instruction set or better. - - -Step 1, dependency install --------------------------- - -1.1/ install the following in sequence (accept all default options) there should be no errors ! - -Python 2.7 ... http://python.org/ftp/python/2.7/python-2.7.msi -matplotlib 1.0.1 ... http://sourceforge.net/projects/matplotlib/files/matplotlib/matplotlib-1.0.1/matplotlib-1.0.1.win32-py2.7.exe/download -pygtk 2.22 ... http://ftp.gnome.org/pub/GNOME/binaries/win32/pygtk/2.22/pygtk-2.22.0-1.win32-py2.7.exe -pycairo 1.8.10 ... http://ftp.gnome.org/pub/GNOME/binaries/win32/pycairo/1.8/pycairo-1.8.10.win32-py2.7.exe -pyGobject X 2.26 ... http://ftp.gnome.org/pub/GNOME/binaries/win32/pygobject/2.26/pygobject-2.26.0-1.win32-py2.7.exe -pywin 216 ... http://sourceforge.net/projects/pywin32/files/pywin32/Build216/pywin32-216.win32-py2.7.exe/download - -pypokereval 138 ... http://sourceforge.net/projects/fpdb/files/fpdb/pokereval-138.win32-py2.7.exe/download -cdecimal 2.2 ... http://www.bytereef.org/software/mpdecimal/releases/cdecimal-2.2.win32-py2.7.msi -psycopg2 ... http://www.stickpeople.com/projects/python/win-psycopg/psycopg2-2.2.1.win32-py2.6-pg8.4.3-release.exe - -(Note: stickpeople is the offical repository, not a community build) - -py2exe 0.6.9 ... http://sourceforge.net/projects/py2exe/files/py2exe/0.6.9/py2exe-0.6.9.win32-py2.7.exe/download - -1.2/ MySQL - -Install the following file: -mysql-python 1.2.3 ... http://sourceforge.net/projects/fpdb/files/fpdb/MySQL-python-1.2.3.win32-py2.7.exe/download - -1.3/ pytz fixup to work in an executable package - -pytz needs runtime access to timezone definition files. pytz is hard-coded to search in the directory from which the pytz .py modules are being run. -In a py2exe package, this directory is actually a library.zip container file, so windows cannot find the timezone definitions, and will crash the app. - -We need to make a one-line change to pytz to search in the current working directory (which is not a container), and not the application directory. -The py2exe script copies the timezone datafiles into the package folder pyfpdb/zoneinfo. - -Thanks to Jeff Peck gmail.com> on the py2exe mailing list for documenting this problem and solution. - -1.3.1/ Navigate to C:\Python27\Lib\site-packages\pytz -1.3.2/ Edit __init__.py -1.3.3/ At line 55 replace the following line(s): - - filename = os.path.join(os.path.dirname(__file__), - 'zoneinfo', *name_parts) - -with this line: - - filename = os.path.join(os.getcwd(), 'zoneinfo', *name_parts) - -1.3.4/ Save and exit - - -1.4/ Patch py2exe to stop popup runtime error message - -see http://www.py2exe.org/index.cgi/StderrLog for technical info. - -1.4.1/ - -dos> write C:\Python27\Lib\site-packages\py2exe\boot_common.py - -replace: - atexit.register(alert, 0, - "See the logfile '%s' for details" % fname, - "Errors occurred") -with: - #atexit.register(alert, 0, - # "See the logfile '%s' for details" % fname, - # "Errors occurred") - -1.4.2/ save and exit - - - -Step 2 Setup GTK ------------------ - -There are quite a few GTK packages needed, and rather than install them individually, I used the official AllinOne from the GTK project. - -2,1/ Create a new folder c:\GTK - -2.2/ Extract the following zip file into c:\GTK - -gtk+ allinone 2.22.1 ... http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.22/gtk+-bundle_2.22.1-20101227_win32.zip - -2.3/ If everything has worked, you should have c:\GTK\bin \etc \lib \src and so on created. - -2.4/ The /share/doc and /share/gtk-doc folders are huge, so can be emptied now (leave the /doc and /gtk-doc folders - in place, but delete the content) - - -Step 3 Set GTK into the PATH variable -------------------------------------- - -The path for GTK isn't set by default, so need to let the o/s know where the GTK stuff is. - -3.1/ Rightclick on mycomputer to show system properties -3.2/ select advanced/environment Variables -3.3/ in "system variables" NOT "user variables" do the following -3.3.1/ create a new item as name: GTK_BASEPATH value: c:\GTK -3.3.2/ edit the item "path", press home to get to the first character and insert the following text, (no quotes, including semicolon) %GTK_BASEPATH%\bin; - -3.4/ to check, open command prompt and do: - -dos>path ... system should respond with ... PATH=c:\GTK\bin;C:\WIN........ - -3.5/ Give it a spin to test (hopefully an application will start, if not, something has gone wrong) - -dos> gtk-demo - - -Step 4 Get the fpdb GIT tree ----------------------------- - -4.1/ Best to take a copy to work with; following steps will assume that the fpdb folder is on the Desktop -4.2/ Edit the script in packaging/windows/py2exe_setup.py to set the fpdbver variable for this release - - -5.3/ Install correct Numpy for this build ------------------------------------------ - -Numpy needs special handling, as by default it will install an optimised version for the SSE level of your CPU (SSE3, SSE2 or noSSE). This means that the completed package will not run on an older CPU. - -For this reason, do not just run the installer. We will force a nosse version, to minimise problems on -older client PC's - -5.3.1/ download the package to the Desktop - -numpy 1.5.1 ... http://sourceforge.net/projects/numpy/files/NumPy/1.5.1/numpy-1.5.1-win32-superpack-python2.7.exe/download - -5.3.3/ You are normally wanting to build a package which works on all CPU's, so install for noSSE as follows: - -dos> cd Desktop -dos> numpy-1.5.1-win32-superpack-python2.7.exe /arch nosse - -5.3.4/ At the end of the installation, click on "show details" to confirm the installation. - -"Target CPU handles SSE2" -"Target CPU handles SSE3" -"nosse install (arch value: nosse)" -"Install NO SSE" -Extract: numpy-1.5.1-nosse.exe... 100% -Execute: "C:\DOCUME~1\user\LOCALS~1\Temp\numpy-1.5.1-nosse.exe" -Completed - -Step 6 Run py2exe to generate fpdb.exe --------------------------------------- - -6.0/ Set version number of build folder -dos> cd Desktop\fpdb\packaging\windows -dos> write py2exe_setup.py -change the value of fpdbver and save file - -6.1/ Run the script to create the fpdb.exe bundle - -dos> cd Desktop\fpdb\packaging\windows -dos> c:\python27\python.exe py2exe_setup.py py2exe - -wait a while, watch lots of copying and whatever. - -6.2/ You should next get prompted for the GTK folder. -Enter c:\GTK - -6.3/ If there are no errors reported, it has probably worked, we will test soon. - -Build notes: - -There is a warning about dll's not included "umath.pyd - c:\Python27\lib\site-packages\numpy\core\umath.pyd" - - reason for this is not understood at present. (Umath is apparently included in the built package). - - -Step 7 not currently used -------------------------- - -Has been deleted - - -Step 8 Drag out the completed bundle ------------------------------------- - -py2exe creates a new folder for the created software bundle, drag this out to the desktop for ease of working. - -8.1/ Drag Desktop\fpdb\packaging\windows\fpdb-n.nn.nnn to Desktop\ - - -Step 9 Initial run ------------------- - -9.1/ Open the Desktop\fpdb-n.nn.nnn folder -9.2/ In explorer...tools...folder options...View uncheck "Hide extensions for known file types" -9.3/ Double click run_fpdb.bat -9.4/ check the contents of pyfpdb\fpdb.exe.log, deal with any errors thrown - -9.5/ hopefully, fpdb will run -9.6/ Try out a few options, deal with any errors reported - -Observe that the msvcp90.dll was provided by the python runtime package, so we don't have to install the separate package from Microsoft. End-users will, however need the dependency. - - -Step 11 deleted ---------------- - -Has been deleted - - -Step 12 rename folder ---------------------- - -If needed, rename the folder to something meaningful to the community. - -Step 13 Compress to executable archive --------------------------------------- - -13.1/ Download and install 7zip 914 ... http://sourceforge.net/projects/sevenzip/files/7-Zip/9.14/7z914.exe/download -13.2/ Rightclick on fpdb executable folder, select 7zip Add to archive... select SFX archive option switch -13.3/ Test the created exe file - - +PY2EXE walkthrough for Python 2.7 & FPDB 0.2x +created on 27th Feb 2011 by Gimick + +This walkthrough is derived from comments in the py2exe script made by Ray and SqlCoder +Additional information, formatting, updating to Python 2.6 and Python 2.7 and sequencing added by Gimick +Content is available under the the GNU Affero General Public License version 3 + + + +Step 0 Get a fresh XP installation +---------------------------------- + +0.1/ Using XPhome or Pro 32bit + +0.2/ Ensure the CPU supports SSE2 instruction set or better. + + +Step 1, dependency install +-------------------------- + +1.1/ install the following in sequence (accept all default options) there should be no errors ! + +Python 2.7 ... http://python.org/ftp/python/2.7/python-2.7.msi +matplotlib 1.0.1 ... http://sourceforge.net/projects/matplotlib/files/matplotlib/matplotlib-1.0.1/matplotlib-1.0.1.win32-py2.7.exe/download +pygtk 2.22 ... http://ftp.gnome.org/pub/GNOME/binaries/win32/pygtk/2.22/pygtk-2.22.0-1.win32-py2.7.exe +pycairo 1.8.10 ... http://ftp.gnome.org/pub/GNOME/binaries/win32/pycairo/1.8/pycairo-1.8.10.win32-py2.7.exe +pyGobject X 2.26 ... http://ftp.gnome.org/pub/GNOME/binaries/win32/pygobject/2.26/pygobject-2.26.0-1.win32-py2.7.exe +pywin 216 ... http://sourceforge.net/projects/pywin32/files/pywin32/Build216/pywin32-216.win32-py2.7.exe/download + +pypokereval 138 ... http://sourceforge.net/projects/fpdb/files/fpdb/pokereval-138.win32-py2.7.exe/download +cdecimal 2.2 ... http://www.bytereef.org/software/mpdecimal/releases/cdecimal-2.2.win32-py2.7.msi +psycopg2 ... http://www.stickpeople.com/projects/python/win-psycopg/psycopg2-2.2.1.win32-py2.6-pg8.4.3-release.exe + +(Note: stickpeople is the offical repository, not a community build) + +py2exe 0.6.9 ... http://sourceforge.net/projects/py2exe/files/py2exe/0.6.9/py2exe-0.6.9.win32-py2.7.exe/download + +1.2/ MySQL + +Install the following file: +mysql-python 1.2.3 ... http://sourceforge.net/projects/fpdb/files/fpdb/MySQL-python-1.2.3.win32-py2.7.exe/download + +1.3/ pytz fixup to work in an executable package + +pytz needs runtime access to timezone definition files. pytz is hard-coded to search in the directory from which the pytz .py modules are being run. +In a py2exe package, this directory is actually a library.zip container file, so windows cannot find the timezone definitions, and will crash the app. + +We need to make a one-line change to pytz to search in the current working directory (which is not a container), and not the application directory. +The py2exe script copies the timezone datafiles into the package folder pyfpdb/zoneinfo. + +Thanks to Jeff Peck gmail.com> on the py2exe mailing list for documenting this problem and solution. + +1.3.1/ Navigate to C:\Python27\Lib\site-packages\pytz +1.3.2/ Edit __init__.py +1.3.3/ At line 55 replace the following line(s): + + filename = os.path.join(os.path.dirname(__file__), + 'zoneinfo', *name_parts) + +with this line: + + filename = os.path.join(os.getcwd(), 'zoneinfo', *name_parts) + +1.3.4/ Save and exit + + +1.4/ Patch py2exe to stop popup runtime error message + +see http://www.py2exe.org/index.cgi/StderrLog for technical info. + +1.4.1/ + +dos> write C:\Python27\Lib\site-packages\py2exe\boot_common.py + +replace: + atexit.register(alert, 0, + "See the logfile '%s' for details" % fname, + "Errors occurred") +with: + #atexit.register(alert, 0, + # "See the logfile '%s' for details" % fname, + # "Errors occurred") + +1.4.2/ save and exit + + + +Step 2 Setup GTK +----------------- + +There are quite a few GTK packages needed, and rather than install them individually, I used the official AllinOne from the GTK project. + +2,1/ Create a new folder c:\GTK + +2.2/ Extract the following zip file into c:\GTK + +gtk+ allinone 2.22.1 ... http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.22/gtk+-bundle_2.22.1-20101227_win32.zip + +2.3/ If everything has worked, you should have c:\GTK\bin \etc \lib \src and so on created. + +2.4/ The /share/doc and /share/gtk-doc folders are huge, so can be emptied now (leave the /doc and /gtk-doc folders + in place, but delete the content) + + +Step 3 Set GTK into the PATH variable +------------------------------------- + +The path for GTK isn't set by default, so need to let the o/s know where the GTK stuff is. + +3.1/ Rightclick on mycomputer to show system properties +3.2/ select advanced/environment Variables +3.3/ in "system variables" NOT "user variables" do the following +3.3.1/ create a new item as name: GTK_BASEPATH value: c:\GTK +3.3.2/ edit the item "path", press home to get to the first character and insert the following text, (no quotes, including semicolon) %GTK_BASEPATH%\bin; + +3.4/ to check, open command prompt and do: + +dos>path ... system should respond with ... PATH=c:\GTK\bin;C:\WIN........ + +3.5/ Give it a spin to test (hopefully an application will start, if not, something has gone wrong) + +dos> gtk-demo + + +Step 4 Get the fpdb GIT tree +---------------------------- + +4.1/ Best to take a copy to work with; following steps will assume that the fpdb folder is on the Desktop +4.2/ Edit the script in packaging/windows/py2exe_setup.py to set the fpdbver variable for this release + + +5.3/ Install correct Numpy for this build +----------------------------------------- + +Numpy needs special handling, as by default it will install an optimised version for the SSE level of your CPU (SSE3, SSE2 or noSSE). This means that the completed package will not run on an older CPU. + +For this reason, do not just run the installer downloaded. We will force a nosse version, to minimise problems on +older client PC's + +5.3.1/ download the package to the Desktop + +numpy 1.5.1 ... http://sourceforge.net/projects/numpy/files/NumPy/1.5.1/numpy-1.5.1-win32-superpack-python2.7.exe/download + +5.3.3/ If you are wanting to build a package which works on all CPU's, install noSSE as follows: + +dos> cd Desktop +dos> numpy-1.5.1-win32-superpack-python2.7.exe /arch nosse + +5.3.4/ At the end of the installation, click on "show details" to confirm the installation. + +"Target CPU handles SSE2" +"Target CPU handles SSE3" +"nosse install (arch value: nosse)" +"Install NO SSE" +Extract: numpy-1.5.1-nosse.exe... 100% +Execute: "C:\DOCUME~1\user\LOCALS~1\Temp\numpy-1.5.1-nosse.exe" +Completed + +Step 6 Run py2exe to generate fpdb.exe +-------------------------------------- + +6.1/ Run the script to create the fpdb.exe bundle + +dos> cd Desktop\fpdb\packaging\windows +dos> c:\python27\python.exe py2exe_setup.py py2exe + +wait a while, watch lots of copying and whatever. + +6.2/ You should next get prompted for the GTK folder. +c:\GTK + +6.3/ If there are no errors reported, it has probably worked, we will test soon. + +Build notes: + +There is a warning about dll's not included "umath.pyd - c:\Python27\lib\site-packages\numpy\core\umath.pyd" + - reason for this is not understood at present. (Umath is apparently included in the built package). + + +Step 7 not currently used +------------------------- + +Has been deleted + + +Step 8 Drag out the completed bundle +------------------------------------ + +py2exe creates a new folder for the created software bundle, drag this out to the desktop for ease of working. + +8.1/ Drag Desktop\fpdb\packaging\windows\fpdb-n.nn.nnn to Desktop\ + + +Step 9 Initial run +------------------ + +9.1/ Open the Desktop\fpdb-n.nn.nnn folder +9.2/ In explorer...tools...folder options...View uncheck "Hide extensions for known file types" +9.3/ Double click run_fpdb.bat +9.4/ check the contents of pyfpdb\fpdb.exe.log, deal with any errors thrown + +9.5/ hopefully, fpdb will run +9.6/ Try out a few options, deal with any errors reported + +Observe that the msvcp90.dll was provided by the python runtime package, so we don't have to install the separate package from Microsoft. End-users will, however need the dependency. + + +Step 11 pruning +--------------- + +11.1/ The generated folder is 100+MB and can be pruned by removing the following directories: + +pyfpdb/lib/glib-2.0 +pyfpdb/lib/pkgconfig +pyfpdb/share/aclocal +pyfpdb/share/doc +pyfpdb/share/glib-2.0 +pyfpdb/share/gtk-2.0 +pyfpdb/share/gtk-doc +pyfpdb/share/locale +pyfpdb/share/man + + +Step 12 rename folder +--------------------- + +If needed, rename the folder to something meaningful to the community. If you have built for NoSSE, append anyCPU to the directory name. + + +Step 13 Compress to executable archive +-------------------------------------- + +13.1/ Download and install 7zip 914 ... http://sourceforge.net/projects/sevenzip/files/7-Zip/9.14/7z914.exe/download +13.2/ Rightclick on fpdb executable folder, select 7zip Add to archive... select SFX archive option switch +13.3/ Test the created exe file + +Step 14 If you need to build again for a different SSE level +------------------------------------------------------------ + +Go back to step 5 and run again. + diff --git a/packaging/windows/py2exe_setup.py b/packaging/windows/py2exe_setup.py index 723218ac..25a54c79 100644 --- a/packaging/windows/py2exe_setup.py +++ b/packaging/windows/py2exe_setup.py @@ -24,25 +24,32 @@ Py2exe script for fpdb. ######################################################################## #TODO: +# get rid of all the uneeded libraries (e.g., pyQT) # think about an installer +# done: change GuiAutoImport so that it knows to start HUD_main.exe, when appropriate +# include the lib needed to handle png files in mucked + #HOW TO USE this script: # -#- edit the fpdbver variable in this script (this value will be used to create the distribution folder name) #- cd to the folder where this script is stored, usually ...packaging/windows #- Run the script with python "py2exe_setup.py py2exe" #- You will frequently get messages about missing .dll files.just assume other # person will have them? we have copyright issues including some dll's -#- If it works, you'll have a new dir fpdb-version which should +#- If it works, you'll have a new dir fpdb-YYYYMMDD-exe which should # contain 2 dirs; gfx and pyfpdb and run_fpdb.bat +#- [ This bit is now automated: +# Last, you must copy the etc/, lib/ and share/ folders from your +# gtk/bin/ (just /gtk/?) folder to the pyfpdb folder. (the whole folders, +# not just the contents) ] +#- You can (should) then prune the etc/, lib/ and share/ folders to +# remove components we don't need. (see output at end of program run) # See walkthrough in packaging directory for versions used -# Very useful guide here : http://www.no-ack.org/2010/09/complete-guide-to-py2exe-for-pygtk.html # steffeN: Doesnt seem necessary to gettext-ify this, but feel free to if you disagree # Gimick: restructure to allow script to run from packaging/windows directory, and not to write to source pyfpdb -fpdbver = '0.22' import os import sys @@ -54,10 +61,6 @@ except: print "A parameter is required, quitting now" quit() -if sys.argv[1] <> "py2exe": - print "Parameter 1 is not valid, quitting now" - quit() - from distutils.core import setup import py2exe import glob @@ -72,15 +75,12 @@ def isSystemDLL(pathname): return origIsSystemDLL(pathname) def test_and_remove(top): - #print "Attempting to delete:", top if os.path.exists(top): if os.path.isdir(top): remove_tree(top) else: print "Unexpected file '"+top+"' found. Exiting." exit() - else: - "oops folder not found" def remove_tree(top): # Delete everything reachable from the directory named in 'top', @@ -89,8 +89,8 @@ def remove_tree(top): # could delete all your disk files. # sc: Nicked this from somewhere, added the if statement to try # make it a bit safer - if (top in ('build','dist') or top.startswith(distdir)) and os.path.basename(os.getcwd()) == 'windows': - print "removing directory '"+top+"' ..." + if top in ('build','dist',distdir) and os.path.basename(os.getcwd()) == 'windows': + #print "removing directory '"+top+"' ..." for root, dirs, files in os.walk(top, topdown=False): for name in files: os.remove(os.path.join(root, name)) @@ -111,6 +111,8 @@ def copy_file(source,destination): shutil.copy( source, destination ) +fpdbver = '0.21' + distdir = r'fpdb-' + fpdbver rootdir = r'../../' #cwd is normally /packaging/windows pydir = rootdir+'pyfpdb/' @@ -170,6 +172,9 @@ setup( ] + matplotlib.get_py2exe_datafiles() ) +# ,(distdir, [rootdir+'run_fpdb.bat']) +# ,(distdir+r'\gfx', glob.glob(gfxdir+'*.*')) +# ] + print "*** py2exe build phase complete ***" # copy zone info and fpdb translation folders @@ -180,7 +185,7 @@ copy_tree (pydir+r'locale', os.path.join(r'dist', 'locale')) copy_tree (gfxdir, os.path.join(distdir, 'gfx')) copy_file (rootdir+'run_fpdb.bat', distdir) -print "*** Renaming dist folder as pyfpdb folder ***" +print "*** Renaming dist folder as distribution pyfpdb folder ***" dest = os.path.join(distdir, 'pyfpdb') os.rename( 'dist', dest ) @@ -191,34 +196,30 @@ while not os.path.exists(gtk_dir): gtk_dir = sys.stdin.readline().rstrip() print "*** copying GTK runtime ***" -dest = os.path.join(distdir, 'pyfpdb', ) +dest = os.path.join(distdir, 'pyfpdb') copy_file(os.path.join(gtk_dir, 'bin', 'libgdk-win32-2.0-0.dll'), dest ) copy_file(os.path.join(gtk_dir, 'bin', 'libgobject-2.0-0.dll'), dest) copy_tree(os.path.join(gtk_dir, 'etc'), os.path.join(dest, 'etc')) copy_tree(os.path.join(gtk_dir, 'lib'), os.path.join(dest, 'lib')) copy_tree(os.path.join(gtk_dir, 'share'), os.path.join(dest, 'share')) -print "*** Activating MS-Windows GTK theme ***" -gtkrc = open(os.path.join(distdir, 'pyfpdb', 'etc', 'gtk-2.0', 'gtkrc'), 'w') -print >>gtkrc, 'gtk-theme-name = "MS-Windows"' -gtkrc.close() - -print "*** deleting temporary build folder ***" +print "*** All done! ***" test_and_remove('build') +print distdir+" is in the pyfpdb dir" +print """ +The following dirs can probably removed to make the final package smaller: -print "*** deleting folders to shrink package size ***" -test_and_remove(os.path.join(distdir, 'pyfpdb', 'lib', 'glib-2.0')) -test_and_remove(os.path.join(distdir, 'pyfpdb', 'lib', 'gtk-2.0','include')) -test_and_remove(os.path.join(distdir, 'pyfpdb', 'lib', 'pkgconfig')) -test_and_remove(os.path.join(distdir, 'pyfpdb', 'share', 'aclocal')) -test_and_remove(os.path.join(distdir, 'pyfpdb', 'share', 'doc')) -test_and_remove(os.path.join(distdir, 'pyfpdb', 'share', 'glib-2.0')) -test_and_remove(os.path.join(distdir, 'pyfpdb', 'share', 'gtk-2.0')) -test_and_remove(os.path.join(distdir, 'pyfpdb', 'share', 'gtk-doc')) -test_and_remove(os.path.join(distdir, 'pyfpdb', 'share', 'locale')) -test_and_remove(os.path.join(distdir, 'pyfpdb', 'share', 'man')) +pyfpdb/lib/glib-2.0 +pyfpdb/lib/gtk-2.0/include +pyfpdb/lib/pkgconfig +pyfpdb/share/aclocal +pyfpdb/share/doc +pyfpdb/share/glib-2.0 +pyfpdb/share/gtk-2.0 +pyfpdb/share/gtk-doc +pyfpdb/share/locale +pyfpdb/share/man +pyfpdb/share/themes/Default -print "***++++++++++++++++++++++++++++++++++++++++++++++" -print "All done!" -print "The distribution folder "+distdir+" is in the pyfpdb dir" -print "***++++++++++++++++++++++++++++++++++++++++++++++" +Use 7-zip to zip up the distribution and create a self extracting archive and that's it! +""" From f16e33c398ee3d2a832743745176f17b7e7a4a42 Mon Sep 17 00:00:00 2001 From: gimick Date: Fri, 11 Mar 2011 17:28:21 +0000 Subject: [PATCH 16/41] py2exe: add more build automation, activate MS-Windows GTK theme - (2nd try) --- .../windows/py2exeWalkthroughPython27.txt | 32 +++----- packaging/windows/py2exe_setup.py | 73 +++++++++---------- 2 files changed, 47 insertions(+), 58 deletions(-) diff --git a/packaging/windows/py2exeWalkthroughPython27.txt b/packaging/windows/py2exeWalkthroughPython27.txt index c1fe722c..921b591c 100644 --- a/packaging/windows/py2exeWalkthroughPython27.txt +++ b/packaging/windows/py2exeWalkthroughPython27.txt @@ -134,14 +134,14 @@ Step 4 Get the fpdb GIT tree Numpy needs special handling, as by default it will install an optimised version for the SSE level of your CPU (SSE3, SSE2 or noSSE). This means that the completed package will not run on an older CPU. -For this reason, do not just run the installer downloaded. We will force a nosse version, to minimise problems on +For this reason, do not just run the installer. We will force a nosse version, to minimise problems on older client PC's 5.3.1/ download the package to the Desktop numpy 1.5.1 ... http://sourceforge.net/projects/numpy/files/NumPy/1.5.1/numpy-1.5.1-win32-superpack-python2.7.exe/download -5.3.3/ If you are wanting to build a package which works on all CPU's, install noSSE as follows: +5.3.3/ You are normally wanting to build a package which works on all CPU's, so install for noSSE as follows: dos> cd Desktop dos> numpy-1.5.1-win32-superpack-python2.7.exe /arch nosse @@ -159,6 +159,11 @@ Completed Step 6 Run py2exe to generate fpdb.exe -------------------------------------- +6.0/ Set version number of build folder +dos> cd Desktop\fpdb\packaging\windows +dos> write py2exe_setup.py +change the value of fpdbver and save file + 6.1/ Run the script to create the fpdb.exe bundle dos> cd Desktop\fpdb\packaging\windows @@ -167,7 +172,7 @@ dos> c:\python27\python.exe py2exe_setup.py py2exe wait a while, watch lots of copying and whatever. 6.2/ You should next get prompted for the GTK folder. -c:\GTK +Enter c:\GTK 6.3/ If there are no errors reported, it has probably worked, we will test soon. @@ -205,27 +210,16 @@ Step 9 Initial run Observe that the msvcp90.dll was provided by the python runtime package, so we don't have to install the separate package from Microsoft. End-users will, however need the dependency. -Step 11 pruning +Step 11 deleted --------------- -11.1/ The generated folder is 100+MB and can be pruned by removing the following directories: - -pyfpdb/lib/glib-2.0 -pyfpdb/lib/pkgconfig -pyfpdb/share/aclocal -pyfpdb/share/doc -pyfpdb/share/glib-2.0 -pyfpdb/share/gtk-2.0 -pyfpdb/share/gtk-doc -pyfpdb/share/locale -pyfpdb/share/man +Has been deleted Step 12 rename folder --------------------- -If needed, rename the folder to something meaningful to the community. If you have built for NoSSE, append anyCPU to the directory name. - +If needed, rename the folder to something meaningful to the community. Step 13 Compress to executable archive -------------------------------------- @@ -234,8 +228,4 @@ Step 13 Compress to executable archive 13.2/ Rightclick on fpdb executable folder, select 7zip Add to archive... select SFX archive option switch 13.3/ Test the created exe file -Step 14 If you need to build again for a different SSE level ------------------------------------------------------------- - -Go back to step 5 and run again. diff --git a/packaging/windows/py2exe_setup.py b/packaging/windows/py2exe_setup.py index 25a54c79..723218ac 100644 --- a/packaging/windows/py2exe_setup.py +++ b/packaging/windows/py2exe_setup.py @@ -24,32 +24,25 @@ Py2exe script for fpdb. ######################################################################## #TODO: -# get rid of all the uneeded libraries (e.g., pyQT) # think about an installer -# done: change GuiAutoImport so that it knows to start HUD_main.exe, when appropriate -# include the lib needed to handle png files in mucked - #HOW TO USE this script: # +#- edit the fpdbver variable in this script (this value will be used to create the distribution folder name) #- cd to the folder where this script is stored, usually ...packaging/windows #- Run the script with python "py2exe_setup.py py2exe" #- You will frequently get messages about missing .dll files.just assume other # person will have them? we have copyright issues including some dll's -#- If it works, you'll have a new dir fpdb-YYYYMMDD-exe which should +#- If it works, you'll have a new dir fpdb-version which should # contain 2 dirs; gfx and pyfpdb and run_fpdb.bat -#- [ This bit is now automated: -# Last, you must copy the etc/, lib/ and share/ folders from your -# gtk/bin/ (just /gtk/?) folder to the pyfpdb folder. (the whole folders, -# not just the contents) ] -#- You can (should) then prune the etc/, lib/ and share/ folders to -# remove components we don't need. (see output at end of program run) # See walkthrough in packaging directory for versions used +# Very useful guide here : http://www.no-ack.org/2010/09/complete-guide-to-py2exe-for-pygtk.html # steffeN: Doesnt seem necessary to gettext-ify this, but feel free to if you disagree # Gimick: restructure to allow script to run from packaging/windows directory, and not to write to source pyfpdb +fpdbver = '0.22' import os import sys @@ -61,6 +54,10 @@ except: print "A parameter is required, quitting now" quit() +if sys.argv[1] <> "py2exe": + print "Parameter 1 is not valid, quitting now" + quit() + from distutils.core import setup import py2exe import glob @@ -75,12 +72,15 @@ def isSystemDLL(pathname): return origIsSystemDLL(pathname) def test_and_remove(top): + #print "Attempting to delete:", top if os.path.exists(top): if os.path.isdir(top): remove_tree(top) else: print "Unexpected file '"+top+"' found. Exiting." exit() + else: + "oops folder not found" def remove_tree(top): # Delete everything reachable from the directory named in 'top', @@ -89,8 +89,8 @@ def remove_tree(top): # could delete all your disk files. # sc: Nicked this from somewhere, added the if statement to try # make it a bit safer - if top in ('build','dist',distdir) and os.path.basename(os.getcwd()) == 'windows': - #print "removing directory '"+top+"' ..." + if (top in ('build','dist') or top.startswith(distdir)) and os.path.basename(os.getcwd()) == 'windows': + print "removing directory '"+top+"' ..." for root, dirs, files in os.walk(top, topdown=False): for name in files: os.remove(os.path.join(root, name)) @@ -111,8 +111,6 @@ def copy_file(source,destination): shutil.copy( source, destination ) -fpdbver = '0.21' - distdir = r'fpdb-' + fpdbver rootdir = r'../../' #cwd is normally /packaging/windows pydir = rootdir+'pyfpdb/' @@ -172,9 +170,6 @@ setup( ] + matplotlib.get_py2exe_datafiles() ) -# ,(distdir, [rootdir+'run_fpdb.bat']) -# ,(distdir+r'\gfx', glob.glob(gfxdir+'*.*')) -# ] + print "*** py2exe build phase complete ***" # copy zone info and fpdb translation folders @@ -185,7 +180,7 @@ copy_tree (pydir+r'locale', os.path.join(r'dist', 'locale')) copy_tree (gfxdir, os.path.join(distdir, 'gfx')) copy_file (rootdir+'run_fpdb.bat', distdir) -print "*** Renaming dist folder as distribution pyfpdb folder ***" +print "*** Renaming dist folder as pyfpdb folder ***" dest = os.path.join(distdir, 'pyfpdb') os.rename( 'dist', dest ) @@ -196,30 +191,34 @@ while not os.path.exists(gtk_dir): gtk_dir = sys.stdin.readline().rstrip() print "*** copying GTK runtime ***" -dest = os.path.join(distdir, 'pyfpdb') +dest = os.path.join(distdir, 'pyfpdb', ) copy_file(os.path.join(gtk_dir, 'bin', 'libgdk-win32-2.0-0.dll'), dest ) copy_file(os.path.join(gtk_dir, 'bin', 'libgobject-2.0-0.dll'), dest) copy_tree(os.path.join(gtk_dir, 'etc'), os.path.join(dest, 'etc')) copy_tree(os.path.join(gtk_dir, 'lib'), os.path.join(dest, 'lib')) copy_tree(os.path.join(gtk_dir, 'share'), os.path.join(dest, 'share')) -print "*** All done! ***" +print "*** Activating MS-Windows GTK theme ***" +gtkrc = open(os.path.join(distdir, 'pyfpdb', 'etc', 'gtk-2.0', 'gtkrc'), 'w') +print >>gtkrc, 'gtk-theme-name = "MS-Windows"' +gtkrc.close() + +print "*** deleting temporary build folder ***" test_and_remove('build') -print distdir+" is in the pyfpdb dir" -print """ -The following dirs can probably removed to make the final package smaller: -pyfpdb/lib/glib-2.0 -pyfpdb/lib/gtk-2.0/include -pyfpdb/lib/pkgconfig -pyfpdb/share/aclocal -pyfpdb/share/doc -pyfpdb/share/glib-2.0 -pyfpdb/share/gtk-2.0 -pyfpdb/share/gtk-doc -pyfpdb/share/locale -pyfpdb/share/man -pyfpdb/share/themes/Default +print "*** deleting folders to shrink package size ***" +test_and_remove(os.path.join(distdir, 'pyfpdb', 'lib', 'glib-2.0')) +test_and_remove(os.path.join(distdir, 'pyfpdb', 'lib', 'gtk-2.0','include')) +test_and_remove(os.path.join(distdir, 'pyfpdb', 'lib', 'pkgconfig')) +test_and_remove(os.path.join(distdir, 'pyfpdb', 'share', 'aclocal')) +test_and_remove(os.path.join(distdir, 'pyfpdb', 'share', 'doc')) +test_and_remove(os.path.join(distdir, 'pyfpdb', 'share', 'glib-2.0')) +test_and_remove(os.path.join(distdir, 'pyfpdb', 'share', 'gtk-2.0')) +test_and_remove(os.path.join(distdir, 'pyfpdb', 'share', 'gtk-doc')) +test_and_remove(os.path.join(distdir, 'pyfpdb', 'share', 'locale')) +test_and_remove(os.path.join(distdir, 'pyfpdb', 'share', 'man')) -Use 7-zip to zip up the distribution and create a self extracting archive and that's it! -""" +print "***++++++++++++++++++++++++++++++++++++++++++++++" +print "All done!" +print "The distribution folder "+distdir+" is in the pyfpdb dir" +print "***++++++++++++++++++++++++++++++++++++++++++++++" From f61fcc4b4aace5c81c266a6600202a856162a4ad Mon Sep 17 00:00:00 2001 From: Robert Wielinga Date: Sat, 12 Mar 2011 13:28:55 +0100 Subject: [PATCH 17/41] Added the PacifikPoker (888Poker) HandHistoryConverter --- pyfpdb/PacificPokerToFpdb.py | 467 +++++++++++++++++++++++++++++++++++ 1 file changed, 467 insertions(+) create mode 100644 pyfpdb/PacificPokerToFpdb.py diff --git a/pyfpdb/PacificPokerToFpdb.py b/pyfpdb/PacificPokerToFpdb.py new file mode 100644 index 00000000..34fb2265 --- /dev/null +++ b/pyfpdb/PacificPokerToFpdb.py @@ -0,0 +1,467 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Copyright 2008-2010, Carl Gherardi +# +# 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 2 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, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +######################################################################## + +import L10n +_ = L10n.get_translation() + +# TODO: straighten out discards for draw games + +import sys +from HandHistoryConverter import * +from decimal_wrapper import Decimal + +# PacificPoker HH Format + +class PacificPoker(HandHistoryConverter): + + # Class Variables + + sitename = "PacificPoker" + filetype = "text" + codepage = ("utf8", "cp1252") + siteId = 13 # Needs to match id entry in Sites database + + mixes = { 'HORSE': 'horse', '8-Game': '8game', 'HOSE': 'hose'} # Legal mixed games + sym = {'USD': "\$", 'CAD': "\$", 'T$': "", "EUR": "\xe2\x82\xac", "GBP": "\xa3", "play": ""} # ADD Euro, Sterling, etc HERE + substitutions = { + 'LEGAL_ISO' : "USD|EUR|GBP|CAD|FPP", # legal ISO currency codes + 'LS' : "\$|\xe2\x82\xac|" # legal currency symbols - Euro(cp1252, utf-8) + } + + # translations from captured groups to fpdb info strings +# :: TODO 0.02 limit does not seem right + Lim_Blinds = { '0.02': ('0.01', '0.02'), '0.04': ('0.01', '0.02'), + '0.10': ('0.02', '0.05'), '0.20': ('0.05', '0.10'), + '0.40': ('0.10', '0.20'), '0.50': ('0.10', '0.25'), + '1.00': ('0.25', '0.50'), '1': ('0.25', '0.50'), + '2.00': ('0.50', '1.00'), '2': ('0.50', '1.00'), + '4.00': ('1.00', '2.00'), '4': ('1.00', '2.00'), + '6.00': ('1.00', '3.00'), '6': ('1.00', '3.00'), + '8.00': ('2.00', '4.00'), '8': ('2.00', '4.00'), + '10.00': ('2.00', '5.00'), '10': ('2.00', '5.00'), + '20.00': ('5.00', '10.00'), '20': ('5.00', '10.00'), + '30.00': ('10.00', '15.00'), '30': ('10.00', '15.00'), + '40.00': ('10.00', '20.00'), '40': ('10.00', '20.00'), + '60.00': ('15.00', '30.00'), '60': ('15.00', '30.00'), + '80.00': ('20.00', '40.00'), '80': ('20.00', '40.00'), + '100.00': ('25.00', '50.00'), '100': ('25.00', '50.00'), + '200.00': ('50.00', '100.00'), '200': ('50.00', '100.00'), + '400.00': ('100.00', '200.00'), '400': ('100.00', '200.00'), + '800.00': ('200.00', '400.00'), '800': ('200.00', '400.00'), + '1000.00': ('250.00', '500.00'),'1000': ('250.00', '500.00') + } + + limits = { 'No Limit':'nl', 'Pot Limit':'pl', 'Limit':'fl', 'LIMIT':'fl', 'Fix Limit':'fl' } + + games = { # base, category + "Holdem" : ('hold','holdem'), + 'Omaha' : ('hold','omahahi'), + 'Omaha Hi/Lo' : ('hold','omahahilo'), + 'OmahaHL' : ('hold','omahahilo'), + 'Razz' : ('stud','razz'), + 'RAZZ' : ('stud','razz'), + '7 Card Stud' : ('stud','studhi'), + '7 Card Stud Hi/Lo' : ('stud','studhilo'), + 'Badugi' : ('draw','badugi'), + 'Triple Draw 2-7 Lowball' : ('draw','27_3draw'), + 'Single Draw 2-7 Lowball' : ('draw','27_1draw'), + '5 Card Draw' : ('draw','fivedraw') + } + + currencies = { u'€':'EUR', '$':'USD', '':'T$' } + + # Static regexes + re_GameInfo = re.compile(u""" + \#Game\sNo\s:\s(?P[0-9]+)\\n + \*\*\*\*\*\sCassava\sHand\sHistory\sfor\sGame\s[0-9]+\s\*\*\*\*\*\\n + (?P%(LS)s)?(?P[.,0-9]+)/(%(LS)s)?(?P[.,0-9]+)\sBlinds\s + (?PNo\sLimit|Fix\sLimit|Pot\sLimit)\s + (?PHoldem|Omaha|OmahaHL) + \s-\s\*\*\*\s + (?P.*$) + """ % substitutions, re.MULTILINE|re.VERBOSE) + + re_PlayerInfo = re.compile(u""" + ^Seat\s(?P[0-9]+):\s + (?P.*)\s + \(\s(%(LS)s)?(?P[.,0-9]+)\s\)""" % substitutions, + re.MULTILINE|re.VERBOSE) + + re_HandInfo = re.compile(""" + ^Table\s(?P[-\ \#a-zA-Z\d]+)\s + (\(Real\sMoney\))? + (?P\(Practice\sPlay\))? + \\n + Seat\s(?PFrom 43b071515d05aaf4338e8fae5be7de8c9600813f Mon Sep 17 00:00:00 2001 From: Steffen Schaumburg Date: Sat, 19 Mar 2011 20:15:53 +0100 Subject: [PATCH 35/41] remove hharchivebase from code and test config --- pyfpdb/Configuration.py | 12 ++---------- pyfpdb/HUD_config.test.xml | 2 +- pyfpdb/HandHistoryConverter.py | 16 ---------------- pyfpdb/fpdb.pyw | 20 -------------------- pyfpdb/fpdb_import.py | 11 +---------- 5 files changed, 4 insertions(+), 57 deletions(-) diff --git a/pyfpdb/Configuration.py b/pyfpdb/Configuration.py index 4d468405..c1b3e16a 100644 --- a/pyfpdb/Configuration.py +++ b/pyfpdb/Configuration.py @@ -485,7 +485,6 @@ class Import: self.node = node self.interval = node.getAttribute("interval") self.callFpdbHud = node.getAttribute("callFpdbHud") - self.hhArchiveBase = node.getAttribute("hhArchiveBase") self.ResultsDirectory = node.getAttribute("ResultsDirectory") self.hhBulkPath = node.getAttribute("hhBulkPath") self.saveActions = string_to_bool(node.getAttribute("saveActions"), default=False) @@ -495,8 +494,8 @@ class Import: self.saveStarsHH = string_to_bool(node.getAttribute("saveStarsHH"), default=False) def __str__(self): - return " interval = %s\n callFpdbHud = %s\n hhArchiveBase = %s\n saveActions = %s\n fastStoreHudCache = %s\nResultsDirectory = %s" \ - % (self.interval, self.callFpdbHud, self.hhArchiveBase, self.saveActions, self.cacheSessions, self.sessionTimeout, self.fastStoreHudCache, self.ResultsDirectory) + return " interval = %s\n callFpdbHud = %s\n saveActions = %s\n fastStoreHudCache = %s\nResultsDirectory = %s" \ + % (self.interval, self.callFpdbHud, self.saveActions, self.cacheSessions, self.sessionTimeout, self.fastStoreHudCache, self.ResultsDirectory) class HudUI: def __init__(self, node): @@ -861,9 +860,6 @@ class Config: return nodes_added - def set_hhArchiveBase(self, path): - self.imp.node.setAttribute("hhArchiveBase", path) - def find_default_conf(self): if os.name == 'posix': config_path = os.path.join(os.path.expanduser("~"), '.fpdb', 'default.conf') @@ -1261,10 +1257,6 @@ class Config: try: imp['interval'] = self.imp.interval except: imp['interval'] = 10 - # hhArchiveBase is the temp store for part-processed hand histories - should be redundant eventually - try: imp['hhArchiveBase'] = self.imp.hhArchiveBase - except: imp['hhArchiveBase'] = "~/.fpdb/HandHistories/" - # ResultsDirectory is the local cache for downloaded results # NOTE: try: except: doesn'tseem to be triggering # using if instead diff --git a/pyfpdb/HUD_config.test.xml b/pyfpdb/HUD_config.test.xml index dca95cd1..fba76fe1 100644 --- a/pyfpdb/HUD_config.test.xml +++ b/pyfpdb/HUD_config.test.xml @@ -2,7 +2,7 @@ - +