diff options
28 files changed, 1021 insertions, 33 deletions
| @@ -1,3 +1,4 @@ +SHELL := /bin/zsh  # ################################  # Makefile for compiling resources  # files. @@ -62,5 +63,8 @@ deb:  	@git tag -a debian/$(DEBVER) -m "..."  	@debuild -us -uc -i.git +apidocs: +	@sphinx-apidoc -o docs/api src/leap +  clean :   	$(RM) $(COMPILED_UI) $(COMPILED_RESOURCES) $(COMPILED_UI:.py=.pyc) $(COMPILED_RESOURCES:.py=.pyc)   @@ -15,12 +15,12 @@ You can read the documentation online at `http://leap-client.readthedocs.org <ht  Quick Start  ============== -At the current development stage we still do not have any versioned release. Instead, you might want to have a look at the `testers guide<http://leap-client.readthedocs.org/en/latest/testers/howto.html>`_ for a quick howto on fetching and testing latest development code. +At the current development stage we still do not have any versioned release. Instead, you might want to have a look at the `testers guide <http://leap-client.readthedocs.org/en/latest/testers/howto.html>`_ for a quick howto on fetching and testing latest development code.  Dependencies  ------------------ -Leap client depends on these libraries: +LEAP Client depends on these libraries:  * ``python 2.6`` or ``2.7``  * ``qt4 libraries`` @@ -73,7 +73,7 @@ After a successful installation, there should be a launcher called ``leap-client  Hacking  ======= -See the `hackers guide<http://leap-client.readthedocs.org/en/latest/dev/environment.html>`_ +See the `hackers guide <http://leap-client.readthedocs.org/en/latest/dev/environment.html>`_.  The LEAP client git repository is available at:: diff --git a/data/leap_client.pro b/data/leap_client.pro index 4c559029..3f76d6af 100644 --- a/data/leap_client.pro +++ b/data/leap_client.pro @@ -2,15 +2,16 @@  # is not there a f*** way of expanding this? other to template with python I mean... -SOURCES 	+= ../src/leap/gui/firstrun/intro.py -SOURCES 	+= ../src/leap/gui/firstrun/last.py -SOURCES		+= ../src/leap/gui/firstrun/login.py -SOURCES		+= ../src/leap/gui/firstrun/providerinfo.py -SOURCES		+= ../src/leap/gui/firstrun/providerselect.py -SOURCES		+= ../src/leap/gui/firstrun/providersetup.py -SOURCES		+= ../src/leap/gui/firstrun/register.py -SOURCES		+= ../src/leap/gui/firstrun/regvalidation.py -SOURCES		+= ../src/leap/gui/firstrun/wizard.py +SOURCES += ../src/leap/base/exceptions.py +SOURCES += ../src/leap/gui/firstrun/intro.py +SOURCES	+= ../src/leap/gui/firstrun/last.py +SOURCES	+= ../src/leap/gui/firstrun/login.py +SOURCES	+= ../src/leap/gui/firstrun/providerinfo.py +SOURCES	+= ../src/leap/gui/firstrun/providerselect.py +SOURCES	+= ../src/leap/gui/firstrun/providersetup.py +SOURCES	+= ../src/leap/gui/firstrun/register.py +SOURCES	+= ../src/leap/gui/firstrun/regvalidation.py +SOURCES	+= ../src/leap/gui/firstrun/wizard.py  # where to generate ts files -- tx will pick from here diff --git a/data/ts/en_US.ts b/data/ts/en_US.ts index f6aadc5c..a802dd75 100644 --- a/data/ts/en_US.ts +++ b/data/ts/en_US.ts @@ -1,6 +1,39 @@  <?xml version="1.0" encoding="utf-8"?>  <!DOCTYPE TS><TS version="2.0">  <context> +    <name>Errors</name> +    <message> +        <location filename="../src/leap/base/exceptions.py" line="57"/> +        <source>Interface not found</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <location filename="../src/leap/base/exceptions.py" line="64"/> +        <source>Looks like your computer is not connected to the internet</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <location filename="../src/leap/base/exceptions.py" line="72"/> +        <source>Looks like there are problems with your internet connection</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <location filename="../src/leap/base/exceptions.py" line="80"/> +        <source>It looks like there is no internet connection.</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <location filename="../src/leap/base/exceptions.py" line="88"/> +        <source>Domain cannot be found</source> +        <translation type="unfinished"></translation> +    </message> +    <message> +        <location filename="../src/leap/base/exceptions.py" line="95"/> +        <source>The Encrypted Connection was lost. Shutting down...</source> +        <translation type="unfinished"></translation> +    </message> +</context> +<context>      <name>IntroPage</name>      <message>          <location filename="../src/leap/gui/firstrun/intro.py" line="14"/> @@ -216,4 +249,10 @@          <translation type="unfinished"></translation>      </message>  </context> +<context> +    <name>TestyClass</name> +</context> +<context> +    <name>this is a cat</name> +</context>  </TS> diff --git a/docs/api/leap.base.rst b/docs/api/leap.base.rst new file mode 100644 index 00000000..778836c4 --- /dev/null +++ b/docs/api/leap.base.rst @@ -0,0 +1,98 @@ +base Package +============ + +:mod:`auth` Module +------------------ + +.. automodule:: leap.base.auth +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`authentication` Module +---------------------------- + +.. automodule:: leap.base.authentication +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`checks` Module +-------------------- + +.. automodule:: leap.base.checks +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`config` Module +-------------------- + +.. automodule:: leap.base.config +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`connection` Module +------------------------ + +.. automodule:: leap.base.connection +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`constants` Module +----------------------- + +.. automodule:: leap.base.constants +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`exceptions` Module +------------------------ + +.. automodule:: leap.base.exceptions +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`network` Module +--------------------- + +.. automodule:: leap.base.network +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`pluggableconfig` Module +----------------------------- + +.. automodule:: leap.base.pluggableconfig +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`providers` Module +----------------------- + +.. automodule:: leap.base.providers +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`specs` Module +------------------- + +.. automodule:: leap.base.specs +    :members: +    :undoc-members: +    :show-inheritance: + +Subpackages +----------- + +.. toctree:: + +    leap.base.tests + diff --git a/docs/api/leap.base.tests.rst b/docs/api/leap.base.tests.rst new file mode 100644 index 00000000..7af035b0 --- /dev/null +++ b/docs/api/leap.base.tests.rst @@ -0,0 +1,43 @@ +tests Package +============= + +:mod:`test_auth` Module +----------------------- + +.. automodule:: leap.base.tests.test_auth +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`test_checks` Module +------------------------- + +.. automodule:: leap.base.tests.test_checks +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`test_config` Module +------------------------- + +.. automodule:: leap.base.tests.test_config +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`test_providers` Module +---------------------------- + +.. automodule:: leap.base.tests.test_providers +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`test_validation` Module +----------------------------- + +.. automodule:: leap.base.tests.test_validation +    :members: +    :undoc-members: +    :show-inheritance: + diff --git a/docs/api/leap.baseapp.rst b/docs/api/leap.baseapp.rst new file mode 100644 index 00000000..f24b4976 --- /dev/null +++ b/docs/api/leap.baseapp.rst @@ -0,0 +1,75 @@ +baseapp Package +=============== + +:mod:`constants` Module +----------------------- + +.. automodule:: leap.baseapp.constants +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`dialogs` Module +--------------------- + +.. automodule:: leap.baseapp.dialogs +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`eip` Module +----------------- + +.. automodule:: leap.baseapp.eip +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`leap_app` Module +---------------------- + +.. automodule:: leap.baseapp.leap_app +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`log` Module +----------------- + +.. automodule:: leap.baseapp.log +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`mainwindow` Module +------------------------ + +.. automodule:: leap.baseapp.mainwindow +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`network` Module +--------------------- + +.. automodule:: leap.baseapp.network +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`permcheck` Module +----------------------- + +.. automodule:: leap.baseapp.permcheck +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`systray` Module +--------------------- + +.. automodule:: leap.baseapp.systray +    :members: +    :undoc-members: +    :show-inheritance: + diff --git a/docs/api/leap.certs.rst b/docs/api/leap.certs.rst new file mode 100644 index 00000000..e9cc2524 --- /dev/null +++ b/docs/api/leap.certs.rst @@ -0,0 +1,11 @@ +certs Package +============= + +:mod:`certs` Package +-------------------- + +.. automodule:: leap.certs +    :members: +    :undoc-members: +    :show-inheritance: + diff --git a/docs/api/leap.crypto.rst b/docs/api/leap.crypto.rst new file mode 100644 index 00000000..a04e2e1d --- /dev/null +++ b/docs/api/leap.crypto.rst @@ -0,0 +1,26 @@ +crypto Package +============== + +:mod:`certs` Module +------------------- + +.. automodule:: leap.crypto.certs +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`leapkeyring` Module +------------------------- + +.. automodule:: leap.crypto.leapkeyring +    :members: +    :undoc-members: +    :show-inheritance: + +Subpackages +----------- + +.. toctree:: + +    leap.crypto.tests + diff --git a/docs/api/leap.crypto.tests.rst b/docs/api/leap.crypto.tests.rst new file mode 100644 index 00000000..54ffa62f --- /dev/null +++ b/docs/api/leap.crypto.tests.rst @@ -0,0 +1,11 @@ +tests Package +============= + +:mod:`test_certs` Module +------------------------ + +.. automodule:: leap.crypto.tests.test_certs +    :members: +    :undoc-members: +    :show-inheritance: + diff --git a/docs/api/leap.eip.rst b/docs/api/leap.eip.rst new file mode 100644 index 00000000..e418461b --- /dev/null +++ b/docs/api/leap.eip.rst @@ -0,0 +1,74 @@ +eip Package +=========== + +:mod:`checks` Module +-------------------- + +.. automodule:: leap.eip.checks +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`config` Module +-------------------- + +.. automodule:: leap.eip.config +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`constants` Module +----------------------- + +.. automodule:: leap.eip.constants +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`eipconnection` Module +--------------------------- + +.. automodule:: leap.eip.eipconnection +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`exceptions` Module +------------------------ + +.. automodule:: leap.eip.exceptions +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`openvpnconnection` Module +------------------------------- + +.. automodule:: leap.eip.openvpnconnection +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`specs` Module +------------------- + +.. automodule:: leap.eip.specs +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`udstelnet` Module +----------------------- + +.. automodule:: leap.eip.udstelnet +    :members: +    :undoc-members: +    :show-inheritance: + +Subpackages +----------- + +.. toctree:: + +    leap.eip.tests + diff --git a/docs/api/leap.eip.tests.rst b/docs/api/leap.eip.tests.rst new file mode 100644 index 00000000..932a074f --- /dev/null +++ b/docs/api/leap.eip.tests.rst @@ -0,0 +1,43 @@ +tests Package +============= + +:mod:`data` Module +------------------ + +.. automodule:: leap.eip.tests.data +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`test_checks` Module +------------------------- + +.. automodule:: leap.eip.tests.test_checks +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`test_config` Module +------------------------- + +.. automodule:: leap.eip.tests.test_config +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`test_eipconnection` Module +-------------------------------- + +.. automodule:: leap.eip.tests.test_eipconnection +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`test_openvpnconnection` Module +------------------------------------ + +.. automodule:: leap.eip.tests.test_openvpnconnection +    :members: +    :undoc-members: +    :show-inheritance: + diff --git a/docs/api/leap.gui.firstrun.rst b/docs/api/leap.gui.firstrun.rst new file mode 100644 index 00000000..36470c33 --- /dev/null +++ b/docs/api/leap.gui.firstrun.rst @@ -0,0 +1,91 @@ +firstrun Package +================ + +:mod:`firstrun` Package +----------------------- + +.. automodule:: leap.gui.firstrun +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`intro` Module +------------------- + +.. automodule:: leap.gui.firstrun.intro +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`last` Module +------------------ + +.. automodule:: leap.gui.firstrun.last +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`login` Module +------------------- + +.. automodule:: leap.gui.firstrun.login +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`mixins` Module +-------------------- + +.. automodule:: leap.gui.firstrun.mixins +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`providerinfo` Module +-------------------------- + +.. automodule:: leap.gui.firstrun.providerinfo +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`providerselect` Module +---------------------------- + +.. automodule:: leap.gui.firstrun.providerselect +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`providersetup` Module +--------------------------- + +.. automodule:: leap.gui.firstrun.providersetup +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`register` Module +---------------------- + +.. automodule:: leap.gui.firstrun.register +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`regvalidation` Module +--------------------------- + +.. automodule:: leap.gui.firstrun.regvalidation +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`wizard` Module +-------------------- + +.. automodule:: leap.gui.firstrun.wizard +    :members: +    :undoc-members: +    :show-inheritance: + diff --git a/docs/api/leap.gui.rst b/docs/api/leap.gui.rst new file mode 100644 index 00000000..a35a7856 --- /dev/null +++ b/docs/api/leap.gui.rst @@ -0,0 +1,75 @@ +gui Package +=========== + +:mod:`gui` Package +------------------ + +.. automodule:: leap.gui +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`constants` Module +----------------------- + +.. automodule:: leap.gui.constants +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`locale_rc` Module +----------------------- + +.. automodule:: leap.gui.locale_rc +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`mainwindow_rc` Module +--------------------------- + +.. automodule:: leap.gui.mainwindow_rc +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`progress` Module +---------------------- + +.. automodule:: leap.gui.progress +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`styles` Module +-------------------- + +.. automodule:: leap.gui.styles +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`threads` Module +--------------------- + +.. automodule:: leap.gui.threads +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`utils` Module +------------------- + +.. automodule:: leap.gui.utils +    :members: +    :undoc-members: +    :show-inheritance: + +Subpackages +----------- + +.. toctree:: + +    leap.gui.firstrun +    leap.gui.tests + diff --git a/docs/api/leap.gui.tests.rst b/docs/api/leap.gui.tests.rst new file mode 100644 index 00000000..60b0a6ca --- /dev/null +++ b/docs/api/leap.gui.tests.rst @@ -0,0 +1,59 @@ +tests Package +============= + +:mod:`test_firstrun_login` Module +--------------------------------- + +.. automodule:: leap.gui.tests.test_firstrun_login +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`test_firstrun_providerselect` Module +------------------------------------------ + +.. automodule:: leap.gui.tests.test_firstrun_providerselect +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`test_firstrun_register` Module +------------------------------------ + +.. automodule:: leap.gui.tests.test_firstrun_register +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`test_firstrun_wizard` Module +---------------------------------- + +.. automodule:: leap.gui.tests.test_firstrun_wizard +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`test_mainwindow_rc` Module +-------------------------------- + +.. automodule:: leap.gui.tests.test_mainwindow_rc +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`test_progress` Module +--------------------------- + +.. automodule:: leap.gui.tests.test_progress +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`test_threads` Module +-------------------------- + +.. automodule:: leap.gui.tests.test_threads +    :members: +    :undoc-members: +    :show-inheritance: + diff --git a/docs/api/leap.rst b/docs/api/leap.rst new file mode 100644 index 00000000..ce715c5d --- /dev/null +++ b/docs/api/leap.rst @@ -0,0 +1,41 @@ +leap Package +============ + +:mod:`leap` Package +------------------- + +.. automodule:: leap.__init__ +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`_version` Module +---------------------- + +.. automodule:: leap._version +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`app` Module +----------------- + +.. automodule:: leap.app +    :members: +    :undoc-members: +    :show-inheritance: + +Subpackages +----------- + +.. toctree:: + +    leap.base +    leap.baseapp +    leap.certs +    leap.crypto +    leap.eip +    leap.gui +    leap.testing +    leap.util + diff --git a/docs/api/leap.testing.rst b/docs/api/leap.testing.rst new file mode 100644 index 00000000..dfad1b0c --- /dev/null +++ b/docs/api/leap.testing.rst @@ -0,0 +1,43 @@ +testing Package +=============== + +:mod:`basetest` Module +---------------------- + +.. automodule:: leap.testing.basetest +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`https_server` Module +-------------------------- + +.. automodule:: leap.testing.https_server +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`pyqt` Module +------------------ + +.. automodule:: leap.testing.pyqt +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`qunittest` Module +----------------------- + +.. automodule:: leap.testing.qunittest +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`test_basetest` Module +--------------------------- + +.. automodule:: leap.testing.test_basetest +    :members: +    :undoc-members: +    :show-inheritance: + diff --git a/docs/api/leap.util.rst b/docs/api/leap.util.rst new file mode 100644 index 00000000..dbb69ebe --- /dev/null +++ b/docs/api/leap.util.rst @@ -0,0 +1,66 @@ +util Package +============ + +:mod:`coroutines` Module +------------------------ + +.. automodule:: leap.util.coroutines +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`dicts` Module +------------------- + +.. automodule:: leap.util.dicts +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`fileutil` Module +---------------------- + +.. automodule:: leap.util.fileutil +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`leap_argparse` Module +--------------------------- + +.. automodule:: leap.util.leap_argparse +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`misc` Module +------------------ + +.. automodule:: leap.util.misc +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`translations` Module +-------------------------- + +.. automodule:: leap.util.translations +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`web` Module +----------------- + +.. automodule:: leap.util.web +    :members: +    :undoc-members: +    :show-inheritance: + +Subpackages +----------- + +.. toctree:: + +    leap.util.tests + diff --git a/docs/api/leap.util.tests.rst b/docs/api/leap.util.tests.rst new file mode 100644 index 00000000..eb6654c4 --- /dev/null +++ b/docs/api/leap.util.tests.rst @@ -0,0 +1,19 @@ +tests Package +============= + +:mod:`test_fileutil` Module +--------------------------- + +.. automodule:: leap.util.tests.test_fileutil +    :members: +    :undoc-members: +    :show-inheritance: + +:mod:`test_leap_argparse` Module +-------------------------------- + +.. automodule:: leap.util.tests.test_leap_argparse +    :members: +    :undoc-members: +    :show-inheritance: + diff --git a/docs/api/modules.rst b/docs/api/modules.rst new file mode 100644 index 00000000..d49776ae --- /dev/null +++ b/docs/api/modules.rst @@ -0,0 +1,7 @@ +leap +==== + +.. toctree:: +   :maxdepth: 4 + +   leap diff --git a/docs/dev/internationalization.rst b/docs/dev/internationalization.rst index e6b89dea..1a9af0be 100644 --- a/docs/dev/internationalization.rst +++ b/docs/dev/internationalization.rst @@ -38,21 +38,30 @@ tl;dr;::       self.tr('your string') -for any string that you want to be translated. +for any string that you want to be translated, as long as the instance derives from ``QObject``. + +If you have to translate something that it is not a ``QObject``, use the magic leap ``translate`` method: + + +.. code-block:: python + +   from leap.util.translations import translate + +   class Foo(object): +        bar = translate(<Context>, <string>, <comment>) +  .. Note about this: there seems to be some problems with the .tr method -   on QObjects. Investigate this. -   I still believe we can use a generic _ method which is smart enough to -   fallback to QObject.tr methods or lookup our own tr implementation (for our -   multilungual objects, like in exceptions or provider labels that came from json objects). +   so the translate method could actually be the preferred thing in all the cases. +   Still missing what to do for language labels (json-based).     --kali  For i18n maintainers  ^^^^^^^^^^^^^^^^^^^^ -You need ``pylupdate4`` for these steps. To get it, in debian:: +You need ``pylupdate4`` and ``lrelease`` for these steps. To get it, in debian:: -   $ apt-get install python-qt4-utils +   $ apt-get install pyqt4-dev-tools qt4-linguist-tools  If you do not already have it, install the ``transifex-client`` from the cheese shop:: diff --git a/docs/index.rst b/docs/index.rst index 017fa32c..a57e030f 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -78,10 +78,14 @@ API Documentation  If you are looking for a reference to specific classes or functions, you are likely to find it here +.. I should investigate a bit more how to skip some things, and how to give nice format +   to the docstrings. +   Maybe we should not have sphinx-apidocs building everything, but a minimal index of our own. +  .. note:: -   when it's finished, that's it :) +   when it's a bit more polished, that's it :)  .. toctree::     :maxdepth: 2 -   api +   api/leap diff --git a/src/leap/base/exceptions.py b/src/leap/base/exceptions.py index 227da953..c5e56b76 100644 --- a/src/leap/base/exceptions.py +++ b/src/leap/base/exceptions.py @@ -14,6 +14,7 @@ Exception attributes and their meaning/uses  * usermessage: the message that will be passed to user in ErrorDialogs                 in Qt-land.  """ +from leap.util.translations import translate  class LeapException(Exception): @@ -22,6 +23,7 @@ class LeapException(Exception):      sets some parameters that we will check      during error checking routines      """ +      critical = False      failfirst = False      warning = False @@ -46,32 +48,50 @@ class ImproperlyConfigured(Exception):      pass -class NoDefaultInterfaceFoundError(LeapException): -    message = "no default interface found" -    usermessage = "Looks like your computer is not connected to the internet" +# NOTE: "Errors" (context) has to be a explicit string!  class InterfaceNotFoundError(LeapException):      # XXX should take iface arg on init maybe?      message = "interface not found" +    usermessage = translate( +        "Errors", +        "Interface not found") + + +class NoDefaultInterfaceFoundError(LeapException): +    message = "no default interface found" +    usermessage = translate( +        "Errors", +        "Looks like your computer " +        "is not connected to the internet")  class NoConnectionToGateway(CriticalError):      message = "no connection to gateway" -    usermessage = "Looks like there are problems with your internet connection" +    usermessage = translate( +        "Errors", +        "Looks like there are problems " +        "with your internet connection")  class NoInternetConnection(CriticalError):      message = "No Internet connection found" -    usermessage = "It looks like there is no internet connection." +    usermessage = translate( +        "Errors", +        "It looks like there is no internet connection.")      # and now we try to connect to our web to troubleshoot LOL :P  class CannotResolveDomainError(LeapException):      message = "Cannot resolve domain" -    usermessage = "Domain cannot be found" +    usermessage = translate( +        "Errors", +        "Domain cannot be found")  class TunnelNotDefaultRouteError(CriticalError):      message = "Tunnel connection dissapeared. VPN down?" -    usermessage = "The Encrypted Connection was lost. Shutting down..." +    usermessage = translate( +        "Errors", +        "The Encrypted Connection was lost. Shutting down...") diff --git a/src/leap/base/pluggableconfig.py b/src/leap/base/pluggableconfig.py index 0ca985ea..3517db6b 100644 --- a/src/leap/base/pluggableconfig.py +++ b/src/leap/base/pluggableconfig.py @@ -10,6 +10,8 @@ import urlparse  import jsonschema +from leap.util.translations import LEAPTranslatable +  logger = logging.getLogger(__name__) @@ -118,7 +120,6 @@ adaptors['json'] = JSONAdaptor()  # to proper python types.  # TODO: -# - multilingual object.  # - HTTPS uri @@ -132,6 +133,20 @@ class DateType(object):          return time.strftime(self.fmt, data) +class TranslatableType(object): +    """ +    a type that casts to LEAPTranslatable objects. +    Used for labels we get from providers and stuff. +    """ + +    def to_python(self, data): +        return LEAPTranslatable(data) + +    # needed? we already have an extended dict... +    #def get_prep_value(self, data): +        #return dict(data) + +  class URIType(object):      def to_python(self, data): @@ -164,6 +179,7 @@ types = {      'date': DateType(),      'uri': URIType(),      'https-uri': HTTPSURIType(), +    'translatable': TranslatableType(),  } diff --git a/src/leap/base/specs.py b/src/leap/base/specs.py index 962aa07d..f57d7e9c 100644 --- a/src/leap/base/specs.py +++ b/src/leap/base/specs.py @@ -22,12 +22,16 @@ leap_provider_spec = {              #'required': True,          },          'name': { -            'type': dict,  # XXX multilingual object? +            #'type': LEAPTranslatable, +            'type': dict, +            'format': 'translatable',              'default': {u'en': u'Test Provider'}              #'required': True          },          'description': { +            #'type': LEAPTranslatable,              'type': dict, +            'format': 'translatable',              'default': {u'en': u'Test provider'}          },          'enrollment_policy': { diff --git a/src/leap/base/tests/test_providers.py b/src/leap/base/tests/test_providers.py index 9c11f270..f257f54d 100644 --- a/src/leap/base/tests/test_providers.py +++ b/src/leap/base/tests/test_providers.py @@ -15,10 +15,12 @@ from leap.base import providers  EXPECTED_DEFAULT_CONFIG = {      u"api_version": u"0.1.0", -    u"description": {u'en': u"Test provider"}, +    #u"description": "LEAPTranslatable<{u'en': u'Test provider'}>", +    u"description": {u'en': u'Test provider'},      u"default_language": u"en",      #u"display_name": {u'en': u"Test Provider"},      u"domain": u"testprovider.example.org", +    #u'name': "LEAPTranslatable<{u'en': u'Test Provider'}>",      u'name': {u'en': u'Test Provider'},      u"enrollment_policy": u"open",      #u"serial": 1, @@ -66,6 +68,7 @@ class TestLeapProviderDefinition(BaseLeapTest):          self.definition.save(to=self.testfile, force=True)          deserialized = json.load(open(self.testfile, 'rb'))          self.maxDiff = None +        #import ipdb;ipdb.set_trace()          self.assertEqual(deserialized, EXPECTED_DEFAULT_CONFIG)      def test_provider_dump_to_slug(self): @@ -84,8 +87,9 @@ class TestLeapProviderDefinition(BaseLeapTest):          with open(self.testfile, 'w') as wf:              wf.write(json.dumps(EXPECTED_DEFAULT_CONFIG))          self.definition.load(fromfile=self.testfile) -        self.assertDictEqual(self.config, -                             EXPECTED_DEFAULT_CONFIG) +        #self.assertDictEqual(self.config, +                             #EXPECTED_DEFAULT_CONFIG) +        self.assertItemsEqual(self.config, EXPECTED_DEFAULT_CONFIG)      def test_provider_validation(self):          self.definition.validate(self.config) diff --git a/src/leap/util/tests/test_translations.py b/src/leap/util/tests/test_translations.py new file mode 100644 index 00000000..794daeba --- /dev/null +++ b/src/leap/util/tests/test_translations.py @@ -0,0 +1,22 @@ +import unittest + +from leap.util import translations + + +class TrasnlationsTestCase(unittest.TestCase): +    """ +    tests for translation functions and classes +    """ + +    def setUp(self): +        self.trClass = translations.LEAPTranslatable + +    def test_trasnlatable(self): +        tr = self.trClass({"en": "house", "es": "casa"}) +        eq = self.assertEqual +        eq(tr.tr(to="es"), "casa") +        eq(tr.tr(to="en"), "house") + + +if __name__ == "__main__": +    unittest.main() diff --git a/src/leap/util/translations.py b/src/leap/util/translations.py new file mode 100644 index 00000000..14b8c020 --- /dev/null +++ b/src/leap/util/translations.py @@ -0,0 +1,83 @@ +import inspect +import logging + +from PyQt4.QtCore import QCoreApplication +from PyQt4.QtCore import QLocale + +logger = logging.getLogger(__name__) + +""" +here I could not do all that I wanted. +the context is not getting passed to the xml file. +Looks like pylupdate4 is somehow a hack that does not +parse too well the python ast. +I guess we could generate the xml for ourselves as a last recourse. +""" + +# XXX BIG NOTE: +# RESIST the temptation to get the translate function +# more compact, or have the Context argument passed as a variable +# It HAS to be explicit due  to how the pylupdate parser +# works. + + +qtTranslate = QCoreApplication.translate + + +def translate(*args, **kwargs): +    """ +    our magic function. +    translate(Context, text, comment) +    """ +    #print 'translating...' +    klsname = None +    try: +        # get class value from instance +        # using live object inspection +        prev_frame = inspect.stack()[1][0] +        self = inspect.getargvalues(prev_frame).locals.get('self') +        if self: +            # XXX will this work with QObject wrapper?? +            if isinstance(LEAPTranslatable, self) and hasattr(self, 'tr'): +                print "we got a self in base class" +                return self.tr(*args) + +            # Trying to  get the class name +            # but this is useless, the parser +            # has already got the context. +            klsname = self.__class__.__name__ +            #print 'KLSNAME  -- ', klsname +    except: +        logger.error('error getting stack frame') +        #print 'error getting stack frame' + +    if klsname: +        nargs = (klsname,) + args +        return qtTranslate(*nargs) + +    else: +        nargs = ('default', ) + args +        return qtTranslate(*nargs) + + +class LEAPTranslatable(dict): +    """ +    An extended dict that implements a .tr method +    so it can be translated on the fly by our +    magic  translate method +    """ + +    try: +        locale = str(QLocale.system().name()).split('_')[0] +    except: +        logger.warning("could not get system locale!") +        print "could not get system locale!" +        locale = "en" + +    def tr(self, to=None): +        if not to: +            to = self.locale +        _tr = self.get(to, None) +        if not _tr: +            _tr = self.get("en", None) +        return _tr | 
