From 4d5294cc76780b90e44d6418e5feb785626d2fc7 Mon Sep 17 00:00:00 2001 From: Eduard Iskandarov Date: Sun, 1 Nov 2015 21:31:16 +0300 Subject: [PATCH] add pyinstaller spec file and adopt certs_file function --- .gitignore | 2 ++ README.rst | 44 ++++++++++++++++++++++++++++++++++++++ appveyor.yml | 3 ++- contrib/test_win_build.sh | 18 ++++++++++++++++ contrib/tx.ico | Bin 0 -> 24870 bytes contrib/tx.spec | 29 +++++++++++++++++++++++++ setup.py | 20 ----------------- txclib/utils.py | 14 ++++++++++++ txclib/web.py | 14 +----------- 9 files changed, 110 insertions(+), 34 deletions(-) create mode 100644 contrib/test_win_build.sh create mode 100644 contrib/tx.ico create mode 100644 contrib/tx.spec diff --git a/.gitignore b/.gitignore index 72bd50ca..508cc212 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ *pyo *~ *egg-info* +/build +/dist diff --git a/README.rst b/README.rst index 634625d4..8286eaf6 100644 --- a/README.rst +++ b/README.rst @@ -26,4 +26,48 @@ You can also install the `in-development version`_ of transifex-client with ``pip install transifex-client==dev`` or ``easy_install transifex-client==dev``. + +Build transifex-client for Windows +================================== + +1. Download transifex-client sources via git or github archive. + + a. ``git clone https://github.com/transifex/transifex-client.git`` + b. Download and unpack https://github.com/transifex/transifex-client/archive/master.zip + +2. Download and install Python_. + + At this step choose right version of python: 2 or 3 and x86 or x86-64 instruction set. + + Make sure pip marked for installation(default for latest installers). + +3. Install PyInstaller_. + + Suppose that Python installed to ``C:\\Program Files\\Python35-32`` + + Make ``python.exe`` accessible via PATH environment variable or cd to directory containing python.exe. + + :: + + python -m pip install pyinstaller + + This command will install ``PyInstaller`` package and its dependencies. + +4. Build ``transifex-client`` distribution. + + Change directory to transifex-client folder and run command: + + :: + + python -m PyInstaller contrib/tx.spec + # or + pyinstaller contrib/tx.spec + +5. ``tx.exe`` + + ``dist/tx.exe`` will be created as the result of build process. + + .. _in-development version: http://github.com/transifex/transifex-client/tarball/master#egg=transifex-client-dev +.. _Python: https://www.python.org/downloads/windows/ +.. _PyInstaller: http://www.pyinstaller.org diff --git a/appveyor.yml b/appveyor.yml index e9215b9f..002e69fb 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -51,11 +51,12 @@ install: build_script: # Build the compiled extension #- "%CMD_IN_ENV% python setup.py build" - - pyinstaller tx.spec + - pyinstaller contrib/tx.spec test_script: # Run the project tests #- "%CMD_IN_ENV% python setup.py nosetests" + - bash contrib/test_win_build.sh after_test: # If tests are successful, create binary packages for the project. diff --git a/contrib/test_win_build.sh b/contrib/test_win_build.sh new file mode 100644 index 00000000..1480dc6b --- /dev/null +++ b/contrib/test_win_build.sh @@ -0,0 +1,18 @@ +HOST="https://www.transifex.com" +USER=$TRANSIFEX_USER +PASSWORD=$TRANSIFEX_PASSWORD +TX=`pwd`"/dist/tx.exe" + +# Exit on fail +set -e + +rm -rf txci +git clone https://github.com/diegobz/txci.git +cd txci +rm -rf .tx +$TX init --host=$HOST --user=$USER --pass=$PASSWORD +$TX set --auto-local -r txci.test -s en 'locale//LC_MESSAGES/django.po' -t PO --execute +$TX push -s +$TX pull -l pt_BR -f + +# $TX delete -f diff --git a/contrib/tx.ico b/contrib/tx.ico new file mode 100644 index 0000000000000000000000000000000000000000..ade19630d358132b04fada4b71306a6caf207278 GIT binary patch literal 24870 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 literal 0 HcmV?d00001 diff --git a/contrib/tx.spec b/contrib/tx.spec new file mode 100644 index 00000000..3febf6d2 --- /dev/null +++ b/contrib/tx.spec @@ -0,0 +1,29 @@ +# -*- mode: python -*- + +block_cipher = None +added_files = [ + ('../txclib/cacert.pem', 'txclib'), +] + +a = Analysis(['../tx'], + binaries=None, + datas=added_files, + hiddenimports=[], + hookspath=None, + runtime_hooks=None, + excludes=None, + win_no_prefer_redirects=None, + win_private_assemblies=None, + cipher=block_cipher) +pyz = PYZ(a.pure, a.zipped_data, + cipher=block_cipher) +exe = EXE(pyz, + a.scripts, + a.binaries, + a.zipfiles, + a.datas, + name='tx', + debug=False, + strip=None, + upx=False, + console=True , icon='contrib/tx.ico') diff --git a/setup.py b/setup.py index aef041bd..ac76ad18 100755 --- a/setup.py +++ b/setup.py @@ -19,26 +19,6 @@ install_requires = [] extra_args = {} -import platform -if platform.system() == 'Windows': - from py2exe.build_exe import py2exe as build_exe - - class MediaCollector(build_exe): - # See http://crazedmonkey.com/blog/python/pkg_resources-with-py2exe.html - def copy_extensions(self, extensions): - build_exe.copy_extensions(self, extensions) - self.copy_file( - 'txclib/cacert.pem', - os.path.join(self.collect_dir, 'txclib/cacert.pem') - ) - self.compiled_files.append('txclib/cacert.pem') - - extra_args = { - 'console': ['tx'], - 'options': {'py2exe': {'bundle_files': 1}}, - 'zipfile': None, - 'cmdclass': {'py2exe': MediaCollector}, - } setup( name="transifex-client", diff --git a/txclib/utils.py b/txclib/utils.py index 0dd4e0c4..3a1c7a24 100644 --- a/txclib/utils.py +++ b/txclib/utils.py @@ -21,6 +21,20 @@ class HttpNotFound(Exception): pass +def get_base_dir(): + """PyInstaller Run-time Operation. + + http://pythonhosted.org/PyInstaller/#run-time-operation + """ + if getattr(sys, 'frozen', False): + # we are running in a bundle + basedir = sys._MEIPASS + else: + # we are running in a normal Python environment + basedir = os.path.dirname(os.path.abspath(__file__)) + return basedir + + def find_dot_tx(path=os.path.curdir, previous=None): """Return the path where .tx folder is found. diff --git a/txclib/web.py b/txclib/web.py index 41856ce1..9349a044 100644 --- a/txclib/web.py +++ b/txclib/web.py @@ -14,19 +14,7 @@ def user_agent_identifier(): def certs_file(): if platform.system() == 'Windows': - # Workaround py2exe and resource_filename incompatibility. - # Store the content in the filesystem permanently. - app_dir = os.path.join( - os.getenv('appdata', os.path.expanduser('~')), 'transifex-client' - ) - if not os.path.exists(app_dir): - os.mkdir(app_dir) - ca_file = os.path.join(app_dir, 'cacert.pem') - if not os.path.exists(ca_file): - content = resource_string(__name__, 'cacert.pem') - with open(ca_file, 'w') as f: - f.write(content) - return ca_file + return os.path.join(txclib.utils.get_base_dir(), 'txclib', 'cacert.pem') else: POSSIBLE_CA_BUNDLE_PATHS = [ # Red Hat, CentOS, Fedora and friends